可迁移表空间
使用可迁移表空间(Transportable Tablespaces)的特性在数据库之间移动大量数据,性能比export/import和unload/load要快很多,因为它迁移表空间只需要复制数据文件和插入表空间元数据到目标数据库中。
迁移表空间对以下应用特别有用:
分阶段将OLTP的数据移入数据仓库
更新数据仓库和数据集
从数据仓库中心加载数据集
有效地归档数据仓库和OLTP
向内部或外部客户发布数据
执行时间点表空间恢复(TSPITR)
限制
源数据库与目标数据库的硬件平台必须相同
源数据库与目标数据库的字符集和国家字符集必须相同
不能迁移与目标数据库已有的同名表空间
迁移表空间不支持实体化视图/复制,基于函数的索引,环境REFs,8.0兼容的有多个接收人的先进队列
考虑兼容性
要使用这个特性,源数据库与目标数据库的初始化参数中的COMPATIBLE必须设置8.1或更高,如果被迁移的表空间的block size与标准的尺寸不同,目标数据库的初始化参数中的COMPATIBLE必须设置9.0或更高。不必要源数据库与目标数据库的版本一样,oracle会保证兼容性,如果不行,错误提示会在插入开始给出。
从老版本的数据库数据迁移到更新版本的目标数据库总是可能的。
迁移过程
Ø 提取自包含的表空间集
数据库对象间有逻辑或物理的依赖性,自包含表空间集的意思是这种表空间集中没有对象依赖于外界的对象。违法自包含规则的例子如下:
1) 存在依赖于要迁移表空间集外的表空间的索引
2) 分区表只有部分被包含在要迁移表空间集中
3) 引用完整性约束穿越了要迁移表空间集的边界
4) 要迁移表空间集中包含一个LOB字段指向表空间集之外
可以使用DBMS_TTS包检查表空间集的自包含性,要执行必须赋予EXECUTE_CATALOG_ROLE 角色,可以设置TTS_FULL_CHECK参数为TRUE作严格的检查。
要检查表空间sales_1和sales_2是自包含的,执行:
EXECUTE dbms_tts.transport_set_check('sales_1,sales_2', TRUE);
执行检查后就可以在视图TRANSPORT_SET_VIOLATIONS,如果是自包含的那么视图应该为空。
SELECT * FROM TRANSPORT_SET_VIOLATIONS;
Ø 产生可迁移表空间集
产生可迁移表空间集使用下面步骤:
1) 修改可迁移表空间集为只读
ALTER TABLESPACE sales_1 READ ONLY;
ALTER TABLESPACE sales_2 READ ONLY;
2) 导出表空间集元数据
EXP TRANSPORT_TABLESPACE=y TABLESPACES=(sales_1,sales_2)
TRIGGERS=y CONSTRAINTS=n GRANTS=n FILE=
如果要执行TSPITR和更严格的约束的检查,执行:
EXP TRANSPORT_TABLESPACE=y TABLESPACES=(sales_1,sales_2)
TTS_FULL_CHECK=Y FILE=
Ø 迁移表空间集
将数据文件和导出的元数据移动到目标数据库能访问的地方,
Ø 插入表空间集
插入表空间结构信息:
IMP TRANSPORT_TABLESPACE=y FILE=
DATAFILES=('/db/sales_jan','/db/sales_feb',...)
TABLESPACES=(sales_1,sales_2) TTS_OWNERS=(dcranney,jfee)
FROMUSER=(dcranney,jfee) TOUSER=(smith,williams)
这里指定的选项有:
TRANSPORT_TABLESPACE=y 指示要迁移表空间
FILE包含了表空间元数据
表空间名指定为sales_1,sales_2
TTS_OWNERS指定在表空间集拥有数据的所有用户
FROMUSER 和TOUSER 指定改变数据库对象的所有者,如果不指定它们所有数据对象被创建在与源数据相同的用户下。
如果插入完成,那么所有插入的表空间都是只读模式,可以改变:
ALTER TABLESPACE sales_1 READ WRITE
ALTER TABLESPACE sales_1 READ WRITE
如果数据文件数量非常多,在一条语句里指定太费劲,可以写一个import参数文件,例如:
IMP PARFILE=''
文件 包含下面内容:
TRANSPORT_TABLESPACE=y
FILE=
DATAFILES=('/db/sales_jan','/db/sales_feb',...)
TABLESPACES=(sales_1,sales_2)
TTS_OWNERS=(dcranney,jfee)
FROMUSER=(dcranney,jfee)
TOUSER=(smith,williams)