劉君堯 王輝靜 劉云霞
摘 要:對于從事信息系統(tǒng)管理的人員來說,掌握數(shù)據(jù)庫的備份方法在工作中尤為重要。當本地數(shù)據(jù)出錯或者磁盤損壞時,可以利用備份的數(shù)據(jù)恢復(fù)數(shù)據(jù)庫系統(tǒng),從而保證系統(tǒng)的正常運行。文章以Linux平臺下的Sybase數(shù)據(jù)庫為例,給出兩種不同備份的實現(xiàn)方法。
關(guān)鍵詞:Linux平臺;Sybase;數(shù)據(jù)庫備份
對于從事信息管理系統(tǒng)的人員來說,掌握數(shù)據(jù)庫的備份是必備的技能。當本地數(shù)據(jù)出錯、人為誤操作或者磁盤/文件損壞時,可以利用備份的數(shù)據(jù)進行恢復(fù),從而保證系統(tǒng)的正常運行[1]。本文以Linux平臺下Sybase數(shù)據(jù)庫的備份為例,給出兩種備份的實現(xiàn)方法,并對這兩種方法實現(xiàn)的操作專業(yè)程度、時間性能、可擴展性等方面進行比較說明,以供信息系統(tǒng)管理人員進行相應(yīng)管理操作使用。Linux平臺下Sybase數(shù)據(jù)庫備份的方法主要有兩種:(1)整庫二進制備份;(2)整表文本備份。下面針對這兩種備份方法進行詳細描述,并給出客觀的對比結(jié)論。
1 整庫二進制備份恢復(fù)
1.1整庫二進制備份
整庫二進制備份主要采用轉(zhuǎn)儲數(shù)據(jù)庫的方式進行,就是為整個數(shù)據(jù)庫(包括數(shù)據(jù)、表結(jié)構(gòu)、觸發(fā)器、游標、存儲過程、事務(wù)日志等)做一次完整的物理備份。
Sybase進行數(shù)據(jù)庫轉(zhuǎn)儲時,Sybase系統(tǒng)自動執(zhí)行一次Checkpoint(所謂的Checkpoint是將日志和數(shù)據(jù)從內(nèi)存緩沖區(qū)寫入到硬盤中(只針對改動過的數(shù)據(jù)進行寫入,即臟頁寫入),把己被分配的日志頁和數(shù)據(jù)頁也寫入到磁盤中,確保進行數(shù)據(jù)庫轉(zhuǎn)儲時數(shù)據(jù)的正確性。 通過整庫二進制備份,可以將整個數(shù)據(jù)庫的運行環(huán)境完整復(fù)制一份,包括數(shù)據(jù)庫的結(jié)構(gòu)、臟頁和碎片,在使用load命令恢復(fù)時,只能恢復(fù)到同樣大小的數(shù)據(jù)庫中(數(shù)據(jù)和日志的大小都只能和原來完全一致),可以確保真正地還原,恢復(fù)后數(shù)據(jù)庫準確無誤。
可以采用如下的方式進行Sybase的整庫二進制備份:使用Sybase數(shù)據(jù)庫提供的isql命令登錄數(shù)據(jù)庫服務(wù)器,并使用dump命令進行備份。具體的命令實現(xiàn)為:
dbuser> isql -S{DBServerName)-U{username) -P{password)
dump database {dbname) to “path/filename” withcompression={level)
dump transaction {dbname) to“path/filename"
go
其中“path/filename”為備份出來的文件放置的目錄以及文件名。compression為備份時是否進行壓縮,取值范圍:0-9以及100或者101。其中0表示不壓縮,9表示最高壓縮比進行壓縮。100表示提供更快速度的壓縮;101表示提供壓縮比更高的壓縮,一般根據(jù)磁盤的情況以及壓縮的時長,來決定具體的壓縮等級。
1.2整庫二進制恢復(fù)
整庫二進制恢復(fù)可以將整庫二進制備份方式下備份出來的數(shù)據(jù)庫物理備份進行恢復(fù)。采用整庫二進制恢復(fù),可以確保數(shù)據(jù)庫恢復(fù)到備份時的情況,包括數(shù)據(jù)庫結(jié)構(gòu)、數(shù)據(jù)、頁和碎片等。整庫二進制恢復(fù)在進行恢復(fù)前,需要確保要恢復(fù)的數(shù)據(jù)庫設(shè)備存在,并且要比備份的容量相等或者更大。以便可以完整地進行物理恢復(fù)。整庫二進制恢復(fù)分3步進行。
第一步:創(chuàng)建準備恢復(fù)的數(shù)據(jù)庫設(shè)備(包括數(shù)據(jù)設(shè)備和日志設(shè)備)以及數(shù)據(jù)庫。
可以采用如下命令,創(chuàng)建恢復(fù)所需的數(shù)據(jù)庫設(shè)備:
dbuser> isql -S{DBServerName)-U{username) -P{password)
disk init name=datadev, physname=/opt/Sybase/data/datadev.dat. size=150m'
disk init name=logdev, physname=/opt/Sybase/data/logdev.dat, size=300m'
go
datadev為數(shù)據(jù)設(shè)備,用于放置實際的數(shù)據(jù);logdev為日志設(shè)備,用于放置日志數(shù)據(jù),disk init命令用于創(chuàng)建數(shù)據(jù)庫所需的數(shù)據(jù)設(shè)備和日志設(shè)備。上面命令表示,創(chuàng)建一個數(shù)據(jù)設(shè)備,容量大小為150 M,設(shè)備名稱為datadev;創(chuàng)建一個日志設(shè)備,容量大小為300 M,設(shè)備名稱為logdev。
可以采用如下命令,創(chuàng)建恢復(fù)所需的數(shù)據(jù)庫:
dbuser> isql -S{DBServerName)-U{username) -P{password)
create database dbname on datadev=150m' log onlogdev=300m
go
上面的命令表示,在數(shù)據(jù)設(shè)備datadev以及日志設(shè)備logdev(這兩個設(shè)備由disk init命令創(chuàng)建)上創(chuàng)建數(shù)據(jù)庫dbname,數(shù)據(jù)庫大小為:數(shù)據(jù)容量大小150 M,日志容量大小300 M。創(chuàng)建的數(shù)據(jù)庫容量(包括數(shù)據(jù)容量和日志容量)以及數(shù)據(jù)庫用到的數(shù)據(jù)設(shè)備、日志設(shè)備數(shù)量、大小,都要與備份的數(shù)據(jù)庫保持一致。
第二步:進行物理恢復(fù),可以采用如下命令,在第一步創(chuàng)建的數(shù)據(jù)庫上進行數(shù)據(jù)恢復(fù)。
dbuser> isql -S{DBServerName} -U{username}P{password}
load database dbname from "path/filename"
go
上述命令表示從path/filename備份文件中,將數(shù)據(jù)直接導(dǎo)入到數(shù)據(jù)庫dbname。
第三步:激活數(shù)據(jù)庫,可以采用如下命令,在第二步導(dǎo)入數(shù)據(jù)庫后進行數(shù)據(jù)庫激活。
dbuser> isql -S{DBServerName)-U{username) -P{password)
online database dbname
go
2 整表文本備份恢復(fù)
2.1整表文本備份
整表文本備份主要采用文本導(dǎo)出的方式,將數(shù)據(jù)庫中數(shù)據(jù)表的數(shù)據(jù),按照csv格式導(dǎo)出為文本文件。整表文本備份只能進行數(shù)據(jù)表的數(shù)據(jù)的備份,無法將數(shù)據(jù)庫結(jié)構(gòu)、頁面信息、數(shù)據(jù)庫日志等信息導(dǎo)出。
整表文本備份,可以使用Sybase數(shù)據(jù)庫提供的bcp命令進行,具體的命令實現(xiàn)為:
dbuser> isql -S{DBServerName)-U{username) -P{password)
use dbname
go
checkpoint
90
quit
dbuser>bcp {tablename) out “path/filename" 一c -t{字段間隔符)-r{記錄間隔符)-S{DBServerName) -U{username)-P{password)
默認的字段間隔符為\t;默認的記錄間隔符為\n。如果表中字段本身有\t\n等特殊字符,可以采用較為復(fù)雜的字符串作為字段間隔符或者記錄間隔符,以避免出現(xiàn)恢復(fù)失敗。
如果要對整個數(shù)據(jù)庫進行備份,需要對數(shù)據(jù)庫中所有的數(shù)據(jù)表逐個執(zhí)行bcp命令進行備份,可以用一個命令來生成備份的語句,實現(xiàn)對一個數(shù)據(jù)庫的所有數(shù)據(jù)表進行備份:
dbuser> isql -S{DBServerName)-U{username) -P{password)
select 'bcp ‘+name+out ‘+path/filename -c -t{字段間隔符)-r{記錄間隔符)- S{DBServerName) -63U{username) -P{password) from sysobjects where type='U'
go
2.2整表文本恢復(fù)
當數(shù)據(jù)庫中某個數(shù)據(jù)表,或者整個數(shù)據(jù)庫出現(xiàn)故障需要恢復(fù)時,可以采用整表文本恢復(fù)的方式進行恢復(fù)。采用整表文本恢復(fù),需要的前提是:(1)數(shù)據(jù)庫已經(jīng)存在;(2)數(shù)據(jù)表已經(jīng)創(chuàng)建,并且和備份時的字段名稱、順序完全相同。
因此,整表文本恢復(fù)需要如下4個步驟。
第一步:創(chuàng)建準備恢復(fù)的數(shù)據(jù)庫設(shè)備(包括數(shù)據(jù)設(shè)備和日志設(shè)備)以及數(shù)據(jù)庫,如果數(shù)據(jù)庫已經(jīng)存在,則可以跳過。具體創(chuàng)建數(shù)據(jù)庫設(shè)備和數(shù)據(jù)庫的命令,可以參考“整庫二進制恢復(fù)”的內(nèi)容。
第二步:創(chuàng)建要恢復(fù)的數(shù)據(jù)表,如果該數(shù)據(jù)表已經(jīng)存在,則可以跳過??梢圆捎萌缦旅睿诘谝徊絼?chuàng)建的數(shù)據(jù)庫上創(chuàng)建數(shù)據(jù)表。
dbuser> isql -S{DBServerName)-U{username) -P{password)
use dbname
90
create tabletablename}
90
創(chuàng)建數(shù)據(jù)表的create table命令格式如下:
CREATE TABLE table-name
{{ column-definition I table-constraint(pctfree)….)
[{ IN(ON) dbspace-name]
[ ENCRYPTED]
[ ON COMMIT{ DELETE(PRESERVE) ROWS
[NOT TRANSACTIONAL]
[ AT location-string]
[ SHARE BY ALL]
column- definition:
column-name data-type
[ COMPRESSED]
[ INLINE{ inline-length I USE DEFAULT)]
[ PREFIX{ prefix-length l USE DEFAULT)]
[[ NO] INDEX]
[[ NOT] NULL]
[ DEFAULT default-value|IDENTITY]
[ column-constraint…]
column-constraint:
[ CONSTRAINT constraint-name]{
UNIQUE[ CLUSTERED]
[PRIMARY KEY[ CLUSTERED][ASC | DESC]
[REFERENCES table-name[(column-name)]
[ MATCH[ UNIQUE]{SIMPLE[ FULL)]
[ action-list][CLUSTERED]
[CHECK( condition)
}
COMPUTE ( expression )table-constraint :
[ CONSTRAINT constraint-name]{
UNIQUE[ CLUSTERED](column-name[ ASC『DESC]….)
[PRIMARY KEY[ CLUSTERED](column-name[ASC[ DESC]….)
[CHECK( condition)
[foreign-key-constraint
}
foreign-key-constraint:
[ NOT NULL] FOREIGN KEY[ role-name]
[( column-name[ ASC[DESC]….)]
REFERENCES table-name
[(coluinn-name,.)]
[ MATCH[ UNIQUE]{ SIMPLE l FULL)]
[ action-list][CHECK ON COMMIT][CLUSTERED][FOR OLAP WORKLOAD]
第三步:刪除表中已有的數(shù)據(jù),避免導(dǎo)入沖突,此步驟在表中已有數(shù)據(jù)的情況下執(zhí)行即可,如果是新建的表,可以跳過此步驟??梢圆捎萌缦旅睿瑢⒈碇械臄?shù)據(jù)清空。
dbuser> isql -S{DBServerName)-U{username) -P{password)
truncate table {tablename)
go
第四步:將數(shù)據(jù)導(dǎo)入,可以采用如下命令,將備份出的整表文本數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫中指定的數(shù)據(jù)表中。
bcp{dbname}.{tablename} in“path/filename”一c -t{字段間隔符)-r{記錄間隔符)-S{DBServerName) -U{username)-P{password
3 兩種備份方法的對比分析
整庫二進制備份,可以對Sybase數(shù)據(jù)庫的數(shù)據(jù)、相關(guān)的表結(jié)構(gòu)和數(shù)據(jù)庫事務(wù)日志都進行備份,但是備份的文件容量比較大,一般約等于數(shù)據(jù)庫的真實容量(不做壓縮情況下),同時由于采用整庫備份(也支持數(shù)據(jù)庫事務(wù)日志備份),因此,在備份效率、備份一致性以及信息完整性上有明顯優(yōu)勢。
整表文本備份,只針對數(shù)據(jù)表中存儲的數(shù)據(jù)進行備份,因此備份的文件容量較小,一般約等于數(shù)據(jù)庫真實容量的20% -50%(一般文本數(shù)據(jù),不做壓縮情況下),由于采用數(shù)據(jù)表粒度進行備份,因此,可以靈活選擇需要備份的內(nèi)容進行備份,甚至對備份的數(shù)據(jù)進行調(diào)整和處理,同時也可以針對不同重要程度的數(shù)據(jù)表進行有差異的備份(比如不同的備份周期,重要的數(shù)據(jù)表以較短的備份周期進行備份)。但是采用整表文本備份也有明顯的缺陷,如果數(shù)據(jù)庫的數(shù)據(jù)表結(jié)構(gòu)發(fā)生損壞,通過此備份方式將無法恢復(fù),需要先恢復(fù)或者重建表結(jié)構(gòu);另外對于數(shù)據(jù)庫中Image,Blob等二進制存儲類型的數(shù)據(jù),此方法容易產(chǎn)生亂碼,不建議使用。
如果備份的磁盤空間比較大,建議可以兩種備份方式都采用,在恢復(fù)的時候,根據(jù)具體的需要采取恢復(fù)的手段。4實驗測試結(jié)果
具體的實驗環(huán)境為:服務(wù)器:CPU 2*Xeon E5 4650;內(nèi)存128 G;磁盤容量2T(磁盤陣列RAID l+0);操作系統(tǒng):RedHat Linux 7;數(shù)據(jù)庫服務(wù)器:Sybase ASE 15.7;數(shù)據(jù)庫容量:約50 G; 336個數(shù)據(jù)表。實驗效果如表所示,需要注意的是,不同的存儲內(nèi)容以及存儲格式對備份時長及備份文件大小有一定的影響。兩種數(shù)據(jù)庫備份方法的比較如表1所示。
5結(jié)語
Linux平臺下Sybase數(shù)據(jù)庫備份的兩種方法各有優(yōu)劣勢,也有不同的應(yīng)用場景,信息系統(tǒng)管理人員在進行數(shù)據(jù)備份時,可以因地制宜,選擇合適的備份方法進行數(shù)據(jù)備份。
[參考文獻]
[1]王暉媛SQL Server中數(shù)據(jù)庫備份和恢復(fù)方法的研究[J]計算機光盤軟件與應(yīng)用,2011(2):112-113