Schema

導入 Oracle 模式數據而不失去對儲存過程的修改

  • January 22, 2016

我有這種情況:

  1. 一個巨大(數千張表)、複雜的 Oracle 8 生產數據庫,
  2. 一個巨大的(上千張表),複雜的,Oracle 9 開發數據庫,(與生產相同的結構)
  3. 在開發數據庫中,修改了一些儲存過程和包,並添加了新的。
  4. 開發數據庫在某些模式中有新表
  5. Oracle 8exp和 Oracle 9imp都沒有 ROWS ONLY 選項

**我們通常這樣做,**因為這是正確更新數據的唯一方法,因為導入ignore=yes只會插入新數據,但不會更新具有相同 PK 但非 PK 列中的不同值的預先存在的行:

  1. 刪除一個架構,然後再次創建使用者以擁有一個空架構
  2. 從使用者到使用者導入到空模式

問題是:

  1. 如何使用來自生產導出的新數據更新開發數據庫,而無需先刪除模式,因為開發數據庫中有新的儲存過程/包以及修改過的儲存過程/包?
  2. 在刪除模式後重新創建僅修改過的或新的儲存過程以從備份中取回它們的比較過程太容易出錯。
  3. 有數千個(字面意思)表,所以我們不想編寫一個儲存過程來按特定順序刷新數據等。這需要幾個月的時間來編寫和測試。

什麼是基於導入的解決方案?

**編輯:**我沒有提到 prod 是 Solaris 而 dev 是 RedHat。

最終解決我的問題是:

  • 關閉存檔模式
  • 禁止連接
  • 禁用觸發器和約束
  • 截斷所有表
  • 執行導入(嘗試創建現有對象失敗但插入數據)
  • 重新啟用觸發器和約束
  • 重新打開存檔模式
  • 允許返回連接

我看到兩個解決方案。我沒有測試它們,但我希望它們有用。

與表模式導出相比,使用者模式和表空間模式導出都處理表之間的依賴關係,以便以正確的順序導入表。這兩種方法都將生產表結構導入到 dev。ORacle 8i 或 9i 中的表空間模式導出/導入只能在同一作業系統上的多個數據庫系統中進行。On 可以通過使用使用者模式導入將數據導入與目標系統相同的作業系統上的中間模式或數據庫來處理此限制。

**方法 1:**使用TablespaceMode 導出/導入

  1. 將 prod 的表空間設置為只讀模式

  2. TablespaceMode - 從 prod 導出表空間和數據文件副本

  3. 將 prod 的表空間設置為讀/寫模式再次

  4. 刪除 dev 中的表空間(離開過程、來自 dev 的視圖)

  5. TablespaceMode - 導入 Target 中的表空間(包括表、觸發器、索引、prod 的約束)

  6. 將 dev 的表空間放入 read/寫模式

也許您必須複製一些問題,包括表結構的更改、缺少授權或必須調整序列

**方法 2:**用導出替換程序

  1. 產品模式的

UserMod-Export 2) 開發模式的 UserMod-Export

CONSTRAINTS=N

GRANTS=N

STATITICS=N

TRIGGERS=N

ROWS=N

  1. 刪除開發模式

  2. 導入產品模式(到開發)

  3. 導入開發模式(開發)

IGNORE=Y

CONSTRAINTS=N*

GRANTS=N*

INDEXES=N

ROWS=N*

第二個導入應該用 dev 對象替換 prod 對象(過程、視圖),但保留表和表相關對象。帶 * 的參數已在導出期間設置。也許在導入期間不能設置它們。如果你設置IGNORE=N了,那麼你會收到很多錯誤資訊,但也許還有其他一些優點。如果您從 dev 導入不在 prod 中的表,就會發生這種情況。必須逐年處理對錶結構的更改。

我更喜歡一種在被 prod 模式替換之前從 dev 模式中提取過程的方法。諸如來自 Quest 的 Toad 之類的工具(正如 @rm 在評論中提到的那樣)可以比較模式並創建腳本以實現差異可能會有所幫助。

  1. 從 prod 中導出 UserMode

  2. 從 dev 中提取程序到 sql-scripts

  3. 刪除 dev 模式

  4. UserMode-Import 到 dev

  5. 在 dev 中刪除程序

  6. 執行由提取過程創建的腳本

  7. 編譯所有程序

以下方法離開開發結構,僅從生產中導入數據。如果表的列已在 dev 中重命名或刪除,則在導入數據期間將出現錯誤。在 dev 表中添加帶有約束的列或在 dev 中更改約束也可能導致此表的數據導入失敗。如果由於此錯誤而未導入某些表,則在 dev 中未更改的相關表在導入數據時也會出現問題。所以會出現很多複雜的問題。基本思想是:

*) 從開發表中刪除數據

*) 禁用開發表上的約束、觸發器和索引 *)

僅將數據從 prod 表導入到開發表

*) 啟用開發表上的約束、觸發器和索引

*)將數據導入新的開發表並啟用它們的約束、觸發器和索引

  1. 使用者模式導出沒有觸發器的開發模式

ROWS=NO

TRIGGERS=NO

FILE=dev1.dmp

  1. 使用者模式再次導出開發模式

ROWS=NO

TRIGGERS=NO

FILE=dev1.dmp

  1. 表模式導出在產品上找不到的開發表

TABLES=list_of_tables_in_right_order

TRIGGERS=Y

CONSTRAINTS=Y

INDEXES=YES

GRANTS=Y

ROWS=Y

STATISTICS=NO

dev3.dmp

  1. 刪除開發上的模式

  2. 再次在開發上創建空模式

  3. 導入沒有觸發器、約束和索引的空開發模式

ROWS=NO

CONSTRAINTS=N

INDEXES=NO

FILE=dev1.dmp

  1. 在腳本中導入索引

INDEXES=YES

ÌNDEXFILE=index.sql

FILE=dev1.dmp

  1. 使用者模式導出產品模式TRIGGERS=NO INDEXES=NO FILE=prod1.dmp TABLES=*
  2. 使用 index.sql 創建索引sqlplus
  3. 導入表約束和触發器
  4. 導入你需要的開發表

CONSTRAINTS=NO

GRANTS=NO``9) table import the prod table data

IGNORE=Y

CONSTRAINTS=N

INDEXES=N

GRANTS=N

FILE=prod1.dmp

TABLES=*

CONSTRAINT=Y

TRIGGERS=Y

ROWS=N

FILE=dev2.dmp

TABLES=list_of_tables_in_right_order

IGNORE=Y

CONSTRAINT=Y

GRANTS=Y

INDEXES=Y

引用自:https://dba.stackexchange.com/questions/49829