一、 實施方案
這幾天給客戶的Oracle 11gr2 RAC搭建到單實例的DG,整理了一下步驟,理清一下思路,文中敏感信息已做模糊處理。
RAC至單實例的Dataguard為雙節點各自傳遞自己當前線程的歸檔至備庫。
由於節點1存儲不足,備份在節點2上跑。整體搭建思路如下:
備庫文件目錄創建à主庫force logging(已是歸檔模式)
à備份節點二à復制節點二口令文件à創建備庫pfileà創建備庫à恢復備庫
à創建主備standby logfileà配置主備監聽及TNSà修改主庫(節點一、節點二)參數à打開備庫並實時應用
1.1 主備環境說明
| Primary |
Node1 |
Node2 |
| Hostname |
hostname01 |
hostname02 |
| Public |
10.10.10.141 |
10.10.10.143 |
| VIP |
10.10.10.142 |
10.10.10.144 |
| SCAN |
10.10.10.140 |
|
| Instance_name |
repprod1 |
repprod2 |
| DB_name |
repprod |
|
| Service_names |
repprod |
|
| DB_unique_name |
repprod |
|
| Storage_mode |
ASM |
|
| Standby |
Node |
|
| Hostname |
hostnamedg |
|
| IP |
10.10.10.191 |
|
| Instance_name |
Repproddg |
|
| DB_name |
repprod |
|
| Service_names |
repproddg |
|
| DB_unique_name |
repproddg |
|
| Storage_mode |
Local disk |
|
1.2 文件系統規划
| Primary |
Standby |
| +DATADG/repprod/datafile |
/oradata/datafile |
| +DATADG/repprod/tempfile |
/oradata/tempfile |
| +ARCDG/repprod/onlinelog +DATADG/repprod/onlinelog |
/oradata/onlinelog |
| +ARCDG/ |
/oradata/arch |
1.3 實施操作步驟
1.3.1 備庫存儲和文件系統創建
#standby庫上新建各個數據文件的存放位置
$mkdir -p /oradata/datafile --數據文件 $mkdir -p /oradata/tempfile --臨時文件 $mkdir -p /oradata/onlinelog --redo日志 $mkdir -p /oradata/controlfile --控制文件 $mkdir -p /oradata/arch --歸檔文件
#備庫為全新安裝oracle 11.2.0.4軟件,需要手工建立以下目錄,保持與主庫目錄一致。
$cd $ORACLE_BASE $mkdir -p admin/repproddg/adump $mkdir -p admin/repproddg/dpdump $mkdir -p admin/repproddg/hdump $mkdir -p admin/repproddg/pfile
1.3.2 主庫上設置數據庫運行在force logging模式
#查看數據庫的模式: SQL> select LOG_MODE,OPEN_MODE,PROTECTION_MODE,DATABASE_ROLE,SWITCHOVER_STATUS,GUARD_STATUS,FORCE_LOGGING from v$database; #在主庫上執行: SQL> alter database force logging;
1.3.3 備份主庫
#節點二備份 $rman target / RMAN> run{ allocate channel c1 type disk; allocate channel c2 type disk; backup filesperset=3 format='/oracle/backup/%T_%d_%s_%p.bus' as compressed backupset database; backup format='/oracle/backup/%T_%d_%s_%p.ctl' current controlfile; release channel c1; release channel c2; }
#傳遞備份至備庫 $scp /oracle/backup/20180418* oracle@10.10.10.191:/oradata/backup
1.3.4 口令文件復制
#將主庫的口令文件復制到備庫相同目錄下,並改名為orapwrepproddg。 $scp /oracle/app/oracle/db/dbs/orapwrepprod oracle@10.10.10.191:/u01/app/oracle/product/11.2.0/db_1/dbs #重命名 $mv orapwrepprod orapwrepproddg
1.3.5 創建和修改備庫pfile 參數文件
#主庫上生成pfile SQL> create pfie from spfile; #傳遞至備庫 $cd $ORACLE_HOME/dbs $scp initrepprod.ora oracle@10.10.10.191: /u01/app/oracle/product/11.2.0/db_1/dbs #修改為initrepproddg.ora並修改相關參數 $mv initrepprod.ora initrepproddg.ora $vi initrepprod.ora *.__db_cache_size=21206401024 *.__java_pool_size=1879048192 *.__large_pool_size=805306368 *.__pga_aggregate_target=70061654016 *.__sga_target=38386270208 *.__shared_io_pool_size=0 *.__shared_pool_size=13421772800 *.__streams_pool_size=536870912 *.audit_file_dest= '/u01/app/oracle/repproddg/adump' *.audit_trail='db' *.compatible='11.2.0.4.0' *.control_files='/oradata/controlfile/control01.ctl' *.db_block_size=8192 *.db_domain='' *.db_name=repprod *.db_unique_name=repproddg *.service_names=repproddg *.db_recovery_file_dest_size=209715200000 *.open_cursors=300 *.pga_aggregate_target=70061654016 *.processes=1500 *.sessions=1655 *.sga_target=38386270208 *._undo_autotune=FALSE *.log_archive_format='%t_%s_%r.arc' *.db_recovery_file_dest='/oradata/arch' *.db_file_name_convert='+DATADG/repprod/datafile','/oradata/datafile','+DATADG/repprod/tempfile','/oradata/tempfile' *.LOG_ARCHIVE_CONFIG='DG_CONFIG=(repprod, repproddg)' *.LOG_ARCHIVE_DEST_1='LOCATION=/oradata/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=repproddg' *.LOG_ARCHIVE_DEST_2='SERVICE=repprod_pri LGWR ASYNC NOAFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME= repprod' *.log_file_name_convert='+ARCDG/repprod/onlinelog','/oradata/onlinelog','+DATADG/repprod/onlinelog','/oradata/onlinelog' *.remote_login_passwordfile='exclusive' *.standby_file_management=auto *.diagnostic_dest= '/u01/app/oracle' *.fal_server='repprod1_pri ','repprod2_pri' *.fal_client='repproddg_stb' $sqlplus / as sysdba
SQL> startup pfile='/u01/app/oracle/product/11.2.0/db_1/dbs/initrepproddg.ora' nomount; SQL> create spfile from pfile SQL> shut immediate
1.3.6 恢復備庫
#備庫恢復控制文件 SQL> startup nomount; RMAN> restore standby controlfile from '/oradata/backup/20180418_REPPROD_4020_1.ctl'; RMAN> alter database mount; #注冊備份集 RMAN> CATALOG START WITH ‘/oradata/backup/’; RMAN> CROSSCHECK BACKUP; rman target / run { set newname for datafile 1 to '/oradata/datafile/system01.dbf'; set newname for datafile 2 to '/oradata/datafile/sysaux01.dbf'; set newname for datafile 3 to '/oradata/datafile/undotbs01.dbf'; set newname for datafile 4 to '/oradata/datafile/undotbs02.dbf'; set newname for datafile 5 to '/oradata/datafile/users01.dbf'; set newname for datafile 6 to '/oradata/datafile/bylgt01.dbf'; set newname for tempfile 1 to '/oradata/tempfile/temp01.dbf'; restore database; SWITCH DATAFILE ALL; SWITCH TEMPFILE ALL; } #把歸檔從主庫中copy到備庫后,進行手工recover #根據備庫alter.log查看缺失的日志sequence號 #節點二上從ASM上copy歸檔到本地再scp至備庫 $su – grid $asmcmd ASMCMD> cd +ARCDG/repprod/AR*/2018_04_18 ASMCMD> cp thread_2_seq_3741.2001.973785643 /oracle/backup ASMCMD> cp thread_2_seq_3742.2012.973785651 /oracle/backup ASMCMD> cp thread_2_seq_3743.2015.973785659 /oracle/backup ASMCMD> cp thread_2_seq_3744.1987.973785669 /oracle/backup ASMCMD> cp thread_2_seq_3745.2008.973785709 /oracle/backup ASMCMD> cp thread_2_seq_3746.1977.973785717 /oracle/backup ASMCMD> cp thread_2_seq_3747.1996.973791733 /oracle/backup ASMCMD> cp thread_2_seq_3748.2005.973791739 /oracle/backup $cd /oracle/backup $ scp thread_2_seq* oracle@10.10.10.191:/oradata/arch #備庫上注冊歸檔並recover database SQL> alter database register logfile '/oradata/arch/thread_2_seq_3741.2001.973785643'; SQL> alter database register logfile '/oradata/arch/thread_2_seq_3742.2012.973785651'; SQL> alter database register logfile '/oradata/arch/thread_2_seq_3743.2015.973785659'; SQL> alter database register logfile '/oradata/arch/thread_2_seq_3744.1987.973785669'; SQL> alter database register logfile '/oradata/arch/thread_2_seq_3745.2008.973785709'; SQL> alter database register logfile '/oradata/arch/thread_2_seq_3746.1977.973785717'; SQL> alter database register logfile '/oradata/arch/thread_2_seq_3747.1996.973791733'; SQL> alter database register logfile '/oradata/arch/thread_2_seq_3748.2005.973791739'; SQL> recover managed standby database disconnect from session; Media recovery complete. SQL> recover managed standby database cancel; Media recovery complete.
1.3.7 在主庫中建立standby logfile
#最大保護及最高可用性保護模式必須創建SRL,但強烈建議也為最大性能模式添加,為了簡化切換以后的操作,建議同時在主庫也進行添加。SRL大小必須跟主數據庫ORL一樣,且比ORL數量多1。
具體可參考“thread數*(ORL+1)”,即兩節點的rac,ORL為3,則SRL數量為2*(3+1)=8。配置主數據庫standby redo日志,在節點一或節點二進行: SQL> alter database add standby logfile thread 1('+ARCDG','+DATADG') size 512M; SQL> alter database add standby logfile thread 1('+ARCDG','+DATADG') size 512M; SQL> alter database add standby logfile thread 1('+ARCDG','+DATADG') size 512M; SQL> alter database add standby logfile thread 1('+ARCDG','+DATADG') size 512M; SQL> alter database add standby logfile thread 2('+ARCDG','+DATADG') size 512M; SQL> alter database add standby logfile thread 2('+ARCDG','+DATADG') size 512M; SQL> alter database add standby logfile thread 2('+ARCDG','+DATADG') size 512M; SQL> alter database add standby logfile thread 2('+ARCDG','+DATADG') size 512M;
1.3.8 在備庫中建立standby logfile
#與主庫一樣的redo組 SQL> alter database add standby logfile group 7 ('/oradata/onlinelog/redo7a.dbf','/oradata/onlinelog/redo7b.dbf') size 512m; SQL> alter database add standby logfile group 8 ('/oradata/onlinelog/redo8a.dbf','/oradata/onlinelog/redo8b.dbf') size 512m; SQL> alter database add standby logfile group 9 ('/oradata/onlinelog/redo9a.dbf','/oradata/onlinelog/redo9b.dbf') size 512m; SQL> alter database add standby logfile group 10 ('/oradata/onlinelog/redo10a.dbf','/oradata/onlinelog/redo10b.dbf') size 512m; SQL> alter database add standby logfile group 11 ('/oradata/onlinelog/redo11a.dbf','/oradata/onlinelog/redo11b.dbf') size 512m; SQL> alter database add standby logfile group 12 ('/oradata/onlinelog/redo12a.dbf','/oradata/onlinelog/redo12b.dbf') size 512m; SQL> alter database add standby logfile group 13 ('/oradata/onlinelog/redo13a.dbf','/oradata/onlinelog/redo13b.dbf') size 512m; SQL> alter database add standby logfile group 14 ('/oradata/onlinelog/redo14a.dbf','/oradata/onlinelog/redo14b.dbf') size 512m;
1.3.9 備庫上監聽和TNS配置
#配置監聽 $cd $ORACLE_HOME/network/admin $vi listener.ora repproddg = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.191)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0)) ) ) SID_LIST_repproddg = (SID_LIST = (SID_DESC = (SID_NAME = repproddg) (ORACLE_HOME =/u01/app/oracle/product/11.2.0/db_1) #(PROGRAM = extproc) ) ) #配置TNS $vi tnsname.ora repprod_pri = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST =10.10.10.140)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = repprod)
) ) repproddg_stb= (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST =10.10.10.191)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = repproddg) ) ) #開啟監聽 $lsnrctl statrt
1.3.10 主庫上TNS配置
#將以下備庫的tns加入到主庫兩節點的tnsnames.ora中: $cd $ORACLE_HOME/network/admin $vi tnsnames.ora repprod_pri = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST =10.10.10.141)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = repprod)
) ) repproddg_stb= (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST =10.10.10.191)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = repproddg) ) ) 監聽和TNS檢查 #在主庫兩節點上執行以下: $tnsping repproddg_stb #在備庫中執行以下: $tnsping repprod_pri
1.3.11 主庫上修改參數
#節點一、節點二均設置以下參數 SQL> alter system set log_archive_config='DG_CONFIG=(repprod,repproddg)' scope=both sid='*'; SQL> alter system set log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(all_logfiles,all_roles) db_unique_name=repprod' scope=both sid='*'; SQL> alter system set log_archive_dest_2='SERVICE=repproddg_stb lgwr ASYNC NOAFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=repproddg' scope=both; SQL> alter system set log_archive_max_processes=10 scope=both; SQL> alter system set db_file_name_convert='/oradata/datafile', '+DATADG/repprod/datafile', 'oradata/tempfile', '+DATADG/repprod/tempfile' scope=spfile; SQL> alter system set log_file_name_convert='/oradata/onlinelog','+ARCDG/repprod/onlinelog','/oradata/onlinelog','+DATADG/repprod/onlinelog' scope=spfile; SQL> alter system set standby_file_management=auto scope=both;
1.3.12 打開數據庫並實時應用redo
#開啟數據庫並打卡redo日志實時應用 SQL> alter database open; SQL> alter database recover managed standby database using current logfile disconnect from session;
二、 *實施完成后的驗證
#主庫檢查current sequence# SQL> select thread#,sequence#,status from v$log; #主庫檢查LNS進程正在寫的sequence# SQL> select process,sequence#,status from v$managed_standby; #備庫檢查正在應用的sequence# SQL> SELECT PROCESS,THREAD#,SEQUENCE#,STATUS FROM V$MANAGED_STANDBY; #檢查是否存在GAP SQL> SELECT THREAD#,LOW_SEQUENCE#,HIGH_SEQUENCE# FROM V$ARCHIVE_GAP; no rows selected
三、 問題匯總
3.1 備庫未打補丁處理
1.傳遞與主庫一致的補丁p24006111_112040_Linux-x86-64.zip至/software上 2.關閉與Oracle相關的所有進程,包括sqlplus 3.opatch version必須大於11.2.0.3.6 4.檢查環境 unzip p24006111_112040_ Linux-x86-64.zip cd 24006111 $ORACLE_HOME/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -ph ./ 5.應用補丁 $ORACLE_HOME/OPatch/opatch apply
3.2 Temp文件錯誤處理
1.恢復時set newname路徑錯誤 2.將tempfile下線: SQL> alter database tempfile '/oradata/tempile/temp01.dbf' offline; 3.新建正確路徑的tempfile: SQL> alter tablespace TEMP add tempfile '/oradata/tempfile/temp01.dbf' size 2G autoextend on; 4.刪除錯誤tempfile SQL> alter database tempfile '/oradata/tempile/temp01.dbf' drop
3.3 歸檔刪除腳本部署
#在/home/oracle/下新建歸檔刪除腳本,保留3天 $ vi /home/oracle/delete_arch.sh . ~/.bash_profile rman target / <<EOF crosscheck archivelog all; delete noprompt archivelog until time 'sysdate-3'; crosscheck archivelog all; exit EOF
#Oracle crontab,每天0點自動刪除歸檔文件 $crontab -e #每天0點自動刪除歸檔文件 0 * * * * /home/oracle/delete_arch.sh 1>/home/oracle/delete_arch.sh.out 2>&1
SERVICE_NAME = repproddg
