Oracle10g对迁移表空间特性进行了进一步增强,利用RMAN进行表空间迁移,可以避免将源数据库的表空间置于READ ONLY状态。


Oracle的迁移表空间是数据装载、迁移、升级的一个重要手段,利用这种方法,Oracle不再需要将表空间内所有表的数据导出到DMP文件,然后再通过导入工具导入到目标数据库中。

Oracle从9i开始支持迁移表空间。采用了直接拷贝数据文件的方法,而导入、导出只需要处理表空间中对应的源数据即可。从而使得导入、导出的速度得到了很大的提高。

但是迁移表空间一直有一个比较严重的问题,制约着产品环境下使用这个特性。这就是传输表空间的过程中,要求源数据库将表空间置于只读状态,虽然源数据库环境仍然可以读取表空间的内容,但是不能进行修改了。这对于7*24环境的产品系统而言,无疑是一个很致命的限制。

不过在Oracle的10.2中,Oracle将RMAN与数据泵结合在一起,成功的解决了这个问题。通过RMAN新增的TRANSPORT TABLESPACE命令,Oracle不再需要从数据库中的表空间读取数据文件,而是直接从数据库的备份中生成,而且这个命令将读取备份,将表空间的数据文件还原到指定目的地,恢复到一致性状态,利用数据泵导出源数据,生成数据泵的导入脚本这些复杂的操作在一个命令中全部完成。

下面看一个简单的例子:

bash-2.03$ export ORACLE_SID=test
bash-2.03$ sqlplus "/ as sysdba"

SQL*Plus: Release 10.2.0.3.0 - Production on 星期五 1月 9 01:46:08 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, Real Application Clusters, OLAP and Data Mining options

SQL> select file_name from dba_data_files;

FILE_NAME
--------------------------------------------------------------------------------
/data1/oradata/test/test/system01.dbf
/data1/oradata/test/test/undotbs01.dbf
/data1/oradata/test/test/sysaux01.dbf
/data1/oradata/test/test/users01.dbf
/data1/oradata/test/test/yangtk01.dbf

SQL> exit 从 Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining options
bash-2.03$ rman target /

恢复管理器: Release 10.2.0.3.0 - Production on 星期五 1月 9 02:10:07 2009

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

连接到目标数据库: TEST (DBID=1920405094)

RMAN> backup database;

启动 backup 于 09-1月 -09使用通道 ORA_DISK_1通道 ORA_DISK_1: 启动全部数据文件备份集通道 ORA_DISK_1: 正在指定备份集中的数据文件输入数据文件 fno=00001 name=/data1/oradata/test/test/system01.dbf输入数据文件 fno=00003 name=/data1/oradata/test/test/sysaux01.dbf输入数据文件 fno=00002 name=/data1/oradata/test/test/undotbs01.dbf输入数据文件 fno=00004 name=/data1/oradata/test/test/users01.dbf输入数据文件 fno=00005 name=/data1/oradata/test/test/yangtk01.dbf通道 ORA_DISK_1: 正在启动段 1 于 09-1月 -09通道 ORA_DISK_1: 已完成段 1 于 09-1月 -09段句柄=/data/oracle/product/10.2/database/dbs/1tk4bden_1_1 标记=TAG20090109T023255 注释=NONE通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:25完成 backup 于 09-1月 -09

启动 Control File and SPFILE Autobackup 于 09-1月 -09段 handle=/data1/backup/test/c-1920405094-20090109-01 comment=NONE完成 Control File and SPFILE Autobackup 于 09-1月 -09

在数据库TEST中,准备迁移YANGTK表空间。首先确保Oracle执行及时点恢复所需的所有表空间的备份存在,以及恢复所需的ARCHIVELOG文件存在。这里为了简化,提前备份数据库,避免执行TRANSPORT TABLESPACE的过程中找不到备份而报错,下面就可以执行TRANSPORT TABLESPACE命令了:

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='bxbu' 创建自动实例

供自动实例使用的初始化参数:
db_name=TEST
compatible=10.2.0.3.0
db_block_size=8192
db_files=200
db_unique_name=tspitr_TEST_bxbu
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_bxbu.f

启动自动实例 TEST

Oracle 实例已启动

系统全局区域总计 205520896 字节

Fixed Size 2028912 字节
Variable Size 146803344 字节
Database Buffers 50331648 字节
Redo Buffers 6356992 字节自动实例已创建

内存脚本的内容:

{
 # set the until clause
 set until scn 3564484;
 # 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:03输出文件名=/data1/backup/cntrl_tspitr_TEST_bxbu.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_DISK_1释放的通道: ORA_AUX_DISK_1

内存脚本的内容:

{
 # generated tablespace point-in-time recovery script
 # set the until clause
 set until scn 3564484;
 # 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_BXBU/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: 正在指定从备份集恢复的数据文件正将数据文件00003恢复到/data1/backup/TSPITR_TEST_BXBU/datafile/o1_mf_sysaux_%u_.dbf正将数据文件00005恢复到/data1/backup/yangtk01.dbf通道 ORA_AUX_DISK_1: 正在读取备份段 /data1/backup/test/1oisppvj_1_1通道 ORA_AUX_DISK_1: 已恢复备份段 1段句柄 = /data1/backup/test/1oisppvj_1_1 标记 = TAG20070925T024154通道 ORA_AUX_DISK_1: 恢复完成, 用时: 00:00:16通道 ORA_AUX_DISK_1: 正在开始恢复数据文件备份集通道 ORA_AUX_DISK_1: 正在指定从备份集恢复的数据文件正将数据文件00001恢复到/data1/backup/TSPITR_TEST_BXBU/datafile/o1_mf_system_%u_.dbf正将数据文件00002恢复到/data1/backup/TSPITR_TEST_BXBU/datafile/o1_mf_undotbs1_%u_.dbf通道 ORA_AUX_DISK_1: 正在读取备份段 /data1/backup/test/1nisppvj_1_1通道 ORA_AUX_DISK_1: 已恢复备份段 1段句柄 = /data1/backup/test/1nisppvj_1_1 标记 = TAG20070925T024154通道 ORA_AUX_DISK_1: 恢复完成, 用时: 00:00:36完成 restore 于 09-1月 -09

数据文件 1 已转换成数据文件副本输入数据文件副本 recid=5 stamp=675657350 文件名=/data1/backup/TSPITR_TEST_BXBU/datafile/o1_mf_system_4pdkv341_.dbf数据文件 2 已转换成数据文件副本输入数据文件副本 recid=6 stamp=675657350 文件名=/data1/backup/TSPITR_TEST_BXBU/datafile/o1_mf_undotbs1_4pdkv34h_.dbf数据文件 3 已转换成数据文件副本输入数据文件副本 recid=7 stamp=675657350 文件名=/data1/backup/TSPITR_TEST_BXBU/datafile/o1_mf_sysaux_4pdktlvx_.dbf数据文件 5 已转换成数据文件副本输入数据文件副本 recid=8 stamp=675657350 文件名=/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 序列 105 已作为文件 /data1/oradata/test/archivelog/1_105_622258662.dbf 存在于磁盘上存档日志线程 1 序列 106 已作为文件 /data1/oradata/test/archivelog/1_106_622258662.dbf 存在于磁盘上存档日志线程 1 序列 107 已作为文件 /data1/oradata/test/archivelog/1_107_622258662.dbf 存在于磁盘上存档日志线程 1 序列 108 已作为文件 /data1/oradata/test/archivelog/1_108_622258662.dbf 存在于磁盘上存档日志线程 1 序列 109 已作为文件 /data1/oradata/test/archivelog/1_109_622258662.dbf 存在于磁盘上存档日志线程 1 序列 110 已作为文件 /data1/oradata/test/archivelog/1_110_622258662.dbf 存在于磁盘上存档日志线程 1 序列 111 已作为文件 /data1/oradata/test/archivelog/1_111_622258662.dbf 存在于磁盘上存档日志线程 1 序列 112 已作为文件 /data1/oradata/test/archivelog/1_112_622258662.dbf 存在于磁盘上存档日志线程 1 序列 113 已作为文件 /data1/oradata/test/archivelog/1_113_622258662.dbf 存在于磁盘上存档日志文件名 =/data1/oradata/test/archivelog/1_105_622258662.dbf 线程 =1 序列 =105存档日志文件名 =/data1/oradata/test/archivelog/1_106_622258662.dbf 线程 =1 序列 =106存档日志文件名 =/data1/oradata/test/archivelog/1_107_622258662.dbf 线程 =1 序列 =107存档日志文件名 =/data1/oradata/test/archivelog/1_108_622258662.dbf 线程 =1 序列 =108存档日志文件名 =/data1/oradata/test/archivelog/1_109_622258662.dbf 线程 =1 序列 =109存档日志文件名 =/data1/oradata/test/archivelog/1_110_622258662.dbf 线程 =1 序列 =110存档日志文件名 =/data1/oradata/test/archivelog/1_111_622258662.dbf 线程 =1 序列 =111存档日志文件名 =/data1/oradata/test/archivelog/1_112_622258662.dbf 线程 =1 序列 =112存档日志文件名 =/data1/oradata/test/archivelog/1_113_622258662.dbf 线程 =1 序列 =113介质恢复完成, 用时: 00:01:18完成 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=oraclebxbu)(ARGS=^'(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))^')(ENVS=^'ORACLE_SID=bxbu^'))(CONNECT_DATA=(SID=bxbu))) 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:37: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启动 "SYS"."SYS_EXPORT_TRANSPORTABLE_01": userid="/********@(DESCRIPTION=(ADDRESS=(PROTOCOL=beq)(PROGRAM=/data/oracle/product/10.2/database/bin/oracle)(ARGV0=oraclebxbu)(ARGS=(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))))(ENVS=ORACLE_SID=bxbu))(CONNECT_DATA=(SID=bxbu))) AS SYSDBA" transport_tablespaces= YANGTK dumpfile=yangtk_meta.dp directory=d_output logfile=yangtk_meta.log 处理对象类型 TRANSPORTABLE_EXPORT/PLUGTS_BLK处理对象类型 TRANSPORTABLE_EXPORT/TABLE处理对象类型 TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK已成功加载/卸载了主表 "SYS"."SYS_EXPORT_TRANSPORTABLE_01" 
 ******************************************************************************
 SYS.SYS_EXPORT_TRANSPORTABLE_01 的转储文件集为:
 /data/dmp/yangtk_meta.dp作业 "SYS"."SYS_EXPORT_TRANSPORTABLE_01" 已于 02:38:19 成功完成主机命令完成
/*
 The following command may be used to import the tablespaces.
 Substitute values for <logon> and <directory>.
 impdp <logon> directory=<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
 --------------------------------------------------------------

删除自动实例关闭自动实例
Oracle 实例已关闭自动实例已删除已删除辅助实例文件 /data1/backup/cntrl_tspitr_TEST_bxbu.f已删除辅助实例文件 /data1/backup/TSPITR_TEST_BXBU/datafile/o1_mf_system_4pdkv341_.dbf已删除辅助实例文件 /data1/backup/TSPITR_TEST_BXBU/datafile/o1_mf_undotbs1_4pdkv34h_.dbf已删除辅助实例文件 /data1/backup/TSPITR_TEST_BXBU/datafile/o1_mf_sysaux_4pdktlvx_.dbf已删除辅助实例文件 /data1/backup/TSPITR_TEST_BXBU/datafile/o1_mf_temp_4pdkz09s_.tmp已删除辅助实例文件 /data1/backup/TSPITR_TEST_BXBU/onlinelog/o1_mf_1_4pdkyqj3_.log已删除辅助实例文件 /data1/backup/TSPITR_TEST_BXBU/onlinelog/o1_mf_2_4pdkyr45_.log已删除辅助实例文件 /data1/backup/TSPITR_TEST_BXBU/onlinelog/o1_mf_3_4pdkythh_.log

至此,TRANSPORT TABLESPACE工作告一段落。