相老師的OCP教程 42-45課 文字版

甲骨論42課鎖基礎(chǔ)原理

鎖是數(shù)據(jù)庫并發(fā)的前提。進(jìn)程等待鎖的時(shí)間過長(zhǎng)會(huì)影響用戶體驗(yàn)。

鎖有l(wèi)atch鎖和lock鎖。遍歷過的鏈會(huì)被serverprocess并發(fā)訪問,用latch鎖保護(hù)。

lock鎖主要用來保護(hù)buffercache,分為排它鎖和共享鎖。排它鎖被對(duì)象訪問時(shí)其它對(duì)象不能訪問,共享鎖不排它。

行鎖指向被修改塊的對(duì)應(yīng)事務(wù)槽。行級(jí)鎖是Oracle鎖的最小粒度單位。一個(gè)事務(wù)修改事務(wù)槽不影響構(gòu)造CR塊對(duì)行進(jìn)行讀取。

事務(wù)鎖TX是由行級(jí)鎖產(chǎn)生的(行級(jí)鎖必然產(chǎn)生事務(wù)鎖),一個(gè)事務(wù)只有一個(gè)事務(wù)鎖。commit和rollback就將事務(wù)鎖解鎖。DML語句加鎖。

表級(jí)鎖TM有:

l? 行級(jí)排他鎖(Rowexclusive)或RX鎖

事務(wù)A修改許多行,給每行加行鎖,只給A加一個(gè)事務(wù)鎖,在表上加RX鎖。RX鎖有兼容性,也就是兩個(gè)事務(wù)都給同一個(gè)表加RX鎖。RX鎖和X鎖是互斥的,不能同時(shí)加。

DML語句自動(dòng)在被更新表上添加RX鎖,lock命令顯示在表上添加RX鎖,加RX鎖后不能加X鎖。

>lock table in row exclusive exclusive[share row exclusive] mode;

l? 行級(jí)共享鎖(RowShared)或RS鎖

>select … from for update;//需要加RS鎖,由于forupdate和update是互斥的。

where rownum=1 //選第一行的sql語句

l? 排他鎖(Exclusive)或X鎖

對(duì)表的結(jié)構(gòu)進(jìn)行改變和刪除表需要X鎖。此時(shí)任何其它會(huì)話都不能修改表。

l? 共享鎖(Share)或S鎖

l? 共享行級(jí)排他鎖(ShareRow Exclusive)或SRX鎖。

使用鎖要注意鎖的粒度、鎖的排他性。

鎖的兼容性:

RX鎖可再加RX鎖、RS鎖。X鎖與任何鎖排他,對(duì)并發(fā)影響最大。

加鎖語句:增刪改產(chǎn)生RX鎖,可再加RX和RS。select…fromfor update產(chǎn)生RS鎖,可再加RS、RX、S、SRX鎖。S鎖可再加S和RS。SRX可再加RS。X鎖與所有鎖排他。

甲骨論43課鎖相關(guān)視圖及相關(guān)操作

鎖視圖:vlock,通過鎖的視圖找出鎖的問題。

>selectxidusn,xidslot,xidsqn,status from v$transaction;//查事務(wù)回滾段編號(hào)、事務(wù)槽編號(hào)、覆蓋次數(shù)、回滾塊的狀態(tài)

vYou can't use 'macro parameter character #' in math modesession的主鍵,共同標(biāo)識(shí)一個(gè)session。

v$enqueue_lock顯示那些申請(qǐng)鎖定,但是無法獲得鎖定的session信息。記錄按照申請(qǐng)鎖定的時(shí)間先后順序排列,排在前面的優(yōu)先獲得鎖定。

v$locked_object記錄當(dāng)前被鎖定的對(duì)象信息,其中OBJECT_ID說明當(dāng)前被鎖定的對(duì)象的ID號(hào),可以根據(jù)ID號(hào)到dba_objects查找被鎖定的對(duì)象名稱。LOCKED_MODE指鎖定模式的數(shù)字編碼。

v$session記錄當(dāng)前會(huì)話信息。

>grant selecton v賦予用戶訪問mystat表的權(quán)限,需在sys用戶執(zhí)行

>select sidfrom v$mystat where rownum=1;//查看第一行會(huì)話的sid

死鎖產(chǎn)生:兩個(gè)會(huì)話同時(shí)分別訪問兩個(gè)數(shù)據(jù)塊(鎖?。?,相互依賴導(dǎo)致相互等待。對(duì)兩個(gè)會(huì)話roolback解決死鎖。死鎖發(fā)生時(shí)在/u01/app/oracle/admin/數(shù)據(jù)庫名/bdump/alert_jiagulun.log日志中記錄ORA-00060:Deadlockdetected死鎖信息,.trc文件記錄了死鎖的具體信息。

甲骨論44課Oracle網(wǎng)絡(luò)原理及配置

由于Oracle沒有負(fù)載,不容易出問題。

Oracle連接過程:

1)? ? ? ? ? ? 客戶端發(fā)送連接請(qǐng)求給Listener

2)? ? ? ? ? ? Listener將連接請(qǐng)求發(fā)送給Oracle數(shù)據(jù)庫的實(shí)例

3)? ? ? ? ? ? 據(jù)庫實(shí)例啟動(dòng)server process并將server process地址發(fā)給Listener

4)? ? ? ? ? ? Listener將serverprocess地址發(fā)給客戶端

5)? ? ? ? ? ? 客戶端直接發(fā)送請(qǐng)求給server process

6)? ? ? ? ? ? 客戶端發(fā)送用戶名和密碼給serverprocess,驗(yàn)證通過則正式建立會(huì)話。

l? 建立會(huì)話后Listener不再使用,Listener只負(fù)責(zé)建立連接的轉(zhuǎn)發(fā)(不含密碼)。只有在短時(shí)間內(nèi)在大量的連接請(qǐng)求才需要優(yōu)化。

l? 監(jiān)聽只負(fù)責(zé)找到數(shù)據(jù)庫實(shí)例,而與數(shù)據(jù)庫實(shí)例沒有常鏈接。

l? 監(jiān)聽默認(rèn)端口號(hào)1521

監(jiān)聽的3個(gè)文件:listener.ora、tnsnames.ora、sqlnet.ora,服務(wù)端有l(wèi)istener.ora和rnsnames.ora,客戶端只有tnsnames.ora。

在客戶端配置服務(wù)端的監(jiān)聽:

1)? ? ? ? ? ? #xhost+

2)? ? ? ? ? ? #w //獲取遠(yuǎn)程登陸的IP地址

3)? ? ? ? ? ? #export DISPLAY=”IP地址”//將圖形界面映射到本地

4)? ? ? ? ? ? #su -用戶

5)? ? ? ? ? ? #netca //配置監(jiān)聽,生成listener.ora文件

6)? ? ? ? ? ? 設(shè)置:監(jiān)聽名、協(xié)議TCP、標(biāo)準(zhǔn)端口號(hào)

7)? ? ? ? ? ? 在Oracle程序的/network/admin/listener.ora文件檢查主機(jī)名和端口號(hào)。

?? ? 把主機(jī)名改為IP地址。

8)? ? ? ? ? ? #lsnctl restart;lsnctlstop;lsnctl start;lsnctl status//重啟監(jiān)聽

客戶端配置:

1)? ? ? ? ? ? 查看數(shù)據(jù)庫服務(wù)名:連接數(shù)據(jù)庫->show parameter service

2)? ? ? ? ? ? 查看主機(jī)名:#netstat –tulnp:grep 1521

3)? ? ? ? ? ? #netca

4)? ? ? ? ? ? 選net本地服務(wù)配置、服務(wù)名、TCP、主機(jī)名(服務(wù)器的監(jiān)聽I(yíng)P)、網(wǎng)絡(luò)服務(wù)名(任填)。

5)? ? ? ? ? ? 在/network/admin/tnsnames.ora查看生成文件,檢查主機(jī)名,服務(wù)名。

6)? ? ? ? ? ? #sqlplus 用戶名/密碼@網(wǎng)絡(luò)服務(wù)名//從tnsnames.ora自動(dòng)解析@后的字符串(IP、端口、服務(wù))

排錯(cuò)流程:

1)? ? ? ? ? ? tnsnames.ora的ip、端口號(hào)、service_names。服務(wù)器端 netstat–tulnp|grep 1521;show parameter service。網(wǎng)絡(luò)服務(wù)名要與tnsnames.ora中的一致。

2)? ? ? ? ? ? tnsping 網(wǎng)絡(luò)服務(wù)名

3)? ? ? ? ? ? > alter system register;//強(qiáng)制將servicename注冊(cè)到監(jiān)聽中(加速),默認(rèn)地Oracle會(huì)將service name注冊(cè)到監(jiān)聽中。這兩種方式都稱為動(dòng)態(tài)注冊(cè)。

數(shù)據(jù)庫有3個(gè)名字:數(shù)據(jù)庫名、實(shí)例名、服務(wù)名。使用服務(wù)名靜態(tài)注冊(cè)到監(jiān)聽中。

客戶端與監(jiān)聽連接過程:用tnsnames.ora解析命令@后的字串得IP和端口號(hào),根據(jù)IP和端口號(hào)找監(jiān)聽,如果tnsnames.ora中的服務(wù)名與監(jiān)聽中的服務(wù)名一致,則建立連接。

服務(wù)名的”靜態(tài)注冊(cè)”為解決動(dòng)態(tài)注冊(cè)不穩(wěn)定的問題。在listener.ora加入腳本。

連接方式:不用監(jiān)聽、只用監(jiān)聽、用監(jiān)聽和tnsnames.ora

l? #sqlplus hr/hr;//直接連接,不用監(jiān)聽

l? #sqlplus / as sysdba

l用監(jiān)聽、不用tnsnames.ora的啟動(dòng)方法:

>sqlplus hr/hr@192.168.0.100:1521/數(shù)據(jù)庫服務(wù)名

一個(gè)數(shù)據(jù)庫可以使用多個(gè)監(jiān)聽,實(shí)現(xiàn)負(fù)載均衡。

l? #sqlplus hr/hr@數(shù)據(jù)庫服務(wù)名;//用監(jiān)聽和tnsnames.ora啟動(dòng)

甲骨論45課Oracle參數(shù)文件及數(shù)據(jù)庫的啟動(dòng)和關(guān)閉

參數(shù)文件位置$ORACLE_HOME/dbs/spfile實(shí)例名.ora。9i以后都是動(dòng)態(tài)參數(shù)文件,靜態(tài)參數(shù)文件是文本文件,靜態(tài)參數(shù)文件缺點(diǎn)是修改參數(shù)需要重啟數(shù)據(jù)庫,動(dòng)態(tài)參數(shù)文件是二進(jìn)制文件。如果是單實(shí)例,數(shù)據(jù)庫名與實(shí)例名相同。

Oracle啟動(dòng)過程:

1)? ? ? ? ? ? 找參數(shù)文件,根據(jù)$ORACLE_SID找”spfile實(shí)例名.ora”

查:#echo $ORACLE_SID

改:#cd;vi .bash_profile;export ORACLE_SID=實(shí)例名;//設(shè)置不對(duì)顯示”連接到空閑的實(shí)例上”

Oracle啟動(dòng)過程:nomount、mount、open。三個(gè)階段:

1)? ? ? ? ? ? nomount:找到參數(shù)文件spfile,根據(jù)參數(shù)文件分配內(nèi)存和啟動(dòng)進(jìn)程。

m#ps –ef//查進(jìn)程

#ipcs –a//查內(nèi)存

>show parameter control//顯示參數(shù)文件

2)? ? ? ? ? ? mount:根據(jù)參數(shù)文件記錄的控制文件位置,打開控制文件。

>alert database mount;//打開控制文件

3)? ? ? ? ? ? open:打開數(shù)據(jù)文件和重做日志

>alter database open;

>createpfile from spfile;//從動(dòng)態(tài)文件生成靜態(tài)文件。

改啟動(dòng)參數(shù):

>alter system set parameter_name=parameter_valuescope=memory|spfile|both [sid=’sid’|’*’];//改啟動(dòng)參數(shù)。memory僅內(nèi)存有效重啟后失效,spfile只修改參數(shù)文件重啟后生效,默認(rèn)both。若文檔中是FALSE,則只能scope=spfile。

>selectname,value,ISSYS_MODIFIABLE from v$parameter;//查看參數(shù)值及生效類型

查閱:官方文檔/reference/v$parameter/。ISSYS_MODIFIABLE中有IMMEDIATE則立即生效、DEFERRED重新登陸會(huì)話生效、FALSE重啟生效。

參數(shù)錯(cuò)誤會(huì)導(dǎo)致無法用vim打開。解決方法是:生成靜態(tài)修改后再重新生成動(dòng)態(tài)文件。

1)? ? ? ? ? ? >create pfile fromspfile;exit;

2)? ? ? ? ? ? #vim %ORACLE_SID/init.ora;

3)? ? ? ? ? ? 將參數(shù)改回來

4)? ? ? ? ? ? #sqlplus / as sysdba;

5)? ? ? ? ? ? >create spfile from pfile;

數(shù)據(jù)庫關(guān)閉方式:

>shutdown immediate;//最常用

l? normal(等提交回滾和斷連接)

等待事務(wù)主動(dòng)提交或回滾,等待用戶主動(dòng)斷開連接,存在用戶未斷開連接則無法關(guān)閉。

l? transactional(等提交回滾)

等待正在運(yùn)行的事務(wù)直到提交和回滾(主動(dòng)結(jié)束),然后強(qiáng)行中斷連接。將實(shí)例中為數(shù)據(jù)寫入數(shù)據(jù)文件,清空緩存。存在未提交或回滾的事務(wù)則無法關(guān)閉。

l? immediate(全回滾不等提交,但仍寫回buffer cache)

強(qiáng)行中斷或因滾所有事務(wù),然后關(guān)閉連接。將數(shù)據(jù)文件寫入數(shù)據(jù)文件。

l? abort(重啟需要實(shí)例恢復(fù))

模擬突然斷電。事務(wù)立即中斷,沒有提交/回滾,內(nèi)存沒有寫入數(shù)據(jù)文件就被清空。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容