cmds在线重定义增加列
生活随笔
收集整理的這篇文章主要介紹了
cmds在线重定义增加列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
--輸出信息采用縮排或換行格式化EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'PRETTY', TRUE);--確保每個語句都帶分號EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'SQLTERMINATOR', TRUE);--關閉表索引、外鍵等關聯(后面單獨生成)EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'CONSTRAINTS', FALSE);EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'REF_CONSTRAINTS', FALSE);EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'CONSTRAINTS_AS_ALTER', FALSE);--關閉存儲、表空間屬性EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'STORAGE', FALSE);EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'TABLESPACE', FALSE);--關閉創建表的PCTFREE、NOCOMPRESS等屬性EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'SEGMENT_ATTRIBUTES', FALSE);
Oracle數據庫操作中,假如在原始表TB_HXL_USER上新增字段remark01,默認值為'A',但是由于該表的數據量比較大,直接在原表上新增字段,執行的時間特別長,最后還報出了undo空間不足的問題。而且在新增字段的過程中,其他用戶還不能訪問該表,出現的等待事件是library cache lock。下面試著通過在線重定義的方法新增字段,能夠避免undo空間不足以及其他用戶不能訪問該表的情況。
1.使用如下SQL獲取原始表的DDL設置分隔符號以及去掉表DDL中的storage屬性
SELECT DBMS_METADATA.GET_DDL(OBJECT_TYPE => 'TABLE', NAME => 'INSURED') || ?DBMS_METADATA.GET_DEPENDENT_DDL(OBJECT_TYPE => 'INDEX',BASE_OBJECT_NAME => 'INSURED') || ?DBMS_METADATA.GET_DEPENDENT_DDL(OBJECT_TYPE => 'CONSTRAINT',BASE_OBJECT_NAME => 'INSURED' ) || ?DBMS_METADATA.GET_DEPENDENT_DDL('OBJECT_GRANT', 'INSURED', 'CMDS') ?FROM DUAL;
begin ?Dbms_Metadata.Set_Transform_Param(Dbms_Metadata.Session_Transform,'SQLTERMINATOR',True); ?Dbms_Metadata.Set_Transform_Param(Dbms_Metadata.Session_Transform,'STORAGE',False); ?end;/
提取表,索引,約束以及權限的語句。Select Dbms_Metadata.Get_Ddl(Object_Type => 'TABLE', Name => 'INSURED') || ?Dbms_Metadata.Get_Dependent_Ddl(Object_Type => 'INDEX', ?Base_Object_Name => 'INSURED')?From Dual ;
2.將步驟1 SQL中的表名TB_HXL_USER 替換為TB_HXL_USER_MID 創建中間表
3.中間表新增字段 remark01alter table insured_MID add remark01 varchar2(10) default 'A';?4.檢查能否進行重定義,過程執行成功即說明可以重定義beginDBMS_REDEFINITION.CAN_REDEF_TABLE('cmds','insured',DBMS_REDEFINITION.CONS_USE_rowid);end;/
beginDBMS_REDEFINITION.CAN_REDEF_TABLE('cmds','insured_mid',DBMS_REDEFINITION.CONS_USE_rowid);end;/
5.開始重定義表
注意:如原始表有未提交的事物,該過程會一直在等待,等待事件為enq: TX - row lock contention。不能執行start_redef_table的情況下,需要將如下權限賦予用戶。grant create any table to hxl; ?grant alter any table to hxl; ?grant drop any table to hxl; ?grant lock any table to hxl; ?grant select any table to hxl; ?grant create any trigger to hxl; ?grant create any index to hxl;?
運行start_redef_table過程
SQL> BEGIN ?dbms_redefinition.start_redef_table(uname => USER,orig_table => 'insured', int_table => 'INSURED_MID', options_flag => DBMS_REDEFINITION.cons_use_rowid);?END;?/如果有主鍵則是options_flag => DBMS_REDEFINITION.cons_use_pk,如果沒有DBMS_REDEFINITION.cons_use_rowid ?
6.開始同步中間表BEGIN ?dbms_redefinition.sync_interim_table(uname => 'CMDS',orig_table => 'INSURED',int_table => 'INSURED_MID'); ?END;/
7.完成同步注意:如原始表有未提交的事物,該過程會一直在等待BEGIN ?dbms_redefinition.finish_redef_table(uname => 'CMDS',orig_table => 'INSURED',int_table => 'INSURED_MID'); ?END;/
8.刪除中間表drop table insured_mid;9.修改索引名稱alter index IDX_INSURED_NO_mid rename to?IDX_INSURED_NO; ?alter index IDX_INSURED_INDEX_mid rename to?IDX_INSURED_INDEX;?
執行完以上的9個步驟,新增字段就創建成功了。
Oracle數據庫操作中,假如在原始表TB_HXL_USER上新增字段remark01,默認值為'A',但是由于該表的數據量比較大,直接在原表上新增字段,執行的時間特別長,最后還報出了undo空間不足的問題。而且在新增字段的過程中,其他用戶還不能訪問該表,出現的等待事件是library cache lock。下面試著通過在線重定義的方法新增字段,能夠避免undo空間不足以及其他用戶不能訪問該表的情況。
1.使用如下SQL獲取原始表的DDL設置分隔符號以及去掉表DDL中的storage屬性
SELECT DBMS_METADATA.GET_DDL(OBJECT_TYPE => 'TABLE', NAME => 'INSURED') || ?DBMS_METADATA.GET_DEPENDENT_DDL(OBJECT_TYPE => 'INDEX',BASE_OBJECT_NAME => 'INSURED') || ?DBMS_METADATA.GET_DEPENDENT_DDL(OBJECT_TYPE => 'CONSTRAINT',BASE_OBJECT_NAME => 'INSURED' ) || ?DBMS_METADATA.GET_DEPENDENT_DDL('OBJECT_GRANT', 'INSURED', 'CMDS') ?FROM DUAL;
begin ?Dbms_Metadata.Set_Transform_Param(Dbms_Metadata.Session_Transform,'SQLTERMINATOR',True); ?Dbms_Metadata.Set_Transform_Param(Dbms_Metadata.Session_Transform,'STORAGE',False); ?end;/
提取表,索引,約束以及權限的語句。Select Dbms_Metadata.Get_Ddl(Object_Type => 'TABLE', Name => 'INSURED') || ?Dbms_Metadata.Get_Dependent_Ddl(Object_Type => 'INDEX', ?Base_Object_Name => 'INSURED')?From Dual ;
2.將步驟1 SQL中的表名TB_HXL_USER 替換為TB_HXL_USER_MID 創建中間表
3.中間表新增字段 remark01alter table insured_MID add remark01 varchar2(10) default 'A';?4.檢查能否進行重定義,過程執行成功即說明可以重定義beginDBMS_REDEFINITION.CAN_REDEF_TABLE('cmds','insured',DBMS_REDEFINITION.CONS_USE_rowid);end;/
beginDBMS_REDEFINITION.CAN_REDEF_TABLE('cmds','insured_mid',DBMS_REDEFINITION.CONS_USE_rowid);end;/
5.開始重定義表
注意:如原始表有未提交的事物,該過程會一直在等待,等待事件為enq: TX - row lock contention。不能執行start_redef_table的情況下,需要將如下權限賦予用戶。grant create any table to hxl; ?grant alter any table to hxl; ?grant drop any table to hxl; ?grant lock any table to hxl; ?grant select any table to hxl; ?grant create any trigger to hxl; ?grant create any index to hxl;?
運行start_redef_table過程
SQL> BEGIN ?dbms_redefinition.start_redef_table(uname => USER,orig_table => 'insured', int_table => 'INSURED_MID', options_flag => DBMS_REDEFINITION.cons_use_rowid);?END;?/如果有主鍵則是options_flag => DBMS_REDEFINITION.cons_use_pk,如果沒有DBMS_REDEFINITION.cons_use_rowid ?
6.開始同步中間表BEGIN ?dbms_redefinition.sync_interim_table(uname => 'CMDS',orig_table => 'INSURED',int_table => 'INSURED_MID'); ?END;/
7.完成同步注意:如原始表有未提交的事物,該過程會一直在等待BEGIN ?dbms_redefinition.finish_redef_table(uname => 'CMDS',orig_table => 'INSURED',int_table => 'INSURED_MID'); ?END;/
8.刪除中間表drop table insured_mid;9.修改索引名稱alter index IDX_INSURED_NO_mid rename to?IDX_INSURED_NO; ?alter index IDX_INSURED_INDEX_mid rename to?IDX_INSURED_INDEX;?
執行完以上的9個步驟,新增字段就創建成功了。
轉載于:https://www.cnblogs.com/wangrongxin/p/6654009.html
總結
以上是生活随笔為你收集整理的cmds在线重定义增加列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mpvue 使用wxParse解析htm
- 下一篇: 几款常用的ble调试app(nRF Co