⑴ db2有表空間的LRG跟FLG文件,能恢復出來嗎
在弄明白什麼是重定向恢復之前,需要知道資料庫的文件構成,如果您對這一塊比較熟悉,可以直接跳到第一條分割線:
首先,一個DB2資料庫的文件是由兩分部構成的:表空間容器和資料庫文件,容器就是真正存放用戶數據的地方,是創建表空間時定義的;資料庫文件則包括了緩沖池信息文件、資料庫配置文件、歷史文件、日誌控制文件等。
問題是,如何定義表空間容器以及資料庫文件所在的路徑呢?答:是create database以及create tablespace的時候的參數決定的:
1. 如果CREATE DATABASE的時候指定了 AUTOMATIC STORAGE NO:
沒有指定ON path,那麼資料庫文件會被創建在資料庫管理器配置文件dftdbpath指定的目錄里;
若指定了ON path,那麼資料庫文件會被創建在ON指定的path里。
2. 如果CREATE DATABASE的時候指定了 AUTOMATIC STORAGE YES或者根本沒有指定AUTOMATIC STORAGE:
2.1 沒有指定ON path, 那麼資料庫文件和IBMSTOGROUP都會被創建/指定在dftdbpath指定的目錄里
2.2 若指定了ON path, 這個path可以指定多個路徑。 IBMSTOGROUP就使用這些路徑,表空間容器路徑解決了,資料庫文件在哪裡呢?這取決於DBPATH ON 參數:
沒有指定DBPATH ON,資料庫文件會被放在ON path指定的第一個路徑里。
若指定了DBPATH ON, 資料庫文件會放在這個路徑下。
下面正式進入重定向復原,首先是什麼情況下需要重定向恢復?
在下列任何情況下,請使用重定向復原操作:
--如果要將備份映像復原到不同於源機器的目標機器
--如果要將表空間容器復原到另一個物理位置
--如果復原操作由於一個或多個容器不可訪問而失敗
--如果要重新定義已定義的存儲器組的路徑
這兒我舉一個例子,盡可能地將上面幾種情況都包括了,假設我們有如下創建資料庫以及表空間的命令:
dbm cfg: Default database path (DFTDBPATH) = /home/db2users/e105q6a
$ db2 "create db test"
$ db2 "connect to test"
$ db2 "create STOGROUP MQSGROUP ON '/home/db2users/e105q6a/conpath1', '/home/db2users/e105q6a/conpath2'"
$ db2 "create user temporary tablespace usrtmp1 managed by automatic storage"
$ db2 "create regular tablespace rglrtbs1 managed by automatic storage USING STOGROUP MQSGROUP"
$ db2 "create tablespace tbs1 managed by system using ('/home/db2users/e105q6a/path1')"
$ db2 "create tablespace tbs2 managed by database using (file 'con2' 4000)"
那麼資料庫文件、storage group以及各個表空間的容器路徑如下:
資料庫文件/資料庫目錄:
/home/db2users/e105q6a
Storage Group:
$ db2 "SELECT VARCHAR(STORAGE_GROUP_NAME, 15) AS STOGROUP, STORAGE_GROUP_ID, VARCHAR(DB_STORAGE_PATH, 40) AS STORAGE_PATH FROM TABLE(ADMIN_GET_STORAGE_PATHS('',-1)) AS T"
STOGROUP STORAGE_GROUP_ID STORAGE_PATH
---------------- ---------------- ----------------------------------------
IBMSTOGROUP 0 /home/db2users/e105q6a
MQSGROUP 1 /home/db2users/e105q6a/conpath1
MQSGROUP 1 /home/db2users/e105q6a/conpath2
3 record(s) selected.
表空間容器(我精簡了輸出):
$ db2pd -db test -tab
Database Member 0 -- Database TEST -- Active -- Up 0 days 00:16:02 -- Date 2017-02-25-10.28.54.331489
Tablespace Configuration:
Id AS AR Type Content SGID Name Type Container
0 Yes Yes DMS Regular 0 SYSCATSPACE File /home/db2users/e105q6a/e105q6a/NODE0000/TEST/T0000000/C0000000.CAT
1 Yes No SMS SysTmp 0 TEMPSPACE1 Path /home/db2users/e105q6a/e105q6a/NODE0000/TEST/T0000001/C0000000.TMP
2 Yes Yes DMS Large 0 USERSPACE1 File /home/db2users/e105q6a/e105q6a/NODE0000/TEST/T0000002/C0000000.LRG
3 Yes Yes DMS Large 0 SYSTOOLSPACE File /home/db2users/e105q6a/e105q6a/NODE0000/TEST/T0000003/C0000000.LRG
4 Yes No SMS UsrTmp 0 USRTMP1 Path /home/db2users/e105q6a/e105q6a/NODE0000/TEST/T0000004/C0000000.UTM
5 Yes Yes DMS Regular 1 RGLRTBS1 File /home/db2users/e105q6a/conpath1/e105q6a/NODE0000/TEST/T0000005/C0000000.USR
5 Yes Yes DMS Regular 1 RGLRTBS1 File /home/db2users/e105q6a/conpath2/e105q6a/NODE0000/TEST/T0000005/C0000001.USR
6 No No SMS Regular - TBS1 Path /home/db2users/e105q6a/path1
7 No No DMS Large - TBS2 File /home/db2users/e105q6a/e105q6a/NODE0000/SQL00001/con2
----
以上面的資料庫為例,假設想要通過重定向恢復達到以下目的:
1.)把資料庫文件路徑換為/home/db2users/e105q6a/targetdbdir
2.) 把IBMSTOGROUP的路徑換為/home/db2users/e105q6a/targetstgrpsystem
3.)把MQSGROUP的路徑換為/home/db2users/e105q6a/targetstgrpuser1, /home/db2users/e105q6a/targetstgrpuser2 和/home/db2users/e105q6a/targetstgrpuser3
4.)把表空間tbs1路徑換為:/home/db2users/e105q6a/targetpath1
5.)把表空間tbs2路徑換為:/home/db2users/e105q6a/targetcon2, 並將大小改為5000
要先通過"db2 drop db test"刪掉資料庫(模擬恢復到另一個機器上),之後針對上面這幾個需求,相應的操作如下:
1.)$ db2 "restore db test to '/home/db2users/e105q6a/targetdbdir' redirect without prompting"
2.)$ db2 "SET STOGROUP PATHS FOR IBMSTOGROUP ON '/home/db2users/e105q6a/targetstgrpsystem'"
3.)$ db2 "SET STOGROUP PATHS FOR MQSGROUP ON '/home/db2users/e105q6a/targetstgrpuser1', '/home/db2users/e105q6a/targetstgrpuser2', '/home/db2users/e105q6a/targetstgrpuser3' "
4.)$ db2 "set tablespace containers for 6 using (path '/home/db2users/e105q6a/targetpath1')"
5.)$ db2 "set tablespace containers for 7 using (file '/home/db2users/e105q6a/targetcon2' 5000)"
最後發出db2 restore db test continue的命令,完成重定向恢復。
⑵ DB2 誤刪除了表中的一條數據 使用的語句是 delete from tableA where id =x ;求如何恢復
1. 首先資料庫要可以前滾恢復(資料庫配置參數logretain或userexit打開)。
db2 connect to
dbname
db2 update db cfg using logretain on
db2 backup db dbname
(當打開歸檔日誌後,該資料庫會處於rollforward pending狀態,所以要做一次全備份)
2. 對要實施Drop Table Recovery的表空間(限regular tablespace),執行:
db2 "alter
tablespace 表空間名稱 dropped table recovery on "
3. 用 list history dropped table all for 資料庫名 得到刪除表的tableid(例如
0000000000006d0000020003)和表結構的生成語句(DDL),記錄tableid和該語句以便恢復。之後,用drop命令刪除的表中的數據可以在前滾恢復時導出。
db2
list history dropped table all for dbname
4. 恢復資料庫後,如果想恢復已刪除的表,在前滾時加recover dropped table tableid to
目標目錄。在該目錄下被刪除的表中的數據導出。利用上面提到表結構生成語句生成被刪除了的表,然後用import命令將數據導入表中。
db2
restore db dbname tablespace(tablespacename) without rolling forward without
prompting
db2 "rollforward db dbname to end of logs and stop
tablespace(tablespacename) recover dropped table table id to path "
cd
path
利用 db2 list history dropped table all for dbname
查出的表結構生成語句生成被刪除了的表
db2 import from data of del insert into tablename