Data Guard 環境:
操作系統: redhat 4.7
Primary數據庫:
IP地址:10.85.10.1。
數據庫SID:orcl
DB_UNIQUE_NAME:orcl_pd
Standby數據庫:
IP地址:10.85.10.2
數據庫SID:orcl。
DB_UNIQUE_NAME:orcl_st
一. Primary 端的配置
1. 主庫設置為force logging 模式
SQL> alter database force logging;
2. 主庫設為歸檔模式
SQL> archive log list;
SQL> shutdown immediate
SQL> startup mount
SQL> alter database archivelog;
SQL> archive log list;
3. 添加redo log file
添加一個新的Standby Redologs組(注意組號不要與當前存在的Online Redologs組重復),并為該組指定一個成員:
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('/u01/app/oracle/oradata/orcl/redo04.log') size 50M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/u01/app/oracle/oradata/orcl/redo05.log') size 50M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/u01/app/oracle/oradata/orcl/redo06.log') size 50M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/u01/app/oracle/oradata/orcl/redo07.log') size 50M;
4. 修改listener.ora 和tnsnames.ora 文件
Listener.ora 文件:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(SID_NAME = orcl)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
注意:SID_LIST_LISTENER 配置的是靜態注冊,如果沒有該參數,而且Data Guard 啟動順序又不正確,那么在主庫可能會報 PING[ARC1]: Heartbeat failed to connect to standby 'orcl_st'. Error is 12514. 錯誤,導致歸檔無法完成。
Oracle Listener 動態注冊 與 靜態注冊
http://blog.csdn.net/tianlesoftware/archive/2010/04/30/5543166.aspx
Tnsnames.ora 文件
ORCL_ST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.85.10.2)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
ORCL_PD =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.85.10.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
5. 創建備庫的密碼文件和控制文件
SQL> alter database create standby controlfile as '/u01/control01.ctl';
-- 說明: 判斷一個數據庫是Primary還是Standby,就是通過控制文件來判斷的。
[oracle@localhost dbs]$ orapwd file=/u01/app/oracle/product/10.2.0/db_1/dbs/orapworcl password=admin
如果已經存在,就不用創建了。 缺省情況下,win下口令文件的格式是pwdsid.ora,unix下的格式是orapwSID(大小寫敏感)
6. 修改初始化參數文件
SQL> create pfile='/u01/initorcl.ora' from spfile;
在initorcl.ora 添加如下內容:
####主庫參數######
*.DB_NAME ='orcl';
*.DB_UNIQUE_NAME='orcl_pd'
#--列出DG中所有DB_UNIQUE_NAME
*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(orcl_pd,orcl_st)'
*.LOG_ARCHIVE_DEST_1='LOCATION=/u01/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl_pd'
*.LOG_ARCHIVE_DEST_2='service=orcl_st DB_UNIQUE_NAME=orcl_st'
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
#####備庫參數#######
*.FAL_SERVER=orcl_st
*.FAL_CLIENT=orcl_pd
*.standby_file_management='AUTO'
*.standby_archive_dest='/u01/archive'
#如果主備庫目錄不同,還需要添加:
#*.log_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
#*.db_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
用'/u01/initorcl.ora' 這個pfile 啟動數據庫,并生成spfile。
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup pfile='/u01/initorcl.ora';
ORACLE instance started.
Total System Global Area 167772160 bytes
Fixed Size 1218316 bytes
Variable Size 79694068 bytes
Database Buffers 83886080 bytes
Redo Buffers 2973696 bytes
Database mounted.
Database opened.
SQL> create spfile from pfile='/u01/initorcl.ora';
File created.
二. Standby 端配置
1. 創建備庫存放數據文件和后臺跟蹤目錄, 這個目錄可以和主庫相同, 如果不同,就需要在主庫的初始化文件中進行轉換。
如:
*.log_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
*.db_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
$ORACLE_BASE/ORADATA/ORCL
$ORACLE_BASE/admin/orcl
$ORACLE_BASE/admin/orcl/adump
$ORACLE_BASE/admin/orcl/bdump
$ORACLE_BASE/admin/orcl/cdump
$ORACLE_BASE/admin/orcl/dpdump
$ORACLE_BASE/admin/orcl/pfile
$ORACLE_BASE/admin/orcl/udump
$ORACLE_BASE/admin/orcl/
2. 將主庫的密碼文件,控制文件,數據文件,參數文件,日志文件copy到備庫。
說明一點,這個控制文件是我們自己創建的standby 控制文件。將copy過來的控制文件再復制三份就可以了。 主備的控制文件是不一樣的。 這里除了采用直接copy 文件之外,還可以采用Rman 恢復來做。 直接copy 需要停數據庫,如果采用RMAN 的話,就不需要停機了。
[oracle@localhost orcl]$ pwd
/u01/app/oracle/oradata/orcl
[oracle@localhost orcl]$ ls
control01.ctl redo01.log redo04.log redo07.log temp01.dbf
control02.ctl redo02.log redo05.log sysaux01.dbf undotbs01.dbf
control03.ctl redo03.log redo06.log system01.dbf users01.dbf
[oracle@localhost orcl]$ scp *.dbf 10.85.10.2://u01/app/oracle/oradata/orcl
[oracle@localhost u01]$ scp *.ctl 10.85.10.2://u01/app/oracle/oradata/orcl
[oracle@localhost u01]$ scp *.log 10.85.10.2://u01/app/oracle/oradata/orcl
[oracle@localhost u01]$ scp initorcl.ora 10.85.10.2://u01/app/oracle/product/10.2.0/db_1/dbs
[oracle@localhost dbs]$ scp orapworcl 10.85.10.2://u01/app/oracle/product/10.2.0/db_1/dbs
3. 修改初始化參數文件
修改之后如下:
####主庫參數######
*.DB_NAME ='orcl';
*.DB_UNIQUE_NAME='orcl_st'
#--列出DG中所有DB_UNIQUE_NAME
*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(orcl_pd,orcl_st)'
*.LOG_ARCHIVE_DEST_1='LOCATION=/u01/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl_st'
*.LOG_ARCHIVE_DEST_2='service=orcl_pd DB_UNIQUE_NAME=orcl_pd'
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
#####備庫參數#######
*.FAL_SERVER=orcl_pd
*.FAL_CLIENT=orcl_st
*.standby_file_management='AUTO'
*.standby_archive_dest='/u01/archive'
#如果主備庫目錄不同,還需要添加:
#*.log_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
#*.db_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
4. 修改listener.ora 和 tnsnames.ora 文件,如果不存在,就從主庫上copy 過去。
5. 在備庫添加redo log file
如果主庫沒有添加redo log file,可以先用copy 過來的初始化文件將數據庫啟動到mount 狀態。在創建個spfile,最后添加redo log。
SQL> startup mount pfile='/u01/app/oracle/product/10.2.0/db_1/dbs/initorcl.ora'
ORACLE instance started.
SQL> create spfile from pfile='/u01/app/oracle/product/10.2.0/db_1/dbs/initorcl.ora';
添加一個新的Standby Redologs組(注意組號不要與當前存在的Online Redologs組重復),并為該組指定一個成員:
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('/u01/app/oracle/oradata/orcl/redo04.log') size 50M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/u01/app/oracle/oradata/orcl/redo05.log') size 50M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/u01/app/oracle/oradata/orcl/redo06.log') size 50M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/u01/app/oracle/oradata/orcl/redo07.log') size 50M;
提示,由于從Primary數據庫復制文件時并沒有復制Online Redologs,因此物理Standby數據庫在第一次啟動REDO應用時,會在Alert文件中報Online Redo Logfile文件不存在,沒有關系,物理Standby會自動重建這批文件,同時你也不用擔心會丟失數據,Online Redologs中的數據會以歸檔文件的形式從Primary端接收。
至此,Data Guard 的操作已經完成,下面來開始驗證。
注意Data Guard 啟動順序:
啟動順序:先standby ,后primary;
關閉順序:先primary 后standby;
在備庫將實例啟動到mount 狀態:
SQL> startup nomount;
SQL>alter database mount standby database ;
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
SQL>alter database recover managed standby database disconnect from session;
在備庫啟動監聽:
$lsnrctl start
在主庫啟動實例:
SQL> startup;
在主庫啟動監聽:
$lsnrctl start
在主庫驗證歸檔目錄是否有效:
SQL> SELECT STATUS,DESTINATION, ERROR FROM V$ARCHIVE_DEST;
如果有錯誤,要排查原因。
SQL> alter system switch logfile;
SQL> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
70
主備查詢結果一致,Data Guard 搭建結束。
注意:如果在主庫執行 alter database clear unarchived logfile或alter database open resetlogs , 則dataguard要重建。
三. 一些其他操作
1. 首先查看當前的保護模式 ---primary數據庫操作
SQL> select protection_mode,protection_level from v$database;
PROTECTION_MODE PROTECTION_LEVEL
-------------------- --------------------
MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE
2. 設置新的數據保護模式并重啟數據庫 --primary數據庫操作
當保護模式更改順序:
maximize protection ---> maximize availability ----> maximize performance
當在把dataguard的保護級別按這上面的順序減低的時候, 不需要primary庫在mount狀態,否則primary 必須在mount 狀態。
如:
SQL> alter database set standby database to maximize availability;
alter database set standby database to maximize availability
*
ERROR at line 1:
ORA-01126: database must be mounted in this instance and not open in any
instance
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 167772160 bytes
Fixed Size 1218316 bytes
Variable Size 79694068 bytes
Database Buffers 83886080 bytes
Redo Buffers 2973696 bytes
Database mounted.
SQL> alter database set standby database to maximize availability;
Database altered.
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
報錯了,這是因為最大可用性需要先修改日志傳送方式為lgwr同步方式,否則,數據庫是無法open.
Maximum protection/AVAILABILITY模式必須滿足以下條件
Redo Archival Process: LGWR
Network Tranmission mode: SYNC
Disk Write Option: AFFIRM
Standby Redo Logs: Yes
standby database type: Physical Only
SQL> alter system set log_archive_dest_2='service=orcl_st lgwr sync AFFIRM';
System altered.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 167772160 bytes
Fixed Size 1218316 bytes
Variable Size 79694068 bytes
Database Buffers 83886080 bytes
Redo Buffers 2973696 bytes
Database mounted.
SQL> alter database set standby database to maximize availability;
Database altered.
SQL> alter database open;
Database altered.
SQL> select protection_mode,protection_level from v$database;
PROTECTION_MODE PROTECTION_LEVEL
-------------------- --------------------
MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY
alter database set standby database to maximize performance;
提示:maximize后可跟{PROTECTION | AVAILABILITY | PERFORMANCE},分別對應最大保護,最高可用性及最高性能。
在最大保護模式下,直接關閉備庫是不行的,如果在備庫上關閉數據庫,會有如下提示:
SQL> shutdown immediate
ORA-01154: database busy. Open, close, mount, and dismount not allowed now
SQL>
在最大保護模式下,備庫是不允許關閉的,此時首先關閉主庫,然后備庫就可以順利關閉了。
注意: 主庫的保護模式修改之后,備庫的模式也會改變,和主庫保持一致。
3. 查看日志歸檔情況
主庫進行日志切換:
SQL>Alter system switch logfile;
select max(sequence#) from v$archived_log;
select max(sequence#) from v$log_history;
select group#,sequence#,archived,status from v$log;
select name,sequence#,applied from v$archived_log;
select sequence#,applied from v$archived_log;
若不同步,
1) 看log日志, archive是否有丟失
2)可以在備庫坐如下操作:
alter database recover managed standby database cancel;
alter database recover managed standby database disconnect from session;
四. 主備庫切換
4.1 Switchover
一般SWITCHOVER切換都是計劃中的切換,特點是在切換后,不會丟失任何的數據,而且這個過程是可逆的,整個DATA GUARD環境不會被破壞,原來DATA GUARD環境中的所有物理和邏輯STANDBY都可以繼續工作。
在進行DATA GUARD的物理STANDBY切換前需要注意:
1)確認主庫和從庫間網絡連接通暢;
2)確認沒有活動的會話連接在數據庫中;
3)PRIMARY數據庫處于打開的狀態,STANDBY數據庫處于MOUNT狀態;
4)確保STANDBY數據庫處于ARCHIVELOG模式;
5)如果設置了REDO應用的延遲,那么將這個設置去掉;
6)確保配置了主庫和從庫的初始化參數,使得切換完成后,DATA GUARD機制可以順利的運行。
主庫:
1. 查看switchover 狀態
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
--------------------
TO STANDBY
附: A:switchover_status出現session active/not allowed
當出現session active的時候表示還有活動的session,則運行
Alter database commit to switchover to physical standby with session shutdown;
當出現not allowed時,在官方文檔說轉換會不成功,但是我測試的時候成功了。
B.ora- 01153: an incompatible media recovery is active
運行下面代碼
Alter database recover managed standby database finish;
或者Alter database recover managed standby database finish force;
Alter database recover managed standby database disconnect from session;
2 切換成備庫
SQL>Alter database commit to switchover to physical standby with session shutdown;
或者
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY;
Database altered.
3 啟動到mount和應用日志狀態
SQL> SHUTDOWN IMMEDIATE
SQL> startup nomount;
SQL> alter database mount standby database;
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
4. 查看數據庫模式
SQL>select dest_name,status,database_mode,recovery_mode,protection_mode from v$archive_dest_status;
SQL>select status,database_mode from v$archive_dest_status;
備庫:
1.查看switchover狀態
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
TO PRIMARY
附:若不是用此語句切換:ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY with session shutdown
補充:若出現:ORA-16139: media recovery required
是因為沒有執行:alter database recover managed standby database disconnect from session;
2. 切換成主庫
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
Database altered.
SQL> shutdown immediate;
SQL> startup;
SQL> alter system switch logfile;
3. 查看數據庫模式
SQL>select dest_name,status,database_mode,recovery_mode,protection_mode from v$archive_dest_status;
SQL>select status,database_mode from v$archive_dest_status;
驗證同步:
SQL> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
78
4.2. Failovers:
FAILOVER切換一般是PRIMARY數據庫發生故障后的切換,這種情況是STANDBY數據庫發揮其作用的情況。這種切換發生后,可能會造成數據的丟失。而且這個過程不是可逆的,DATA GUARD環境會被破壞。
由于PRIMARY數據庫已經無法啟動,所以FAILOVER切換所需的條件并不多,只要檢查STANDBY是否運行在最大保護模式下,如果是的話,需要將其置為最大性能模式,否則切換到PRIMARY角色也無法啟動。
1. 查看是否有日志GAP,沒有應用的日志:
SQL> SELECT UNIQUE THREAD#, MAX(SEQUENCE#) OVER(PARTITION BY THREAD#) LAST FROM V$ARCHIVED_LOG;
SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
如果有,則拷貝過來并且注冊
SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE '路徑';
重復查看直到沒有應用的日志:
2. 然后停止應用歸檔:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
Database altered.
3. 下面將STANDBY數據庫切換為PRIMARY數據庫:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
或 SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE;
Database altered.
SQL> SELECT DATABASE_ROLE FROM V$DATABASE;
DATABASE_ROLE
----------------
PHYSICAL STANDBY
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
Database altered.
SQL> ALTER DATABASE OPEN; 或者 shutdown immediate+startup
Database altered.
檢查數據庫是否已經切換成功:
SQL> SELECT DATABASE_ROLE FROM V$DATABASE;
DATABASE_ROLE
----------------
PRIMARY
至此,FAILOVER切換完成。這個時候應該馬上對新的PRIMARY數據庫進行備份。