[Oracle] Transporting Tablespace
Transporting Tablespace Between Database
【测试目的】
利用Oracle TTS(transport tablespace)特性实现表空间合并
【主要步骤】
确定源平台/目的平台信息以及以及字节序信息
确定待传输的表空间是否独立 (self-contained)
生成transportable tablespace set
transportable tablespace set包含待传输表空间所有数据文件以及待传输表空间结构信息(metadata)导出文件;
如果源平台/目的平台的字节序信息不同, 就必须将tablespace set的字节序信息转换为目的平台;
既可以在源平台上转换, 也可以在目的平台转换;
传输(scp/rsync) tablespace set
导入tablespace set
【测试一】
从DB01将user01用户相关的表空间传输到DB02
实例信息:
Username ORACLE_SID DB_IP DR_IP user01 DB01 1.1.1.1 1.1.1.2 user02 DB02 2.2.2.2 2.2.2.3 数据文件:
SQL> select file_name,tablespace_name from dba_data_files where tablespace_name in ('user01_DAT','user01_IDX'); FILE_NAME TABLESPACE_NAME
-------------------------------------------------- ------------------------------
/data1/oradata/DB01/r221dat009.dbf user01_DAT
/data1/oradata/DB01/r221dat010.dbf user01_DAT ......
/data1/oradata/DB01/r221idx007.dbf user01_IDX
/data1/oradata/DB01/r221idx008.dbf user01_IDX 30 rows selected.
测试示例:
- Step 1: 确定平台信息以及字节信息
source platform:
SQL> SELECT d.PLATFORM_NAME, ENDIAN_FORMAT FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME; PLATFORM_NAME ENDIAN_FORMAT
-------------------------- --------------
Linux x86 64-bit Little
target platform:
SQL> SELECT d.PLATFORM_NAME, ENDIAN_FORMAT FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME; PLATFORM_NAME ENDIAN_FORMAT
-------------------------- --------------
Linux x86 64-bit Little
从查询结果看到: 平台和字节序信息相同, 因此不需要进行convert操作
- Step 2: 确认Self-Contained Set of Tablespaces
执行存储过程:
DBMS_TTS.TRANSPORT_SET_CHECK检查表空间是否独立
SQL>EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('user01_DAT,user01_IDX',TRUE); PL/SQL procedure successfully completed. SQL> select * from TRANSPORT_SET_VIOLATIONS; no rows selected
Step 3: 生成Transport Tablespace Set
将要传输的相关表空间read-only
SQL> alter tablespace user01_DAT read only;
SQL> alter tablespace user01_IDX read only;
导出metadata信息
2.1 创建导出目录
SQL> create directory dump_dir as '/u/dump/';
SQL> grant read,write on directory dump_dir to PUBLIC;
2.2 调用expdp工具
expdp dumpfile=expdat.dmp directory=dump_dir transport_tablespaces = user01_DAT,user01_IDX transport_full_check=y Export: Release 11.2.0.2.0 - Production on Thu Sep 26 11:45:33 2013 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. Username:****** Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Starting "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01": system/******** dumpfile=expdat.dmp directory=dump_dir transport_tablespaces=user01_DAT,user01_IDX transport_full_check=y
Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
ORA-39126: Worker unexpected fatal error in KUPW$WORKER.UNLOAD_METADATA [PLUGTS_BLK]
ORA-00904: "Q"."TABOBJ_NUM": invalid identifier ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95
ORA-06512: at "SYS.KUPW$WORKER", line 8358 ----- PL/SQL Call Stack -----
object line object
handle number name
0x5ba4f3e20 19208 package body SYS.KUPW$WORKER
0x5ba4f3e20 8385 package body SYS.KUPW$WORKER
0x5ba4f3e20 2935 package body SYS.KUPW$WORKER
0x5ba4f3e20 9054 package body SYS.KUPW$WORKER
0x5ba4f3e20 1688 package body SYS.KUPW$WORKER
0x5ba4f7e60 2 anonymous block
Job "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" stopped due to fatal error at 11:13:56
在这里调用expdp工具时, 遇到错误:
encounter some error: ORA-39126: Worker unexpected fatal error in KUPW$WORKER.UNLOAD_METADATA [PLUGTS_BLK]
for more information: http://martincarstenbach.wordpress.com/2011/05/10/slight-11-2-0-2-caveat-with-tts-and-missing-xmldb/
解决办法:
A. 使用exp/imp工具
exp file=/u/dump/expdat.dmp log=/u/dump/expdat.log transport_tablespace=y tablespaces=user01_DAT,user01_IDX
B. 编译后,使用expdp/impdp工具
conn / as sysdba
@?/rdbms/admin/catbundle.sql psu apply
@?/rdbms/admin/catqm.sql xdb sysaux temp yes
@?/rdbms/admin/utlrp.sql expdp dumpfile=expdat.dmp directory=dump_dir transport_tablespaces = user01_DAT,user01_IDX transport_full_check=y
如果Step 1中的平台信息, 以及字节序信息不同, 那么就需要对表空间进行convert; 否则直接跳过, 进行Step 4操作
这里假设target platform是Microsoft Windows NT平台, 需要在source platform上convert数据文件到临时目录:
RMAN TARGET / NOCATALOG
RMAN> convert tablespace user01_DAT,user01_IDX to platform 'Microsoft Windows NT' format '/temp/%U';
Step 4: 传输Tablespace Set
rsync -a --progress oracle@1.1.1.1:/data1/oradata/DB01/r221*dbf /data1/oradata/DB01/
rsync -a --progress oracle@1.1.1.1:/u/dump/expdat.* /u/
如果是将表空间传输到不同平台不同字节序的目的端, 并且Step 3中没有做convert操作, 然而不管数据文件是否被convert过, 都必须移动到特定的目的端位置;
使用RMAN命令convert传输过来的数据文件为目的端字节序信息, 并且将结果存储在/data1/oradata/DB01/
这里假设数据文件存放在目的端目录:/data1/dbbak/test/,target platform是Microsoft Windows NT平台:
RMAN> convert datafile
2> '/data1/dbbak/test/r231dat005.dbf'
......
13> '/data1/dbbak/test/r231idx004.dbf'
14> to platform="Microsoft Windows NT"
15> from platform="Linux x86 64-bit"
16> db_file_name_convert=
17> "/data1/dbbak/test/","/data1/oradata/DB01/"
18> parallelism=5;
备注:
- 省略号出需要填写全部的文件信息;
- 在target platform上RMAN是通过文件名来辨识数据文件的, 而不是表空间名称. 因为目的端是无法知道表空间名称的, 直到metadata导入到实例;
- 参数: to platform和from platform信息是可选的, RMAN通过存在的数据文件确定source platform信息, 以及运行convert主机上默认的target platform信息;
Step 5: Import the Tablespace Set
在目标平台上, 导入metadata信息之前用户必须存在
SQL> create user user01 identified by user01;
SQL> grant connect to user01;
或者
可以用下面sql迁移source上的用户和权限
1.1 创建用户
SQL> select 'create user '||a.name||' identified by values "'||a.password||'";' from user$ a,dba_users b where a.user#=b.user_id and b.account_status='OPEN' and a.name not in ('SYS','SYSTEM','PERFSTAT');
1.2 设置用户默认的表空间
SQL> select 'alter user '||a.name||' default tablespace '||b.default_tablespace||';' from user$ a,dba_users b where a.user#=b.user_id and b.account_status='OPEN' and a.name not in ('SYS','SYSTEM','PERFSTAT');
1.3 初始化用户权限
SQL> select 'grant create session to '||a.name||';' from user$ a,dba_users b where a.user#=b.user_id and b.account_status='OPEN' and a.name not in ('SYS','SYSTEM','PERFSTAT');
SQL> select 'grant '||c.PRIVILEGE||' to '||d.name||';' from (select distinct a.name from user$ a,dba_users b,dba_sys_privs c where a.user#=b.user_id and a.name=c.grantee and b.account_status='OPEN' and a.name not in ('SYS','SYSTEM','PERFSTAT')) d,dba_sys_privs c where d.name=c.grantee;
Import metadata信息
2.1 使用imp/exp工具
imp parfile=/u/par.f
--参数:parfile可以用来指定impdp参数
/u/par.f内容:
file=/u/expdat.dmp
log=/u/impdat.log
transport_tablespace=y
tablespace=user01_DAT,user01_IDX
datafiles=
/data1/oradata/DB01/r221dat015.dbf,
......
/data1/oradata/DB01/r221idx002.dbf,
/data1/oradata/DB01/r221idx001.dbf
备注:
- 省略号处需要列举所有数据文件信息;
2.2 使用expdp/impdp工具
impdp parfile=/u/par.f
--参数: parfile可以用来指定impdp参数
/u/par.f内容:
dumpfile=expdat.dmp
directory=dump_dir
transport_datafiles=
/data1/oradata/DB02/r231dat005.dbf,
......
/data1/oradata/DB02/r231idx003.dbf,
/data1/oradata/DB02/r231idx004.dbf
logfile=tts_impdp.log
备注:
- 省略号处需要列举所有数据文件信息;
--END--
[Oracle] Transporting Tablespace的更多相关文章
- 转 Oracle Transportable TableSpace(TTS) 传输表空间 说明
############1 迁移数据库的集中方法 三.相关技术 迁移方式 优势 不足1 Export and import • 对数据库版本,以及系统平台没有要求 • 不支持并发,速度慢• 停机时 ...
- Oracle错误——tablespace 'XXXX' does not exist
错误 在使用IMP命令导入Oracle数据的时候,因为导出数据的数据库表空间和导入数据的数据库表空间不同,导致导入数据失败,出现:tablespace 'XXXX' does not exist 在网 ...
- oracle create tablespace
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; sqlplus shybt/shybt@127.0.0.1:1521/orcl Cr ...
- Oracle create tablespace 、create user and so on
1.创建临时表空间 CREATE TEMPORARY TABLESPACE test_tempTEMPFILE 'C:\oracle\product\10.1.0\oradata\orcl\test_ ...
- Oracle create tablespace 创建表空间语法详解
CREATE [UNDO] TABLESPACE tablespace_name [DATAFILE datefile_spec1 [,datefile_spec2] ...... ...
- 【Oracle 】tablespace 表空间创建和管理
1.表空间的概述 1. 表空间是数据库的逻辑组成部分. 2. 从物理上讲,数据库数据存放在数据文件中: 3. 从逻辑上讲,数据库是存放在表空间中,表空间由一个或者多个数据文件组成. 2.oracle的 ...
- Oracle transport tablespace
本来没想过发布这个文章,只是周边有一朋友工作中遇到合并数据库的情况,他是通过expdp提取出五个库对象,然后impdp到新库里面.我觉得这种方法特别耗时,尤其在数据量比较大的时候.这种时候我觉得采用表 ...
- Oracle UNDO Tablespace size & Table Size
Table Space Query select SEGMENT_NAME,bytes/1024/1024,a.* from dba_segments a UNDO Table Space Size ...
- Oracle - PL/SQL Commands
第一章:日志管理 1.forcing log switches sql> alter system switch logfile; 2.forcing checkpoints sql> a ...
随机推荐
- python基础之生成器表达式形式、面向过程编程、内置函数部分
生成器表达式形式 直接上代码 1 # yield的表达式形式 2 def foo(): 3 print('starting') 4 while True: 5 x=yield #默认返回为空,实际上为 ...
- PHP.31-TP框架商城应用实例-后台7-商品会员修改-页面优化,多表数据更新
商品表修改功能 1.页面优化,类似添加页面 <layout name="layout" /> <div class="tab-div"> ...
- 计算机指令集CISC与RISC
当接触一新CPU时商家会首先描述它是RISC指令集,这意味着什么,从这个描述你能了解多少CPU特性信息? 复杂指令集计算机(CISC) 长期来,计算机性能的提高往往是通过增加硬件的复杂性来获得.随着集 ...
- Hibernate---架构
Hibernate 架构是分层的,作为数据访问层,你不必知道底层 API .Hibernate 利用数据库以及配置数据来为应用程序提供持续性服务(以及持续性对象). 下面是一个非常高水平的 Hiber ...
- python 表格存取方法(转)
xlwt/xlrd库 存Excel文件:(如果存储数据中有字符,那么写法还有点小小的变化) import xlwt workbook = xlwt.Workbook(encoding='utf-8') ...
- python 按位置关系输出矩阵元素
描述:依次输出矩阵中最近邻的元素 例如:输入: [[1, 2, 3] [4, 5, 6] [7, 8, 9]] 输出: [[ 1. 2. 4. 5. 3. 6. 7. 8. 9.] [ ...
- Avril Lavigne : Everybody Hurts (Ver3)
http://www.guitartabsexplorer.com/ http://www.guitartabsexplorer.com/lavigne-avril-Tabs/everybody-hu ...
- Pascal ASCII和文本的转换
用于帮助新手理解ASCII码和字符型与整型的一段小程序,转载请注明出处 例如:输入 I love you 打印 73 32 108 111 118 101 32 121 111 117 13 10 P ...
- Ajax异步与JavaScript的一些初浅认识
向服务器请求数据的技术 有以下五种常用技术用于向服务器请求数据 XMLHttpRequest(XHR) Dynamic script tag insertion(动态脚本标签插入) iframes C ...
- Visual Studio使用技巧笔记(引用程序集自动复制dll到引用项目目录)
copy /y $(TargetPath) $(SolutionDir)\[您项目引用dll文件的目录]\$(TargetFileName) 例如:copy /y $(TargetPath) $(So ...