Oracle 重建表(rename)注意事項總結
http://www.cnblogs.com/ljbguanli/p/6752029.html
一、概述
前一段時間,有一個DBA朋友在完畢重建表(rename)工作後,第二天早上業務無法正常執行,出現資料無法插入的限制和錯誤,後來分析才發現,錯誤的原因是使用rename方式重建表以後,其他引用這個表的外來鍵約束指向沒有又一次定義到這個重建的新表中,從而導致這些表在插入新資料時,違反資料完整性約束,導致資料無法正常插入。
影響了業務大概有1個多小時,真是一次血淋淋的教訓啊。
使用rename方式重建表是我們日常DBA維護工作中常常使用的一種方法,由於CTAS+rename這樣的配合方式。非常有用和高效。
非常多DBA朋友應該也都是用過rename方式重建表。並且重建完畢以後也都一切正常,沒有引起過問題。可是,我想說的是,使用rename重建表後。詳細須要完畢哪些掃尾工作你真的清楚嗎??
這篇文章主要就是歸納當我們使用rename方式重建表後。須要進行哪些掃尾工作,假設你還不是非常清楚。一定要細緻閱讀這篇文章。同一時候在以後的重建表工作中矯正過來。否則。問題遲早有一天會降臨到你的身邊!
二、重建表的方式
這裡先不談其他,只說一下重建表的方法,例如以下
1、為了確保全部表欄位、欄位型別、長度全然一樣,我一般不建議使用CTAS方式來重建表。
2、一般我都是使用以下兩種方法中的一個,來抽取表的定義
-
select dbms_metadata.get_ddl('TABLE',upper('&i_table_name'),upper('&i_owner')) from dual;
-
使用PL/SQL developer類似這種工具,來檢視錶定義語句
3、又一次建一張_old型別的表(依據上面的抽取的表定義),然後使用insert /*+ append */ xx select xxx 方式完畢資料的轉換
4、最後使用rename方式倒換這兩張表的名字
三、重建表注意事項
索引重建:這裡最關鍵的是,重建後索引的名字是否必須和曾經的一樣,假設須要一樣。則必須將當前使用的索引名字先rename,否則建立的時候會出現索引名字已經存在的錯誤
例如以下查詢當前表的索引並改名sql:
例如以下查詢當前表的索引並改名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';
依賴物件重建:一般能夠使用例如以下方式完畢
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、這裡重建的僅僅是直接依賴物件,必須考慮那些間接依賴的物件(比如 view1依賴A表,view2依賴view1),查詢方法和上面幾乎相同
2、假設這些依賴物件中存在一些私有物件(比如dblink等)。我們用DBA使用者編譯是會出現編譯錯誤,對於這樣的物件。必須以相應物件的所屬者才能編譯成功。(也可用用10g以後新出現的代理許可權來完畢這類任務!)
針對PL/SQL程式碼(包、函式、過程等),是否存在私有物件的查詢方法,例如以下:
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 '%@%';
針對檢視中是否存在私有物件的查詢方法,例如以下(因為是long型別。必須得一個一個檢視):
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')
許可權重建:能夠使用例如以下語句
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');
外來鍵重建:對於外來鍵,如今的業務資料邏輯非常多都是在應用層來實現。因此表上的外來鍵可能都非常少,因此。導致非常多DBA都忘記須要檢查和重建這一部分了,從而導致業務出現故障,本章最開始說的故障案例就是由於沒有重建外來鍵而引起,因此我們一定要提高警惕。
能夠使用以下語句檢視,哪些表引用了重建表
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='';
物化檢視:另外一個很重要的依賴物件就是物化檢視,一般來說,rename表以後,物化檢視是不會有問題的,再次重新整理時會自己主動編譯,可是這可能會影響最佳化其選擇執行計劃。因此,建議手工直接編譯這些失效的物化檢視,如下:
alter MATERIALIZED VIEW DH_T_MV compile;
備註。事實上這步已經包括在依賴物件重建部分了。單獨拿出來是由於這個依賴物件很重要,不容有不論什麼意外
物化檢視日誌:物化檢視日誌是為了高速重新整理準備的。並且從dba_dependencies
這張依賴表中無法查詢出來的。可是,對於這個物件。我們一定要保持慎重和敬畏,由於假設表上存在物化檢視日誌物件的話,那麼這張表無法完畢rename(在一個變更的晚上,其他什麼都OK了,突然遇到一個這種問題。還得找開發確認。是非常被動的,整個變更非常有可能由於這個無法確認而取消)。會直接報錯。查詢表上的物化檢視日誌物件方法例如以下:
select master,log_table
from user_mview_logs a
where master in ('DH_T');
備註:
-
我們可能還須要關注表欄位型別,那些LOB、long欄位都是我們重建表是須要考慮的
-
還有就是重建表是我們可能都會使用parallel+nologging模式來加高速度,一定要記得在重建完畢後將這些屬性改動回來。(曾經遇到過一個案例,未將parallel屬性改回來,導致執行計劃選用並行,終於導致資源非常快耗盡,CPU100%)
- 另一些同步機制。假設同步依賴rowid,因為重建表rowid會該表。可能造成實時同步失敗,這些都是我們須要考慮的
- 最後。在工作完畢後,檢查一下全部物件的有效性是一個不錯的方案。(建議在重建前儲存快照。重建後與前面的快照比較)
- 上面講述的都是一些我們最經常使用的物件,其他一些非常少使用的物件這裡就不概述了
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31397003/viewspace-2146849/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 達夢表空間管理注意事項總結
- Oracle臨時表使用注意事項Oracle
- TCP使用注意事項總結TCP
- Oracle使用*的注意事項Oracle
- Oracle資料庫表設計時的注意事項Oracle資料庫
- Oracle vs PostgreSQL,研發注意事項(1)-查詢鎖表OracleSQL
- Oracle 資料匯出注意事項Oracle
- IMPDP分割槽表注意事項
- form表單提交注意事項ORM
- vue元件通訊--注意事項及經驗總結Vue元件
- vue元件通訊–注意事項及經驗總結Vue元件
- Oracle:記憶體設定注意事項Oracle記憶體
- 【ASM】Oracle asm刪除磁碟組注意事項ASMOracle
- SqlServer注意事項總結,高階程式設計師必背。SQLServer程式設計師
- 達夢資料裝載工具-dmfldr使用注意事項總結
- SQL Server 表分割槽注意事項HXSQLServer
- Oracle vs PostgreSQL,研發注意事項(6)- 事務處理OracleSQL
- pytorch分散式訓練注意事項/踩坑總結 - 持續更新PyTorch分散式
- RandomAccessFile注意事項randomMac
- @Lombok注意事項Lombok
- 關於mysqldump備份非事務表的注意事項MySql
- Oracle vs PostgreSQL,研發注意事項(2)-DDL語句與事務OracleSQL
- Oracle vs PostgreSQL,研發注意事項(5)- 字元型別OracleSQL字元型別
- Oracle vs PostgreSQL,研發注意事項(12) - NULL與索引OracleSQLNull索引
- Oracle vs PostgreSQL,研發注意事項(13) - UPDATE語句OracleSQL
- 原創:oracle 事務總結Oracle
- vs.net 2003水晶報表部署注意事項
- 函式注意事項函式
- 生產注意事項
- 電量注意事項
- CSP 考前注意事項
- 快取注意事項快取
- ORACLE臨時表總結Oracle
- Oracle vs PostgreSQL,研發注意事項(8)- Oracle資料比較規則OracleSQL
- Oracle vs PostgreSQL,研發注意事項(7)- 型別轉換OracleSQL型別
- Oracle vs PostgreSQL,研發注意事項(3)- 事務回滾之UPDATE操作解析OracleSQL
- 部署專案注意事項
- iOS 程式碼注意事項iOS
- 換工作的注意事項