上一篇
"王工!生产环境的分区表迁移报错了!" 凌晨2点,我被急促的电话铃声惊醒,客户正在执行跨平台数据库迁移,却在传输表空间时突然弹出刺眼的错误:
ORA-39901: 仅部分分区表包含在可传输集中
这个报错让原本计划3小时完成的迁移任务彻底卡壳,作为DBA,这种涉及分区表的传输问题我们几乎每月都会遇到,今天就来彻底解决它!
这个错误本质是Oracle的"强迫症"发作了 😅 当我们尝试传输包含分区表的表空间时,Oracle要求:
但现实情况往往是:
举个🌰:假设有个按月份分区的SALES表,1-6月分区在TBS1,7-12月在TBS2,如果只传输TBS1,就会触发此错误。
-- 1. 查询分区表的所有表空间 SELECT table_name, partition_name, tablespace_name FROM user_tab_partitions WHERE table_name = '你的分区表名'; -- 2. 将所有相关表空间加入传输集 -- 例如使用数据泵导出时: expdp system/password dumpfile=exp.dmp transport_tablespaces=TBS1,TBS2,TBS3 transport_full_check=y
-- 1. 创建临时普通表 CREATE TABLE sales_temp AS SELECT * FROM sales PARTITION(分区名); -- 2. 传输完成后重建分区表 -- (注意:此方法会丢失分区特性)
BEGIN DBMS_TTS.skip_constraint_checks('分区表名'); END; /
⚠️ 警告:此方法可能导致数据不一致,仅限紧急情况使用!
当生产环境不能停机时,可以尝试这些技巧:
-- 1. 创建中间非分区表 BEGIN DBMS_REDEFINITION.start_redef_table( uname => 'SCHEMA名', orig_table => '分区表名', int_table => '临时表名'); END; / -- 2. 同步数据(可重复执行) BEGIN DBMS_REDEFINITION.sync_redef_table( uname => 'SCHEMA名', orig_table => '分区表名', int_table => '临时表名'); END; / -- 3. 完成重定义 BEGIN DBMS_REDEFINITION.finish_redef_table( uname => 'SCHEMA名', orig_table => '分区表名', int_table => '临时表名'); END; /
-- 配置GoldenGate抽取进程
EXTRACT ext_sales
USERID ggs_user, PASSWORD ggs_pwd
EXTTRAIL /path/to/trail
TABLE schema.sales_partitioned;
预防胜于治疗:传输前总是检查:
EXEC DBMS_TTS.transport_set_check('TBS1,TBS2', TRUE); SELECT * FROM transport_set_violations;
神奇的12.2新特性:12.2+版本支持分区子集传输:
ALTER TABLE sales MOVE PARTITION jan2025 TABLESPACE new_tbs ONLINE;
空间不足的救急方法:遇到表空间不足时:
ALTER TABLE sales MODIFY PARTITION jan2025 COMPRESS FOR OLTP;
根据Oracle 2025年8月最新补丁说明:
建议检查你的版本是否包含这些修复:
SELECT * FROM v$version;
遇到ORA-39901时,我的处理优先级通常是:
分区表就像乐高积木 🧩,要么全部搬走,要么就别动它!保持耐心,你一定能搞定这个"挑剔"的错误~
本文由 弓凯唱 于2025-08-06发表在【云服务器提供商】,文中图片由(弓凯唱)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/549679.html
发表评论