【C/C++9】天气APP:Oracle的虚表/日期/序列,索引/视图/链路/同义词,数据库高可用性
文章目錄
- 1.虛表/日期/序列:SEQUENCE
- 2.索引/視圖/鏈路/同義詞:create index/view/link/synonym
- 3.表空間/數據文件/啟動關閉/權限/備份恢復:exp/imp
- 4.清理空閑會話/歸檔日志:kill session,archive log list
- 5.系統高可用性:rac
1.虛表/日期/序列:SEQUENCE
oracle的虛表dual用來構成select的語法規則,不要當表來看,oracle保證dual里永遠只有一條記錄,可用它來做如下很多事。
如下若是c語言寫1/86400就是=0(因為整數除),只有浮點數才能這樣運算。oracle中是非常精確的,不用擔心精度問題。
如下sysdate函數返回值可以當成值來用。
SQL>CREATE SEQUENCE ABC INCREMENT BY 1 START WITH 1 MAXVALUE 9999999999 NOCYCLE NOCACHE;
如上新建一個序列第一次取當前值是取不到的(提示該序列在此會話中未定義),必須.nextval再.currval取當前值。下面起步為100,步長為5。
下面給表增加兩個字段crttime和keyid(導出數據時用到keyid),下面在crttable.sql中
如下insert into里必須有主鍵obtid和ddatetime,將序列生成器下個值賦給keyid字段
下面為rowid偽列和rownum偽列:rowid(是數據詳細地址,通過rowid,oracle可最快定位某行具體的數據在磁盤中存放的物理位置)的格式不用管。rownum(查詢返回的結果集中行的序號,可使用它來限制查詢返回的行數)是變的是結果集的一個序號(C語言很少用rownum)。
如下第一行select時需要將rownum和rowid寫出來查詢才能看到,第二行用rowid作為查詢或更新的條件最快(區別索引)
如上每條記錄雖然存在數據庫里(即表空間,表空間還是數據文件)最后還是存在磁盤上(在磁盤上就有位置),就是/oracle/base/oradata/snorcl11g里的.dbf文件。vi crttable.sql
vi psurfdata.cpp
下面是以shqx用戶登陸。
2.索引/視圖/鏈路/同義詞:create index/view/link/synonym
虛日序,索視鏈同。如下decode函數如果sex為1顯示男,為2顯示女…(if 1 男,else if 2 女,else if 3 非男非女,else if null 不確定,else 錯誤)。
keyid從序列生成器取出來我們沒把它當成主鍵,應該它是唯一的索引(索引也是數據,需要存儲空間),因為keyid不可能重復。
索引創建時是否指定為唯一索引呢?看列的性質如obtid+ddatetime是唯一的,keyid是唯一的【只拿obtid出來或只拿ddatetime出來肯定不是唯一的,若創建唯一索引的話數據插入時插不進去。比如現在建一個表,表里有一個字段弄成唯一索引,再往里插入重復的值肯定報錯】。
如果某列出現在查詢條件中,而列的數據是無序的,查詢時只能從第一行開始一行一行匹配。創建索引就是對某些特定列中數據排序或歸類,生成獨立索引表。在某列創建索引后,如果該列出現在查詢條件中,oracle會自動的引用該索引,先從索引表中查詢出符合條件記錄的ROWID,由于ROWID是記錄的物理地址,因此可根據ROWID快速定位到具體記錄。
唯一索引效果相當于主鍵約束(即主鍵不允許重復),當表和索引在不同的表空間時效率更高,如下數據庫自動將obtid和ddatetime主建字段創建唯一索引,下面在crttable.sql中。
每建一個索引就相當于把列的數據拿出來單獨存放,如下創建索引的實質就是2列(rowid也算1列)或多列(與上面依次對應)拿出來組成一個像表一樣的對象(像書的目錄),用專門空間存放。所以索引有開銷,雖提高查詢效率,但一方面是需要更多的存儲空間,另一方面是影響表的增、刪、改的性能(對數據進行操作時,索引需要更新),所以不能表的什么字段都建上索引,需要設計,規范如下。
適合建立索引的列特點:where后經常用到的列,主鍵本身唯一性索引,保持數據唯一性。下面在plsql developer中tools菜單里Explainplan,選中F5分析。
ddatetime在數據庫中是整數
如上如果業務系統對數據庫進行全表掃描的話,我們監控查到告訴他做改進
如下第三條就是上面to_char函數用不了索引
視圖就是訪問數據的一個窗口,當成一個表來用,下面為先授權
如上可以exit退出,也可直接切換connect scott用戶
視圖不占用表空間,在emp將hiredate設置為系統時間,從v_emp查也有效果
drop view …
如下登錄sqlplus是客戶端,數據庫服務端在tnsnames.ora中snorcl…198里配置ip和端口
如下注意snorcl11g_to_198中間有個to
如下設為私有的話,自己可以用自己
如上方法如果改了如下服務名,就不好用了
如下另一種方法創建不用snorcl11g_198服務名
下面連接遠程數據庫服務器不要產生遠程事務:1.性能低,2.遠程事務容易拖垮數據庫,對遠程數據庫的訪問可以select,但不要update,insert,delete(都會產生事務)
下面是同義詞:數據庫對象(表,視圖,序列,存儲過程,包)的一個別名。
如下dblinkname指snorcl11g_198等等
實際不可能給shqx和密碼給客戶,給普通用戶如scott給客戶并授權
如下是更多sql,如下先查下有什么表:select * from tab;結果集不包含1234…這個列和EMPNO…這個行(就是外面框架)
如下是列的拼接即內容的拼接,前面是字符串后面是數字也可以拼接,行沒有顯示(sal+100),但結果集里最后有數字900,拼接符||不是C語言中的或,優先級高于+號。
對表使用別名,如下內表是dept,外表是emp
distinct關鍵字,取結果集中的唯一值,去重,如下有很多30,20,10重復
如下最后一個dname出問題
如下創建的aaa除了表和列,其他數據庫對象都沒有。下面1=2為了只保留表結構即第一行OBTID,DDATE…。
向aaa這個空表(前面1=2)insert,keyid不允許重復是唯一索引的約束,aaa沒繼承這些約束,所以keyid插入了3個1,但aaa繼承了字段空還是非空這些屬性。
如上給t_surfdata表增加一個obtname空字段,如下將t_obtcode中obtname字段值賦給t_surfdata中obtname空字段
3.表空間/數據文件/啟動關閉/權限/備份恢復:exp/imp
vi .bash_profile,服務器安裝好數據庫后可裝多個實例,就像類創建/定義/實例化一個對象/變量。
安裝數據庫的服務器有一半內存分配給oracle數據庫的,不要太去關注oracle數據庫這個概念。關注表空間這概念,建表時可指定表空間。不想創建表空間,USER表空間夠用就用。
如上三行不用dbstart命令腳本啟動數據庫,如下dba重新登錄,創建用戶并授權,授權后需要重新登陸才生效。
如下revoke撤銷權限是立馬生效
數據處理好后別的業務系統要使用這數據,給分配一用戶:給這用戶connect和resource權限,再授權grant select any table to…
如下是備份和恢復:括號要\來轉義,以下為表模式導出。.dmp約定命名,表示是oracle的exp卸出來的。rows=n(no)表示只導出表定義,沒導出數據。注意數據庫字符集和版本。
以下為導入(必須是有dba權限的用戶【如下shqx/pwdidc有dba權限】,導入的文件就是上面導出的.dmp文件),索引那些都會導進來但不能重復導入一樣的表。
以下為用戶模式導出(表模式只導出表,沒有序列等等),將shqx這用戶全導出。把shqx用戶刪了,創建一用戶再把導入,整個用戶完整恢復如下。
4.清理空閑會話/歸檔日志:kill session,archive log list
如下SQL*Net其實就是tcp的服務程序,是oracle的網絡軟件
自動創建文件:vi listener.ora
vi listener.ora
別人用完我數據庫不斷開,我可以強行斷開session
sqlplus / as sysdba;oracle日志有兩種方式:歸檔,非歸檔(非歸檔模式在如下三個在線保留的日志:有的話就可以恢復,沒有的話就恢復不了。所以經常改為歸檔模式)
NOARCHIVELOG為非歸檔模式,如上兩種方式查看oracle是否為歸檔模式,如下由非歸檔轉為歸檔。
如下歸檔日志文件名也可以叫…dbf
如上切換成歸檔模式成功,如下如果在線日志滿了會自動寫入歸檔日志里,對數據庫很多操作,內容就寫進去了。數據庫不忙,一下寫不進歸檔日志,所以手動切換日志,如下在線日志切換到了第二組,并寫入了歸檔日志里。
刪除歸檔日志,以前清理ftp采集的文件用時間,但是歸檔日志文件大小和數量由數據庫繁忙程度決定,一分鐘產生不定量的文件。目錄滿了,數據庫歸檔失敗,數據庫停了。所以清理日志文件,保留最近多少個文件(按照歸檔日志文件名用Cdir類排序,從后面往前找):deletearchive.cpp見文章:https://blog.csdn.net/weixin_43435675/article/details/103476761
5.系統高可用性:rac
一臺服務器比一般主機要大,同樣cpu在里面不外露,但是服務器的磁盤以插拔形式暴露在外面有多個。如下是磁盤陣列技術,假設一個服務器有12個1T硬盤,如下raid0一但12個中一個壞了,沒有一個1T補充上來,整個出問題。raid1兩個盤之間互為備份,壞了就動態調整。
如下假如oracle數據庫在一個服務器上運行,出問題了怎么辦?(一般硬件故障)。Oracle三種高可用集群方案:1.RAC,2.Data Guard,3.OGG。如下是RAC技術,可以多個,但一般為兩個。有的數據在內存,有的在緩存,2個要進行數據協調很麻煩,所以不是高性能,比單個服務器要慢。
如下為結合三種集群技術應用。
RAC有多個節點(上面為兩個),應用程序只要做好客戶端配置怎么連RAC數據庫就行。
如下為應用系統的高可用性,不是數據庫系統。把一個web系統相同全部部在多個服務器上,ip地址只有一個,那怎么訪問呢?訪問一網站時首先訪問到nginx,nginx將訪問請求均勻分給服務器。
應用程序系統手動切,不像oracle的RAC和dataguard那樣自動切。因為應用程序熱切換難,普通系統可冷備份,2個服務器后臺的應用程序以及環境都準備好,一接到切換通知立馬登錄服務器,冷切換,10分鐘左右。銀行系統必須熱備份熱切換:跑兩套應用系統,數據庫系統,加負載均衡。
總結
以上是生活随笔為你收集整理的【C/C++9】天气APP:Oracle的虚表/日期/序列,索引/视图/链路/同义词,数据库高可用性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java24】健康项目:环境搭建,预约
- 下一篇: 【C/C++11】天气APP:txt/x