一、概述
本文將介紹如何給rac搭建單節點的dg,以及如何對其進行角色轉換。預先具備的知識(rac搭建,單實例-單實例dg搭建)
二、實驗環境介紹
主庫rac(已安裝rac,并已有數據庫orcl)
1
2
|
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. 主庫打開歸檔模式,并強制寫日志
先查看數據庫的歸檔狀態以及是否開啟強制寫日志,從下圖可以看到目前數據庫并沒有打開歸檔,也沒有開啟強制寫日志
1
|
SQL> select log_mode, force_logging from v$ database ; |
數據庫在mount狀態下打開歸檔
1
2
3
4
5
|
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狀態就能修改
1
2
|
SQL> alter database force logging; SQL> startup; # 當節點1open完畢后,在節點2上打開數據庫 |
再來查看數據庫的歸檔狀態以及是否開啟強制寫日志
1
|
SQL> select log_mode, force_logging from v$ database ; |
2. 主庫打開dataguard開關
1
|
SQL> alter system set log_archive_config= 'dg_config=(orcl,orcldg)' sid= '*' ; # orcl是主庫的db_unique_name,orcldg是從庫的db_unique_name |
3. 主庫設置遠程歸檔
1
|
SQL> alter system set log_archive_dest_3= 'service=orcldg valid_for=(online_logfiles,primary_role) db_unique_name=orcldg' sid= '*' ; |
4. 將主庫的口令文件傳送給從庫
1
|
[oracle@rac1 ~]$ scp $ORACLE_HOME/dbs/orapw$ORACLE_SID 192.168.56.102:$ORACLE_HOME/dbs/orapworcldg |
5. 從庫準備參數文件
這里參數文件跟給單實例搭建單實例dg沒什么區別,所以不做具體介紹
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
[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. 從庫中準備相關目錄
1
2
3
4
5
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. 啟動從庫實例
1
2
3
4
|
[oracle@oradg ~]$ export ORACLE_SID=orcldg [oracle@oradg ~]$ sqlplus / as sysdba SQL> create spfile from pfile; SQL> startup nomount |
8. 從庫配置并啟動監聽程序
因為采用duplicate方式復制主庫數據,所以需要將從庫配置為靜態注冊的形式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
[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. 主庫配置服務命名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# 兩個節點都要設置 [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. 主庫使用網絡連接從庫(測試連通性)
1
2
|
# 這里我的主庫的sys密碼是123456,從庫與主庫一致 [oracle@rac1 ~]$ sqlplus sys/123456@orcldg as sysdba |
11. 在主庫啟動rman復制從庫
rman連接主庫和從庫
1
2
|
[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重復即可
1
2
3
4
5
6
7
8
|
[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. 從庫打開應用日志
1
|
SQL> alter database recover managed standby database disconnect from session; |
14. 主庫切換歸檔
1
|
SQL> alter system switch logfile; |
15. 打開從庫
當從庫應用歸檔一段時間后,就關閉應用歸檔日志,打開從庫。
1
2
3
|
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. 驗證同步
主庫做修改
1
2
|
SQL> update scott.emp set sal=2000; SQL> commit ; |
從庫查詢
1
|
SQL> select * from scott.emp; |
至此,給rac搭建一個單實例的dg就已經做完了,跟單實例搭建單實例的dg沒什么區別。接下來介紹如何切換。
四、主從切換準備
17. 主庫添加standby logfile歸檔路徑
使用grid賬號,創建歸檔路徑
1
2
3
4
5
|
[grid@rac1 ~]$ asmcmd ASMCMD> lsdg # 查看磁盤組名字 ASMCMD> cd data ASMCMD> cd orcl ASMCMD> mkdir ARCHSTDLOG |
使用sys數據庫賬號,修改數據庫參數
1
|
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)
1
2
3
4
5
6
|
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. 主庫修改參數文件
1
2
3
|
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
這里的配置tnsnames.ora的目的是,當原從庫轉變為新主庫之后,原主庫變為新從庫,新主庫需要給新從庫發送歸檔日志,所以這里的tnsnames要指向新從庫,又由于dg庫應用歸檔只能在一個節點上, 所以toorcl只指向節點1。
1
2
3
4
5
6
7
8
9
10
11
12
|
[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設置歸檔路徑
1
2
3
|
[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. 從庫設置遠程歸檔參數
1
|
SQL> alter system set log_archive_dest_3= 'service=toorcl valid_for=(online_logfiles,primary_role) db_unique_name=orcl' ; |
到這里,從庫轉為主庫的準備工作已完成!
四、主從切換
23. 查看主庫的角色轉換狀態
1
|
SQL> select database_role,switchover_status from v$ database ; |
24. 在節點1上主轉從
集群在做角色轉換時,只能有一個實例是打開狀態,其余都要關閉,所以將節點2的實例關閉。
SQL> shutdown immediate; # 只在節點2上做
在節點1上執行以下命令,將主庫轉為從庫,并且關閉實例
1
|
SQL> alter database commit to switchover to physical standby with session shutdown; |
25. 在節點3上從轉主
1
|
SQL> select database_role,switchover_status from v$ database ; |
如果是"NOT ALLOWED"表示歸檔還沒有應用完成,可以等待一段時間
如果日志全部應用了再查看角色轉換狀態
1
|
SQL> select database_role,switchover_status from v$ database ; |
如果角色轉換狀態是TO PRIMARY,那么表示可以進行角色轉換
執行從轉主的命令,命令執行成功后,數據庫的狀態會變為mount
1
2
|
SQL> alter database commit to switchover to primary ; SQL> alter database open ; |
26. 打開新從庫
在節點1和節點2上
SQL> startup
節點1上應用歸檔
1
|
SQL> alter database recover managed standby database using current logfile disconnect from session; |
節點3上切換歸檔
1
|
SQL> alter system switch logfile; |
27. 驗證同步
主庫做修改
1
2
|
SQL> update scott.emp set sal=3000; SQL> commit ; |
從庫查詢
1
|
SQL> select * from scott.emp; |
28. 錯誤處理
如果發現日志傳不到備庫的話可以在主庫通過以下命令查看錯誤原因
1
|
SQL> select dest_id,dest_name,log_sequence,status,error from v$archive_dest; |
如果報上面的錯誤的話,可以把歸檔開關重啟一下即可
1
2
|
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.log
總結
以上所述是小編給大家介紹的Oracle 給rac創建單實例dg并做主從切換功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!
原文鏈接:https://www.cnblogs.com/ddzj01/p/12044310.html