利用RMAN遷移表空間碰到的問題(四)

yangtingkun發表於2009-03-15

嘗試10.2的新特性RMANTRANSPORT TABLESPACE進行表空間的遷移過程,其中碰到了不少問題,簡單總結一下。

這一篇介紹TRANSPORT TABLESPACE命令碰到的RMAN-06513錯誤,對應的Oracle命令列錯誤為ORA-39070錯誤。

利用RMAN遷移表空間碰到的問題(一):http://yangtingkun.itpub.net/post/468/480070

利用RMAN遷移表空間碰到的問題(二):http://yangtingkun.itpub.net/post/468/480171

利用RMAN遷移表空間碰到的問題(三):http://yangtingkun.itpub.net/post/468/480222

 

 

這個錯誤其實比較有意思:

RMAN> transport tablespace yangtk auxiliary destination '/data1/backup'
2> datapump directory d_output dump file 'yangtk_meta.dp'
3> export log 'yangtk_meta.log' import script. 'yangtk_imp.src'
4> tablespace destination '/data1/backup';

RMAN-05026: 警告: 假定以下表空間集適用於指定的時間點

表空間列表要求具有 UNDO
表空間 SYSTEM
表空間 UNDOTBS1

使用 SID='mBeh' 建立自動例項

供自動例項使用的初始化引數:
db_name=TEST
compatible=10.2.0.3.0
db_block_size=8192
db_files=200
db_unique_name=tspitr_TEST_mBeh
large_pool_size=1M
shared_pool_size=110M
#No auxiliary parameter file used
db_create_file_dest=/data1/backup
control_files=/data1/backup/cntrl_tspitr_TEST_mBeh.f


啟動自動例項 TEST

Oracle 例項已啟動

系統全域性區域總計     205520896 位元組

Fixed Size                     2028912 位元組
Variable Size                146803344
位元組
Database Buffers              50331648
位元組
Redo Buffers                   6356992
位元組
自動例項已建立

記憶體指令碼的內容:
{
# set the until clause
set until  scn 3564357;
# restore the controlfile
restore clone controlfile;
# mount the controlfile
sql clone 'alter database mount clone database';
# archive current online log for tspitr to a resent until time
sql 'alter system archive log current';
# avoid unnecessary autobackups for structural changes during TSPITR
sql 'begin dbms_backup_restore.AutoBackupFlag(FALSE); end;';
}
正在執行記憶體指令碼

正在執行命令: SET until clause

啟動 restore 09-1 -09
分配的通道: ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: sid=34 devtype=DISK

通道 ORA_AUX_DISK_1: 正在開始恢復資料檔案備份集
通道 ORA_AUX_DISK_1: 正在復原控制檔案
通道 ORA_AUX_DISK_1: 正在讀取備份段 /data1/backup/test/c-1920405094-20090109-00
通道 ORA_AUX_DISK_1: 已恢復備份段 1
段控制程式碼 = /data1/backup/test/c-1920405094-20090109-00 標記 = TAG20090109T021104
通道 ORA_AUX_DISK_1: 恢復完成, 用時: 00:00:02
輸出檔名=/data1/backup/cntrl_tspitr_TEST_mBeh.f
完成 restore 09-1 -09

sql 語句: alter database mount clone database

sql 語句: alter system archive log current

sql 語句: begin dbms_backup_restore.AutoBackupFlag(FALSE); end;
釋放的通道: ORA_AUX_DISK_1

記憶體指令碼的內容:
{
# generated tablespace point-in-time recovery script
# set the until clause
set until  scn 3564357;
# set an omf destination filename for restore
set newname for clone datafile  1 to new;
# set an omf destination filename for restore
set newname for clone datafile  2 to new;
# set an omf destination filename for restore
set newname for clone datafile  3 to new;
# set an omf destination tempfile
set newname for clone tempfile  1 to new;
# set a destination filename for restore
set newname for datafile  5 to
 "/data1/backup/yangtk01.dbf";
# rename all tempfiles
switch clone tempfile all;
# restore the tablespaces in the recovery set plus the auxilliary tablespaces
restore clone datafile  1, 2, 3, 5;
switch clone datafile all;
#online the datafiles restored or flipped
sql clone "alter database datafile  1 online";
#online the datafiles restored or flipped
sql clone "alter database datafile  2 online";
#online the datafiles restored or flipped
sql clone "alter database datafile  3 online";
#online the datafiles restored or flipped
sql clone "alter database datafile  5 online";
# make the controlfile point at the restored datafiles, then recover them
recover clone database tablespace  "YANGTK", "SYSTEM", "UNDOTBS1", "SYSAUX" delete archivelog;
alter clone database open resetlogs;
# PLUG HERE the creation of a temporary tablespace if export fails due to lack
# of temporary space.
# For example in Unix these two lines would do that:
#sql clone "create tablespace aux_tspitr_tmp
#           datafile ''/tmp/aux_tspitr_tmp.dbf'' size 500K";
}
正在執行記憶體指令碼

正在執行命令: SET until clause

正在執行命令: SET NEWNAME

正在執行命令: SET NEWNAME

正在執行命令: SET NEWNAME

正在執行命令: SET NEWNAME

正在執行命令: SET NEWNAME

臨時檔案 1 在控制檔案中已重新命名為 /data1/backup/TSPITR_TEST_MBEH/datafile/o1_mf_temp_%u_.tmp

啟動 restore 09-1 -09
分配的通道: ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: sid=36 devtype=DISK

通道 ORA_AUX_DISK_1: 正在開始恢復資料檔案備份集
通道 ORA_AUX_DISK_1: 正在指定從備份集恢復的資料檔案
正將資料檔案00001恢復到/data1/backup/TSPITR_TEST_MBEH/datafile/o1_mf_system_%u_.dbf
正將資料檔案00002恢復到/data1/backup/TSPITR_TEST_MBEH/datafile/o1_mf_undotbs1_%u_.dbf
正將資料檔案00003恢復到/data1/backup/TSPITR_TEST_MBEH/datafile/o1_mf_sysaux_%u_.dbf
正將資料檔案00005恢復到/data1/backup/yangtk01.dbf
通道 ORA_AUX_DISK_1: 正在讀取備份段 /data1/backup/1rk4bc4v_1_1
通道 ORA_AUX_DISK_1: 已恢復備份段 1
段控制程式碼 = /data1/backup/1rk4bc4v_1_1 標記 = TAG20090109T021038
通道 ORA_AUX_DISK_1: 恢復完成, 用時: 00:00:46
完成 restore 09-1 -09

資料檔案 1 已轉換成資料檔案副本
輸入資料檔案副本 recid=5 stamp=675656832 檔名=/data1/backup/TSPITR_TEST_MBEH/datafile/o1_mf_system_4pdkbmls_.dbf
資料檔案 2 已轉換成資料檔案副本
輸入資料檔案副本 recid=6 stamp=675656832 檔名=/data1/backup/TSPITR_TEST_MBEH/datafile/o1_mf_undotbs1_4pdkbmno_.dbf
資料檔案 3 已轉換成資料檔案副本
輸入資料檔案副本 recid=7 stamp=675656832 檔名=/data1/backup/TSPITR_TEST_MBEH/datafile/o1_mf_sysaux_4pdkbmn5_.dbf
資料檔案 5 已轉換成資料檔案副本
輸入資料檔案副本 recid=8 stamp=675656832 檔名=/data1/backup/yangtk01.dbf

sql 語句: alter database datafile  1 online

sql 語句: alter database datafile  2 online

sql 語句: alter database datafile  3 online

sql 語句: alter database datafile  5 online

啟動 recover 09-1 -09
使用通道 ORA_AUX_DISK_1

正在開始介質的恢復

存檔日誌執行緒 1 序列 112 已作為檔案 /data1/oradata/test/archivelog/1_112_622258662.dbf 存在於磁碟上
存檔日誌檔名 =/data1/oradata/test/archivelog/1_112_622258662.dbf 執行緒 =1 序列 =112
介質恢復完成, 用時: 00:00:01
完成 recover 09-1 -09

資料庫已開啟

記憶體指令碼的內容:
{
#mark read only the tablespace that will be exported
sql clone "alter tablespace YANGTK read only";
# export the tablespaces in the recovery set
host 'expdp userid=\"/@\(DESCRIPTION=\(ADDRESS=\(PROTOCOL=beq\)\(PROGRAM=/data/oracle/product/10.2/database/bin/oracle\)\(ARGV0=oraclemBeh\)\(ARGS=^'\(DESCRIPTION=\(LOCAL=YES\)\(ADDRESS=\(PROTOCOL=beq\)\)\)^'\)\(ENVS=^'ORACLE_SID=mBeh^'\)\)\(CONNECT_DATA=\(SID=mBeh\)\)\) as sysdba\" transport_tablespaces=
 YANGTK dumpfile=
yangtk_meta.dp directory=
d_output logfile=
yangtk_meta.log';
}
正在執行記憶體指令碼

sql 語句: alter tablespace YANGTK read only


Export: Release 10.2.0.3.0 - 64bit Production on
星期五, 09 1, 2009 2:27:28

Copyright (c) 2003, 2005, Oracle.  All rights reserved.

連線到: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining options
ORA-39002:
操作無效
ORA-39070:
無法開啟日誌檔案。
ORA-39087:
目錄名 D_OUTPUT 無效


主機命令完成

刪除自動例項
關閉自動例項
Oracle
例項已關閉
自動例項已刪除
MAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: tranport tablespace
命令 ( 01/09/2009 02:27:43 ) 失敗
RMAN-03015:
在儲存的指令碼Memory Script中出現錯誤
RMAN-06135:
執行主命令時出錯: Additional information: 256
Additional information: 4

錯誤很簡單,由於指定了一個不存在的DIRECTORY名稱:D_OUTPUT,導致RMAN在透過命令列方式呼叫EXPDP命令時出錯。錯誤資訊很明確,解決方法也很簡單,只需要在資料庫中新增D_OUTPUT目錄就可以了。

既然問題這麼簡單,為什麼說這個問題有意思呢。有意思的在源資料庫中新增新的目錄D_OUTPUT後,問題依舊:

SQL> create directory d_output as '/data/dmp';

目錄已建立。

SQL> host
bash-2.03$ expdp test/test directory=d_output dumpfile=test.dp

Export: Release 10.2.0.3.0 - 64bit Production on 星期五, 09 1, 2009 2:31:06

Copyright (c) 2003, 2005, Oracle.  All rights reserved.

連線到: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining options
啟動 "TEST"."SYS_EXPORT_SCHEMA_01":  test/******** directory=d_output dumpfile=test.dp
正在使用 BLOCKS 方法進行估計...
處理物件型別 SCHEMA_EXPORT/TABLE/TABLE_DATA
使用 BLOCKS 方法的總估計: 640 KB
處理物件型別 SCHEMA_EXPORT/USER
處理物件型別 SCHEMA_EXPORT/SYSTEM_GRANT
處理物件型別 SCHEMA_EXPORT/ROLE_GRANT
處理物件型別 SCHEMA_EXPORT/DEFAULT_ROLE
處理物件型別 SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
處理物件型別 SCHEMA_EXPORT/TABLE/TABLE
處理物件型別 SCHEMA_EXPORT/TABLE/INDEX/INDEX
處理物件型別 SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
處理物件型別 SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
處理物件型別 SCHEMA_EXPORT/TABLE/COMMENT
處理物件型別 SCHEMA_EXPORT/FUNCTION/FUNCTION
處理物件型別 SCHEMA_EXPORT/PROCEDURE/PROCEDURE
處理物件型別 SCHEMA_EXPORT/FUNCTION/ALTER_FUNCTION
處理物件型別 SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
. .
匯出了 "TEST"."T"                                  392.1 KB   45229
已成功載入/解除安裝了主表 "TEST"."SYS_EXPORT_SCHEMA_01"
******************************************************************************
TEST.SYS_EXPORT_SCHEMA_01
的轉儲檔案集為:
  /data/dmp/test.dp
作業 "TEST"."SYS_EXPORT_SCHEMA_01" 已於 02:32:04 成功完成

可以看到,新增的D_OUTPUT目錄可以正常工作,但是再次執行上面的TRANSPORT TABLESPACE命令,錯誤卻沒有發生任何的變化。

其實導致這個問題的原因並不複雜,由於執行的是表空間及時點恢復,且在執行TRANSPORT TABLESPACE命令時沒有指定UNTIL SCN引數,因此RMAN自動選擇了一個時間點,而這個時間點恰好是在CREATE DIRECTORY命令之前,導致了TRANSPORT TABLESPACE命令生成的AUXILIARY例項在執行完及時點恢復後,不包含新建立的DIRECTORY

解決這個問題最簡單的方法是指定一個系統中已經存在的目錄,如果一定要使用新建的目錄,那麼需要在TRANSPORT TABLESPACE的時候指定UNTIL SCN引數,且保證這個SCN在建立新DIRECTORY之後。

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-567410/,如需轉載,請註明出處,否則將追究法律責任。

相關文章