国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

ORACLE普通表在線轉分區表

IT那活兒 / 3125人閱讀
ORACLE普通表在線轉分區表
點擊上方“IT那活兒”公眾號,關注后了解更多內容,不管IT什么活兒,干就完了!!! 

檢查權限

如果使用普通用戶進行操作,需要確認當前使用用戶是否具有以下權限:

grant EXECUTE_CATALOG_ROLE,CREATE ANY TABLE,ALTER ANY TABLE,DROP ANY TABLE,LOCK ANY TABLE,SELECT ANY TABLE to &用戶名;
或者直接使用DBA用戶。

檢測當前表是否可進行重定義

測試要進行分區的表是否可以進行分區轉換,使用以下語句進行測試,選項dbms_redefinition.cons_use_pk表示使用主鍵作為轉換依據(默認值)。
begin
 dbms_redefinition.can_redef_table(uname        => &user,
                                   tname        => &table,
                                  options_flag => dbms_redefinition.CONS_USE_PK);
end;
/

如果當前表沒有主鍵,需要將選項設置為CONS_USE_rowid(表示使用rowid作為分區依據。)

開啟并行

確定可以進行分區表轉換后,可以考慮增加并行度加快表轉換的速度。
alter session force parallel dml parallel &并行度;
alter session force parallel query parallel &并行度;


按照預定的分區格式,創建臨時表

舉例:
CREATE TABLE scott.emp_tmp
  (
EMPNO NUMBER(4) not null,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2)
)
 partition BY range(EMPNO)
 (
 partition tab_part_2020 VALUES less than  (7700),
 partition tab_part_2021 VALUES less than  (7900),
  partition tab_part_2022 values less than(maxvalue)
 );


開始進行數據重定義

開始進行表轉換,轉換過程中會占用較大空間,需要提前確認磁盤空間是否有足夠余量。
col_mapping => null如果對全部列進行重定義,此處設置為null,如果只對部分列進行重定義,需要將源表和目標表的對應字段一一列出。
options_flag => dbms_redefinition.cons_use_pk該選項此處表示使用主鍵作為分區依據。
BEGIN
 DBMS_REDEFINITION.START_REDEF_TABLE(uname  => &用戶名,
                                     orig_table  => &源表名,
                                     int_table   => &臨時表名,
   col_mapping => null,
                                    options_flag => dbms_redefinition.cons_use_pk
                                     );
END;
/
如果源表中的數據有超出分區表范圍的值,會報類似以下錯誤。
ERROR at line 1:
ORA-12008: error in materialized view refresh path
ORA-14400: inserted partition key does not map to any partition
處理方法:清理無效數據或設置默認分區表。然后將在線重定義的操作進行回退。
注明:此步驟在原表上創建一個物化視圖日志,并用臨時表命名創建一個物化視圖,其基表是原表。如果轉換過程失敗需要刪除相關物化視圖和物化視圖日志然后重新轉化。
select * from dba_mview_logs where log_owner=SCOTT;
select MVIEW_NAME,CONTAINER_NAME,QUERY from dba_mviews where owner=SCOTT;
drop materialized view log on scott.emp1;
drop materiallized view scott.emp_tmp;


開始索引約束重定義

如果以上操作正常執行完成,則進入下一步操作,遷移索引、約束、觸發器。
DECLARE
error_count PLS_INTEGER :=0;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(uname  => &用戶名,
                                       orig_table       => &源表名,
                                       int_table        => &臨時表名,
                                       copy_indexes     => DBMS_REDEFINITION.CONS_ORIG_PARAMS,
                                       copy_triggers    => TRUE,
                                       copy_constraints => TRUE,
                                       copy_privileges  => TRUE,

                                       ignore_errors    => true,
                                       num_errors     => error_count,
                                       copy_statistics  => FALSE );
DBMS_OUTPUT.PUT_LINE(errors :=  || TO_CHAR(error_count));
END;
參數簡介:
  • copy_indexes=> DBMS_REDEFINITION.CONS_ORIG_PARAMS使用源端的索引參數復制索引;設為0表示不復制索引。
  • copy_triggers  => TRUE、copy_constraints => TRUE、copy_privileges  => TRUE,復制觸發器、約束、權限等表的屬性;false表示不復制
注:上述過程可能出現的錯誤如下所示:
ERROR at line 1:
ORA-01442: column to be modified to NOT NULL is already NOT NULL
出現上述錯誤,是因為創建臨時表時設置了多個not null 的約束。
查看重定義過程中是否出錯。
select * from DBA_REDEFINITION_ERRORS;
如果not null約束未遷移成功,采用以下步驟進行處理。
--找出NOT VALIDATED的約束:
SELECT CONSTRAINT_NAME, VALIDATED FROM USER_CONSTRAINTS WHERE TABLE_NAME = &表名;
--上面查出的約束:
ALTER TABLE &表名 ENABLE VALIDATE CONSTRAINT &約束名稱;
--驗證約束是否生效:

SELECT CONSTRAINT_NAME, VALIDATED FROM USER_CONSTRAINTS WHERE TABLE_NAME = &表名;

同步新產生的數據

同步從數據重定義轉換開始至當前產生的新數據,這個操作的目的是為了縮短執行完成過程中鎖定表的時間。

BEGIN
 DBMS_REDEFINITION.SYNC_INTERIM_TABLE(uname      => &用戶名,
                                      orig_table => &源表名,
                                      int_table  => &臨時表名
                                      );
END;

完成在線重定義

執行DBMS_REDEFINITION.FINISH_REDEF_TABLE過程完成表的重定義。這個過程中,原始表會被獨占模式鎖定一小段時間,具體鎖定時間和表的數據量有關。

BEGIN
 DBMS_REDEFINITION.FINISH_REDEF_TABLE(uname      => &用戶名,
                                      orig_table => &源表名,
                                      int_table  => &臨時表名
                                      );
END;

收集統計信息

EXEC DBMS_STATS.gather_table_stats(&用戶名, &表名, cascade => TRUE,no_invalidate => FALSE);

no_invalidate參數決定了新統計量生成之后,如何處理此時已經生成的執行計劃,no_invalidate取值true,新的執行計劃不會立即生效;no_invalidate取值false,新的執行計劃會立即生效,取值auto_invalidate則數據庫自行判斷何時生效(默認值)。

收尾工作

刪除臨時表
確認最后一個分區數據是否有變化,如果數據量未發生變化,查看alert.log是否報錯,如果日志中出現“Some indexes or index [sub]partitions of table ORABPEL.AUDIT_TRAIL have been marked unusable”的錯誤,錯誤處理方法如下:
SELECT ALTER INDEX  || INDEX_OWNER || . || INDEX_NAME ||
      REBUILD PARTITION  || PARTITION_NAME || NOLOGGING online;
 FROM DBA_IND_PARTITIONS
WHERE INDEX_OWNER NOT IN (SYS, SYSTEM, PUBLIC)
  AND STATUS = UNUSABLE
UNION ALL
SELECT alter index  || OWNER || . || A.INDEX_NAME ||
       REBUILD online nologging;
 FROM DBA_INDEXES A
WHERE OWNER NOT IN (SYS, SYSTEM, PUBLIC)
  AND STATUS = UNUSABLE;
確認在線重定義是否引起存儲過程、觸發器等對象失效。
select * from dba_objects where status<>VALID and owner=&用戶名;
確認無誤后,刪除臨時表。
truncate table &臨時表名;
drop table &臨時表名;
根據實際情況判斷是否創建本地分區索引。

本文作者:張連坤(上海新炬王翦團隊)

本文來源:“IT那活兒”公眾號

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/129302.html

相關文章

  • ORACLE 歷史數據管理策略--數據清理

    摘要:背景由于性能數據每天導入量,數據庫表空間每天增長很快,且不需要太長的保存周期,為避免爆表,因此需要定制定期清理計劃。數據的清理可以有多種方案,根據場景的不同可以分為離線,在線。 背景 由于性能數據每天導入量,數據庫表空間每天增長很快,且不需要太長的保存周期,為避免爆表,因此需要定制定期清理計劃。數據的清理可以有多種方案,根據場景的不同可以分為離線,在線。后續又在可以細分。這里僅考慮在線...

    willin 評論0 收藏0
  • 數據庫收集 - 收藏集 - 掘金

    摘要:前言在使用加載數據數據庫常見的優化操作后端掘金一索引將放第一位,不用說,這種優化方式我們一直都在悄悄使用,那便是主鍵索引。 Redis 內存壓縮實戰 - 后端 - 掘金在討論Redis內存壓縮的時候,我們需要了解一下幾個Redis的相關知識。 壓縮列表 ziplist Redis的ziplist是用一段連續的內存來存儲列表數據的一個數據結構,它的結構示例如下圖 zlbytes: 記錄整...

    Little_XM 評論0 收藏0

發表評論

0條評論

IT那活兒

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<