ORACLE11g R2【單實例 FS→單實例FS】
ORACLE11g R2【單實例 FS→單實例FS】
本演示案例所用環境:
|
primary |
standby |
OS Hostname |
pry |
std |
OS Version |
RHEL6.5 |
RHEL6.5 |
DB Version |
11.2.0.4 |
11.2.0.4 |
db_name |
stephen |
stephen |
db_unique_name |
stephen |
standby |
service_names |
stephen |
standby |
instance_name |
stephen |
standby |
Primary database configure
1.啟用primary force logging
SQL> select force_logging from v$database;
SQL> alter database force logging;
2.配置redo傳輸認證
(1) tnsnames.ora
STEPHEN =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = pry)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = stephen)
)
)
STANDBY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = std)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = standby)
)
)
(2) tnsping命令解析網絡服務名,命令須返回OK.
此時,standby端未配置監聽,無法解析,可以standby配置後再測試。
$ tnsping standby
(2) 密碼文件
若無密碼文件,則創建密碼文件。格式:orapw<ORACLE_SID>
cd $ORACLE_HOME/dbs
orapwd file=orapwstephen password=oracle ignorecase=y force=y
3.添加standby logfiles
添加standby logfile 的要求:
(1) 確保主和備數據庫上的日誌文件大小是相同的
(2) 確定備庫重做日誌文件組的適當數目
Standby logfile數 = (每個線程的logfile數+1)* 線程數
(3) 檢查create database時指定的MAXLOGFILES和MAXLOGMEMBERS參數,可以通過trace controlfile出來查看
(4) RAC環境創建standby logfile,指定thread#創建
每個thread的standby logfile數 = 每個thread的logfile數 + 1
檢查當前環境的logfile:
set lines 200 pages 300
col member for a60
select a.thread#,a.group#,b.member,b.type,a.bytes/1024/1024 MB from v$log a,v$logfile b where a.group#=b.group#
union all
select a.thread#,a.group#,b.member,b.type,a.bytes/1024/1024 MB from v$standby_log a,v$logfile b where a.group#=b.group#;
根據查詢的logfile 信息上文添加standby logfile的要求,添加合理的standby logfile,然後用上面的sql再次查看當前環境的logfile:
SQL> alter database add standby logfile
group 4 ‘/oradata/stephen/redo04.log‘ size 50M,
group 5 ‘/oradata/stephen/redo05.log‘ size 50M,
group 6 ‘/oradata/stephen/redo06.log‘ size 50M,
group 7 ‘/oradata/stephen/redo07.log‘ size 50M;
4.修改primary參數文件
備份spfile:
create pfile=‘/tmp/pfile.bak‘ from spfile;
修改以下參數,其中stephen,standby分別為primary,standby的db_unqiue_name/TNS-Alias,詳見參數詳解部分:
alter system set log_archive_config=‘dg_config=(stephen,standby)‘;
alter system set log_archive_dest_1=‘location=/oradata/arch valid_for=(all_logfiles,all_roles) db_unique_name=stephen‘;
alter system set log_archive_dest_2=‘service=standby lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=standby‘;
alter system set log_archive_max_processes=30; #根據需求調整個數
確認以下參數默認值,如不為以下參數值,則修改:
alter system set remote_login_passwordfile=exclusive scope=spfile;
# remote_login_passwordfile=exclusive/shared
alter system set log_archive_dest_state_1=enable;
alter system set log_archive_dest_state_2=enable;
log_archive_format參數控制歸檔文件名稱格式,默認值以.dbf結尾,為了與datafile區分,建議修改為.arc結尾:
alter system set log_archive_format=‘%t_%s_%r.arc‘ scope=spfile;
當primary切換為standby角色後,需要增加修改以下參數,建議配置:
alter system set fal_server=standby;
alter system set standby_file_management=auto;
# primary和standby的datafile和logfile存儲路徑不一樣時,設定以下參數:
alter system set db_file_name_convert=‘/oradata/standby‘,‘/oradata/stephen‘ scope=spfile;
alter system set log_file_name_convert=‘/oradata/standby‘,‘/oradata/stephen‘ scope=spfile;
註:以上參數,指定spfile修改的,在實例重啟後生效。
5.打開歸檔模式
首先確認當前數據庫是否是歸檔模式,如果不是,則打開歸檔模式。
archive log list;
shutdown immediate;
startup mount;
alter database archivelog;
archive log list;
alter database open;
6.備份primary database
可以使用之前的備份,但需要確保備份以來的歸檔沒有丟失。
rman target / <<EOF
run{allocate channel c1 type disk;
allocate channel c2 type disk;
backup full database format ‘/backup/full_%U.bak‘ plus archivelog;
sql ‘alter system switch logfile‘;
backup current controlfile for standby format ‘/backup/c_%U.bak‘;
release channel c1;
release channel c2;
}
EOF
Standby database configure
1.配置環境變量
export ORACLE_BASE=/oracle/app/oracle
export ORACLE_HOME=/oracle/app/oracle/product/11.2.0/db_1
export ORACLE_SID=standby
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib #不同平臺變量名不一樣
2.配置redo傳輸認證
(1) listener.ora
配置靜態監聽:
LISTENER =
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcp)(HOST=std)(PORT=1521))
)
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=standby)
(SID_NAME=standby)
(ORACLE_HOME=/oracle/app/oracle/product/11.2.0/db_1)
)
)
啟用監聽:
lsnrctl start
lsnrctl status
(2) tnsnames.ora
STEPHEN =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = pry)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = stephen)
)
)
STANDBY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = std)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = standby)
)
)
(3) tnsping命令解析網絡服務名,命令須返回OK.
此時,standby端未配置監聽,無法解析,可以standby配置後再測試。
$ tnsping stephen
(4) 密碼文件
使用主庫的密碼文件:
scp pry:$ORACLE_HOME/dbs/orapwstephen $ORACLE_HOME/dbs/orapwstandby
3.創建相關目錄
mkdir -p $ORACLE_BASE/admin/standby/{adump,dpdump,pfile}
mkdir -p /oradata/{standby,arch}
4.參數文件
用primary的pfile加以修改,以保證某些參數與primary保持一致,註意主備庫內存的大小適當的調整內存相關參數。
scp pry:/tmp/pfile.bak $ORACLE_HOME/dbs/initstandby.ora
修改pfile為需要的standby pfile,並創建spfile.特別註意以下事例的參數設定:
*.audit_file_dest=‘/oracle/app/oracle/admin/standby/adump‘
*.audit_trail=‘db‘
*.control_files=‘/oradata/standby/control01.ctl‘
*.db_name=‘stephen‘
*.db_unique_name=‘standby‘
*.instance_name=‘standby‘
*.service_names=‘standby‘
*.remote_login_passwordfile=‘EXCLUSIVE‘
*.undo_tablespace=‘UNDOTBS1‘
*.log_archive_format=‘%t_%s_%r.arc‘
*.log_archive_config=‘dg_config=(standby,stephen)‘
*.log_archive_dest_1=‘location=/oradata/arch valid_for=(all_logfiles,all_roles) db_unique_name=standby‘
*.log_archive_dest_2=‘service=stephen lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=stephen‘
*.log_archive_dest_state_1=‘enable‘
*.log_archive_dest_state_1=‘enable‘
*.log_archive_max_processes=30 #根據需求調整個數
*.fal_server=‘stephen‘
*.standby_file_management=auto
*.remote_login_passwordfile=‘EXCLUSIVE‘
#主、備庫日誌文件和數據文件存放路徑不一致,設定以下參數:
*.db_file_name_convert=‘/oradata/stephen‘,‘/oradata/standby‘
*.log_file_name_convert=‘/oradata/stephen‘,‘/oradata/standby‘
創建spfile:
create spfile from pfile;
5.恢復standby controlfile
SQL> startup nomount;
RMAN> restore standby controlfile from ‘/backup/c_05qlbira_1_1.bak‘;
6.恢復數據文件
啟動數據庫到mount階段,恢復數據文件。
(1)standby 與primary數據文件存放路徑一致:
RMAN> sql ‘alter database mount standby database‘;
run
{allocate channel c1 type disk;
allocate channel c2 type disk;
resotore database;
recover database;
release channel c1;
release channel c2;
}
(2) standby 與primary數據文件存放路徑不一致:
查詢primary database的數據文件信息:
set lines 300 pages 300
col name for a60
col member for a60
select file#,name from v$datafile
union all
select file#,name from v$tempfile;
啟動standby到mount階段,恢復數據文件:
RMAN> sql ‘alter database mount standby database‘;
run
{set newname for datafile 1 to ‘/oradata/standby/system01.dbf‘;
set newname for datafile 2 to ‘/oradata/standby/sysaux01.dbf‘;
set newname for datafile 3 to ‘/oradata/standby/undotbs1.dbf‘;
set newname for datafile 4 to ‘/oradata/standby/user01.dbf‘;
set newname for tempfile 1 to ‘/oradata/standby/temp01.dbf‘;
restore database;
switch datafile all;
switch tempfile all;
recover database;
}
查看standby database log file:
set lines 200 pages 300
col member for a60
select a.thread#,a.group#,b.member,b.type,a.bytes/1024/1024 MB
from v$log a,v$logfile b where a.group#=b.group#
union all
select a.thread#,a.group#,b.member,b.type,a.bytes/1024/1024 MB
from v$standby_log a,v$logfile b where a.group#=b.group#;
7.應用日誌
應用archive log:
recover managed standby database disconnect;
應用redo logfile:
recover managed standby database using current logfile disconnect;
取消應用日誌:
recover managed standby database cancel;
11g Physical standby database可打開至read only模式,也就是常說的Active Dataguard.可遷移查詢的業務至Active DG上,減小primary DB的壓力。
打開數據庫至read only模式並開始實時復制:
alter database open read only;
recover managed standby database using current logfile disconnect;
8.觀察日誌傳輸
跟蹤primary,standby database的alert log,觀察是否有錯誤發生,也可以看到應用日誌的相關信息。
確認standby是否應用日誌:
--primary端多切幾次日誌,觀察alert log信息。
alter system switch logfile;
alter system switch logfile;
--觀察主備庫日誌序列號
archive log list;
--primary端查詢v$archived_log視圖,確認日誌是否被應用:
set lines 300 pages 300
col name for a20
select name,dest_id,thread#,sequence#,standby_dest,applied,registrar,completion_time from v$archived_log
where standby_dest=‘YES‘
order by thread#,sequence#;
--primary端查詢primary,standby的最大日誌序列號是否一致:
select ‘Primary :‘ "DB Role",thread#,max(sequence#)
from v$archived_log
where standby_dest=‘NO‘
group by thread#
union
select ‘Standby :‘ "DB Role",thread#,max(sequence#)
from v$archived_log
where standby_dest=‘YES‘ and applied=‘YES‘
group by thread#
order by thread#;
ORACLE11g R2【單實例 FS→單實例FS】