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