一、 環(huán)境配置
primary:
IP:192.168.0.120
CPU:2個Intel(R) Xeon(TM) CPU 2.80GHz (HT)Mem:2G
Swap:4G
Disk:130G
DB:Oracle Database 10g Enterprise Edition Release 10.1.0.3.0 - Prod
OS:Linux oracle 2.4.21-20.ELsmp #1 SMP
standby:
IP:192.168.0.101
Cup:2個Intel(R) Xeon(TM) CPU 2.40GHz (HT)
Mem:2G
Swap:2G
Disk:66G
DB:Oracle Database 10g Enterprise Edition Release 10.1.0.3.0 - Prod
OS:Linux boss-3 2.4.21-15.ELsmp #1 SMP
Primary為正在使用的生產(chǎn)數(shù)據(jù)庫,standby安裝oracle軟件,但不建立數(shù)據(jù)庫。
二、 建立物理備用數(shù)據(jù)庫
1. 準備主庫的oracle環(huán)境:
編輯oracle用戶的$HOME/.bash_profile文件,oracle相關環(huán)境變量如下:
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_SID=BOSS; export ORACLE_SID
ORACLE_HOME=$ORACLE_BASE/product/10.1.0/Db_1; export ORACLE_HOME
export PATH=$ORACLE_HOME/bin:$PATH:
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib
DISPLAY=10.1.9.59:0.0; export DISPLAY
NLS_LANG=american_america.ZHS16CGB231280; export NLS_LANG
2. 修改主庫為歸檔模式
建立歸檔目錄:
mkdir -p /u02/oradata/BOSS/arch
修改歸檔模式:
archive log list;
create pfile from spfile;
編輯$ORACLE_HOME/dbs/initBOSS.ora
添加下面一行
log_archive_dest_1='location=/u02/oradata/BOSS/arch'
sqlplus /nolog
conn sys as sysdba
shutdown immediate;
create spfile from pfile;
startup nomount;
alter database mount;
alter database archivelog;
alter database open;
3. 對主數(shù)據(jù)庫做一次完整熱備份,獲得備用數(shù)據(jù)庫數(shù)據(jù)
RMAN>connect target
RMAN> backup database format='/home/oracle/%U_%s.bak';
RMAN> sql "Alter System Archive Log Current";
RMAN> Backup filesperset 10 ArchiveLog all format='/home/oracle/%U_%s.bak';
cd /home/oracle
scp *.bak 192.168.0.101:/home/oracle/
4. 在standby服務器準備環(huán)境與primary相同
編輯oracle用戶的$HOME/.bash_profile文件,oracle相關環(huán)境變量如下:
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_SID=BOSS; export ORACLE_SID
ORACLE_HOME=$ORACLE_BASE/product/10.1.0/Db_1; export ORACLE_HOME
export PATH=$ORACLE_HOME/bin:$PATH:
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib
DISPLAY=10.1.9.59:0.0; export DISPLAY
NLS_LANG=american_america.ZHS16CGB231280; export NLS_LANG
5. 準備相應目錄,如日志文件路徑,歸檔路徑,參數(shù)文件路徑,數(shù)據(jù)文件準備存放路徑等
$mkdir -p /u02/oradata/BOSS
$mkdir -p /u02/oradata/BOSS /arch
$mkdir -p $ORACLE_BASE/admin/BOSS
$mkdir -p $ORACLE_BASE/admin/BOSS/bdump
$mkdir -p $ORACLE_BASE/admin/BOSS/cdump
$mkdir -p $ORACLE_BASE/admin/BOSS/udump
6. 建立備用數(shù)據(jù)庫參數(shù)文件
主庫的參數(shù)如下:
BOSS.__db_cache_size=339738624
BOSS.__java_pool_size=33554432
BOSS.__large_pool_size=4194304
BOSS.__shared_pool_size=218103808
*.background_dump_dest='/u01/app/oracle/admin/BOSS/bdump'
*.compatible='10.1.0.2.0'
*.control_files='/u02/oradata/BOSS/control01.ctl','/u02/oradata/BOSS/control02.ctl','/u02/oradata/BOSS/control03.ctl'
*.core_dump_dest='/u01/app/oracle/admin/BOSS/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='BOSS'
*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=2147483648
*.db_writer_processes=4
*.dispatchers='(PROTOCOL=TCP) (SERVICE=BOSSXDB)'
*.global_names=FALSE
*.java_pool_size=32M
*.job_queue_processes=10
*.license_max_users=250
*.log_archive_dest_1='location=/u02/oradata/BOSS/arch'
*.log_archive_dest_2='SERVICE=dbstandby LGWR'
*.open_cursors=300
*.pga_aggregate_target=199229440
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=598736896
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/BOSS/udump'
*.utl_file_dir='/u01/app/oracle/admin/BOSS/bdump'
與主數(shù)據(jù)庫不一樣的參數(shù)如下:
#standby database parameter
standby_file_management=AUTO
remote_archive_enable=TRUE
standby_archive_dest='/u02/oradata/BOSS/arch'
fal_server='DBPRIMARY'
fal_client='DBSTANDBY'
7. 從主服務器拷貝口令文件到備用服務器
$cd $ORACLE_HOME/dbs/
$scp orapwBOSS 192.168.0.101: /u01/app/oracle/product/10.1.0/Db_1/dbs
8. 配置網(wǎng)絡連接
修改主服務器的
/u01/app/oracle/product/10.1.0/Db_1/network/admin/listener.ora文件如下:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521))
)
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/10.1.0/Db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = BOSS)
(ORACLE_HOME = /u01/app/oracle/product/10.1.0/Db_1)
(SID_NAME = BOSS)
)
)
LISTENERDB =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.120)(PORT = 1522))
)
)
)
SID_LIST_LISTENERDB =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = BOSS)
(ORACLE_HOME = /u01/app/oracle/product/10.1.0/Db_1)
(SID_NAME = BOSS)
)
)
$lsnrctl start
$lsnrctl status 查看監(jiān)聽狀態(tài).
修改主服務器的
/u01/app/oracle/product/10.1.0/Db_1/network/admin/tnsnames.ora文件如下:
BOSS =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = BOSS)
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
DBPRIMARY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.120)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = BOSS)
)
)
DBSTANDBY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.101)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = BOSS)
)
)
修改備用服務器的
/u01/app/oracle/product/10.1.0/Db_1/network/admin/listener.ora文件如下:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.101)(PORT = 1521))
)
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = BOSS)
(ORACLE_HOME = /u01/app/oracle/product/10.1.0/Db_1)
(SID_NAME = BOSS)
)
)
LISTENERDB =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.101)(PORT = 1522))
)
)
)
SID_LIST_LISTENERDB =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = BOSS)
(ORACLE_HOME = /u01/app/oracle/product/10.1.0/Db_1)
(SID_NAME = BOSS)
)
)
修改備用服務器的
/u01/app/oracle/product/10.1.0/Db_1/network/admin/tnsnames.ora文件如下:
DBPRIMARY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.120)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = BOSS)
)
)
DBSTANDBY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.101)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = BOSS)
)
)
在這里配置兩個監(jiān)聽,一個用于主服務器到備用服務器的連接,端口是1522,
另外一個用于日后的切換需要,默認端口1521。
啟動1522 的端口
$lsnrctl start listenerdb
$lsnrctl status listenerdb 查看1522 端口上監(jiān)聽的狀態(tài).
測試:
在主和備用機上分別執(zhí)行
tnsping dbprimary
tnsping dbstandby
9. 在主數(shù)據(jù)庫創(chuàng)建備用服務器控制文件
alter database create standby controlfile as '/home/oracle/standby.ctl';
創(chuàng)建后將控制文件cp(rcp or scp)到備用數(shù)據(jù)庫所在的控制文件目錄下。
如$ scp control01.ctl 192.168.0.101:/u02/oradata/BOSS/
cp /u02/oradata/BOSS/control01.ctl /u02/oradata/BOSS/control02.ctl
cp /u02/oradata/BOSS/control01.ctl /u02/oradata/BOSS/control03.ctl
10. 啟動備用數(shù)據(jù)庫
conn sys as sysdba
create spfile from pfile;
startup nomount;
alter database mount standby database;
恢復數(shù)據(jù)庫:
RMAN> connect target;
RMAN> restore database;
RMAN> restore archivelog all;
如果有恢復的日志并想手工恢復,可以運行如下命令
SQL>recover automatic standby database;
如果過程中出現(xiàn)如下類似錯誤,則可以忽略
ORA-00279: change 50775 generated at 06/08/2004 21:57:21 needed for thread 1
ORA-00289: suggestion : /u01/oracle/oradata/tbdb/archive/1_5.dbf
ORA-00280: change 50775 for thread 1 is in sequence #5
ORA-00278: log file '/u01/oracle/oradata/tbdb/archive/1_5.dbf' no longer needed
for this recovery
ORA-00308: cannot open archived log '/u01/oracle/oradata/tbdb/archive/1_5.dbf'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
因為最后需要的日志根本沒有從主數(shù)據(jù)庫送過來
進入到后臺管理恢復狀態(tài)
SQL>alter database recover managed standby database disconnect from session;
三、采用Lgwr進程傳遞聯(lián)日志機的最大性能模式
1. 在備用數(shù)據(jù)庫上創(chuàng)建備用日志
alter database recover managed standby database cancel;
alter database add standby LOGFILE GROUP 5 ('/u02/oradata/BOSS/stdy_redo05.log') size 10m;
alter database add standby LOGFILE GROUP 6 ('/u02/oradata/BOSS/stdy_redo06.log') size 10m;
alter database add standby LOGFILE GROUP 7 ('/u02/oradata/BOSS/stdy_redo07.log') size 10m;
alter database add standby LOGFILE GROUP 8 ('/u02/oradata/BOSS/stdy_redo08.log') size 10m;
alter database recover managed standby database disconnect from session;
2. 修改主庫的歸檔路徑
alter system set LOG_ARCHIVE_DEST_2='SERVICE=dbstandby LGWR' scope=both;
另外,如果考慮到以后該庫可能被切換到備用數(shù)據(jù)庫,也可以創(chuàng)建同樣的備用日志
組:
alter database add standby LOGFILE GROUP 5 ('/u02/oradata/BOSS/stdy_redo05.log') size 10m;
alter database add standby LOGFILE GROUP 6 ('/u02/oradata/BOSS/stdy_redo06.log') size 10m;
alter database add standby LOGFILE GROUP 7 ('/u02/oradata/BOSS/stdy_redo07.log') size 10m;
alter database add standby LOGFILE GROUP 8 ('/u02/oradata/BOSS/stdy_redo08.log') size 10m;
四、驗證備用服務器是否工作
在主庫上:
create user test identified by ftp123;
grant connect,resource to test;
conn test/ftp123@primary;
create table test(name varchar2(20));
insert into test values('hi, Data Guard');
commit;
conn / as sysdba;
alter system switch logfile;
查看從庫日志
以只讀方式打開從庫查看 insert into test values('hi, Data Guard'); 已經(jīng)生效。
conn / as sysdba;
alter database recover managed standby database cancel;
alter database open read only;
conn test/ftp123
select * from test;
再次設置從庫在恢復模式:
alter database recover managed standby database disconnect from session;
五、日常管理
1. 備用服務器的管理模式與只讀模式
(1)啟動到管理模式
SQL>shutdown immediate;
SQL>startup nomount;
SQL>alter database mount standby database;
SQL>alter database recover managed standby database disconnect from session;
(2)啟動到只讀方式
SQL>shutdown immediate;
SQL>startup nomount;
SQL>alter database mount standby database;
SQL>alter database open read only;
(3)如果在管理恢復模式下到只讀模式
SQL>recover managed standby database cancel;
SQL>alter database open read only;
這個時候,可以給數(shù)據(jù)庫增加臨時數(shù)據(jù)文件(這個在熱備份的時候是沒有備份過來的)
如
alter tablespace temp add tempfile '/u02/oradata/BOSS/temp01.dbf' size 100M;
(4)從只讀方式到管理恢復方式
SQL>recover managed standby database disconnect from session;
2. 備用服務器日志刪除
備用服務器的日志刪除也必須小心,因為如果有些日志還沒有被備用服務器應用而該日志被
刪除的話,將引起備用數(shù)據(jù)庫無法往下應用新的日志。
刪除備用服務器的日志的腳本為:
#!/bin/sh
# set env
cd $HOME
. .bash_profile
# start remove
cd $HOME/dbbat
grep "Media Recovery Log" $ORACLE_BASE/admin/$ORACLE_SID/bdump/alert_${ORACLE_SID}.log | awk '{print $4}'|sed -e 's/^/rm /' > rmarch
log.sh
chmod +x ./rmarchlog.sh
./rmarchlog.sh
cd $ORACLE_BASE/admin/$ORACLE_SID/bdump
cat alert_${ORACLE_SID}.log >>alert_${ORACLE_SID}.log.bak
echo ''>alert_${ORACLE_SID}.log
rm -f ./rmarchlog.sh
3. 日志延遲檢查
備用服務器可能有這樣的情況發(fā)生,因為日志塊邏輯損壞,所以必須對日志應用進行檢查,
防止日志應用被停止,防患于未然,當然我們可以手工檢查,但是以下腳本則可以實現(xiàn)自動
檢查(放到cron中)
#!/bin/bash
# set env
cd $HOME
. .bash_profile
# start check
DATE=`date +%Y-%m-%d:%H:%M:%S`
filepath=/u02/oradata/$ORACLE_SID/arch/
logpath=$ORACLE_BASE/admin/$ORACLE_SID/bdump
remotefile=`ssh oracle@192.168.0.120 "ls -t /u02/oradata/BOSS/arch/*|head -1|sed -e 's/.*_1_//g' |sed -e 's/.arc$//g'"`
echo "CHECK TIME:"${DATE}
echo
echo "remote file : "$remotefile
cd $filepath
varfile=`ls -t | head -1|sed -e 's/.*_1_//g' |sed -e 's/.arc$//g'`
echo "archive file : "$filepath$varfile
cd $logpath
varlog=`grep "Media Recovery Log" alert_${ORACLE_SID}.log | awk '{print $4}' | tail -1 |sed -e 's/.*_1_//g' | sed -e 's/.arc$//g'`
echo "applice file : "$varlog
echo
echo >> $HOME/dblog/check_DG_log.log
echo "CHECK TIME:"${DATE} >> $HOME/dblog/check_DG_log.log
echo >> $HOME/dblog/check_DG_log.log
echo "remote file : "$remotefile >> $HOME/dblog/check_DG_log.log
echo "archive file : "$filepath$varfile >> $HOME/dblog/check_DG_log.log
echo "applice file : "$varlog >> $HOME/dblog/check_DG_log.log
echo >> $HOME/dblog/check_DG_log.log
六、主庫與備庫的正常切換
注意:Swithover時只能先從Primary切到Standby,再從Standby切到Primary.
以下順序不能顛倒,如果采用standby redo log的需要注意在切換前在主數(shù)據(jù)庫創(chuàng)建同樣的standby redo log。
1.切換之前先要準備init參數(shù)文件
最簡單的辦法就是把兩個數(shù)據(jù)庫的文件互換,在一個機器上同時保留主數(shù)據(jù)庫的初始化文件
與備用數(shù)據(jù)庫的初始化文件。
2. 從Primary切換到standby的腳本:
[oracle@db worksh]$ more swithstandby.sh
#!/bin/bash
cd $HOME
. .bash_profile
sqlplus /nolog <
alter database commit to switchover to physical standby with session shutdown;
shutdown immediate;
create spfile from '/u01/app/oracle/product/10.1.0/Db_1/dbs/inittbdbsdby.ora';
startup nomount;
alter database mount standby database;
recover managed standby database disconnect;
exit
EOF
lsnrctl stop
lsnrctl start listenerdb
3. 修改主端的tnsnames.ora 將主庫IP:192.168.0.120 與備庫IP:192.168.0.101 對換(即120 與 101 對調即可)
4. 從standby切換到primary的腳本:
$ more switchprimary.sh
#!/bin/bash
cd $HOME
. .bash_primary
sqlplus /nolog <
alter database commit to switchover to primary;
shutdown immediate;
create spfile from '/u01/app/oracle/product/10.1.0/Db_1/dbs/inittbdbprim.ora';
startup;
exit
EOF
lsnrctl stop listenerdb
lsnrctl start
5. 修改備用端的tnsnames.ora 將主庫IP:192.168.0.120 與備庫IP:192.168.0.101 對換(即 120 與 101 對調即可)
這樣切換的要求是主機和備機各有兩個listener, listener 監(jiān)聽1521,listenerdb 監(jiān)聽1522(見
上面的配置過程),任何一個節(jié)點,在primary期間啟動listener, standby 期間啟動listenerdb。
連接data guard的客戶端的tnsnames配置,這樣就可以實現(xiàn)失敗切換,對客戶端是透明的:
BOSS =
(DESCRIPTION =
(failover = on )
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 主)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 備)(PORT = 1521))
)
(CONNECT_DATA =
(SID = BOSS)
)
七、備庫的失敗切換
1. 失敗切換
一般指主服務器已經(jīng)不能使用,必須切換到備用服務器,所以,只操作備用服務器這一
端,以下提供一切換腳本
$ more switchprimary.sh
#!/bin/bash
cd $HOME
. .bash_profile
sqlplus /nolog <
recover managed standby database cancel;
-- if standby have Standby redo logfile
--alter database recover managed standby database finish;
-- else
alter database recover managed standby database finish skip standby logfile;
-- switch
alter database commit to switchover to primary;
-- open
shutdown immediate;
create spfile from '/u01/app/oracle/product/10.1.0/Db_1/dbs/inittbdbprim.ora';
startup;
exit
EOF
lsnrctl stop listenerdb
lsnrctl start
最后改tnsnames.ora 將主庫IP:192.168.0.120 與備庫IP:192.168.0.101 對換(即120 與101 對調即可)
說明:
(1)如果在備用端有活動的未歸檔的日志,或者有從主數(shù)據(jù)庫拷貝過來的聯(lián)機日志,可以采
用如下的辦法注冊并恢復
SQL> ALTER DATABASE REGISTER LOGFILE '/u01/oracle/oradata/tbdb/archive/1_87.dbf';
SQL>recover standby database;
(2)如果有活動日志,必須用
alter database recover managed standby database finish;
否則用
alter database recover managed standby database finish skip standby logfile;
這樣切換的備用服務器可以避免最小的數(shù)據(jù)丟失和不用resetlogs,特別是對于用多個備
用服務器的時候,該服務器可以馬上作為主服務器而不用重新創(chuàng)建備用服務器。
2. 強行切換(激活)
這樣的切換是以激和備用服務器來完成的,在重新啟動數(shù)據(jù)庫的時候,備用機會
resetlogs,這樣會影響到其它備用服務器而且必須重新在主服務器上重新構造備用服務器,
一般不建議這樣做。
$ more activeprimary.sh
#!/bin/bash
#swith to primary with cancel
cd $HOME
. .bash_profile
#cancel and startup database
sqlplus /nolog <
alter system archive log current;
recover managed standby database cancel;
alter database activate standby database;
shutdown immediate;
create spfile from '/u01/app/oracle/product/10.1.0/Db_1/dbs/inittbdbprim.ora';
startup;
exit
EOF
lsnrctl stop listenerdb
lsnrctl start
八、備用庫的備份與恢復
1. 從備用庫上恢復主庫的數(shù)據(jù)文件
在某些情況下,主服務器可能損壞一個或兩個數(shù)據(jù)文件,如果從主數(shù)據(jù)庫上的備份恢復,理
論上也是可以的,但是可能會因為需要應用到太多的日志,實際耗時太大,這個時候,我們
可以考慮從備份服務器上恢復該數(shù)據(jù)文件,因為備份服務器與主數(shù)據(jù)庫一般只相差一個日志
文件左右。
(1)關閉備用數(shù)據(jù)庫
recover managed standby database cancel;
shutdown immediate;
(2)拷貝或FTP損壞的數(shù)據(jù)文件到主數(shù)據(jù)庫
(3)在主數(shù)據(jù)庫recover database datafile '文件名'即可。
2. 在備用數(shù)據(jù)庫上進行備份
如果想減輕主庫的壓力,可以在備用數(shù)據(jù)庫上進行備份,因為備用控制文件的特性關系,在
對standby的rman備份中,不能修改rman的配置,所以沒有辦法自動備份控制文件。
可以采用如下的方法備份:
(1)備份備用數(shù)據(jù)庫,可以停止恢復進程,跳轉到read only模式下,通過backup database來備份數(shù)據(jù)庫,這樣的數(shù)據(jù)庫處于一致性的模式下。
(2)采用恢復目錄備份standby數(shù)據(jù)庫
rman target sys@dbstandby
backup database format '/u02/oradata/rman_backup/full_%d_%T_s%s_p%p';
backup archivelog all delete input format '/u02/oradata/rman_backup/arc_%d_%T_s%s_p%p';
(3)如果采用控制文件做恢復目錄,注意
alter database backup controlfile to '/u02/oradata/rman_backup/ctl_%d_%T_s%s_p%p';