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之所以不需要将源数据库的表空间置于只读状态,在于RMAN在TRANSPORT TABLESPACE的过程中,利用及时点恢复的方式构造了一个CLONE数据库,在进行迁移表空间的时候,只需要将克隆数据库的对应表空间置于只读状态就可以了。
随后RMAN通过命令行的方式调用了EXPDP执行数据泵的导出操作。为了能顺利的访问到这个新建的实例,Oracle采用了完整的TNSNAMES规则来作为EXPDP的服务名。并将TRANSPORT TABLESPACE命令中指定的DATAPUMP DIRECTORY、DUMP FILE和EXPORT LOG参数带入到EXPDP命令中。
在导出结束后,RMAN还自动生成了导入的脚本,存放在IMPORT SCRIPT参数指定的文件中。而且RMAN生成了两种导入方式,分别是IMPDP和PL/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,这是RMAN的TRANSPORT TABLESPACE命令自动生成的:
$ more yangtk_imp.src
/*
The following command may be used to import the tablespaces.
Substitute values for
impdp
*/
--------------------------------------------------------------
-- 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
可以看到,通过这种方式实现表空间的迁移不需要修改源数据库表空间的只读状态。这使得传输表空间在产品环境中使用的可能性大大增加。
当然,对于9i或10.1的环境,完全可以仿照上面的步骤来自己实现表空间及时点的恢复,并从克隆数据库传输表空间。但是自己实现的方法要远比一个TRANSPORT TABLESPACE命令要复杂得多。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4227/viewspace-566886/ ,如需转载,请注明出处,否则将追究法律责任。