一.oracle data guard 主要用于確定企業資料的高可用,資料保護和容災恢複。
二.典型的dg 配置包含一個主庫和一個或若幹個備庫。主庫用于正常的企業操作使用,并且将redo 資料傳送到備庫中。備庫可以在遠端機器上,也可以再本機。通常配置如下圖
三.data guard 的保護模式
①Maximum availability這種保護模式提供了最進階别的資料保護,不惜犧牲主庫的可用性。在這種模式下,隻有主庫産生的需要recover的那些redo data 至少寫入到了一個相同步的standby database 的standby redo log裡,主庫的事務才會送出。這種模式確定了資料的零丢失
②Maximum performance這種模式是data guard預設的保護模式,也算是最進階别的保護模式,不過不會影響主庫的性能。隻要事物産生的那些redo data 被寫到了online log上事物就可以送出。這些redo data也需要向其他一個或多個的備庫寫,它可以和事物送出不同步。是以主庫的性能在向備庫寫 redo data時不會受到影響。
③Maximum protection這種模式可以 確定當主機當機時沒有資料丢失。這種模式是在送出事物之前必須将要恢複的redo data寫入到online log 和至少一個的standby database中,為了防止資料丢失,當redo data無法寫入到被庫時,主庫直接shutdown。
四.配置
主庫
IP: 192.168.163.139
sid: eras
db_unique_name: primary
備庫
IP: 192.168.163.140
sid: eras
db_unique_name standby
1.資料庫設定為歸檔模式,歸檔目錄/home/oracle/archivelog/
關閉資料庫,重新開機加載 sql>shutdown immediate; sql>startup mount;
設定歸檔,并建立歸檔目錄sql>alter database archivelog; sql>!mkdir -p /home/oracle/archivelog
設定主備參數 sql>alter system set log_archive_dest_1=’location=/home/oracle/archivelog/ valid_for=(all_logfiles,all_roles) db_unqique_name=primary’ scope=spfile; (主庫)
sql>alter system set log_archive_dest_1=’location=/home/oracle/archivelog/ valid_for=(all_logfiles,all_roles) db_unique_name=standby’ scope=spfile; (備庫)
設定歸檔日志格式sql>alter system set log_archive_format=’%t_%s_%r.arc’ scope =spfile;
sql>alter system set remote_login_passwordfile=exclusive scope =spfile;
sql> alter database open
sql>alter system archive log start;
2.啟用資料庫閃回功能
檢視閃回目錄sql>show parameter db_recovery_file_dest;
修改閃回目錄打下sql>alter system set db_recovery_file_dest_size=10G;
檢視閃回功能的啟用狀态sql>select flashback_on from v$database;
啟用閃回功能sql>alter database flashback on;
3.檢視data guard是否安裝,如未安裝,需安裝
sql>select * from v$option where parameter=’Oracle Data Guard’;
4.設定強制記錄日志
sql>alter database force logging;
5.設定自動管理備庫檔案
sql>alter system set standby_file_management=’AUTO’;
6.添加日志檔案組
在建立standby logfile時需要注意,standby logfile的大小不小于online redo log files的大小
查詢 online redo log files 的大小 sql>select group#,bytes/1024/1024 as M from v$log;
一般,standby logfiles 日志檔案組數要比primary資料庫的online redo log files 日志檔案組數至少多一個。
※不建議組号group#緊挨着online redo log file的組号,可以從11到14建立standby logfile
建立目錄dg
sql>!mkdir /u01/app/oracle/oradata/eras/dg
sql>!chmod 777 /u01/app/oracle/oradata/eras/dg
添加日志檔案組
sql>alter database add standby logfile group 11 ‘/u01/app/oracle/oradata/eras/dg/standby11.log’ size 50M;
sql>alter database add standby logfile group 12 ‘/u01/app/oracle/oradata/eras/dg/standby12.log’ size 50M;
sql>alter database add standby logfile group 13 ‘/u01/app/oracle/oradata/eras/dg/standby13.log’ size 50M;
sql>alter database add standby logfile group 14 ‘/u01/app/oracle/oradata/eras/dg/standby14.log’ size 50M;
※以上所有步驟,出标有主備的其他的主備庫都一樣。都需要執行一遍。
7.配置db_unique_name
先檢視db_unique_name sql>show parameter db_unique_name;
主庫: sql>alter system set db_unique_name=’primary’ scope=spfile;
備庫: sql>alter system set db_unique_name=’standby’ scope=spfile;
名字加上引号儲存的就是小寫的,不加引号會自動儲存成大寫。
8.配置fal_server
主庫: sql>alter system set fal_server=’standby’ scope=spfile;
sql>alter system set log_archive_config=’dg_config=(primary,standby)’ scope=spfile;
備庫: sql>alter system set fal_server=’primary’ scope=spfile;
sql>alter system set log_archive_config=’dg_config=(primary,standby)’ scope=spfile;
9.配置重做日志到備庫
主庫: sql>alter system set log_archive_dest_2=’service=standby async valid_for=(online_logfiles,primary_role) db_unique_name=standby’ scope=spfile;
備庫: sql>alter system set log_archive_dest_2=’service=primary async valid_for=(online_logfiles,primary_role) db_unique_name=primary’ scope=spfile;
10.複制主庫密碼檔案到備庫
密碼檔案位置為$ORACLE_HOME/dbs/orapweras
//生成密碼檔案(如果沒有的話)
//orapwd file=$ORACLE_HOME/dbs/orapweras password=Oracle1521
關閉主備庫
sql>shutdown immediate;
複制檔案
scp /u01/app/oracle/product/12.1.0.2/db_1/dbs/orapweras [email protected]:/u01/app/oracle/product/12.1.0.2/db_1/dbs
提示輸入密碼
備庫oracle使用者的密碼輸入即可
11.複制主庫standby控制檔案到備庫
備庫控制檔案在兩個地方,是以需要複制兩次
/u01/app/oracle/oradata/eras/control01.ctl
/u01/app/oracle/fast_recovery_area/eras/control02.ctl
關閉主備庫sql>shutdown immediate;
主庫
生成standby控制檔案
sql>startup mount;
sql>alter database create standby controlfile as ‘/home/oracle/standby.ctl’;
sql>shutdown immediate;
複制改檔案到備庫
scp /home/oracle/standby1.ctl [email protected]:/u01/app/oracle/oradata/eras/control01.ctl
scp /home/oracle/standby1.ctl [email protected]:/u01/app/oracle/fast_recovery_area/eras/control02.ctl
12.配置主備庫的listener.ora、tnsnames.ora檔案
路徑:$ORACLE_HOME/network/admin/listener.ora
(配置完後,主庫終端執行tnsping standby,備庫終端執行tnsping primary 如果都為ok則配置成功)
主庫
vim $ORACLE_HOME/network/admin/listener.ora
SID_LIST=LISTENER=
(SID_LIST=
(SID_DESC=
(
(GLOBAL_DBNAME=primary)
(ORACLE_HOME=/u01/app/oracle/product/12.1.0.2/db_1)
(SID_NAME=eras)
)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.163.139)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
vim $ORACLE_HOME/network/admin/tnsnames.ora
primary=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.163.139)(PORT=1521))
)
(CONNECT_DATA=
(SERVICE_NAME=primary.localdomain)
)
)
standby=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.163.140)(PORT=1521))
)
(CONNECT_DATA=
(SERVICE_NAME=standby.localdomain)
)
)
備庫
vim $ORACLE_HOME/network/admin/listener.ora
SID_LIST=LISTENER=
(SID_LIST=
(SID_DESC=
(
(GLOBAL_DBNAME=standby)
(ORACLE_HOME=/u01/app/oracle/product/12.1.0.2/db_1)
(SID_NAME=eras)
)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.163.140)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
vim $ORACLE_HOME/network/admin/tnsnames.ora
primary=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.163.139)(PORT=1521))
)
(CONNECT_DATA=
(SERVICE_NAME=primary.localdomain)
)
)
standby=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.163.140)(PORT=1521))
)
(CONNECT_DATA=
(SERVICE_NAME=standby.localdomain)
)
)
重新開機監聽
先重新開機備庫
lsnrctl stop
lsnrctl start
後重新開機主庫
lsnrctl stop
lsnrctl start
13.複制主庫檔案到備庫(保證主備庫資料檔案一緻)
關閉主備庫sql>shutdown immediate;
主庫
scp –rp /u01/app/oracle/oradata/eras/* [email protected]:/u01/app/oracle/oradata/eras
※複制時會把主庫的control01.ctl也複制到備庫中,這個檔案和步驟11生成的不一樣,是以仍需要在執行一次
scp /home/oracle/standby.ctl[email protected]:/u01/app/oracle/oradata/eras/control01.ctl
啟動與關閉physical standby database
- 啟動監聽
備庫
lsnrctl start
主庫
lsnrctl start
- 啟動資料庫
備庫
startup nomount;
alter databse mount standby database;
啟動redo應用
alter database recover managed standby database disconnect from session;
主庫
startup;
- 關閉
主庫
shutdown immediate;
備庫
alter database recover managed standby database cancel;
shutdown immediate;
檢視資料庫狀态
select name,open_mode,database_role,protection_mode from v$database;
檢查standby配置是否成功
1)确認主、備庫裡的歸檔目的地配置及傳送都是有效的
select dest_name,status,destination,error from v$archive_dest where dest_id<=2;
log_archive_dest_1和2狀态應該是valid
2)确認主庫重做日志是否被應用了。
select sequence#, first_time, next_time, applied, archived from v$archived_log;
如果歸檔和日志應用均正常,APPLIED 和 ARCHIVED 列都應該是 YES。如果沒有應用redo,applied應該是NO
3)檢查主庫是否有重做日志缺口
如果一切正常,應該傳回 VALID 和 NO GAP
select status, gap_status from v$archive_dest_status where dest_id = 2;
4)檢查主、備庫data guard狀态是否有錯
select * from v$dataguard_status order by timestamp;
5)測試日志序号是否正确
在主庫切換幾次日志:
alter system switch logfile;
檢視主庫日志序号:
select max(sequence#) from v$archived_log;
驗證備庫日志序号
select max(sequence#) from v$archived_log;
備庫伺服器管理
啟動模式
- 啟動到管理模式
shutdown immediate;
startup nomount;
alter database mount standby database;
alter database recover managed standby database disconnect from session;
- 啟動到隻讀模式
shutdown immediate;
startup nomount;
alter database mount standby database;
alter database open read only;
- 管理恢複模式到隻讀模式(該模式是可以檢視備庫中接受的change,但redoapply不應用)
recover managed standby database cancel;
alter database open read only;
- 隻讀模式到管理恢複模式
recover managed standby database disconnect from session;
- 暫停
alter database recover managed standby database cancel;
- 關閉
alter database recover managed standby database cancel;
shutdown immediate;