Oracle Transportable Tablespaces (TTS)
主要讲一下关于Oracle在线传输表空间的一些注意事项,文中附有示例。
原理分析
使用copy 数据文件+导入metadata的方式迁移数据
可以实现跨平台传输表空间
COLUMNPLATFORM_NAME FORMAT A36
SELECT * FROM V$TRANSPORTABLE_PLATFORM ORDER BY PLATFORM_NAME;
如果发现源、目标数据库的endian不相同,需要使用rman convert 转换,否则不需要
限制
源、目标数据库必须拥有兼容的字符集。
字符集相同
源数据库的字符集必须是目标数据库的子集。(下面必须全部满足)
(1) 源数据库版本必须大于10.1.0.3
(2) 表中的列不包含semantics的定义信息,最大字符长度限制和目标数据库相同。
(3) 不包含clob数据类型,或者两个数据库的字符集同为single-byte orboth multibyte.
两个数据库必须拥有兼容的国家字符集
必须满足下面其中之一
(1)国家字符集相同
(2)source databaseis in version 10.1.0.3 or higher,并且没有NCHAR, NVARCHAR2, or NCLOB类型的数据
目标数据库中不能有相同名称的表空间。(传输之前rename一下)
底层依赖的对象必须全部包含在表空间集合中。
使用场景
1.tablespace+partition
2. 备份数据到cd中
3. 拷贝只读表可能关键到多个数据库
4. 归档历史数据
5. 执行spitr 基于时间点的表空间恢复
在线传输表空间的工作流程(processes)
1. 检查endian format,查看是否需要使用rman convert 转化endian(如果是相同平台可以忽略这一步)。
2. 选择一个自包含的表空间集合。
3. 在源库端,将表空间置为read only模式,并且生成可传输的表空间集合。(export metadatawith transportable tablespace)
4. 传输表空间集合(使用scp或者其他的传输方式将expdp导出的元数据以及数据文件发送到目标服务器上)
5.恢复表空间为read write模式(可选)
6.在目标端,导入表空间结合(import metadata)
示例一
1、查看目标和源端的endian是否相同
test@ORCL>
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 x8664-bit Little
test@ORCL>
SELECT * FROM V$TRANSPORTABLE_PLATFORM ORDER BYPLATFORM_NAME;
PLATFORM_IDPLATFORM_NAME ENDIAN_FORMAT
------------------------------------------------------------------------------------------------------------------------------
6 AIX-Based Systems(64-bit) Big
16 Apple MacOS Big
19 HP IA OpenVMS Little
15 HP OpenVMS Little
5 HP Tru64UNIX Little
3 HP-UX (64-bit) Big
4 HP-UX IA(64-bit) Big
18 IBM Power BasedLinux Big
9 IBM zSeries BasedLinux Big
10 Linux IA(32-bit) Little
11 Linux IA(64-bit) Little
13 Linux x8664-bit Little
7 Microsoft Windows IA(32-bit) Little
8 Microsoft Windows IA(64-bit) Little
12 Microsoft Windows x8664-bit Little
17 Solaris Operating System(x86) Little
20 Solaris Operating System(x86-64) Little
1 Solaris[tm] OE(32-bit) Big
2 Solaris[tm] OE(64-bit) Big
19 rows selected.
这里都是用Linux x86 64-bit 都是little endian 所以不需要使用rman convert 转换
(记得转换前先设置 表空间 read only 状态,保证数据文件在一个一致性的状态)
2、选择自包含的表空间
test@ORCL>
select t.name , d.name from v$tablespace t,v$datafile d where t.ts#=d.ts# ;
NAME NAME
------------------------------------------------------------------------------------------------------------------------
SYSTEM /u01/apps/oracle/oradata/orcl/system01.dbf
UNDOTBS1 /u01/apps/oracle/oradata/orcl/undotbs01.dbf
SYSAUX /u01/apps/oracle/oradata/orcl/sysaux01.dbf
USERS /u01/apps/oracle/oradata/orcl/users01.dbf
EXAMPLE /u01/apps/oracle/oradata/orcl/example01.dbf
IOTTBS /u01/apps/oracle/oradata/orcl/iottbs01.dbf
IOTEXTBS /u01/apps/oracle/oradata/orcl/iotextbs01.dbf
UNDOTBS1 /u01/apps/oracle/oradata/orcl/undotbs02.dbf
DEXTBS /u01/apps/oracle/oradata/orcl/dextbs01.dbf
SQLTDBS /u01/apps/oracle/oradata/orcl/sqlttbs01.dbf
10 rows selected.
传输iotextbs 表空间对应数据文件
/u01/apps/oracle/oradata/orcl/iotextbs01.dbf
如果没有输出,表示是自包含的表空间
sys@ORCL> EXECUTEDBMS_TTS.TRANSPORT_SET_CHECK('iotextbs',true) ;
PL/SQL procedure successfully completed.
sys@ORCL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
no rows selected