Oracle - 給rac建立單例項dg,並做主從切換
一、概述
本文將介紹如何給rac搭建單節點的dg,以及如何對其進行角色轉換。預先具備的知識(rac搭建,單例項-單例項dg搭建)
二、實驗環境介紹
主庫rac(已安裝rac,並已有資料庫orcl)
rac1:192.168.56.11,sid1:orcl1,version:11.2.0.4
rac2:192.168.56.12,sid2:orcl2,version:11.2.0.4
從庫(已安裝單例項資料庫軟體,無資料庫例項)
oradg:192.168.56.102,sid:orcldg,version:11.2.0.4
三、搭建dg
** 以下所有主庫操作都在節點1上做,如果需要在節點2上做的,我會標明
1. 主庫開啟歸檔模式,並強制寫日誌
先檢視資料庫的歸檔狀態以及是否開啟強制寫日誌,從下圖可以看到目前資料庫並沒有開啟歸檔,也沒有開啟強制寫日誌
SQL> select log_mode, force_logging from v$database;
資料庫在mount狀態下開啟歸檔
SQL> alter system set log_archive_dest_1='location=+data' sid='*' scope=spfile;
SQL> shutdown immediate; # 兩節點都關閉
SQL> startup mount; # 只開啟節點1
SQL> alter database archivelog;
SQL> alter database open;
強制日誌寫,資料庫在open狀態就能修改
SQL> alter database force logging;
SQL> startup; # 當節點1open完畢後,在節點2上開啟資料庫
再來檢視資料庫的歸檔狀態以及是否開啟強制寫日誌
SQL> select log_mode, force_logging from v$database;
2. 主庫開啟dataguard開關
SQL> alter system set log_archive_config='dg_config=(orcl,orcldg)' sid='*'; # orcl是主庫的db_unique_name,orcldg是從庫的db_unique_name
3. 主庫設定遠端歸檔
SQL> alter system set log_archive_dest_3='service=orcldg valid_for=(online_logfiles,primary_role) db_unique_name=orcldg' sid='*';
4. 將主庫的口令檔案傳送給從庫
[oracle@rac1 ~]$ scp $ORACLE_HOME/dbs/orapw$ORACLE_SID 192.168.56.102:$ORACLE_HOME/dbs/orapworcldg
5. 從庫準備引數檔案
這裡引數檔案跟給單例項搭建單例項dg沒什麼區別,所以不做具體介紹
[root@oradg ~]# vi $ORACLE_HOME/dbs/initorcldg.ora
*.audit_file_dest='/u01/app/oracle/admin/orcldg/adump' *.audit_trail='db' *.compatible='11.2.0.4.0' *.control_files='/u01/app/oracle/oradata/orcldg/controlfile/control01.ctl' *.db_block_size=8192 *.db_domain='' *.db_name='orcl' *.diagnostic_dest='/u01/app/oracle' *.log_archive_config='dg_config=(orcl,orcldg)' *.log_archive_dest_2='location=/u01/app/oracle/oradata/orcldg/archstdlog/ valid_for=(standby_logfiles,standby_role) db_unique_name=orcldg' *.memory_target=838860800 *.open_cursors=300 *.processes=150 *.remote_login_passwordfile='exclusive' *.undo_tablespace='UNDOTBS1' standby_file_management=auto # 該引數預設值是manual,需要將其改為auto,表示主庫的資料檔案發生修改(如新建,重新命名等),相應地從庫也做相應修改 db_unique_name='orcldg' db_file_name_convert='+DATA/orcl/datafile/','/u01/app/oracle/oradata/orcldg/datafile/','+DATA/orcl/tempfile/','/u01/app/oracle/oradata/orcldg/tempfile/' log_file_name_convert='+DATA/orcl/onlinelog/','/u01/app/oracle/oradata/orcldg/onlinelog/'
6. 從庫中準備相關目錄
[oracle@oradg ~]$ mkdir -p /u01/app/oracle/admin/orcldg/adump
[oracle@oradg ~]$ mkdir -p /u01/app/oracle/oradata/orcldg/controlfile
[oracle@oradg ~]$ mkdir -p /u01/app/oracle/oradata/orcldg/archstdlog
[oracle@oradg ~]$ mkdir -p /u01/app/oracle/oradata/orcldg/datafile
[oracle@oradg ~]$ mkdir -p /u01/app/oracle/oradata/orcldg/tempfile
[oracle@oradg ~]$ mkdir -p /u01/app/oracle/oradata/orcldg/onlinelog
7. 啟動從庫例項
[oracle@oradg ~]$ export ORACLE_SID=orcldg
[oracle@oradg ~]$ sqlplus / as sysdba
SQL> create spfile from pfile;
SQL> startup nomount
8. 從庫配置並啟動監聽程式
因為採用duplicate方式複製主庫資料,所以需要將從庫配置為靜態註冊的形式
[oracle@oradg ~]$ vi $ORACLE_HOME/network/admin/listener.ora
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = orcldg) (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1) (SID_NAME = orcldg) ) ) LISTENER = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.102)(PORT = 1521)) )
[oracle@oradg ~]$ lsnrctl start
9. 主庫配置服務命名
# 兩個節點都要設定
[oracle@rac1 ~]$ vi $ORACLE_HOME/network/admin/tnsnames.ora
orcldg = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.102)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcldg) ) )
[oracle@rac2 ~]$ vi $ORACLE_HOME/network/admin/tnsnames.ora
內容跟rac1一致,略
10. 主庫使用網路連線從庫(測試連通性)
# 這裡我的主庫的sys密碼是123456,從庫與主庫一致
[oracle@rac1 ~]$ sqlplus sys/123456@orcldg as sysdba
11. 在主庫啟動rman複製從庫
rman連線主庫和從庫
[oracle@rac1 ~]$ rman target / auxiliary sys/123456@orcldg
RMAN> duplicate target database for standby from active database;
12. 從庫新增standbylog
新增的日誌大小跟主庫的onlinelog保持一致,數量多兩組(主庫的onlinelog資訊檢視v$log)
group的編號不與當前的onlinelog重複即可
[oracle@oradg ~]$ mkdir -p /u01/app/oracle/oradata/orcldg/standbylog/
SQL> alter database add standby logfile group 21 '/u01/app/oracle/oradata/orcldg/standbylog/std01.log' size 50M;
SQL> alter database add standby logfile group 22 '/u01/app/oracle/oradata/orcldg/standbylog/std02.log' size 50M;
SQL> alter database add standby logfile group 23 '/u01/app/oracle/oradata/orcldg/standbylog/std03.log' size 50M;
SQL> alter database add standby logfile group 24 '/u01/app/oracle/oradata/orcldg/standbylog/std04.log' size 50M;
SQL> alter database add standby logfile group 25 '/u01/app/oracle/oradata/orcldg/standbylog/std05.log' size 50M;
SQL> alter database add standby logfile group 26 '/u01/app/oracle/oradata/orcldg/standbylog/std06.log' size 50M;
13. 從庫開啟應用日誌
SQL> alter database recover managed standby database disconnect from session;
14. 主庫切換歸檔
SQL> alter system switch logfile;
15. 開啟從庫
當從庫應用歸檔一段時間後,就關閉應用歸檔日誌,開啟從庫。
SQL> alter database recover managed standby database cancel;
SQL> alter database open;
SQL> alter database recover managed standby database using current logfile disconnect from session;
16. 驗證同步
主庫做修改
SQL> update scott.emp set sal=2000;
SQL> commit;
從庫查詢
SQL> select * from scott.emp;
至此,給rac搭建一個單例項的dg就已經做完了,跟單例項搭建單例項的dg沒什麼區別。接下來介紹如何切換。
四、主從切換準備
17. 主庫新增standby logfile歸檔路徑
使用grid賬號,建立歸檔路徑
[grid@rac1 ~]$ asmcmd
ASMCMD> lsdg # 檢視磁碟組名字
ASMCMD> cd data
ASMCMD> cd orcl
ASMCMD> mkdir ARCHSTDLOG
使用sys資料庫賬號,修改資料庫引數
SQL> alter system set log_archive_dest_2='location=+DATA/ORCL/ARCHSTDLOG/ valid_for=(standby_logfiles,standby_role) db_unique_name=orcl' sid='*';
18. 主庫新增standby logfile
新增的日誌的大小跟主庫的onlinelog保持一致,數量多兩組(主庫的onlinelog資訊檢視v$log)
SQL> alter database add standby logfile thread 1 group 21 ('+data') size 50M;
SQL> alter database add standby logfile thread 1 group 22 ('+data') size 50M;
SQL> alter database add standby logfile thread 1 group 23 ('+data') size 50M;
SQL> alter database add standby logfile thread 2 group 24 ('+data') size 50M;
SQL> alter database add standby logfile thread 2 group 25 ('+data') size 50M;
SQL> alter database add standby logfile thread 2 group 26 ('+data') size 50M;
19. 主庫修改引數檔案
SQL> alter system set standby_file_management=auto sid='*';
SQL> alter system set db_file_name_convert='/u01/app/oracle/oradata/orcldg/datafile/','+DATA/orcl/datafile/','/u01/app/oracle/oradata/orcldg/tempfile/','+DATA/orcl/tempfile/' sid='*' scope=spfile;
SQL> alter system set log_file_name_convert='/u01/app/oracle/oradata/orcldg/onlinelog/','+DATA/orcl/onlinelog/' sid='*' scope=spfile;
到這裡,主庫轉換為備庫的準備工作已完成!
20. 從庫配置tnsnames.ora
這裡的配置tnsnams.ora的目的是,當從庫轉變為主庫之後,原主庫變為從庫,需要給原主庫傳送歸檔日誌,所以這裡的tnsnames要指向原主庫,又由於dg庫應用歸檔只能在一個節點上, 所以toorcl只指向節點1。
[oracle@oradg ~]$ vi $ORACLE_HOME/network/admin/tnsnames.ora
toorcl = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.11)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) )
21. 從庫為onlinelog設定歸檔路徑
[oracle@oradg ~]$ mkdir -p /u01/app/oracle/oradata/orcldg/archivelog
SQL> alter system set log_archive_dest_1='location=/u01/app/oracle/oradata/orcldg/archivelog/ valid_for=(online_logfiles,primary_role) db_unique_name=orcldg';
22. 從庫設定遠端歸檔引數
SQL> alter system set log_archive_dest_3='service=toorcl valid_for=(online_logfiles,primary_role) db_unique_name=orcl';
到這裡,從庫轉為主庫的準備工作已完成!
四、主從切換
23. 檢視主庫的角色轉換狀態
SQL> select database_role,switchover_status from v$database;
24. 在節點1上主轉從
叢集在做角色轉換時,只能有一個例項是開啟狀態,其餘都要關閉,所以將節點2的例項關閉。
SQL> shutdown immediate; # 只在節點2上做
在節點1上執行以下命令,將主庫轉為從庫,並且關閉例項
SQL> alter database commit to switchover to physical standby with session shutdown;
25. 在節點3上從轉主
SQL> select database_role,switchover_status from v$database;
如果是"NOT ALLOWED"表示歸檔還沒有應用完成,可以等待一段時間
如果日誌全部應用了再檢視角色轉換狀態
SQL> select database_role,switchover_status from v$database;
如果角色轉換狀態是TO PRIMARY,那麼表示可以進行角色轉換
執行從轉主的命令,命令執行成功後,資料庫的狀態會變為mount
SQL> alter database commit to switchover to primary;
SQL> alter database open;
26. 開啟新從庫
在節點1和節點2上
SQL> startup
節點1上應用歸檔
SQL> alter database recover managed standby database using current logfile disconnect from session;
節點3上切換歸檔
SQL> alter system switch logfile;
27. 驗證同步
主庫做修改
SQL> update scott.emp set sal=3000;
SQL> commit;
從庫查詢
SQL> select * from scott.emp;
28. 錯誤處理
如果發現日誌傳不到備庫的話可以在主庫通過以下命令檢視錯誤原因
SQL> select dest_id,dest_name,log_sequence,status,error from v$archive_dest;
如果報上面的錯誤的話,可以把歸檔開關重啟一下即可
SQL> alter system set log_archive_dest_state_3='defer' sid='*';
SQL> alter system set log_archive_dest_state_3='enable' sid='*';
五、總結
1. dg的切換需要停掉所有的應用,並把資料庫的所有連線全部kill掉,賬號全鎖,切換完成後再解鎖
2. rac在切換時,只留一個活的例項,其它全部關閉
3. 命令每執行一條,就留意返回的結果,並實時檢視alert