用dbms_streams_tablespace_adm来表空间的迁移(2)

由于PULL_SIMPLE_TABLESPACE只能迁移一个数据文件的表空间,多于一个数据文件的表空间需要用PULL_TABLESPACES来完成。
其中PULL过程实际上包含了CLONE以及ATTACH两个过程,其中还包括了DBMS_FILE_TRANSFER包的调用,使得在目标数据库执行一个命令就完成表空间迁移的所有的操作。[@more@]

PULL_TABLESPACES过程完成以下动作

1. Makes any read/write tablespace in the specified tablespace set at the remote database read-only
2. Uses Data Pump to export the metadata for the tablespaces in the tablespace set
3. Uses a database link and the DBMS_FILE_TRANSFER package to transfer the datafiles for the tablespace set and the

log file for the Data Pump export to the current database
4. Places the datafiles that comprise the specified tablespace set in the specified directories at the local

database
5. Places the log file for the Data Pump export in the specified directory at the local database
6. If this procedure made a tablespace read-only, then makes the tablespace read/write
7. Uses Data Pump to import the metadata for the tablespaces in the tablespace set at the local database

在我的测试中,源数据库以及目标数据库的环境一致,只是有小版本的差异,现只检查一下需要迁移表空间的情况:

SQL> SELECT FILE_NAME FROM DBA_DATA_FILES WHERE TABLESPACE_NAME ='NADSPACE';

FILE_NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/NADSPACE001.dbf
/u01/app/oracle/oradata/orcl/NADSPACE002.dbf


directory在源库和目标库在上个便子中都有建立好

需要迁移的表空间的用户以及权限需要建立好

源库的情况:

SQL> SELECT DISTINCT OWNER FROM DBA_SEGMENTS
2 WHERE TABLESPACE_NAME IN ('NADSPACE');

OWNER
------------------------------
NAD
SCOTT


SQL> SELECT 'GRANT ' || GRANTED_ROLE || ' TO ' || GRANTEE || ';'
2 FROM DBA_ROLE_PRIVS
3 WHERE GRANTEE IN ('NAD','SCOTT')
4 ORDER BY GRANTEE, GRANTED_ROLE;

'GRANT'||GRANTED_ROLE||'TO'||GRANTEE||';'
-----------------------------------------------------------------------
GRANT CONNECT TO NAD;
GRANT RESOURCE TO NAD;
GRANT CONNECT TO SCOTT;
GRANT RESOURCE TO SCOTT;


SQL> SELECT 'GRANT ' || PRIVILEGE || ' TO ' || GRANTEE || ';'
2 FROM DBA_SYS_PRIVS
3 WHERE GRANTEE IN ('NAD','SCOTT')
4 AND PRIVILEGE NOT IN
5 (SELECT PRIVILEGE FROM DBA_SYS_PRIVS
6 WHERE GRANTEE IN ('CONNECT', 'RESOURCE'))
7 ORDER BY GRANTEE;

'GRANT'||PRIVILEGE||'TO'||GRANTEE||';'
--------------------------------------------------------------------------------
GRANT UNLIMITED TABLESPACE TO NAD;
GRANT UNLIMITED TABLESPACE TO SCOTT;


利用上面的授权,就可以在目标数据库建立用户,并授权,篇幅所限,这个过程就省略了。


下面就可以执行PULL_TABLESPACES过程了,需要注意,这个过程的输入参数包括了索引组织表类型和记录,因此需要通过建立一个PL/SQL匿名块来完成调用,注意输入参数变量的声明需要用DBMS_STREAMS_TABLESPACE_ADM包中的类型进行声明,否则调用会报错

SQL> DECLARE
V_JOB_NAME VARCHAR2(30) := 'MY_IMP_TABLESPACE';
V_TABLESPACE_NAME DBMS_STREAMS_TABLESPACE_ADM.TABLESPACE_SET;
V_DIRECTORY_NAME DBMS_STREAMS_TABLESPACE_ADM.DIRECTORY_OBJECT_SET;
V_LOGFILE DBMS_STREAMS_TABLESPACE_ADM.FILE;
BEGIN
V_TABLESPACE_NAME(1) := 'NADSPACE';
V_DIRECTORY_NAME(1) := 'D_TRANS';
V_LOGFILE.DIRECTORY_OBJECT := 'D_TRANS';
V_LOGFILE.FILE_NAME := 'imp_tablespaces.log';
DBMS_STREAMS_TABLESPACE_ADM.PULL_TABLESPACES(V_JOB_NAME, 'NAD', V_TABLESPACE_NAME, V_DIRECTORY_NAME, V_LOGFILE);
END;
13 /

PL/SQL procedure successfully completed.

查看目标库的情况:

SQL> SELECT FILE_NAME FROM DBA_DATA_FILES WHERE TABLESPACE_NAME ='NADSPACE';

FILE_NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/NADSPACE002
/u01/app/oracle/oradata/orcl/NADSPACE001

发现迁移过来的数据文件的后缀没有了,还不知道原因。

表空间迁移完成后,加载的表空间处于只读状态,可以根据具体的需要决定是否将其置为可写状态。

以上的例子是源数据库的表空间的数据文件都在同一个目录下,且目标数据库也是在一个目录下的。如果datafile在多个目录下该如何操作?在平时工作中一般很少一个表空间的数据文件都在一个目录下。

检查源库

SQL> SELECT FILE_NAME FROM DBA_DATA_FILES WHERE TABLESPACE_NAME ='NADSPACE';

FILE_NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/NADSPACE001.dbf
/u01/app/oracle/oradata/orcl/NADSPACE002.dbf
/u02/app/oracle/oradata/orcl/NADSPACE003.dbf
/u02/app/oracle/oradata/orcl/NADSPACE004.dbf


建立/u02的directory

CREATE OR REPLACE DIRECTORY
D_DATAFILE_2 AS
'/u02/app/oracle/oradata/orcl';


Prompt Privs on DIRECTORY D_DATAFILE_2 TO SYSTEM to SYSTEM;
GRANT READ, WRITE ON DIRECTORY SYS.D_DATAFILE_2 TO SYSTEM;

SQL> select * from dba_directories where directory_name like 'D_DATAFILE%'
2 ;

OWNER DIRECTORY_NAME DIRECTORY_PATH
------------------------------ --------------- --------------------------------------------------
SYS D_DATAFILE /u01/app/oracle/oradata/orcl
SYS D_DATAFILE_2 /u02/app/oracle/oradata/orcl


检查目录库的directory

CREATE OR REPLACE DIRECTORY
D_TRANS_2 AS
'/u02/app/oracle/oradata/orcl';


Prompt Privs on DIRECTORY D_TRANS_2 TO SYSTEM to SYSTEM;
GRANT READ, WRITE ON DIRECTORY SYS.D_TRANS_2 TO SYSTEM;


SQL> select * from dba_directories where directory_name like 'D_TRANS%'
2 ;

OWNER DIRECTORY_NAME DIRECTORY_PATH
------------------------------ --------------- --------------------------------------------------
SYS D_TRANS /u01/app/oracle/oradata/orcl
SYS D_TRANS_2 /u02/app/oracle/oradata/orcl



指定多个V_DIRECTORY_NAME的值,分别对应每个datafile的directory

SQL> DECLARE
V_JOB_NAME VARCHAR2(30) := 'MY_IMP_TABLESPACE';
V_TABLESPACE_NAME DBMS_STREAMS_TABLESPACE_ADM.TABLESPACE_SET;
V_DIRECTORY_NAME DBMS_STREAMS_TABLESPACE_ADM.DIRECTORY_OBJECT_SET;
V_LOGFILE DBMS_STREAMS_TABLESPACE_ADM.FILE;
BEGIN
V_TABLESPACE_NAME(1) := 'NADSPACE';
V_DIRECTORY_NAME(1) := 'D_TRANS';
V_DIRECTORY_NAME(2) := 'D_TRANS';
V_DIRECTORY_NAME(3) := 'D_TRANS_2';
V_DIRECTORY_NAME(4) := 'D_TRANS';
V_LOGFILE.DIRECTORY_OBJECT := 'D_TRANS';
V_LOGFILE.FILE_NAME := 'imp_tablespaces.log';
DBMS_STREAMS_TABLESPACE_ADM.PULL_TABLESPACES(V_JOB_NAME, 'NAD', V_TABLESPACE_NAME, V_DIRECTORY_NAME, V_LOGFILE);
END;

PL/SQL procedure successfully completed.

完成后检查目标库的datafile,由于只有V_DIRECTORY_NAME(3) 指定的是/u02的目标,所以导进来的第3个datafile是放在/u02的,其它的都在/u01上。

SQL> SELECT FILE_NAME FROM DBA_DATA_FILES WHERE TABLESPACE_NAME ='NADSPACE';

FILE_NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/NADSPACE004
/u02/app/oracle/oradata/orcl/NADSPACE003
/u01/app/oracle/oradata/orcl/NADSPACE002
/u01/app/oracle/oradata/orcl/NADSPACE001

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

转载于:http://blog.itpub.net/271283/viewspace-1028152/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值