甲骨論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ù)文件就被清空。