為配合應(yīng)用變更,主機(jī)維護(hù),異常宕機(jī)重啟等工作,需要進(jìn)行重啟數(shù)據(jù)庫,重啟ORACLE集群軟件,主機(jī)。為保障數(shù)據(jù)庫啟停操作的規(guī)范性,特定制該操作規(guī)范。
按需規(guī)劃網(wǎng)站可以根據(jù)自己的需求進(jìn)行定制,做網(wǎng)站、成都網(wǎng)站制作構(gòu)思過程中功能建設(shè)理應(yīng)排到主要部位公司做網(wǎng)站、成都網(wǎng)站制作的運(yùn)用實(shí)際效果公司網(wǎng)站制作網(wǎng)站建立與制做的實(shí)際意義
該規(guī)范只針對數(shù)據(jù)庫以及使用ORACLE集群軟件的集群環(huán)境,主機(jī)集群、集群文件系統(tǒng)、主機(jī)重啟等規(guī)范由其他應(yīng)用維護(hù)廠家提供。
數(shù)據(jù)庫名稱 | 數(shù)據(jù)庫負(fù)責(zé)人 | 聯(lián)系方式 | 業(yè)務(wù)負(fù)責(zé)人 | 聯(lián)系方式 |
ZWDB | ||||
公司 | 聯(lián)系人 | 聯(lián)系方式 | 緊急聯(lián)系人 | 聯(lián)系方式 |
業(yè)務(wù)支撐室 | ||||
$ 為操作系統(tǒng)命令行提示符,表明該操作命令為普通用戶操作系統(tǒng)命令。
# 為操作用戶根用戶提示符,表明該操作命令使用root用戶進(jìn)行。
SQL> 為SQL命令提示符,表明該操作命令為SQL命令。
以下操作,如無特殊說明,均使用oracle用戶進(jìn)行操作。在進(jìn)行停監(jiān)聽、停實(shí)例、kill用戶進(jìn)程和數(shù)據(jù)庫進(jìn)程之前,一定要得到用戶以及管理人員的確認(rèn),以防止誤操作造成的故障。
確認(rèn)當(dāng)前登錄主機(jī)與操作主機(jī)一致。
$hostname
$echo $ORACLE_SID
該操作由應(yīng)用廠家完成,數(shù)據(jù)庫中檢查類型為USER的進(jìn)程是否有減少。
SQL>SELECT INST_ID, COUNT(1) FROM GV$SESSION WHERE TYPE = 'USER' GROUP BY INST_ID;
如果仍然有大量的用戶類型的進(jìn)程存在,檢查進(jìn)程名及主機(jī)信息,告知應(yīng)用廠家進(jìn)行處理。
SQL> SET LINESIZE 120;
SQL> COL MACHINE FOR A30;
SQL>SELECT INST_ID, PROGRAM, MACHINE, COUNT(1) FROM GV$SESSION WHERE TYPE = 'USER' GROUP BY INST_ID, PROGRAM, MACHINE ORDER BY 4;
非集群環(huán)境下,數(shù)據(jù)庫默認(rèn)的監(jiān)聽名稱為LISTENER,可以通過下面的命令查詢當(dāng)前運(yùn)行的數(shù)據(jù)庫監(jiān)聽的名稱:
$ps -ef | grep tns
/oracle/app/oracle/product/10.2.0/db/bin/tnslsnrLISTENER_RAC10G1 -inherit
藍(lán)色部分,就是數(shù)據(jù)庫監(jiān)聽的名稱,非標(biāo)準(zhǔn)監(jiān)聽名稱,可以通過下面命令進(jìn)行關(guān)閉:
$lsnrctl stopLISTENER_RAC10G1
通過
$ps -ef | grep tns
命令檢查監(jiān)聽是否正常關(guān)閉。
如果監(jiān)聽不能正常關(guān)閉,也可以使用 kill -9的方式殺掉監(jiān)聽進(jìn)程。
集群環(huán)境下,可以通過常規(guī)的lsnrctl命令關(guān)閉監(jiān)聽,也可以通過srvctl命令或crs命令的方式關(guān)閉監(jiān)聽。但是建議使用srvctl命令進(jìn)行資源管理操作。
集群環(huán)境中的停監(jiān)聽操作,根據(jù)要求停庫要求進(jìn)行對應(yīng)主機(jī)的操作。
a.查詢集群中監(jiān)聽運(yùn)行狀態(tài)
$crs_stat -t | grep lsnr
ora....G1.lsnr application ? ?ONLINE ? ?ONLINE ? ?rac10g1 ? ?
ora....G2.lsnr application ? ?ONLINE ? ?ONLINE ? ?rac10g2
b.停止節(jié)點(diǎn)監(jiān)聽
根據(jù)需要,停止相應(yīng)數(shù)據(jù)庫主機(jī)的監(jiān)聽程序
$srvctl stop listener -n rac10g1
c.停止SCAN_LISTENER (11g)
ORACLE 11G 中引入了SCAN_LISTENER的概念,應(yīng)該如果需要停止11g集群的所有實(shí)例,需要停止SCAN_LISTENER。
$srvctl stopscan_listener
d.查詢集群中監(jiān)聽運(yùn)行狀態(tài)
確保操作節(jié)點(diǎn)的監(jiān)聽被停止。
$crs_stat -t | grep lsnr
ora....G1.lsnr application ? ?OFFLINE ? OFFLINE ? ? ? ? ? ? ?
ora....G2.lsnr application ? ?ONLINE ? ?ONLINE ? ?rac10g2
?其他停止監(jiān)聽的方式:
a.通過lsnrctl命令方式停監(jiān)聽,該操作需要在集群中所有節(jié)點(diǎn)進(jìn)行
$ ps -ef | grep tns
/oracle/app/oracle/product/10.2.0/db/bin/tnslsnrLISTENER_RAC10G1 -inherit
$ lsnrctl stop LISTENER_RAC10G1
b.通過crs_stop命令停監(jiān)聽
$ crs_stat | grep lsnr
NAME=ora.rac10g1.LISTENER_RAC10G1.lsnr
NAME=ora.rac10g2.LISTENER_RAC10G2.lsnr
$ crs_stop
Usage: ?crs_stop resource_name [...] [-f] [-q] ["attrib=value ..."]
? ? ? ?crs_stop -c cluster_member [...] [-q] ["attrib=value ..."]
? ? ? ?crs_stop -all [-q]
該命令使用的參數(shù)為集群資源,因此參數(shù)為NAME說對應(yīng)的整個值
$ crs_stopora.rac10g1.LISTENER_RAC10G1.lsnr
檢查數(shù)據(jù)庫的非本地會話連接,該操作所有節(jié)點(diǎn)都需要進(jìn)行,需要注意進(jìn)程運(yùn)行的用戶:
$ps -ef | grep "LOCAL=NO"
如果存在大量的進(jìn)程,表明仍有大量應(yīng)用進(jìn)程沒有停止,通過下面的命令進(jìn)行檢查:
SQL> SET LINESIZE 120;
SQL> COL MACHINE FOR A30;
SQL>SELECT INST_ID, PROGRAM, MACHINE, COUNT(1) FROM GV$SESSION WHERE TYPE = 'USER' GROUP BY INST_ID, PROGRAM, MACHINE ORDER BY 4;
可以通過kill -9的方式,殺掉非本地連接(該操作需要應(yīng)用廠家確認(rèn)后才能進(jìn)行):
$hostname
$id
$ps -ef | grep "LOCAL=NO" | awk '{print $2}' | xargs kill -9
注意:在ORACLE11G的版本,由于監(jiān)聽程序運(yùn)行在grid用戶下,因此LOCAL=NO的進(jìn)程屬組可能是grid用戶。在需要之前需要進(jìn)行確認(rèn)。
為保證在數(shù)據(jù)庫關(guān)閉過程中,所有的臟數(shù)據(jù)都寫入磁盤,日志都完成歸檔操作。建議在執(zhí)行關(guān)閉數(shù)據(jù)庫操作前,進(jìn)行日志切換和檢查點(diǎn)操作。
將集群中所有節(jié)點(diǎn)的臟數(shù)據(jù)寫入到數(shù)據(jù)文件:
SQL>alter system checkpointglobal;
global參數(shù)針對集群數(shù)據(jù)庫,單實(shí)例數(shù)據(jù)庫無需該參數(shù)。
對集群中所有實(shí)例,進(jìn)行日志切換操作,日志切換操作建議執(zhí)行多次:
SQL>alter system archive log current;
在非歸檔模式下,該命令無法正常執(zhí)行,可以通過在各節(jié)點(diǎn)執(zhí)行:
SQL>alter system switch logfile;
命令進(jìn)行替代。
再次執(zhí)行檢查點(diǎn)操作:
SQL>alter system checkpointglobal;
確保停庫時,ACTIVE狀態(tài)的日志不大于1組:
SQL>SELECT INST_ID,GROUP#, STATUS, ARCHIVED FROM GV$LOG WHERE STATUS IN ('ACTIVE', 'CURRENT');
確保MTTR時間在可接受的范圍內(nèi)(數(shù)據(jù)庫異常關(guān)閉,啟動后恢復(fù)所需時間):
SQL> SET LINESIZE 120;
SQL>SELECT RECOVERY_ESTIMATED_IOS,ACTUAL_REDO_BLKS,TARGET_REDO_BLKS,LOG_FILE_SIZE_REDO_BLKS,TARGET_MTTR,ESTIMATED_MTTR FROM GV$INSTANCE_RECOVERY;
通過immediate的方式,進(jìn)行數(shù)據(jù)庫關(guān)閉操作
SQL>shutdown immediate;
?停實(shí)例
在停止部分實(shí)例的情況下,需要使用停實(shí)例的方式來停止指定的數(shù)據(jù)庫實(shí)例。
$ hostname
$ id
$ ps -ef | grep ora_smon
$srvctl stop instance -d
?停數(shù)據(jù)庫
通過srvctl命令方式關(guān)閉數(shù)據(jù)庫:
$crs_stat | grep db$
NAME=ora.crmdb.db
$srvctl stop database -dcrmdb
通過crs_stat命令檢查數(shù)據(jù)庫是否正常關(guān)閉,inst及db資源就是對應(yīng)的實(shí)例和數(shù)據(jù)庫資源:
$ crs_stat -t
Name ? ? ? ? ? Type ? ? ? ? ? Target ? ?State ? ? Host ? ? ? ?
------------------------------------------------------------
ora....b1.inst application ? ?OFFLINE ? OFFLINE ? ? ? ? ? ? ?
ora....b2.inst application ? ?OFFLINE ? OFFLINE ? ? ? ? ? ? ?
ora.crmdb.db ? application ? ?OFFLINE ? OFFLINE ? ? ? ? ? ? ?
注意:ORACLE 11G版本中,crs資源中已經(jīng)不在有實(shí)例的信息。
注意,該操作可能會造成數(shù)據(jù)庫的損壞,非特×××況下不建議采用該操作。
如果上述步驟無法正常關(guān)閉數(shù)據(jù)庫,可采用中止PMON進(jìn)程或shutdown abort方式非正常中止數(shù)據(jù)庫運(yùn)行,數(shù)據(jù)庫實(shí)例的核心進(jìn)程全部關(guān)閉后,注意檢查操作系統(tǒng)的共享內(nèi)存段是否已釋放。在共享內(nèi)存段釋放前不要重新起動數(shù)據(jù)庫。
SQL> shutdown abort;
$ipcs -m | grep oracle
0x61a4a848 3047431 ? ?oracle ? ?640 ? ? ? ?132120576 ?14
如果返回結(jié)果中仍然有oracle的共享內(nèi)存信息,表明數(shù)據(jù)庫沒有完全停止,檢查是否仍然有遺留進(jìn)程,或者等待共享內(nèi)存資源的釋放。
在執(zhí)行abort操作后,一定要執(zhí)行一次正常的數(shù)據(jù)庫起停操作,防止異常操作帶來的數(shù)據(jù)損壞
SQL>startup;
SQL> shutdown immediate;
停數(shù)據(jù)庫集群需要使用root用戶。該操作需要在集群中所有節(jié)點(diǎn)進(jìn)行。
執(zhí)行該操作前,需要檢查數(shù)據(jù)庫是否正常停止:
$crs_stat -t
確保,資源中以inst/db結(jié)尾的資源狀態(tài)已經(jīng)為OFFLINE。如果狀態(tài)為ONLINE,請參照前面的停數(shù)據(jù)庫步驟進(jìn)行操作。
集群的停止操作,需要在CRS_HOME(10g)/GRID_HOME(11g)的bin目錄下進(jìn)程:
#cd /oracle/app/oracle/product/10.2.0/crs/bin
#./crsctl stop crs
Stopping resources. This could take several minutes.
Successfully stopped CRS resources.
Stopping CSSD.
Shutting down CSS daemon.
Shutdown request successfully issued.
檢查關(guān)閉結(jié)果:
#crsctl check crs
Failure 1 contacting CSS daemon
Cannot communicate with CRS
Cannot communicate with EVM
確保該命令沒有返回結(jié)果:
#ps -ef | grep oracle | grep d.bin
以CRMDB為例:
$ hostname
SQL> show parameter instance;
SQL> SELECT INST_ID, PROGRAM, MACHINE, COUNT(1) FROM GV$SESSION WHERE TYPE = 'USER' GROUP BY INST_ID, PROGRAM, MACHINE ORDER BY 4;
$ crs_stat | grep lsnr
$ srvctl stop listener -n crmdb1 -l LISTENER_CRMDB1
$ srvctl stop listener -n crmdb2 -l LISTENER_CRMDB2
$ srvctl stop listener -n crmdb3 -l LISTENER_CRMDB3
$ ps -ef | grep "LOCAL=NO" | awk '{print $2}' | xargs kill -9
SQL> alter system checkpoint global;
SQL> alter system archive log current;
SQL> alter system archive log current;
SQL> alter system archive log current;
SQL> alter system archive log current;
SQL> alter system archive log current;
SQL> alter system archive log current;
SQL> alter system checkpoint global;
$ crs_stat | grep db$
$ srvctl stop database -d crmdb
# crsctl start crs
以下操作,如無特殊說明,均使用oracle用戶進(jìn)行操作。正常情況下在集群啟動會,會將所有相關(guān)資源自動啟動。但可能存在特殊情況,如資源啟動狀態(tài)設(shè)置為disable、手工停止集群未重啟主機(jī)的情況,需要手工進(jìn)行資源的啟動操作。
啟動數(shù)據(jù)庫集群需要使用root用戶。該操作需要在集群中所有節(jié)點(diǎn)進(jìn)行。
命令的執(zhí)行,需要在bin目錄下進(jìn)行:
# cd /oracle/app/oracle/product/10.2.0/crs/bin
[root@rac10g1 bin]#
[root@rac10g1 bin]#crsctl start crs
Attempting to start CRS stack
The CRS stack will be started shortly
該過程可能時間較久,可以通過監(jiān)控集群相關(guān)的進(jìn)行以及crs日志進(jìn)行跟蹤:
[root@rac10g1 bin]# ps -ef | grep d.bin
[root@rac10g1 bin]# cd ../log/rac10g1/crsd/
[root@rac10g1 crsd]# tail -f crsd.log
集群啟動成功后,可以通過crs_stat命令查看集群狀態(tài):
# crs_stat -t
Name ? ? ? ? ? Type ? ? ? ? ? Target ? ?State ? ? Host ? ? ? ?
------------------------------------------------------------
?
ora....0g1.gsd application ? ?ONLINE ? ?ONLINE ? ?rac10g1 ? ?
ora....0g1.ons application ? ?ONLINE ? ?ONLINE ? ?rac10g1 ? ?
ora....0g1.vip application ? ?ONLINE ? ?ONLINE ? ?rac10g1 ? ? ? ?
集群啟動成功后,要確保集群資源中的gsd/ons/vip進(jìn)程狀態(tài)為ONLINE,并且運(yùn)行在自己的節(jié)點(diǎn)上。
非集群環(huán)境下,數(shù)據(jù)庫默認(rèn)的監(jiān)聽名稱為LISTENER,可以通過listener.ora配置文件,查看監(jiān)聽的名稱:
$ cd $ORACLE_HOME/network/admin
[oracle@rac10g1 admin]$
$ cat listener.ora
LISTENER_RAC10G1 =
?(DESCRIPTION_LIST = ........
?)
通過lsnrctl start命令進(jìn)行監(jiān)聽的啟動:
$ lsnrctl start LISTENER_RAC10G1
通過lsnrctl status命令,檢查監(jiān)聽的運(yùn)行狀態(tài):
$ lsnrctl status LISTENER_RAC10G1
集群環(huán)境下,可以通過srvctl命令進(jìn)行監(jiān)聽的啟動。
查詢集群中監(jiān)聽的名稱:
$ crs_stat | grep lsnr
NAME=ora.rac10g1.LISTENER_RAC10G1.lsnr
NAME=ora.rac10g2.LISTENER_RAC10G2.lsnr
執(zhí)行srvctl命令
$ srvctl start listener -h
Usage: srvctl start listener -n
? ?-n
? ?-l "
? ?-h ? ? ? ? ? ? ? ? ?Print usage
$ srvctl stop listener -nrac10g1-lLISTENER_RAC10G1
通過open的方式,該方式是startup的默認(rèn)方式,進(jìn)行數(shù)據(jù)庫啟動操作:
SQL> startup;
通過srvctl命令方式啟動數(shù)據(jù)庫:
$ srvctl start database -d crmdb
檢查各節(jié)點(diǎn)的alert日志,跟蹤數(shù)據(jù)庫關(guān)閉過程:
$ cd $ORACLE_BASE/admin/${DB_NAME}/bdump
$ tail -f alert_crmdb1.log
${DB_NAME}參數(shù)為數(shù)據(jù)庫名。
通過crs_stat命令檢查數(shù)據(jù)庫是否正常啟動,inst及db資源就是對應(yīng)的實(shí)例和數(shù)據(jù)庫資源:
$ crs_stat -t
Name ? ? ? ? ? Type ? ? ? ? ? Target ? ?State ? ? Host ? ? ? ?
------------------------------------------------------------
ora....b1.inst application ? ?ONLINE ? ?ONLINE ? ?rac10g1 ? ?
ora....b2.inst application ? ?ONLINE ? ?ONLINE ? ?rac10g2 ? ?
ora.crmdb.db ? application ? ?ONLINE ? ?ONLINE ? ?rac10g2
確保每個實(shí)例的運(yùn)行狀態(tài)都為OPEN狀態(tài):
SQL>ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
SQL>SELECT INST_ID, STARTUP_TIME, STATUS FROM GV$INSTANCE ORDER BY INST_ID;
查看當(dāng)時數(shù)據(jù)庫配置的所有service
$srvctl config service -d crmdb
srvcrmdb1 PREF: crmdb1 AVAIL: crmdb2
srvcrmdb2 PREF: crmdb2 AVAIL: crmdb1
通過srvctl命令啟動service:
$srvctl start service -d crmdb -s srvcrmdb1
$ srvctl start service -d crmdb -s srvcrmdb2
查看service的運(yùn)行狀態(tài):
$srvctl status service -d crmdb
Service srvcrmdb1 is running on instance(s) crmdb1
Service srvcrmdb2 is running on instance(s) crmdb2
通過vip地址和scan(11g)地址,進(jìn)行數(shù)據(jù)庫遠(yuǎn)程登錄測試,確保所有實(shí)例都能夠登錄成功。
$sqlplus system/password@rac10g1-vip:1521/crmdb
$sqlplus system/password@rac10g2-vip:1521/crmdb
$sqlplus system/password@scan_ip:1521/crmdb