IBM DB2跨平臺(tái)數(shù)據(jù)庫(kù)遷移步驟和注意事項(xiàng)
db2是個(gè)有著廣泛商業(yè)應(yīng)用的關(guān)系數(shù)據(jù)庫(kù)軟件。作為一個(gè)數(shù)據(jù)庫(kù)管理員時(shí)常面臨著數(shù)據(jù)庫(kù)系統(tǒng)的遷移工作,這是一個(gè)復(fù)雜而艱巨的過(guò)程。互聯(lián)網(wǎng)和 db2 的幫助文檔中有許多關(guān)于 db2 數(shù)據(jù)庫(kù)遷移的介紹,但是對(duì)于 db2 數(shù)據(jù)庫(kù)的跨平臺(tái)遷移卻很少談及。本文將基于筆者的成功實(shí)踐,總結(jié)一下跨平臺(tái)數(shù)據(jù)庫(kù)遷移的步驟和注意事項(xiàng)。
簡(jiǎn)介
設(shè)想您是一個(gè) db2 商業(yè)數(shù)據(jù)庫(kù)系統(tǒng)的管理員。您被給予一項(xiàng)任務(wù),支持業(yè)務(wù)開(kāi)發(fā)和測(cè)試團(tuán)隊(duì)對(duì)商業(yè)系統(tǒng)的持續(xù)開(kāi)發(fā),為他們創(chuàng)建一套獨(dú)立于產(chǎn)品環(huán)境的數(shù)據(jù)庫(kù)系統(tǒng),從而不影響日常的商業(yè)運(yùn)作。由于種種原因,這套開(kāi)發(fā)和測(cè)試數(shù)據(jù)庫(kù)系統(tǒng)將運(yùn)行在一個(gè)不同于產(chǎn)品環(huán)境的操作系統(tǒng)。我們知道 db2 提供了一些方便的數(shù)據(jù)庫(kù)管理工具,比如數(shù)據(jù)庫(kù)的整體備份和恢復(fù)功能,用戶可以用它很方便的將一個(gè) db2 數(shù)據(jù)庫(kù)從一臺(tái)物理節(jié)點(diǎn)遷移到另一個(gè)物理節(jié)點(diǎn),但是 db2 的備份和恢復(fù)功能目前只支持同構(gòu)操作系統(tǒng)平臺(tái)間的遷移,比如從 windows 平臺(tái)到 windows 平臺(tái),AIX 平臺(tái)到 AIX 平臺(tái)。對(duì)于上述任務(wù)要求的跨平臺(tái)的數(shù)據(jù)庫(kù)遷移,就沒(méi)有一個(gè)專門(mén)的工具可以很方便的實(shí)現(xiàn)。
遷移步驟
經(jīng)過(guò)筆者的實(shí)踐,總結(jié) db2 數(shù)據(jù)庫(kù)的跨平臺(tái)遷移步驟如下:
記錄源數(shù)據(jù)庫(kù)管理系統(tǒng)配置參數(shù),以備遷移過(guò)后數(shù)據(jù)庫(kù)系統(tǒng)性能調(diào)優(yōu);
檢查源數(shù)據(jù)庫(kù)系統(tǒng)對(duì)象,明確要遷移哪些數(shù)據(jù)庫(kù)系統(tǒng)對(duì)象;
導(dǎo)出源數(shù)據(jù)庫(kù)系統(tǒng)的數(shù)據(jù)集;
生成源數(shù)據(jù)庫(kù)系統(tǒng)的數(shù)據(jù)對(duì)象定義語(yǔ)句;
在目標(biāo)平臺(tái)創(chuàng)建新的數(shù)據(jù)庫(kù),參照源系統(tǒng)進(jìn)行設(shè)置;
導(dǎo)入源數(shù)據(jù)集;
檢查數(shù)據(jù)集導(dǎo)入過(guò)程日志,排除可能的錯(cuò)誤;
執(zhí)行數(shù)據(jù)對(duì)象定義語(yǔ)句;
檢查數(shù)據(jù)對(duì)象語(yǔ)句執(zhí)行日志,排除可能的錯(cuò)誤;
檢查更新存儲(chǔ)過(guò)程的定義;
連接應(yīng)用系統(tǒng),測(cè)試數(shù)據(jù)庫(kù)遷移是否成功。
下面給出一個(gè)遵循上述步驟的具體例子,其中將給出執(zhí)行這些步驟的具體 db2 命令以供參考。
1. 記錄源數(shù)據(jù)庫(kù)管理系統(tǒng)配置參數(shù)。這些是很重要的數(shù)據(jù)環(huán)境設(shè)置,其中的一些設(shè)置關(guān)系到遷移能否成功。
清單 1. 顯示數(shù)據(jù)庫(kù)管理系統(tǒng)配置參數(shù)的命令
以下是引用片段:
db2 get dbm cfg
清單 2. 顯示數(shù)據(jù)庫(kù)配置參數(shù)的命令
以下是引用片段:
db2 get db cfg for source_db_name
注意:Italic part should be replaced by your settings.
注意:對(duì)于比較復(fù)雜的源數(shù)據(jù)庫(kù),要注意它的應(yīng)用程序組內(nèi)存大小參數(shù)(appgroup_memo_sz)。如果它的大小不夠,后面生成數(shù)據(jù)對(duì)象定義的時(shí)候會(huì)有問(wèn)題。
清單3. 顯示數(shù)據(jù)庫(kù)注冊(cè)表變量的命令
以下是引用片段:
db2set -all
清單 4. 顯示數(shù)據(jù)庫(kù)表空間的命令
以下是引用片段:
db2 list tablespaces show detail
清單 5. 顯示數(shù)據(jù)庫(kù)程序包的命令
以下是引用片段:
db2 list packages
上述顯示表空間和程序包的命令都需要先建立到源數(shù)據(jù)庫(kù)的連接。
2. 檢查源數(shù)據(jù)庫(kù)系統(tǒng)對(duì)象,明確要遷移哪些數(shù)據(jù)庫(kù)系統(tǒng)對(duì)象
如何檢查源數(shù)據(jù)庫(kù)系統(tǒng)對(duì)象?一個(gè)最直觀的方法就是使用DB2控制中心(db2cc)瀏覽查看表,視圖,觸發(fā)器,用戶定義的函數(shù),存儲(chǔ)過(guò)程等數(shù)據(jù)庫(kù)對(duì)象。尤其要注意有無(wú)大的表,比如一行數(shù)據(jù)的表定義可能大于8K的表。 這樣的表需要在目標(biāo)數(shù)據(jù)庫(kù)上建立具有足夠頁(yè)大小的表空間。下面的步驟中將會(huì)給出列子。還需要注意的是有無(wú)外部定義的存儲(chǔ)過(guò)程,這些存儲(chǔ)過(guò)程所關(guān)聯(lián)的外部程序包需要手工重新關(guān)聯(lián)。
3. 導(dǎo)出源數(shù)據(jù)庫(kù)系統(tǒng)的數(shù)據(jù)集
db2 提供了一個(gè)工具叫作 db2move,用戶通過(guò)它可以把所有用戶定義的表中的數(shù)據(jù)導(dǎo)出到 IXF(集成交換格式)的文件中。同時(shí),在導(dǎo)入數(shù)據(jù)的時(shí)候,它還可以生成表上的所定義的索引。具體的導(dǎo)出執(zhí)行命令如下:
清單 6. 導(dǎo)出源數(shù)據(jù)集
以下是引用片段:
db2move dbname
export -u
username
-p
password
根據(jù)數(shù)據(jù)庫(kù)大小,機(jī)器性能的不同,這個(gè)導(dǎo)出過(guò)程可能耗時(shí)幾分鐘到幾個(gè)小時(shí)不等。在筆者的經(jīng)歷中,這個(gè)導(dǎo)出過(guò)程就長(zhǎng)達(dá) 2 個(gè)多小時(shí)。
4. 生成源數(shù)據(jù)庫(kù)系統(tǒng)的數(shù)據(jù)對(duì)象定義語(yǔ)句
在導(dǎo)出了數(shù)據(jù)之后,要做的就是導(dǎo)出數(shù)據(jù)對(duì)象定義。DB2提供了一個(gè)工具叫db2look,用戶可以通過(guò)它來(lái)生成數(shù)據(jù)庫(kù)中的數(shù)據(jù)對(duì)象定義,包括別名,表,索引,視圖,觸發(fā)器,用戶定義函數(shù),存儲(chǔ)過(guò)程等。具體的命令如下:
清單 7. 生成數(shù)據(jù)對(duì)象定義語(yǔ)句
以下是引用片段:
db2look -d dbname
-e -o
ddlfile
-i
username
-w
password
如果數(shù)據(jù)庫(kù)非常復(fù)雜,包含很多的數(shù)據(jù)對(duì)象定義,那么在執(zhí)行上述命令前,用戶有可能要先調(diào)整參數(shù)appgroup_memo_sz,才能夠順利的生成數(shù)據(jù)對(duì)象定義文件。下面是筆者修改這個(gè)參數(shù)的命令示例:
清單 8. 調(diào)整源數(shù)據(jù)庫(kù)參數(shù)
以下是引用片段:
db2 update db cfg for dbname using appgroup_mem_sz 51368
5. 在目標(biāo)平臺(tái)創(chuàng)建新的數(shù)據(jù)庫(kù),參照源系統(tǒng)設(shè)置參數(shù)
在源平臺(tái)上完成了數(shù)據(jù)導(dǎo)出和數(shù)據(jù)對(duì)象定義語(yǔ)句生成之后,下面就是要在目標(biāo)平臺(tái)建立目標(biāo)數(shù)據(jù)庫(kù)了。參考源數(shù)據(jù)庫(kù)的設(shè)置為新創(chuàng)建的數(shù)據(jù)庫(kù)配置適當(dāng)?shù)膮?shù),通常需要調(diào)整的參數(shù)有:
dbheap - 數(shù)據(jù)堆大小
catalogcache_sz - 目錄高速緩存大小
logbufsz - 日志緩沖區(qū)大小
util_heap_sz - 實(shí)用程序堆大小
buffpage - 緩沖池大小
sortheap - 排序列表堆
stmtheap - sql 語(yǔ)句堆
applheapsz - 缺省應(yīng)用程序堆
筆者使用的調(diào)整語(yǔ)句如下:
清單 9. 調(diào)整語(yǔ)句
以下是引用片段:
db2 update db cfg for dbname using dbheap 41599
db2 update db cfg for dbname using catalogcache_sz 38049
db2 update db cfg for dbname using logbufsz 256
db2 update db cfg for dbname using util_heap_sz 20000
db2 update db cfg for dbname using buffpage 1000
db2 update db cfg for dbname using sortheap 4096
db2 update db cfg for dbname using stmtheap 16384
db2 update db cfg for dbname using applheapsz 10242
對(duì)于非常復(fù)雜的數(shù)據(jù)庫(kù),目標(biāo)數(shù)據(jù)庫(kù)的日志參數(shù)還需要做出調(diào)整,以便在導(dǎo)入數(shù)據(jù)和生成數(shù)據(jù)對(duì)象時(shí),系統(tǒng)不至于日志溢出。由于筆者要遷移的數(shù)據(jù)庫(kù)比較復(fù)雜,所以使用了較大的日志配置,命令示例如下:
清單 10. 命令示例
db2 update db cfg for dbname using logfilsiz 8192
db2 update db cfg for dbname using mincommit 1
db2 update db cfg for dbname using logprimary 24
db2 update db cfg for dbname using logsecond 108
6. 導(dǎo)入源數(shù)據(jù)集
細(xì)心的讀者可能會(huì)發(fā)現(xiàn),這里總結(jié)的步驟6和8看似不太符合一般的邏輯順序。對(duì)于數(shù)據(jù)庫(kù)系統(tǒng),通常都是先生成數(shù)據(jù)系統(tǒng)對(duì)象,如表,視圖,觸發(fā)器等,然后再導(dǎo)入數(shù)據(jù)集。而上述步驟中卻是先導(dǎo)入數(shù)據(jù)集,然后再生成數(shù)據(jù)對(duì)象定義。 這能行的通嗎?對(duì)于DB2來(lái)說(shuō),這完全行得通,因?yàn)閐b2move命令在導(dǎo)入數(shù)據(jù)集時(shí),會(huì)自動(dòng)生成表和索引。這樣的順序?qū)τ趶?fù)雜數(shù)據(jù)對(duì)象定義的數(shù)據(jù)庫(kù)遷移是唯一可行的順序,因?yàn)閺?fù)雜數(shù)據(jù)庫(kù)中往往包含諸多復(fù)雜的數(shù)據(jù)約束語(yǔ)句, 它們會(huì)造成數(shù)據(jù)集導(dǎo)入時(shí)的種種問(wèn)題。
清單 11. 導(dǎo)入源數(shù)據(jù)集的命令示例
以下是引用片段:
db2move targetdbname
import -u
username
-p
password
如果數(shù)據(jù)量非常大,這個(gè)過(guò)程將會(huì)非常耗時(shí)。
7. 檢查數(shù)據(jù)集導(dǎo)入過(guò)程日志,排除可能的錯(cuò)誤。
導(dǎo)入完成后,你需要檢查導(dǎo)入過(guò)程日志,查看有無(wú)錯(cuò)誤發(fā)生。如果有錯(cuò)誤,你需要找出解決方法,然后從步驟 5 重新開(kāi)始。
8. 在目標(biāo)系統(tǒng)執(zhí)行數(shù)據(jù)系統(tǒng)對(duì)象定義語(yǔ)句
修改步驟 4 生成的 ddl 語(yǔ)句文件,去除文件前端的數(shù)據(jù)庫(kù)連接語(yǔ)句,保存后執(zhí)行如下命令:
清單12. 命令示例
以下是引用片段:
db2 connect to targetdbname
user
username
using
password
db2 -tvf ddlfile > createSchema.log
db2 connect reset
9.檢查數(shù)據(jù)對(duì)象生成日志,排除可能的錯(cuò)誤
通常你會(huì)發(fā)現(xiàn)有很多創(chuàng)建表的語(yǔ)句執(zhí)行失敗的記錄,不要緊張,這是正常的,因?yàn)榍懊娴牟襟E中已經(jīng)生成了所有的用戶表。所以檢查的焦點(diǎn)應(yīng)該放在其他數(shù)據(jù)庫(kù)對(duì)象(如視圖和觸發(fā)器等)的生成語(yǔ)句上。 如果數(shù)據(jù)庫(kù)非常復(fù)雜,可能需要非常細(xì)致的檢查日志,以確保所有數(shù)據(jù)對(duì)象都正確創(chuàng)建。
10. 執(zhí)行后期檢查
通常,用戶可能碰到兩種需要處理的情況。其一,如果數(shù)據(jù)庫(kù)系統(tǒng)中有用 Java 編寫(xiě)的存儲(chǔ)過(guò)程,那么需要注冊(cè)存儲(chǔ)過(guò)程的外部程序包。命令示例如下:
清單 13. 命令示例
以下是引用片段:
db2 call sqlj.install_jar ('jar_url','jar_id')
db2 drop procedure procedurename
db2 create procedure procedurename
external name '
jar_id:
classname' language java parameter style DB2GENERAL FENCED modifies sql data
db2 grant execute on procedure procedurename to public
其二,如果表定義中有數(shù)據(jù)庫(kù)管理的自動(dòng)增長(zhǎng)列,比如表定義語(yǔ)句含有 'GENERATED BY DEFAULT AS IDENTITY'。那么你需要更新這些列的起始計(jì)數(shù)。命令示例如下:
清單 14. 命令示例
以下是引用片段:
db2 alter table
tabname
alter column
colname
restart with
newstartnumber
這個(gè) newstartnumber 的多少是要根據(jù)目前表中該列的最大值來(lái)定的,具體公式是 newstartnumber = currentmaxnumber + 1。
11. 配置應(yīng)用程序,連接數(shù)據(jù)庫(kù),測(cè)試遷移是否成功。
上述就是完整的 db2 跨平臺(tái)數(shù)據(jù)庫(kù)遷移步驟,筆者使用的 db2 版本是 8.2。無(wú)論如何,數(shù)據(jù)庫(kù)遷移是個(gè)復(fù)雜的問(wèn)題,其中難免有些情況筆者未曾遇到,歡迎有過(guò)類似經(jīng)驗(yàn)的高手指教和共同討論。
