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工作告一段落。