成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

ORACLE普通表在線轉(zhuǎn)分區(qū)表

IT那活兒 / 3140人閱讀
ORACLE普通表在線轉(zhuǎn)分區(qū)表
點(diǎn)擊上方“IT那活兒”公眾號,關(guān)注后了解更多內(nèi)容,不管IT什么活兒,干就完了?。。?/strong> 

檢查權(quán)限

如果使用普通用戶進(jìn)行操作,需要確認(rèn)當(dāng)前使用用戶是否具有以下權(quán)限:

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

檢測當(dāng)前表是否可進(jìn)行重定義

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

如果當(dāng)前表沒有主鍵,需要將選項設(shè)置為CONS_USE_rowid(表示使用rowid作為分區(qū)依據(jù)。)

開啟并行

確定可以進(jìn)行分區(qū)表轉(zhuǎn)換后,可以考慮增加并行度加快表轉(zhuǎn)換的速度。
alter session force parallel dml parallel &并行度;
alter session force parallel query parallel &并行度;


按照預(yù)定的分區(qū)格式,創(chuàng)建臨時表

舉例:
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)
 );


開始進(jìn)行數(shù)據(jù)重定義

開始進(jìn)行表轉(zhuǎn)換,轉(zhuǎn)換過程中會占用較大空間,需要提前確認(rèn)磁盤空間是否有足夠余量。
col_mapping => null如果對全部列進(jìn)行重定義,此處設(shè)置為null,如果只對部分列進(jìn)行重定義,需要將源表和目標(biāo)表的對應(yīng)字段一一列出。
options_flag => dbms_redefinition.cons_use_pk該選項此處表示使用主鍵作為分區(qū)依據(jù)。
BEGIN
 DBMS_REDEFINITION.START_REDEF_TABLE(uname  => &用戶名,
                                     orig_table  => &源表名,
                                     int_table   => &臨時表名,
   col_mapping => null,
                                    options_flag => dbms_redefinition.cons_use_pk
                                     );
END;
/
如果源表中的數(shù)據(jù)有超出分區(qū)表范圍的值,會報類似以下錯誤。
ERROR at line 1:
ORA-12008: error in materialized view refresh path
ORA-14400: inserted partition key does not map to any partition
處理方法:清理無效數(shù)據(jù)或設(shè)置默認(rèn)分區(qū)表。然后將在線重定義的操作進(jìn)行回退。
注明:此步驟在原表上創(chuàng)建一個物化視圖日志,并用臨時表命名創(chuàng)建一個物化視圖,其基表是原表。如果轉(zhuǎn)換過程失敗需要刪除相關(guān)物化視圖和物化視圖日志然后重新轉(zhuǎn)化。
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;


開始索引約束重定義

如果以上操作正常執(zhí)行完成,則進(jìn)入下一步操作,遷移索引、約束、觸發(fā)器。
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;
參數(shù)簡介:
  • copy_indexes=> DBMS_REDEFINITION.CONS_ORIG_PARAMS使用源端的索引參數(shù)復(fù)制索引;設(shè)為0表示不復(fù)制索引。
  • copy_triggers  => TRUE、copy_constraints => TRUE、copy_privileges  => TRUE,復(fù)制觸發(fā)器、約束、權(quán)限等表的屬性;false表示不復(fù)制
注:上述過程可能出現(xiàn)的錯誤如下所示:
ERROR at line 1:
ORA-01442: column to be modified to NOT NULL is already NOT NULL
出現(xiàn)上述錯誤,是因為創(chuàng)建臨時表時設(shè)置了多個not null 的約束。
查看重定義過程中是否出錯。
select * from DBA_REDEFINITION_ERRORS;
如果not null約束未遷移成功,采用以下步驟進(jìn)行處理。
--找出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 = &表名;

同步新產(chǎn)生的數(shù)據(jù)

同步從數(shù)據(jù)重定義轉(zhuǎn)換開始至當(dāng)前產(chǎn)生的新數(shù)據(jù),這個操作的目的是為了縮短執(zhí)行完成過程中鎖定表的時間。

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

完成在線重定義

執(zhí)行DBMS_REDEFINITION.FINISH_REDEF_TABLE過程完成表的重定義。這個過程中,原始表會被獨(dú)占模式鎖定一小段時間,具體鎖定時間和表的數(shù)據(jù)量有關(guān)。

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

收集統(tǒng)計信息

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

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

收尾工作

刪除臨時表
確認(rèn)最后一個分區(qū)數(shù)據(jù)是否有變化,如果數(shù)據(jù)量未發(fā)生變化,查看alert.log是否報錯,如果日志中出現(xiàn)“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;
確認(rèn)在線重定義是否引起存儲過程、觸發(fā)器等對象失效。
select * from dba_objects where status<>VALID and owner=&用戶名;
確認(rèn)無誤后,刪除臨時表。
truncate table &臨時表名;
drop table &臨時表名;
根據(jù)實際情況判斷是否創(chuàng)建本地分區(qū)索引。

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

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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/129302.html

相關(guān)文章

  • ORACLE 歷史數(shù)據(jù)管理策略--數(shù)據(jù)清理

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

    willin 評論0 收藏0
  • 數(shù)據(jù)庫收集 - 收藏集 - 掘金

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

    Little_XM 評論0 收藏0

發(fā)表評論

0條評論

IT那活兒

|高級講師

TA的文章

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