Oracle10g新特性——利用RMAN迁移表空间(一)

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

 

 

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

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

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

不过在Oracle10.2中,OracleRMAN与数据泵结合在一起,成功的解决了这个问题。通过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 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
--------------------------------------------------------------

删除自动实例
关闭自动实例
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工作告一段落。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-566659/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/4227/viewspace-566659/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值