DB2備份

Contents
- 使用db2 backup指令備份
- 使用db2 restore指令恢復
- 使用db2look提取數據庫結構DDL
- 用於數據移動的文件格式
- 使用db2move導出全部數據
- 使用db2 export指令導出數據
- 使用db2move導入(import)數據
- 使用db2 import指令導入數據


使用db2 backup指令備份


首先關閉所有到數據庫的連接,將數據庫置爲“靜默”狀態:
$ db2 connect to testdb user db2inst1 using passwd
$ db2 quiesce database immediate force connections
$ db2 connect reset


現在可以開始備份了:
$ db2 backup database testdb to “/home/backup” user db2inst1 using passwd


解除數據庫的“靜默”狀態:
$ db2 connect to testdb user db2inst1 using passwd
$ db2 unquiesce database
$ db2 connect reset


說明:
1, 以上指令將會把數據庫testdb備份到指定目錄 /home/backup下,所以請確保當前登陸用戶(db2inst1)對該目錄有讀寫的權限。
題外話,若打算使用root用戶來執行備份,請先編輯文件 /etc/group,將root用戶加入到與DB2相關的幾個組:db2grp1, db2fgrp1, dasadm1.
2, 生成的備份文件名如下:
TESTDB.0.db2inst1.NODE0000.CATN0000.20050131205259.001


使用db2 restore指令恢復


相同庫名恢復:
$ db2 restore database testdb from “/home/backup”
說明:
這將會從指定的位置恢復數據庫testdb。


不同庫名恢復:
$ db2 restore database testdb from “/home/backup” into testdb_new
說明:
這個指令將會建立一個新庫,名爲testdb_new,其結構、內容來自原先testdb的備份。


使用db2look提取數據庫結構DDL


提取DDL
$ db2look –d testdb –a –e –x –o testdb.sql
參數的含義與用法請參考db2look的help.


編輯得到的DDL文件
使用db2look得到的DDL文件無法直接使用,因爲其中存在一些與當前系統相關的特殊信息,所以需要對該文件進行編輯。共有幾個方面:
1, 去掉文件頭、尾的指令:
CONNECT TO TESTDB;
COMMIT WORK;
CONNECT RESET;
TERMINATE;
位於這幾句指令之間的就是定義該數據庫的DDL語句,去掉這幾句話讓這個文件變成一個純粹的DDL文件,另外,有時候很容易發生DB2指令執行錯誤,將四句指令放到文件外手動執行更有助troubleshooting.
2, 去掉schema name.
在本案例中schema name是db2inst1。因爲在進行異種平臺的數據移動的時候會發生schema name的變化,最常見的就是從UNIX類系統遷移到Windows平臺的時候,它缺省的schema name分別爲db2inst1, db2admin.
3, 去掉全部引號
此經驗主要來自Oracle,一個object,定義它的時候,使用了引號與沒有使用引號是兩個不同的object.
4, 去掉create table語句中指定的tablespace
這個原因與2類似,在數據移動的過程中,tablespace name發生變化是很經常的事情,所以不要指定,讓(不同的)系統自己決定。
有一點非常重要,需要強調,若存在比較大的字段,就必須創建pagesize比較大的bufferpool,在創建一個tablespace使用該bufferpool。


用於數據移動的文件格式


這個部分簡單介紹一下用於DB2數據移動的文件格式,共有四種:


1. ASC
非定界ASCII文件,是一個ASCII字符流。數據流中的行由行定界符分隔,而行中的每一列則通過起始和結束位置來定義。例如:


10 Head Office 160 Corporate New York
15 New England 50 Eastern Boston
20 Mid Atlantic 10 Eastern Washington
38 South Atlantic 30 Eastern Atlanta
42 Great Lakes 100 Midwest Chicago
51 Plains 140 Midwest Dallas
66 Pacific 270 Western San Francisco
84 Mountain 290 Western Denver


2. DEL
定界ASCII文件,也是一個ASCII字符流。數據流中的行由行定界符分隔,行中的列值由列定界符分隔。文件類型修飾符可用於修改這些定界符的默認值。例如:


10,"Head Office",160,"Corporate","New York"
15,"New England",50,"Eastern","Boston"
20,"Mid Atlantic",10,"Eastern","Washington"
38,"South Atlantic",30,"Eastern","Atlanta"
42,"Great Lakes",100,"Midwest","Chicago"
51,"Plains",140,"Midwest","Dallas"
66,"Pacific",270,"Western","San Francisco"
84,"Mountain",290,"Western","Denver"


3. WSF
work sheet format,工作表格式,用於與Lotus系列的軟件進行數據交換。


4. PC/IXF
集成交換格式(Integration Exchange Format,IXF)數據交換體系結構的改編版本,由一些列可變長度的記錄構成,包括頭記錄、表記錄、表中每列的列描述符記錄以及表中每行的一條或多條 數據記錄。PC/IXF 文件記錄由包含了字符數據的字段組成。


使用db2move導出全部數據


db2move是一個集成式的數據移動工具,它支持導出(export)、導入(import)、裝入(load)三種操作方式。其實db2move的這三種工作方式分別是通過簡單使用db2 export, db2 import, db2 load指令來完成的。


此部分僅僅介紹其export功能,import和load將在稍後的部分介紹。使用db2move導出的數據文件格式是IXF。
建立並進入數據存放目錄:
$ mkdir /home/backup/mydata
$ cd /home/backup/mydata


導出指定的數據庫中的全部數據:
$ db2move testdb export –u db2inst1 –p thepasswd


說明:
1,這將會把數據庫testdb中的全部數據提取到當前目錄(/home/backup/mydata)中。每個表的內容都存儲在一個.ixf文件中,每 個.ixf文件都有一個與之相對應的.msg文件,.msg文件是描述從表中導出數據時的信息的。另外還有兩個文件,db2move.lst用來記錄. ixf文件、.msg文件與表的一一對應關係,EXPORT.out記錄的是導出數據時的屏幕輸出。
2,有關db2move指令更多的細節,請直接執行該指令,將會打印出其幫助信息。


使用db2 export指令導出數據


與上面提到的db2move的export功能不同,db2 export是一個更加細緻的導出工具,它支持三種數據文件格式:DEL, WSF, IXF.


以下示範將數據庫testdb中表mytbl的數據導出,存儲在目錄 /home/backup 下。


建立到數據庫的連接:
$ db2
db2 => connect to testdb user db2inst1 using thepasswd


以DEL格式導出:
db2 => export to /home/backup/mytbl.txt of del select * from mytbl


以IXF格式導出:
db2 => export to /home/backup/mytbl.ixf of ixf select * from mytbl
注:若需要記錄導出過程中的message,使用:
db2 => export to /home/backup/mytbl.ixf of ixf messages /home/backup/mytbl.msg select * from mytbl


斷開連接:
db2 => connect reset
db2 => quit
$


更多有關db2 export的幫助,請:
$ db2 ? export


使用db2move導入(import)數據


以db2inst1用戶身份登錄到Host 2。


創建數據庫mytestdb:
$ db2
db2 => create database mytestdb on ‘/home/db2inst1’ using codeset UTF-8 territory CN
db2 => connect to mytestdb user db2inst1 using thepasswd


創建一個pagesize爲16K的bufferpool,名爲mybigpool:
db2 => create bufferpool mybigpool immediate size 1000 pagesize 16K


創建一個tablespace使用上面創建的bufferpool,名爲mybigspace:
db2 => create regular tablespace mybigspace pagesize 16K managed by system using (‘/home/db2inst1/db2inst1/NODE0000/SQL00004/SQLT0003.0’) extentsize 16 overhead 12.67 prefetchsize 16 transferrate 0.18 bufferpool mybigpool dropped table recovery off


注:
extentsize, overhead, prefetchsize, transferrate這幾個參數值與所使用的服務器有關,我這裏使用的值是基於普通的、使用SCSI硬盤的PC服務器的。


完成空庫的創建:
db2 => commit work
db2 => connect reset
db2 => terminate


導入(import)數據:
使用import方式不需要先建表結構,即,準備好一個空庫就行了。這一點與load方式不一樣,load方式需要先建立表結構。
我將從Host1上導出的全部數據文件(位於Host1的 /home/backup/mydata下)複製到Host2下某個目錄下,假定爲 /home/movedata
$ cd /home/movedata
$ db2move mytestdb import –u db2inst1 –p thepasswd
此時屏幕上會顯示有關導入數據的信息。
存在的問題:
db2move import方式只能導入“普通”的表,如果表中存在自增長的IDENTITY列,那麼使用db2move import時,會出錯。這是因爲,如果IDENTITY列創建表的時候都是定義成always的話,那麼在導入數據的時候該列數據是不能被賦值的,而是 應該由系統生成,使用db2move無法導入這樣的表。對於這種含有IDENTITY列的表,只能使用db2 import指令來進行導入,相關的參數是IDENTITYIGNORE,IDENTITYMISSING。我將在下一部分給出具體的指令操作。
一句題外話:
如果需要實現唯一主鍵,可以不必使用IDENTITY列,改而使用sequence,這樣比較便於維護和管理。


使用db2 import指令導入數據


import和export是一對存在對應關係的指令,有一點不同的是,import支持四種格式:ASC, DEL, WSF, IXF, 而export只支持三種(見上面相應部分的描述)。


以下示範將數據文件/home/movedata/mytbl.ixf導入到數據庫mytestdb中。
$ db2
db2 => connect to mytestdb user db2inst1 using thepasswd
db2 => import from /home/movedata/mytbl.ixf of ixf insert into mytbl
db2 => commit work
db2 => connect reset
db2 => quit
$


在上一部分,我有提到,若表中存在自增長的IDENTITY列,需要使用相應的參數才能導入,比如:
db2 => import from /home/movedata/mytbl2.ixf of ixf modified by identityignore insert into mytbl2


更多有關db2 import的幫助,請:
$ db2 ? import 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章