dump database 數據庫名 to 設備文件名1
stripe on 設備文件名2
stripe on 設備文件名3……
with 參數
二、分數據結構和數據記錄做兩次備份
在一般情況下,生產(chǎn)機的數據庫都比較龐大,而實(shí)驗機則相對較小,難以在實(shí)驗環(huán)境中以load命令恢復工作機的內容。所以,在工作實(shí)踐中,我們摸索出了第二種全量備份方案。
1、數據結構備份
在windows平臺的Sybase SQL Server Manager(數據庫管理)平臺中選擇ServeràGenerateddl則產(chǎn)生整個(gè)數據庫服務(wù)器的所有信息,如果選擇databaseàgenerateddl則產(chǎn)生所選定數據庫的信息,以master庫為例,產(chǎn)生的文件主要包括:config.ddl(配置)、devices.ddl(設備)、database.ddl(數據庫)、logins.ddl(用戶(hù))、remote.ddl(遠程)、cache.ddl(緩沖)、segment.ddl()、group.ddl(用戶(hù)組)、user.ddl(用戶(hù))、default.ddl(確?。?、rule.ddl(規則)、udt.ddl、table.ddl(表)、view.ddl(視圖)、proc.ddl(存儲過(guò)程)、triger.ddl(觸發(fā)器)。
2、數據記錄備份
將數據庫各表以Sybase自代的bcp(bulk copy)工具的方式導成一定格式的文本文件,命令格式:
bcp 表名 out 路徑名 文件名 -c -t 分隔符 -u (用戶(hù)名)-p(密碼)-S(服務(wù)器名)
如果將一個(gè)數據庫中的所有表都做一個(gè)bcp備份,就需要針對每一個(gè)表都做一次bcp,在一般情況下,一個(gè)數據庫有100多個(gè)表,工作量比較大??梢岳脭祿熘械南到y表信息做一個(gè)bcp備份腳本。原理是每一個(gè)用戶(hù)表在系統表中都有信息記載,可以通過(guò)isql語(yǔ)句查詢(xún)得到?,F舉一例說(shuō)明:
1)、先編輯一個(gè)名為mkbcpout.sql的文件,內容如下:
select "echo bcp ‘"+name+" out ……………………‘
"+"bcp "+name+" out ./+"name+".table -c -t ‘|‘ -Uuser -Ppassword -S SERVER" from sysobjects where type=‘U‘
go
2)、執行isql命令,以此文件作為輸入,執行結果輸出到另外一個(gè)文件里:
isql -Uuser -Ppassword -S server -I mkbcpout.sql -O bcpout
3)、對bcppout文件稍微修改,增加可執行權限
chmod +x bcpout
4)、執行bcpout,導出數據文本
./bcpout
3、數據庫恢復
業(yè)務(wù)生產(chǎn)機可能為小型機,而實(shí)驗開(kāi)發(fā)環(huán)境的硬件環(huán)境為PC server,安裝好win nt或SCOunix下的Sybase服務(wù)器后,根據需要創(chuàng )建空間足夠大的數據庫和tempdb(系統臨時(shí)數據庫),創(chuàng )建數據庫用戶(hù),并將其更改為此數據庫的所有者,要注意兩點(diǎn):1)此數據庫允許bcp拷貝,2)此數據庫自動(dòng)清除log。命令格式為:
1> sp_dboption databasedbname ,"select into/bulkcopy",true
2> go
1> sp_dboption databasename,"trunc log on chkpt",true
2> go
上述兩個(gè)配置可能與生產(chǎn)機的配置不同。
然后以新創(chuàng )建的數據庫用戶(hù)登錄,導入數據結構,注意要首先導入表結構,然后才是存儲過(guò)程、觸發(fā)器等等。命令格式:
1、 isql -Uusername -Ppassword -I table.ddl -o error.log.table
2、 isql -Uusername -Ppassword -I proc.ddl -o error.log.proc
……
為了提高bcp導入數據的速度,需要將比較大的表的索引和主鍵刪除,否則的話(huà),每bcp進(jìn)一條數據,數據庫都自動(dòng)寫(xiě)一條log日志,記載此數據的上一條和下一條記錄,確定本記錄在此表中的準確位置,一是影響bcp速度,二是數據庫的log飛速膨脹。數據庫的自動(dòng)清除log功能只有在一個(gè)事務(wù)結束后才起作用。
準備工作做完后,開(kāi)始倒入數據記錄。使用類(lèi)似做bcpout的方法做一個(gè)bcpin的腳本,然后執行:
./bcpin |tee error.bcpin
使用tee管道輸出的目的是讓計算機完整記錄下倒入過(guò)程,自動(dòng)存入error.bcpin文件中,待倒入結束后,我們只需要檢查日志文件,不需要一直緊盯著(zhù)計算機屏幕。
所有工作做完之后,不要忘記重新將刪除的主鍵和索引建上。
如果有現成的數據庫,只需要單純地導入數據記錄,則首先將數據庫中所有用戶(hù)表(也就是所有type="U"的表)清空,命令格式:
1> truncate table tablename
2> go
當然最好也是利用做bcpout腳本的做一個(gè)truncate腳本,通過(guò)執行此腳本將所有用戶(hù)表清空。然后的數據導入、處理索引和主鍵的過(guò)程與上面類(lèi)似。
三、利用做bcp備份腳本的方法做數據庫碎片整理
Sybase數據庫作為聯(lián)機事務(wù)處理應用服務(wù)器,每天應用程序都對數據庫做大量的插入、修改和刪除等操作,不可避免的在數據庫的物理存儲介質(zhì)上留下頁(yè)碎片和擴展單元碎片,從而影響數據庫的存儲效率和運行速度。具體表現為:業(yè)務(wù)繁忙時(shí)出現死鎖(deadlock),數據庫的輸入/輸出資源被大量占用,業(yè)務(wù)處理速度慢。其解決辦法是:
1、 清空數據庫中的所有表,命令格式:
isql -Uusername -Ppassword -I truncate.sql -o error.truncate
2、 刪除所有表的索引和主鍵
isql -Uusername -Ppassword -I dropindex.sql -o error.dropindex
3、 導入數據
./bcpin
4、 添加索引和主鍵
isql -Uusername -Ppassword -I addindex.sql -o error.addindex
5、 更新數據庫狀態(tài)
1> update statistics tablename
2> go
上述操作都是針對數據庫中的所有用戶(hù)表進(jìn)行的,利用做bcp備份腳本的方法做出相應的腳本,使繁瑣的數據庫維護變得簡(jiǎn)便易行,還克服了直接使用isql語(yǔ)句操作風(fēng)險大、沒(méi)有操作日志的毛病。
筆者在實(shí)際工作中,使用第一種方法對生產(chǎn)機做日常全量備份,日終通過(guò)unix的crontab定時(shí)批量作業(yè)bcp出全部數據。使用高檔PCserver搭建模擬運行環(huán)境,在需要的情況下導入生產(chǎn)機數據,處理運行中后臺server的各種問(wèn)題,待研究出解決辦法后再在生產(chǎn)機上做相應調整,這樣做風(fēng)險小,效果好。
聯(lián)系客服