溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Oracle 重建表(rename)注意事項(xiàng)總結(jié)

發(fā)布時(shí)間:2020-08-09 05:44:04 來(lái)源:ITPUB博客 閱讀:482 作者:不一樣的天空w 欄目:關(guān)系型數(shù)據(jù)庫(kù)
http://www.cnblogs.com/ljbguanli/p/6752029.html

一、概述
前一段時(shí)間,有一個(gè)DBA朋友在完畢重建表(rename)工作后,第二天早上業(yè)務(wù)無(wú)法正常執(zhí)行,出現(xiàn)數(shù)據(jù)無(wú)法插入的限制和錯(cuò)誤,后來(lái)分析才發(fā)現(xiàn),錯(cuò)誤的原因是使用rename方式重建表以后,其他引用這個(gè)表的外鍵約束指向沒(méi)有又一次定義到這個(gè)重建的新表中,從而導(dǎo)致這些表在插入新數(shù)據(jù)時(shí),違反數(shù)據(jù)完整性約束,導(dǎo)致數(shù)據(jù)無(wú)法正常插入。

影響了業(yè)務(wù)大概有1個(gè)多小時(shí),真是一次血淋淋的教訓(xùn)啊。

使用rename方式重建表是我們?nèi)粘BA維護(hù)工作中常常使用的一種方法,由于CTAS+rename這樣的配合方式。非常有用和高效。

非常多DBA朋友應(yīng)該也都是用過(guò)rename方式重建表。并且重建完畢以后也都一切正常,沒(méi)有引起過(guò)問(wèn)題。可是,我想說(shuō)的是,使用rename重建表后。詳細(xì)須要完畢哪些掃尾工作你真的清楚嗎??

這篇文章主要就是歸納當(dāng)我們使用rename方式重建表后。須要進(jìn)行哪些掃尾工作,假設(shè)你還不是非常清楚。一定要細(xì)致閱讀這篇文章。同一時(shí)候在以后的重建表工作中矯正過(guò)來(lái)。否則。問(wèn)題遲早有一天會(huì)降臨到你的身邊!

二、重建表的方式
這里先不談其他,只說(shuō)一下重建表的方法,例如以下
1、為了確保全部表字段、字段類型、長(zhǎng)度全然一樣,我一般不建議使用CTAS方式來(lái)重建表。
2、一般我都是使用以下兩種方法中的一個(gè),來(lái)抽取表的定義
  • select dbms_metadata.get_ddl('TABLE',upper('&i_table_name'),upper('&i_owner')) from dual;
  • 使用PL/SQL developer類似這種工具,來(lái)查看表定義語(yǔ)句
3、又一次建一張_old類型的表(依據(jù)上面的抽取的表定義),然后使用insert /*+ append */ xx select xxx 方式完畢數(shù)據(jù)的轉(zhuǎn)換
4、最后使用rename方式倒換這兩張表的名字


三、重建表注意事項(xiàng)
索引重建:這里最關(guān)鍵的是,重建后索引的名字是否必須和曾經(jīng)的一樣,假設(shè)須要一樣。則必須將當(dāng)前使用的索引名字先rename,否則創(chuàng)建的時(shí)候會(huì)出現(xiàn)索引名字已經(jīng)存在的錯(cuò)誤

例如以下查詢當(dāng)前表的索引并改名sql:
select 'alter index ' || owner || '.' || index_name || ' rename to ' ||
       substr(index_name, 1, 26) || '_old;'
  from dba_indexes a
 where a.table_owner = 'DBMON'
   AND A.table_name = 'DH_T';  

依賴對(duì)象重建:一般能夠使用例如以下方式完畢
select 'alter '||decode(type,'PACKAGE BODY','PACKAGE',type)||' '||owner||'.'||name||' compile;'
  from dba_dependencies a
 where a.referenced_name = 'DH_T'
   and a.referenced_owner = 'DBMON';  

注意:
1、這里重建的僅僅是直接依賴對(duì)象,必須考慮那些間接依賴的對(duì)象(比如 view1依賴A表,view2依賴view1),查找方法和上面幾乎相同
2、假設(shè)這些依賴對(duì)象中存在一些私有對(duì)象(比如dblink等)。我們用DBA用戶編譯是會(huì)出現(xiàn)編譯錯(cuò)誤,對(duì)于這樣的對(duì)象。必須以相應(yīng)對(duì)象的所屬者才能編譯成功。(也可用用10g以后新出現(xiàn)的代理權(quán)限來(lái)完畢這類任務(wù)?。?br />
針對(duì)PL/SQL代碼(包、函數(shù)、過(guò)程等),是否存在私有對(duì)象的查找方法,例如以下:
select *
  from dba_source a
 where (a.owner, a.name) in
       (select owner, name
          from dba_dependencies b
         where b.referenced_name = 'DH_T'
           and b.referenced_owner = 'DBMON')
   and a.TEXT like '%@%';
  

針對(duì)視圖中是否存在私有對(duì)象的查找方法,例如以下(因?yàn)槭莑ong類型。必須得一個(gè)一個(gè)查看):
select *
  from dba_views a
 where (a.owner, a.view_name) in
       (select owner, name
          from dba_dependencies b
         where b.referenced_name = 'DH_T'
           and b.referenced_owner = 'DBMON'
           and b.type = 'VIEW')  

權(quán)限重建:能夠使用例如以下語(yǔ)句
select 'grant ' || PRIVILEGE || ' on ' || owner || '.' || table_name ||
       ' to ' || grantee || ';'
  from dba_tab_privs
 where table_name = upper('&i_table_name')
   and owner = upper('&i_owner');

外鍵重建:對(duì)于外鍵,如今的業(yè)務(wù)數(shù)據(jù)邏輯非常多都是在應(yīng)用層來(lái)實(shí)現(xiàn)。因此表上的外鍵可能都非常少,因此。導(dǎo)致非常多DBA都忘記須要檢查和重建這一部分了,從而導(dǎo)致業(yè)務(wù)出現(xiàn)故障,本章最開(kāi)始說(shuō)的故障案例就是由于沒(méi)有重建外鍵而引起,因此我們一定要提高警惕。

能夠使用以下語(yǔ)句查看,哪些表引用了重建表

select a.table_name,
       a.owner,
       a.constraint_name,
       a.constraint_type,
       a.r_owner,
       a.r_constraint_name,  --被外鍵引用的約束名
       b.table_name          --被外鍵引用的表名
  from dba_constraints a, dba_constraints b
 where a.constraint_type = 'R'
   and a.r_constraint_name = b.constraint_name
   and a.r_owner = b.owner
   and b.table_name = 'FSPARECEIVEBILLTIME'
   and b.owner='';

物化視圖:另外一個(gè)很重要的依賴對(duì)象就是物化視圖,一般來(lái)說(shuō),rename表以后,物化視圖是不會(huì)有問(wèn)題的,再次刷新時(shí)會(huì)自己主動(dòng)編譯,可是這可能會(huì)影響優(yōu)化其選擇運(yùn)行計(jì)劃。因此,建議手工直接編譯這些失效的物化視圖,如下:
alter MATERIALIZED VIEW DH_T_MV compile; 
備注。事實(shí)上這步已經(jīng)包括在依賴對(duì)象重建部分了。單獨(dú)拿出來(lái)是由于這個(gè)依賴對(duì)象很重要,不容有不論什么意外

物化視圖日志:物化視圖日志是為了高速刷新準(zhǔn)備的并且從dba_dependencies 這張依賴表中無(wú)法查找出來(lái)的。可是,對(duì)于這個(gè)對(duì)象。我們一定要保持慎重和敬畏,由于假設(shè)表上存在物化視圖日志對(duì)象的話,那么這張表無(wú)法完畢rename(在一個(gè)變更的晚上,其他什么都OK了,突然遇到一個(gè)這種問(wèn)題。還得找開(kāi)發(fā)確認(rèn)。是非常被動(dòng)的,整個(gè)變更非常有可能由于這個(gè)無(wú)法確認(rèn)而取消)。會(huì)直接報(bào)錯(cuò)。查找表上的物化視圖日志對(duì)象方法例如以下:
select master,log_table
 from user_mview_logs a
where master in ('DH_T');  

備注:
  1. 我們可能還須要關(guān)注表字段類型,那些LOB、long字段都是我們重建表是須要考慮的
  2. 還有就是重建表是我們可能都會(huì)使用parallel+nologging模式來(lái)加高速度,一定要記得在重建完畢后將這些屬性改動(dòng)回來(lái)。(曾經(jīng)遇到過(guò)一個(gè)案例,未將parallel屬性改回來(lái),導(dǎo)致運(yùn)行計(jì)劃選用并行,終于導(dǎo)致資源非??旌谋M,CPU100%)
  3. 另一些同步機(jī)制。假設(shè)同步依賴rowid,因?yàn)橹亟ū韗owid會(huì)該表。可能造成實(shí)時(shí)同步失敗,這些都是我們須要考慮的
  4. 最后。在工作完畢后,檢查一下全部對(duì)象的有效性是一個(gè)不錯(cuò)的方案。(建議在重建前保存快照。重建后與前面的快照比較)
  5. 上面講述的都是一些我們最經(jīng)常使用的對(duì)象,其他一些非常少使用的對(duì)象這里就不概述了
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI