DataGuard備庫的資料檔案的遷移實戰
在前幾天也花了一點時間測試了一下關於備庫資料檔案的遷移,這部分的工作看起來還是比較常規的,當然方法也很多。但是在實際工作中就更不能掉以輕心,所有的操作都要有理有據。都要經過一些嚴格的測試,如果測試不當,很可能在後期就會出現一些看似奇怪的問題,造成一些不必要的麻煩和影響。
所以在開始之前,做了下面的準備工作。
1.在zabbix中設定了維護視窗,這樣在維護操作中就不會警示。
2.檢查目前的備庫參數設定,是否開啟了閃回區,目前的檔案路徑設定情況和歸檔情況
3.檢查目標檔案路徑的情況,涉及許可權,檔案夾屬主,大小等
4.準備完整的指令碼,估算時間。
第一步中,設定維護視窗的方式如下,加入對應的機器就萬事大吉了。
第二步中備庫沒有設定db_file_name_convert和log_file_name_convert,所以說是預設按照主庫的路徑來產生的。
檢查閃回區竟然沒有開啟,還是不太規範,都是指定使用了歸檔路徑。
SQL> show parameter recovery
NAME TYPE VALUE
------------------------------------ ----------- ------
db_recovery_file_dest string
db_recovery_file_dest_size big integer 0
SQL> show parameter log_archive_dest
NAME TYPE VALUE
------------------------------------ ----------- ----------
log_archive_dest string
log_archive_dest_1 string location="/U01/app/Oracle/admin/testdb/arch", valid_for=(ALL_LOGFILES,ALL_ROLES)
對此的產出指令碼如下:
alter system set db_recovery_file_dest='/U01/app/oracle/admin/testdb/arch' scope=spfile;
alter system set db_recovery_file_dest_size=100G;
alter system log_archive_dest_1='location=USE_DB_RECOVERY_FILE_DEST' scope=spfile;
對於資料檔案和記錄檔的路徑切換
alter system set db_file_name_convert='/U01/app/oracle/oradata/testdb','/DATA/testdb' scope=spfile;
alter system set log_file_name_convert='/U01/app/oracle/oradata/testdb,/Redo/testdb' scope=spfile;
第三步中
磁碟空間情況如下,許可權屬主都沒有問題。
$ df -h
Filesystem Size Used Avail Use% Mounted on
。。。
/dev/sda6 510G 393G 92G 82% /U01
/dev/sdc1 733G 197M 696G 1% /DATA
/dev/sdb2 534G 198M 506G 1% /Redo
。。。
第四步中,如果採用rman的方式遷移資料檔案就需要提前準備指令碼。可以使用如下的方式產生動態指令碼。
select 'COPY DATAFILE '||file#||' to '||chr(39)||name||chr(39)||';'||chr(10)
||' switch datafile '||file#||' to copy;'||chr(10)
||' sql '||chr(39)||'alter database datafile '||file#||' online;' from v$datafile;
產生內容如下:
COPY DATAFILE 5 to '/DATA/testdb/acc_data01.dbf';
switch datafile 5 to copy;
sql 'alter database datafile 5 online;
。。。
準備好指令碼就開始實踐了。
因為這個操作有些參數需要重啟生效,而且這套環境是一主兩備,所以重啟暫時沒有什麼風險。因為考慮到修改convert參數會導致dg broker檢查失敗,需要修改dg broker的參數,如此一來還不如直接做remove操作,遷移完成直接再add database即可,也就免去了更多的屬性修改設定。
所以部署指令碼如下:
remove database stestdb2; --在dg broker中操作
alter system set db_recovery_file_dest='/U01/app/oracle/admin/testdb/arch' scope=spfile;
alter system set db_recovery_file_dest_size=100G;
alter system set log_archive_dest_1='location=USE_DB_RECOVERY_FILE_DEST' scope=spfile;
alter system set db_file_name_convert='/U01/app/oracle/oradata/testdb','/DATA/testdb' scope=spfile;
alter system set log_file_name_convert='/U01/app/oracle/oradata/testdb','/Redo/testdb' scope=spfile;
重啟資料庫執行個體至mount階段
然後就準備開始rman遷移檔案了。
但是剛開始就碰到一些意料之外的事情。遷移的時候竟然提示找不到檔案。
RMAN> COPY DATAFILE 1 to '/DATA/testdb/system01.dbf';
Starting backup at 2016-02-29 10:47:21
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=6596 devtype=DISK
could not read file header for datafile 1 error reason 4
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of backup command at 02/29/2016 10:47:21
RMAN-06056: could not access datafile 1
經過一番排查發現原來在v$datafile裡,檔案路徑已經根據db_file_name_convert變成了最新的路徑了。
即原來的路徑
FILE_NAME
------------------------------------------------------------
/U01/app/oracle/oradata/testdb/users01.dbf
/U01/app/oracle/oradata/testdb/sysaux01.dbf
/U01/app/oracle/oradata/testdb/undotbs01.dbf
在重啟之後v$datafile裡面已經變成了下面的樣子。
FILE_NAME
------------------------------------------------------------
/DATA/testdb/users01.dbf
/DATA/testdb/sysaux01.dbf
/DATA/testdb/undotbs01.dbf
當然這部分資訊在官方文檔中也是有出處的。可以參考http://www.di.unipi.it/~ghelli/didattica/bdldoc/B19306_01/backup.102/b14191/rcmdupdb002.htm
對於這部分內容,還是會有一個優先順序設定。按理說這部分資訊是寫在控制檔案中的。沒想到通過convert的資料看參數應優先產生了。
那麼我們需要做的事情就更簡單了。只需要作業系統級拷貝資料檔案即可。
拷貝完成之後,在dg broker中添加這個執行個體即可。
add database stestdb2 as
connect identifier is stestdb2
maintained as physical;
enable database stestdb2;
看似一個略帶複雜的遷移就這麼輕鬆完成了,感覺做什麼技術含量的事情,前期準備充足,在碰到問題的時候才會更加從容。
Oracle 11gR2 在VMWare虛擬機器中安裝步驟
Debian 下 安裝 Oracle 11g XE R2
Oracle Data Guard 重要配置參數
基於同一主機配置 Oracle 11g Data Guard
探索Oracle之11g DataGuard
Oracle Data Guard (RAC+DG) 歸檔刪除策略及指令碼
Oracle Data Guard 的角色轉換
Oracle Data Guard的日誌FAL gap問題
Oracle 11g Data Guard Error 16143 Heartbeat failed to connect to standby 處理方法