利用PLSQL实现表空间的迁移(一)

9i的时候,表空间的迁移使用EXP/IMP来实现。在10g中,除了使用EXP/IMP之外,还可以使用数据泵EXPDP/IMPDP,以及RMAN的命令TRANSPORT TABLESPACE命令,除此之外,还可以通过PL/SQLDBMS_STREAMS_TABLESPACE_ADM来实现。

这一篇介绍PULL_SIMPLE_TABLESPACE过程。

 

 

OracleDBMS_STREAMS_TABLESPACE_ADM包提供了8个过程:ATTACH_TABLESPACESATTACH_SIMPLE_TABLESPACECLONE_TABLESPACESCLONE_SIMPLE_TABLESPACEDETACH_TABLESPACESDETACH_SIMPLE_TABLESPACEPULL_TABLESPACESPULL_SIMPLE_TABLESPACE

其中包含了4SIMPLE过程,SIMPLE过程可以用来处理一个表空间,且这个表空间中仅包含一个数据文件的情况。

ATTACH过程用于将表空间加载到目标数据库中,这个过程的功能类似IMP导入。

CLONE过程用于将表空间置于只读,并导入源数据,并将表空间对应的数据文件拷贝到指定目录,这个操作包含了EXP的功能。

DETACH过程和CLONE过程功能类型,区别在于DETACH过程在拷贝完成后,会从源数据库中删除表空间。

PULL过程实际上包含了CLONE以及ATTACH两个过程,其中还包括了DBMS_FILE_TRANSFER包的调用,使得在目标数据库执行一个命令就完成表空间迁移的所有的操作。

使用Oracle提供PL/SQL包,可以与TRANSPORT TABLESPACE命令,以及EXP/IMPEXPDP/IMPDP工具配合。比如通过TRANSPORT TABLESPACE命令,或EXP/EXPDP生成的导出源数据以及表空间的数据文件,可以利用ATTACH过程进行导入。利用CLONE过程或DETACH过程生成的源数据以及数据文件,也可以通过IMP/IMPDP方式导入的目标数据库中。

这里介绍一个最简单的例子,由于当前要迁移一个表空间,且表空间仅包含了一个数据文件,因此这里选择了最简单的PULL_SIMPLE_TABLESPACE过程。

首先检查源数据库:

SQL> SELECT * FROM V$VERSION;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi
PL/SQL Release 10.2.0.3.0 - Production
CORE    10.2.0.3.0      Production
TNS for Linux: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production

SQL> SHOW PARAMETER COMPATIBLE

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
compatible                           string      10.2.0.1.0
SQL> SELECT PROPERTY_NAME, PROPERTY_VALUE
  2  FROM DATABASE_PROPERTIES
  3  WHERE PROPERTY_NAME LIKE '%CHARACTERSET%';

PROPERTY_NAME                  PROPERTY_VALUE
------------------------------ --------------------------------------------------
NLS_NCHAR_CHARACTERSET         AL16UTF16
NLS_CHARACTERSET               ZHS16GBK

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

FILE_NAME
-------------------------------------------------------------------------------
/data/oracle/oradata/kaifa/sckc01.dbf

SQL> SHOW PARAMETER DB_BLOCK_SIZE

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_block_size                        integer     16384

SQL> EXEC DBMS_TTS.TRANSPORT_SET_CHECK('SCKC', TRUE)

PL/SQL procedure successfully completed.

SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;

no rows selected

检查目标数据库:

SQL> SELECT * FROM V$VERSION;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi
PL/SQL Release 10.2.0.3.0 - Production
CORE    10.2.0.3.0      Production
TNS for Linux: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production

SQL> SHOW PARAMETER COMPATIBLE

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
compatible                           string      10.2.0.1.0
SQL> SELECT PROPERTY_NAME, PROPERTY_VALUE
  2  FROM DATABASE_PROPERTIES
  3  WHERE PROPERTY_NAME LIKE '%CHARACTERSET%';

PROPERTY_NAME                  PROPERTY_VALUE
------------------------------ --------------------------------------------------
NLS_CHARACTERSET               ZHS16GBK
NLS_NCHAR_CHARACTERSET         AL16UTF16

SQL> SHOW PARAMETER DB_BLOCK_SIZE

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_block_size                        integer     16384
SQL> SELECT TABLESPACE_NAME
  2  FROM DBA_TABLESPACES
  3  WHERE TABLESPACE_NAME = 'SCKC';

no rows selected

目标数据库的版本,兼容性设置、字符集以及DB_BLOCK_SIZE都与源数据库一致,因此不需要进行其他额外的处理。源数据库和目的数据库所在平台也一致,不需要在进行CONVERT转换操作。

在源数据库建立目录,使得源数据库可以读取数据文件:

SQL> CREATE DIRECTORY D_DATAFILE AS '/data/oracle/oradata/kaifa';

Directory created.

SQL> GRANT READ, WRITE ON DIRECTORY D_DATAFILE TO SYSTEM;

Grant succeeded.

在目标数据库建立目标用户:

SQL> CREATE USER SCKC IDENTIFIED BY SCKC;             

User created.

SQL> GRANT CONNECT, RESOURCE TO SCKC;

Grant succeeded.

建立到源数据库的数据库链:

SQL> CREATE DATABASE LINK KAIFA  
  2  CONNECT TO SYSTEM
  3  IDENTIFIED BY PASSWORD
  4  USING 'KAIFA';

Database link created.

SQL> SELECT GLOBAL_NAME FROM GLOBAL_NAME@KAIFA;

GLOBAL_NAME
----------------------------------------------------------------------------------------
KAIFA

SQL> SELECT FILE_NAME FROM DBA_DATA_FILES
  2  WHERE TABLESPACE_NAME = 'SYSTEM';

FILE_NAME
----------------------------------------------------------------------------------
/data/oradata/test08/system01.dbf

SQL> CREATE DIRECTORY D_TRANS AS '/data/oradata/test08';

Directory created.

下面就可以执行PULL_SIMPLE_TABLESPACE过程了:

SQL> EXEC DBMS_STREAMS_TABLESPACE_ADM.PULL_SIMPLE_TABLESPACE('SCKC', 'KAIFA', 'D_TRANS')

PL/SQL procedure successfully completed.

很简单,过程就执行完了,检查一下对应的日志信息:

SQL> host more /data/oradata/test08/sckc01.plg
Starting "SYS"."SYS_IMPORT_TRANSPORTABLE_01": 
Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
Processing object type TRANSPORTABLE_EXPORT/TABLE
Processing object type TRANSPORTABLE_EXPORT/INDEX
Processing object type TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT
Processing object type TRANSPORTABLE_EXPORT/COMMENT
Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
Job "SYS"."SYS_IMPORT_TRANSPORTABLE_01" successfully completed at 15:22:53

检查表空间加载情况:

SQL> SELECT FILE_NAME FROM DBA_DATA_FILES
  2  WHERE TABLESPACE_NAME = 'SCKC';

FILE_NAME
----------------------------------------------------------------------
/data/oradata/test08/sckc01.dbf

SQL> SELECT OWNER, COUNT(*) FROM DBA_OBJECTS
  2  WHERE WNER = 'SCKC'
  3  GROUP BY OWNER;

OWNER                            COUNT(*)
------------------------------ ----------
SCKC                                  127

表空间和数据文件成功加载,表空间中的对象也导入到对应的目标用户中。这个PULL_SIMPLE_TABLESPACE过程来执行表空间的迁移果然很简单。

 

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值