Oracle10g新特性——利用RMAN遷移表空間(二)

yangtingkun發表於2009-03-11

Oracle10g對遷移表空間特性進行了進一步增強,利用RMAN進行表空間遷移,可以避免將源資料庫的表空間置於READ ONLY狀態。

這一篇繼續描述遷移表空間的匯入過程。

Oracle10g新特性——利用RMAN遷移表空間(一):http://yangtingkun.itpub.net/post/468/479902

 

 

由於篇幅問題,上一篇只是列出了RMAN的結果,沒有進一步的說明。

雖然只是一個簡單的TRANSPORT TABLESPACE命令,但是RMAN執行了很多的操作。首先RMAN生成了一些初始化引數,自動新建了一個例項,用來執行及時點恢復。

可以看到,例項啟動後,Oracle執行了SET UNTIL SCN,設定了一個TSPITR恢復的時間點,然後恢復控制檔案,MOUNT克隆資料庫。

隨後根據auxiliary destination的設定對資料檔案和臨時檔案進行重新命名。

隨後開始恢復所有需要的資料檔案,並執行RECOVER操作,恢復完成後透過RESETLOGS方式開啟了這個資料庫。

至此,從備份中恢復目標表空間的操作已經完成,隨後進行的是遷移表空間的步驟,RMAN將這個步驟也包含在TRANSPORT TABLESPACE命令當中了。

首先,將目標表空間置為只讀狀態。可以看到,遷移表空間需要源資料庫的目標表空間置於只讀狀態,這個根本性的限制仍然存在,RMAN之所以不需要將源資料庫的表空間置於只讀狀態,在於RMANTRANSPORT TABLESPACE的過程中,利用及時點恢復的方式構造了一個CLONE資料庫,在進行遷移表空間的時候,只需要將克隆資料庫的對應表空間置於只讀狀態就可以了。

隨後RMAN透過命令列的方式呼叫了EXPDP執行資料泵的匯出操作。為了能順利的訪問到這個新建的例項,Oracle採用了完整的TNSNAMES規則來作為EXPDP的服務名。並將TRANSPORT TABLESPACE命令中指定的DATAPUMP DIRECTORYDUMP FILEEXPORT LOG引數帶入到EXPDP命令中。

在匯出結束後,RMAN還自動生成了匯入的指令碼,存放在IMPORT SCRIPT引數指定的檔案中。而且RMAN生成了兩種匯入方式,分別是IMPDPPL/SQL匯入的指令碼。

在指令碼生成之後,RMAN自動刪除了輔助例項,並刪除了除目標表空間資料檔案外,所有臨時生成的資料檔案和控制檔案。

下面匯出操作就結束了,將資料檔案、匯出的源資料,以及匯入指令碼檔案複製到目標資料庫所在節點:

bash-2.03$ cd /data1/oradata/testrac
bash-2.03$ ftp 172.25.198.223
Connected to 172.25.198.223.
220 racnode2 FTP server (SunOS 5.8) ready.
Name (172.25.198.223:oracle): oracle
331 Password required for oracle.
Password:
230 User oracle logged in.
ftp> bin
200 Type set to I.
ftp> prompt
Interactive mode off.
ftp> cd /data1/backup
250 CWD command successful.
ftp> mget yangtk01.dbf
200 PORT command successful.
150 Binary data connection for yangtk01.dbf (172.25.198.226,34008) (1056768 bytes).
226 Binary Transfer complete.
local: yangtk01.dbf remote: yangtk01.dbf
1056768 bytes received in 0.14 seconds (7227.95 Kbytes/s)
ftp> cd /data/dmp
250 CWD command successful.
ftp> mget *
200 PORT command successful.
150 Binary data connection for yangtk_meta.dp (172.25.198.226,34013) (69632 bytes).
226 Binary Transfer complete.
local: yangtk_meta.dp remote: yangtk_meta.dp
69632 bytes received in 0.11 seconds (595.27 Kbytes/s)
200 PORT command successful.
150 Binary data connection for yangtk_meta.log (172.25.198.226,34014) (1123 bytes).
226 Binary Transfer complete.
local: yangtk_meta.log remote: yangtk_meta.log
1123 bytes received in 0.013 seconds (86.91 Kbytes/s)
ftp> quit
221 Goodbye.

執行匯入操作,使用的命令可以參考yangtk_imp.scr,這是RMANTRANSPORT TABLESPACE命令自動生成的:

$ more yangtk_imp.src
/*
   The following command may be used to import the tablespaces.
   Substitute values for and .
   impdp directory= dumpfile= 'yangtk_meta.dp' transport_datafiles= /data1/backup/yangtk01.dbf
*/
--------------------------------------------------------------
-- Start of sample PL/SQL script. for importing the tablespaces
--------------------------------------------------------------
-- creating directory objects
CREATE DIRECTORY STREAMS$DIROBJ$1 AS  '/data1/backup/';
/* PL/SQL Script. to import the exported tablespaces */
DECLARE
  -- the datafiles
  tbs_files     dbms_streams_tablespace_adm.file_set;
  cvt_files     dbms_streams_tablespace_adm.file_set;
  -- the dumpfile to import
  dump_file     dbms_streams_tablespace_adm.file;
  dp_job_name   VARCHAR2(30) := NULL;
  -- names of tablespaces that were imported
  ts_names       dbms_streams_tablespace_adm.tablespace_set;
BEGIN
  -- dump file name and location
  dump_file.file_name :=  'yangtk_meta.dp';
  dump_file.directory_object := 'd_output';
  -- forming list of datafiles for import
  tbs_files( 1).file_name :=  'yangtk01.dbf';
  tbs_files( 1).directory_object :=  'STREAMS$DIROBJ$1';
  -- import tablespaces
  dbms_streams_tablespace_adm.attach_tablespaces(
    datapump_job_name      => dp_job_name,
    dump_file              => dump_file,
    tablespace_files       => tbs_files,
    converted_files        => cvt_files,
    tablespace_names       => ts_names);
  -- output names of imported tablespaces
  IF ts_names IS NOT NULL AND ts_names.first IS NOT NULL THEN
    FOR i IN ts_names.first .. ts_names.last LOOP
      dbms_output.put_line('imported tablespace '|| ts_names(i));
    END LOOP;
  END IF;
END;
/
-- dropping directory objects
DROP DIRECTORY STREAMS$DIROBJ$1;
--------------------------------------------------------------
-- End of sample PL/SQL script
--------------------------------------------------------------

下面進行匯入的準備過程:

bash-2.03$ mkdir /data1/dmp
bash-2.03$ mv yangtk_meta.* /data1/dmp
bash-2.03$ sqlplus "/ as sysdba"

SQL*Plus: Release 10.2.0.3.0 - Production on 星期三 3 11 11:12:36 2009

Copyright (c) 1982, 2006, Oracle.  All Rights Reserved.


連線到:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options

SQL> create user yangtk identified by yangtk;             

使用者已建立。

SQL> grant connect, resource, dba to yangtk;

授權成功。

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

目錄已建立。

SQL> grant read, write on directory d_output to yangtk;

授權成功。

SQL> exit

最後就可以執行匯入過程了:

bash-2.03$ impdp yangtk/yangtk directory=d_output dumpfile=yangtk_meta.dp logfile=imp_yangtk.log transport_datafiles=/data1/oradata/testrac/yangtk01.dbf              

Import: Release 10.2.0.3.0 - 64bit Production on 星期三, 11 3, 2009 14:32:48

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

連線到: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options
已成功載入/解除安裝了主表 "YANGTK"."SYS_IMPORT_TRANSPORTABLE_01"
啟動 "YANGTK"."SYS_IMPORT_TRANSPORTABLE_01":  yangtk/******** directory=d_output dumpfile=yangtk_meta.dp logfile=imp_yangtk.log transport_datafiles=/data1/oradata/testrac/yangtk01.dbf
處理物件型別 TRANSPORTABLE_EXPORT/PLUGTS_BLK
處理物件型別 TRANSPORTABLE_EXPORT/TABLE
處理物件型別 TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
作業 "YANGTK"."SYS_IMPORT_TRANSPORTABLE_01" 已於 14:32:58 成功完成

進入資料庫中檢查一下:

bash-2.03$ sqlplus yangtk/yangtk

SQL*Plus: Release 10.2.0.3.0 - Production on 星期三 3 11 14:41:21 2009

Copyright (c) 1982, 2006, Oracle.  All Rights Reserved.


連線到:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options

SQL> SET PAGES 100 LINES 120
SQL> SELECT OWNER, TABLE_NAME, TABLESPACE_NAME            
  2  FROM DBA_TABLES
  3  WHERE TABLESPACE_NAME = 'YANGTK';

OWNER                          TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
TEST                           T                              YANGTK

SQL> SELECT COUNT(*) FROM TEST.T;

  COUNT(*)
----------
     45229

可以看到,透過這種方式實現表空間的遷移不需要修改源資料庫表空間的只讀狀態。這使得傳輸表空間在產品環境中使用的可能性大大增加。

當然,對於9i10.1的環境,完全可以仿照上面的步驟來自己實現表空間及時點的恢復,並從克隆資料庫傳輸表空間。但是自己實現的方法要遠比一個TRANSPORT TABLESPACE命令要複雜得多。

 

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

相關文章