使用DBMS_SPACE_ADMIN包传输TableSpace
传输表空间这个特性是一个很好用的东西,因为其操作方便,所以在数据的传输过程中经常会用到。另外如果想修改Tablespace的某些属性(例如名字),但又无法修改时,可以通过表空间传输来解决。当然表空间传输有比较大的局限性,下文详述。
一、表空间的传输
表空间的用途有以下几方面:
* 将数据从OLTP系统移动到数据仓库分级系统
* 从分级系统更新数据仓库和数据中心
* 从中心数据仓库装载数据中心
* 启用存档OLTP和数据仓库系统
* 对内部和外部使用者发布数据
* 执行表空间Point-in-Time恢复
传输表空间比进行数据导出/导入要快很多,而且可以进行索引数据异动,避免了导入数据后必须执行的索引重建
1、约束条件
① 必须在同一数据平台之间传输
② 源/目标数据库必须使用相同字符集和本国字符集
③ 不可重名
④ 不支持以下内容
* 物化视图/复制
* 基于函数的索引
* 规定范围的REF
* 带有多个接受者的高级查询
2、具体的操作过程
① 选择一个自含式表空间集合
“自含式”表示没有从表空间集合内指向表空间外的引用,具体的违反例子有:
1) 一个该表空间集合内部的索引用于一个该表空间集合外的表。(本集表的索引为集外不违例)
2) 分区表部分包含在该表空间集合外,或包含集外分区表的某分区
3) 指向一个表的指示完整性约束条件越过设置的界限(当选择传输时包含指示完整性的约束条件)
4) 表空间集内的表包含集外的LOB列
可以使用DBMS_TTS包中的TRANSPORT_SET_CHECK过程
注:DBMS_TTS包仅供SYS用户使用,即使有DBA权限的用户也无法使用
具体操作是:EXECUTE dbms_tts.transport_set_check('INDX',TRUE);
--true表示需要考虑约束条件,空间名称忽略大小写
执行完成后查询:SELECT * FROM transport_set_violations;
--会列出所有的违例条目,但REF越界不包含其中
② 生成可传输表空间集合
1) 使正在复制的集合中所有表空间只读
ALTER TABLESPACE ... READ ONLY;
2) 使用Export工具,并指定哪些表空间在可传输集合中
EXP TRANSPORT_TABLESPACE=y TABLESPACE=(sales_1,sales_2)
TRIGGERS=y CONSTRANTS=n GRANTS=n FILE=expdat.dmp
说明:
* 只输出表空间的数据字典结构信息,无实际数据
* 触发器内输出(y输出 n不输出)
* 指示完整性的约束条件不被输出
* 授权不被输出
* 要创建的结构信息输出文件名expdat.dmp
③ 传输该表空间集合
将表空间数据文件和输出文件传输到一个目标数据库可访问位置即可。
④ 插入该表空间集合
若块大小不同,则需要在目标数据库加入参数DB_nK_CACHE_SIZE(n为源数据块大小)
使用Import工具插入该表空间和继承结构信息
IMP TRANSPORT_TABLESPACE=y FILE=expdat.dmp
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 通知Export工具正在传输一个表空间
* FILE=exdat.dmp 指名包含元数据的输出文件是exdat.dmp
* TTS_OWNERS列出在该表空间集合中拥有数据的所有用户(与输出一致)
* FROMUSER、TOUSER改变数据库对象的所有权
* 可以将语句写入文本,再调用。 IMP PARFILE='par.f'
3、传输后不能正常工作的对象
① ROWID
ROWID不再唯一,仅在单独表中是唯一的。
② REF
REF在监测自含式时不监测,当非自含时插入虚悬REF,查询时出错
③ 权限
权限赋予可能会失败,例如用户不存在等
④ 分区表
若交换分区后进行传输,要交换回分区时可能会出错
⑤ 索引
基于函数的索引不可被传输,必须在传输前取消
⑥ 触发器
触发器在传输前也不用检查,所以可能会发生编译错误
⑦ 物化视图/复制
二、使用DBMS_SPACE_ADMIN解决表空间问题
DBMS_SPACE_ADMIN包为本地管理的表空间提供带有故障诊断和修复功能的管理程序。
SEGMENT_VERIFY:验证该段盘区映射的一致性
SEGMENT_CORRUPT:标注该段为损坏或有效,以便执行恰当的错误恢复
SEGMENT_DROP_CORRUPT:取消一个当前标注为损坏的段(不回收空间)
SEGMENT_DUMP:卸下一个给定段的段头部和盘区映射
TABLESPACE_VERIFY:验证该表空间中段的位图和盘区映射是否同步
TABLESPACE_REBUILD_BITMAPS:重建适当的位图
TABLESPACE_FIX_BITMAPS:位图中标注适当的数据块地址范围(盘区)为空闲或已用
TABLESPACE_REBUILD_QUOTAS:为给定的表空间重建权限
TABLESPACE_MIGRATE_FROM_LOCAL:将一个本地管理表空间移植为字典管理的表空间
TABLESPACE_MOGRATE_TO_LOCAL:将一个表空间从字典管理的格式移植为本地管理格式
TABLESPACE_RELOCATE_BITMAPS:将位图重定位到指定的目的地
TABLESPACE_FIX_SEGMENT_STATES:修改移植被放弃的表空间中数据段的状态
1、分配的块标注为空闲(没有重叠)时修改位图
SEGMENT_VERIFY过程发现一个段拥有位图中标注为空闲的已分配块,但没有段之间重叠的报告
① 调用SEGMENT_DUMP过程卸下管理冲虚分配给该段的区域
② 对每个区域调用带有TABLESPACE_EXTENT_MAKE_USED选项的TABLESPACE_FIX_BITMAPS过程标注为已用
③ 调用TABLESPACE_REBUILD_QUOTAS过程来确定限额
2、取消一个损坏的段
① 调用带有SEGMENT_VERIFY_EXTENTS_GLOBAL选项的SEGMENT_VERIFY过程,无重叠报告则继续
② 调用SEGMENT_DUMP过程卸下分配给该段的DBA区域
③ 对每个区域调用带有TABLESPACE_EXTENT_MAKE_FREE选项的TABLESPACE_FIX_BITMAPS过程标注为空闲
④ 调用SEGMENT_DROP_CORRUPT过程来取消SEG$入口
⑤ 调用TABLESPACE_REBUILD_QUOTAS过程来修改限额
3、在报告重叠处修改位图
TABLESPACE_VERIFY过程报告一些重叠现象,一些实际数据因原先内部错误必须被牺牲。
选择将表t1牺牲,则执行一下步骤:
① 生成一个t1重叠的所有对象的列表
② 取消表t1.如果必要,通过调用SEGMENT_DROP_CORRUPT过程继续进行
③ 对t1重叠的所有对象调用SEGMENT_VERIFY过程,若必要,调用TABLESPACE_FIX_BITMAPS将合适的位图标注为已用
④ 返回到TABLESPACE_VERIFY过程来验证该位图是否一致
4、纠正位图块的介质损坏
① 对所有位图块或单个快,若只有一个块则调用TABLESPACE_REBUILD_BITMAPS
② 调用TABLESPACE_REBUILD_QUOTAS过程来重建限额
③ 调用TABLESPACE_VERIFY过程来验证该位图是否一致
5、从字典管理移植为本地管理的表空间
EXEC DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL;
三、表空间信息的数据字典
V$TABLESPACE:来自控制文件的所有TableSpace的名称和编号
DBA_TABLESPACES:所有TableSpace的说明(用户可访问)
DBA_EXTENTS:所有TableSpace中段的信息(用户可访问)
DBA_FREE_SPACE:所有TableSpace中的数据盘区信息(用户可访问)
V$DATAFILE:所有数据文件信息,包括所属TableSpace的ID
V$TEMPFILE:所有临时文件信息,包括所属TableSpace的ID
DBA_DATA_FILES:属于TableSpace的文件(数据文件)
DBA_TEMP_FILES:属于临时TableSpace的文件(临时文件)
V$TEMP_EXTENT_MAP:所有本地管理的临时TableSpace中所有盘区信息
V$TEMP_EXTENT_POOL:本地管理的临时表空间由每个实例缓存和使用的临时表空间状态
V$TEMP_SPACE_HEADER:临时文件的已用/空闲空间
DBA_USERS:所有用户的默认和临时的TableSpace
DBA_TS_QUOTAS:列出所有用户的TableSpace限额
V$SORT_SEGMENT:给定实例的每个排序段的信息
V$SORT_USAGE:用户使用的临时排序空间信息