不同系統間的資料庫遷移

2021-05-24 05:09:39 字數 2196 閱讀 8852

假設我們有乙個ibm db2資料庫,這個資料庫裡有很多表(可能上百張甚至更多),又有很多索引、外來鍵約束、觸發器。最要命的是還有一些含有自增字段的表(含有generated always as identity定義的字段的表)。我們也沒有關於這些資料庫物件的準確建立指令碼(筆者經常碰到客戶有這種情況)。

現在我們要把這個資料庫遷移到不同的作業系統(比如從aix到linux),我們應該怎麼辦呢?因為作業系統不同,所以使用backup/restore命令顯然是不行了。那麼是不是可以使用db2move命令呢?也不行,首先db2move命令沒有辦法遷移索引、外來鍵約束、觸發器,更不能遷移含自增欄位資料的表。那麼對每張表都進行export/import操作?天哪,這簡直是一場災難,幾百張表要做到什麼時候啊,更何況import命令並不能保證自增字段的資料和原來一模一樣!下面筆者提供一種方案,感覺還是比較奏效的

假設資料庫名為sample,執行在aix上,我們的目標是遷移到linux上。為簡單起見,所有資料庫物件都在db2inst1模式下,db2inst1使用者擁有必須的所有許可權,密碼也是db2inst1

(一)aix系統上的操作:

1) 首先我們用db2look命令得到資料庫物件的ddl指令碼:

db2look -d sample -z db2inst1 -e -o sample.ddl -i db2inst1 -w db2inst1

2) 使用文字編輯器編輯生成的sample.ddl,將建立表及索引的指令碼語句,建立外來鍵約束的語句,建立觸發器的語句分開,製作成三個ddl指令碼,分別是

sample_tabs.ddl

sample_foriegnkeys.ddl

sample_triggers.ddl

3) 使用下面的sql語句生成匯出所有資料的指令碼:exort.sql

db2 "select 'export to ' || rtrim(tabname) || '.ixf of ixf select * from ' || rtrim(tabname) || ';' from syscat.tables where tabschema = 'db2inst1'" > export.sql

4) 編輯生成的export.sql,把頭和尾那些資訊去掉,只保留必要的export命令.

5) 使用下面的sql語句生成倒入所有資料的指令碼(我們使用load命令,而且必須使用)

db2 "select 'load from ' || rtrim(tabname) || '.ixf of ixf insert into ' || rtrim(tabname) || ';' from syscat.tables where tabschema = 'db2inst1'" > load.sql

6) 編輯生成的load.sql,把頭和尾的資訊去掉,只保留必要的load命令.搜尋sample_tabs.ddl檔案中哪些表含有自增字段(含有generated always as identity定義的字段的表),並把load.sql中含有自增字段的表的load命令加入modified by identityoverride語句(加在of ixf和 insert之間,例如:

load from mytable.ixf of ixf modified by identityoverride insert into mytable;)

注意:load命令中的modified by identityoverride可以保證匯入資料時那些自增字段的值和原資料庫中的資料一致.

7) 使用db2 -tvf export.sql命令,匯出所有表的資料。

(二)將sample_tabs.ddl,sample_foriegnkeys.ddl,sample_triggers.ddl,load.sql及所有匯出的.ixf資料檔案複製到linux機器上.

(三)linux系統上的操作:

1) 使用create database命令建立資料庫sample,建立必要的表空間及配置必要的資料庫引數.

2) 連線到sample資料庫,使用sample_tabs.dd指令碼檔案建立表(db2 -tvf sample_tabs.ddl).

3) 進入到放置.ixf資料檔案的目錄,使用db2 -tvf load.sql匯入資料.

4) 使用sample_foriegnkeys.ddl和sample_triggers.ddl指令碼檔案建立外來鍵約束和觸發器.

ok,我們的資料庫基本上就遷移成功了!

最後,別忘了對每張表執行runstats命令,你可以參照上面生成export和load命令指令碼的方法來生成runstats指令碼,然後再執行它

不同系統間傳輸float型資料

include include int main void r1,r2 特別需要注意的是在微控制器中int float double 型別的字長和pc機中是不一樣的,需要注意 r1.d 7.215487 23131 r2.data 0 r1.data 0 r2.data 1 r1.data 1 r2...

php不同系統下資料庫操作亂碼

最近寫php專案,一直是在win xp環境下開發的。今天部署到遠端空間 unix的freebsd ftp完成以後。使用後台編輯功能就會出現亂碼問題。因為本地環境都是自己搭建的,所以 有問題都可以解決 遠端不是很清楚,系統配置也不開放,但租用平台是對所有人開放的,所以也就排除這種問題機器配置錯誤。測試...

系統解耦問題 不同系統間dubbo呼叫的異常處理

問題描述,系統a和系統b使用了dubbo進行不同系統之間的呼叫,而b是從a解耦出的系統,所以b的自定義異常和a需要對接,我們一開始只是簡單的遷移了異常類過來,實際使用的時候由於包名不同導致a丟擲的異常和b簽名不一致,這時dubbo會直接丟擲異常。解決思路 既然是dubbo傳遞的時候出現的問題,最佳方...