Home  >  Article  >  Database  >  Oracle10g新特性利用RMAN迁移表空间

Oracle10g新特性利用RMAN迁移表空间

WBOY
WBOYOriginal
2016-06-07 15:50:451060browse

Oracle10g 对迁移表空间特性进行了进一步增强,利用 RMAN 进行表空间迁移,可以避免将源数据库的表空间置于 READ ONLY 状态。 Oracle 的迁移表空间是数据装载、迁移、升级的一个重要手段,利用这种方法, Oracle 不再需要将表空间内所有表的数据导出到 DMP


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

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn