備份和恢復(fù)DB2 Universal Database(1)
動(dòng)機(jī)
SQL 語言提供了模式的概念,用來對(duì)所有類型的 SQL 對(duì)象進(jìn)行分組。可以將 SQL 語言中的模式 理解成文件系統(tǒng)中的目錄。DB2 UDB for Linux, UNIX, and Windows 很好地支持 SQL 模式概念,可以將 USER 與 CURRENT SCHEMA 隔離開,并為例程解析提供了 PATH。
使用模式很輕易,但是它們的治理就不同了。模式的重命名、模式級(jí)備份和恢復(fù)以及模式的復(fù)制等任務(wù)比較困難,因?yàn)楸仨毷止みM(jìn)行腳本編程,而且對(duì)象及其依靠性可能很復(fù)雜。
本文提供一個(gè)具有簡單接口的過程庫,使用戶能夠?qū)⒔o定模式中的所有對(duì)象備份到文件系統(tǒng)中、在另一個(gè)模式下恢復(fù)備份以及刪除給定模式中的所有對(duì)象。
安裝
下載并解壓縮本文包含的 backupschema.zip 文件之后,會(huì)得到以下文件:
backupschema.sql
這個(gè)文件包含一些 DDL 語句,這些語句安裝過程以及各個(gè) helper 例程和表。在默認(rèn)情況下,所有對(duì)象使用的模式是 "ADMIN"。假如要改變這個(gè)模式,只需修改這個(gè)文件開頭的 SET SCHEMA 和 SET PATH 語句,將 "ADMIN" 替換為您選擇的模式名。
為了執(zhí)行這個(gè)腳本,作為 DB2 治理員連接到數(shù)據(jù)庫,然后執(zhí)行 db2 -tvf backupschema.sql。
這些過程使用 SYSPROC.ADMIN_CMD() 存儲(chǔ)過程進(jìn)行導(dǎo)出并使用 SYSPROC.DB2LOAD() 存儲(chǔ)過程進(jìn)行裝載。(SYSPROC.ADMIN_CMD() 是在 DB2 V8.2.2(FP 9)中引入的。因此,需要的最低版本是 V8.2.2。)SYSPROC.ADMIN_CMD() 在 sqllibadm.fenced 的所有者指定的 fenced 用戶 id 和組 之下執(zhí)行。因此,導(dǎo)出的文件具有與 sqllibadm.fenced 相同的所有者和組。因此一定要確保這個(gè)用戶和組對(duì)指定的目錄有寫特權(quán),而且用來訪問文件的用戶 id 也有訪問權(quán)。簡單的解決方案是將 sqllibadm.fenced 的所有者改為實(shí)例所有者。更安全的解決方案是讓這兩個(gè) ID 成為同一個(gè)組的成員,然后只將 sqllibadm.fenced 的組所屬權(quán)改為這個(gè)組。這樣就能夠通過組成員關(guān)系訪問產(chǎn)生的文件。
規(guī)范
DROPSCHEMA()
這個(gè)過程將刪除模式中定義的所有對(duì)象,并最終刪除這個(gè)模式本身。
參數(shù)
要?jiǎng)h除的模式的名稱。SQL 標(biāo)識(shí)符是大小寫敏感的。要?jiǎng)h除模式 "MYSCHEMA",模式名必須是大寫的:'MYSCHEMA'。
假如另一個(gè)模式中的對(duì)象依靠于要?jiǎng)h除的模式,那么應(yīng)用刪除對(duì)象的常規(guī)規(guī)則。因此,在大多數(shù)情況下,依靠對(duì)象也會(huì)被刪除或失效。但是,一些對(duì)象(比如 SQL 函數(shù))實(shí)施 RESTRICT 語義。假如碰到這種情況,那么這個(gè)過程將失敗。
DROPSCHEMA 過程在事務(wù)控制下執(zhí)行,它自己不執(zhí)行提交或回退。所以,要想讓模式的刪除持久化,必須提交刪除操作。同樣,假如發(fā)生錯(cuò)誤,那么過程的調(diào)用者需要決定是否將過程回退。
BACKUPSCHEMA(,)
這個(gè)過程將模式中的所有對(duì)象邏輯備份到文件系統(tǒng)中。支持的對(duì)象是:
表,包括統(tǒng)計(jì)數(shù)據(jù)。不支持范圍簇表(RCT)、物化查詢表(MQT)和有類型的表。
視圖,但是不包括有類型的視圖。
函數(shù),包括源、SQL 和外部函數(shù)。注重,對(duì)外部函數(shù)的可執(zhí)行代碼不進(jìn)行備份。函數(shù)的統(tǒng)計(jì)數(shù)據(jù)也不備份。
SQL 過程和外部過程。注重,對(duì)外部過程的可執(zhí)行代碼不進(jìn)行備份。
不同的數(shù)據(jù)類型。注重,不支持結(jié)構(gòu)化數(shù)據(jù)類型。
索引,但是不包括索引擴(kuò)展。
所有約束。
序列,包括它們的高水位標(biāo)志。
支持的所有對(duì)象上的注釋。
支持的所有對(duì)象上的特權(quán)。
這個(gè)備份過程可以包括 PATH、SCHEMA 和 PREP 選項(xiàng)。
不支持聯(lián)邦對(duì)象(比如 NICKNAME)以及數(shù)據(jù)庫分區(qū)特性(DPF)。
參數(shù)
要備份的模式的大小寫敏感名。
對(duì)象要備份到的文件系統(tǒng)目錄。這個(gè)目錄必須存在,在 UNIX 或 Linux 上以斜線結(jié)尾,在 Windows 上以反斜線結(jié)尾;例如 'D:TEMPMYSCHEMA'。假如這個(gè)目錄是 NULL 或空字符串,那么不導(dǎo)出文件。這個(gè)過程只用 DDL 語句填充 DDLLOG 表。COPYSCHEMA 過程要使用這個(gè)方式。
在成功地備份之后,這個(gè)目錄包含以下對(duì)象的 IXF 文件:
備份的模式中的表。
SYSSTAT 視圖,包含表、列和索引統(tǒng)計(jì)數(shù)據(jù)。
DDL 日志,包含重建所有對(duì)象所需的信息。
用戶可以在這個(gè)目錄中添加其他文件,比如外部例程的可執(zhí)行代碼。完成之后,可以根據(jù)需要用 zip 和 tar 對(duì)這個(gè)目錄進(jìn)行壓縮、打包或傳輸。
RESTORESCHEMA(,,,)
這個(gè)過程恢復(fù)以前用 BACKUPSCHEMA 備份的模式。使用當(dāng)前用戶的 ID 創(chuàng)建所有對(duì)象。假如恢復(fù)的任何對(duì)象引用另一個(gè)模式中的對(duì)象,而被引用的對(duì)象在目標(biāo)數(shù)據(jù)庫中不存在,那么這個(gè)過程將失敗。這個(gè)過程執(zhí)行內(nèi)部提交。
假如恢復(fù)到與 BACKUPSCHEMA 不同的模式中,那么所有包含 SQL 體(比如視圖、SQL 例程和檢查約束)的 SQL 對(duì)象在它們的定義中必須沒有顯式地引用源模式。例如,CHECK (MYSCHEMA.MYTABLE.C1 > 0) 無法成功地恢復(fù)到 "MYSCHEMA" 之外的模式中,而 CHECK (MYTABLE.C1 > 0) 可以。為了能夠在 RESTORESCHEMA 中指定其他模式,建議在定義 SQL 對(duì)象時(shí)利用非凡寄存器 CURRENT PATH 和 CURRENT SCHEMA,而不是顯式地指定局部模式。
參數(shù)
要將對(duì)象恢復(fù)到的模式的大小寫敏感名。假如這個(gè)模式已經(jīng)存在,那么先刪除它。假如模式是 NULL 或空字符串,那么這個(gè)過程采用備份時(shí)的模式名進(jìn)行恢復(fù)。COPYSCHEMA 過程采用這種方式。
包含要添加到每個(gè)表定義中的表空間信息的字符串。這個(gè)子句可能包含 IN 、LONG IN 和 INDEX IN 子句。假如應(yīng)該使用默認(rèn)值,那么這個(gè)參數(shù)可以是空字符串或 NULL。例如:'IN DATA8K INDEX IN INDEX4K'
文件系統(tǒng)中存放 BACKUPSCHEMA 生成的文件的目錄。這個(gè)目錄在 UNIX 或 Linux 上必須以斜線結(jié)尾,在 Windows 上必須以反斜線結(jié)尾;例如 'D:TEMPMYSCHEMA'。 文件系統(tǒng)中的一個(gè)目錄,這個(gè)過程將把裝載消息文件寫到這個(gè)目錄中。這個(gè)目錄必須根據(jù)操作系統(tǒng)以適當(dāng)?shù)男本€或反斜線結(jié)尾。
COPYSCHEMA(,,) 這個(gè)過程在相同的數(shù)據(jù)庫中創(chuàng)建模式的副本。
參數(shù)
新模式的大小寫敏感名。
包含要添加到每個(gè)表定義中的表空間信息的字符串。假如是 NULL 或 '',那么使用默認(rèn)值。
要復(fù)制的模式的大小寫敏感名。
REBINDPROCEDURES()
這個(gè)過程對(duì)一個(gè)模式中的所有 SQL 過程進(jìn)行重新綁定。在為模式中過程使用的表收集新的統(tǒng)計(jì)數(shù)據(jù)之后,應(yīng)該調(diào)用這個(gè)過程。這個(gè)過程將重新優(yōu)化 SQL 過程中使用的所有 SQL 語句。
參數(shù)
模式的大小寫敏感名。
示例
CALL ADMIN.DROPSCHEMA('SAMPLE')
這個(gè)過程調(diào)用會(huì)刪除模式 "SAMPLE" 中的所有對(duì)象。
CALL ADMIN.BACKUPSCHEMA('UTIL', 'D:TEMPUTIL_SCHEMA')
這個(gè)過程調(diào)用將模式 "UTIL" 中的所有對(duì)象存儲(chǔ)在目錄 D:TEMPUTIL_SCHEMA 中。
CALL ADMIN.RESTORESCHEMA(NULL, NULL, 'D:TEMPUTIL_SCHEMA', 'D:TEMP')
這個(gè)過程調(diào)用從 D:TEMPUTIL_SCHEMA 中獲取對(duì)象,并使用默認(rèn)表空間將它們恢復(fù)到原來的模式中。來自裝載過程的消息寫入 D:TEMP 中。
CALL ADMIN.RESTORESCHEMA('SRIELAU', 'IN "DATA" INDEX IN "INDEX"', 'D:TEMPUSER_SCHEMA', 'D:TEMP')
這個(gè)過程調(diào)用從 D:TEMPUSER_SCHEMA 中獲取對(duì)象,并將它們恢復(fù)到 "SRIELAU" 模式中,對(duì)于表數(shù)據(jù)使用表空間 "DATA",對(duì)于索引使用 "INDEX"。來自裝載過程的消息寫入 D:TEMP 中。
CALL ADMIN.COPYSCHEMA('SRIELAU', 'IN "DATA" INDEX IN "INDEX" LONG IN "LONG"', 'STOLZE')
這個(gè)過程調(diào)用將模式 "STOLZE" 中的所有對(duì)象復(fù)制到模式 "SRIELAU" 中,對(duì)于表數(shù)據(jù)使用表空間 "DATA",對(duì)于索引使用 "INDEX",對(duì)于 LOB 數(shù)據(jù)使用 "LONG"。 CALL ADMIN.REBINDPROCEDURES('SRIELAU'') 這個(gè)過程調(diào)用對(duì)模式 SRIELAU 中的所有 SQL 過程進(jìn)行重新綁定,獲取新的統(tǒng)計(jì)數(shù)據(jù)。
實(shí)現(xiàn)
本節(jié)在較高的層面上概述本文前面討論的過程的實(shí)現(xiàn)。
成功地恢復(fù)一個(gè)模式中的所有對(duì)象的主要困難是,處理模式中不同對(duì)象之間的依靠性。例如,表可能依靠于用戶定義的不同類型;檢查約束依靠于函數(shù);視圖依靠于視圖、別名和函數(shù);等等。
因?yàn)?DB2 UDB 不能創(chuàng)建依靠于不存在的實(shí)體的對(duì)象,所以正確的執(zhí)行次序是非常重要的。但是,假如仔細(xì)考慮一下這個(gè)問題,就會(huì)發(fā)現(xiàn)依靠圖的深度一般不大,而且某些對(duì)象是自然的端點(diǎn)。比如,用戶定義的類型不能依靠于其他 DDL 對(duì)象,而且表(不包括約束)只依靠于不同的類型。意識(shí)到這一情況,就可以分三個(gè)階段實(shí)現(xiàn)恢復(fù):
恢復(fù)所有不同的類型,然后恢復(fù)所有表及其索引。
將數(shù)據(jù)復(fù)制到表中并獲取統(tǒng)計(jì)數(shù)據(jù)。這樣做是為了確保 SQL 過程的執(zhí)行計(jì)劃是正確的。
在一個(gè)循環(huán)中恢復(fù)所有其他對(duì)象。因此,假如任何給定對(duì)象的創(chuàng)建失敗了,那么不必?fù)?dān)心,只要能夠繼續(xù)遍歷要恢復(fù)的對(duì)象的列表。只有當(dāng)過程進(jìn)行不下去時(shí),才會(huì)返回錯(cuò)誤。
利用這種基本的恢復(fù)算法,很輕易實(shí)現(xiàn)一種簡單的基礎(chǔ)設(shè)施。
BACKUPSCHEMA 過程使用 DDLLOG 表記錄 DDL 語句。第一行(編號(hào)為 0)包含源模式。后面是不同類型的 DDL 語句,然后是表的 DDL 語句。這個(gè)階段的末尾由一個(gè)空行表示,空行后面是所有其他對(duì)象。
這個(gè)表包含一個(gè) SUCCESS 列,RESTORESCHEMA 使用這一列記錄一個(gè)對(duì)象是否成功創(chuàng)建了。
DDL 對(duì)象的組成完全基于文檔記錄的 SYSCAT 編目視圖,只有一個(gè)例外。IDENTITY 列的高水位標(biāo)志需要從 SYSIBM.SYSSEQUENCES.LASTASSIGNVAL 中獲得,在 DB2 UDB V8 中沒有提供這個(gè)值。
與文件系統(tǒng)的交互是通過 SYSPROC.ADMIN_CMD 過程實(shí)現(xiàn)的,這個(gè)過程支持導(dǎo)出,用于將 DDLLOG 表、用戶數(shù)據(jù)和統(tǒng)計(jì)數(shù)據(jù)寫到文件中。對(duì)于裝載,要使用 SYSPROC.DB2LOAD。
用來恢復(fù)模式的強(qiáng)制性方式也用于刪除模式。DROPSCHEMA 過程簡單地不斷嘗試刪除對(duì)象,直到這個(gè)過程進(jìn)行不下去或者所有對(duì)象都被刪除為止。
結(jié)束語
本文提供了一組強(qiáng)大的過程,可以執(zhí)行模式級(jí)操作,比如對(duì)給定模式中的所有對(duì)象進(jìn)行邏輯備份、恢復(fù)和復(fù)制。除了用這個(gè)庫幫助 ISV 和最終用戶之外,本文還演示了如何利用 DB2 UDB 中豐富的 SQL API 為用戶提供更多功能。
相關(guān)文章:
1. 10個(gè)教程教你輕松備份MySQL數(shù)據(jù)庫2. DB2的高可用性和災(zāi)難恢復(fù)概述3. 使用Oracle進(jìn)行數(shù)據(jù)庫備份與還原4. 巧用改變跟蹤技術(shù)加速Oracle的遞增備份5. 利用表空間的備份快速恢復(fù)IBM DB2數(shù)據(jù)庫6. 通過Backup Exec實(shí)施Oracle來災(zāi)難恢復(fù)7. MySQL如何優(yōu)雅的備份賬號(hào)相關(guān)信息8. SQL Server自動(dòng)備份無法刪除過期的備份文件9. MDF文件在SQL Server數(shù)據(jù)庫中恢復(fù)技術(shù)10. MySQL 兩種恢復(fù)數(shù)據(jù)的方法
