數(shù)據(jù)庫日常維護工作是系統(tǒng)管理員的重要職責。其內(nèi)容主要包括以下幾個部分:
一、備份系統(tǒng)數(shù)據(jù)
sybase 系統(tǒng)的備份與恢復機制保證了在系統(tǒng)失敗時重新獲取數(shù)據(jù)的可能性。sql server 提供了兩種不同類型的恢復機制:一類是系統(tǒng)自動完成的恢復,這種措施在每次系統(tǒng)啟動時都自動進行,保證了在系統(tǒng)癱瘓前完成的事務都寫到數(shù)據(jù)庫設備上,而未完成的事務都被回退;另一類是人工完成的恢復,這是通過 dump 和 load 命令來執(zhí)行人工備份和恢復工作。因此定期備份事務日志和數(shù)據(jù)庫是一項十分重要的日常維護工作。
1、備份數(shù)據(jù)庫
每一個數(shù)據(jù)庫都應在創(chuàng)建之后卸出,從而提供一個裝入基點。在此之后按排定的時間周期表卸出。比如每周五卸出數(shù)據(jù)庫。對一般數(shù)據(jù)庫系統(tǒng)卸出數(shù)據(jù)庫周期建議為每周一次。
除了按計劃周期卸出數(shù)據(jù)庫之外,還需在每次運行沒有日志的操作后卸出數(shù)據(jù)庫。例如:
·每次強制地運行了 dump tran with no_log (因為數(shù)據(jù)庫的磁盤空溢出);
·每次用 sp_dboption 允許 select into/bulkcopy 做快速拷貝,或用 select into 命令創(chuàng)建一個永久性的表,或使用了 writetext 命令。
卸出數(shù)據(jù)庫的命令為:
dump database database_name
to dump_device
database_name 是要卸出的數(shù)據(jù)庫名稱,dump_device 是卸出設備的名稱。用系統(tǒng)過程 sp_helpdevice 可以獲得設備的信息。
下面一條命令用來卸出數(shù)據(jù)庫 my_db :
dump database my_db
to db_bk_dev
2、備份事務日志
如果事務日志與數(shù)據(jù)庫放在同一個設備上,則事務日志不應與數(shù)據(jù)庫分開備份。master 數(shù)據(jù)庫和小于 4m 的用戶數(shù)據(jù)庫就是這種情況。一般數(shù)據(jù)庫系統(tǒng)的數(shù)據(jù)庫和日志分別放在不同的設備上,因此,可以用 dump tran 命令單獨備份日志。
備份事務日志的周期直接影響數(shù)據(jù)的恢復程度,因此建議每天備份。
備份事務日志的命令格式為:
dump transaction database_name
[to dump_device]
[with truncate_only|with no_log|with no_truncate]
其中 database_name 是要備份事務的數(shù)據(jù)庫名稱,dump_device 是備份設備名稱,僅當包含了 with truncate_only 或 with no_log 子句時,才可以備份到設備。
注意:如果總是用 dump datebase (備份數(shù)據(jù)庫及其日志),而不用 dump tran ,事務日志將不會刷新,而變得非常龐大。
對于 master 數(shù)據(jù)庫和小型數(shù)據(jù)庫每次運行 dump datebase 之后應當運行 dump transaction 命令刷新日志 。
下面一條命令備份數(shù)據(jù)庫 db160 的事務日志到備份設備上:
dump transaction db160
to db_log_bk_dev
with truncate_only
3、備份數(shù)據(jù)庫及其日志間的相互作用
在至少卸出一次數(shù)據(jù)庫前,卸出事務日志是毫無意義的。下圖顯示了備份數(shù)據(jù)庫及其日志間的關系
如果在星期二下午5:01出現(xiàn)非硬件故障,需要做的所有工作是裝入磁帶5(參見下一節(jié):數(shù)據(jù)恢復),由于磁帶5是下午5:00剛備份的,因此只有備份和裝入之間的一分鐘內(nèi)的數(shù)據(jù)損失。
但是,如果在星期二下午4:49失效會怎么樣呢?在這種情況下,要裝入磁帶1(在星期五下午5:00的卸出)。然后,依次裝入磁帶2,3以及4。這樣,系統(tǒng)將恢復到星期二上午10:00點的狀態(tài),星期二的大部分工作丟失了。此例顯示了經(jīng)常卸出事務的重要性。
二、萬一系統(tǒng)失敗時恢復數(shù)據(jù)庫系統(tǒng)
如果用戶數(shù)據(jù)庫存儲的設備失效,從而數(shù)據(jù)庫被破壞或不可存取,通過裝入最新的數(shù)據(jù)庫備份以及后來的事務日志備份可以恢復數(shù)據(jù)庫。假設當前的事務日志存在于一個并沒有毀壞的設備上,帶著 with no_truncate 選項的 dump transaction 命令卸出它。
要恢復數(shù)據(jù)庫按如下步驟去做:
1、如果日志存在于一個分離的設備上,用帶著 no_truncate 選項的 dump transaction 命令卸出被毀壞的或者不可存取的用戶數(shù)據(jù)庫事務日志。
2、用下面的查詢檢查設備分配已毀壞數(shù)據(jù)庫的設備使用情況。必須為同一目的賦同樣的空間塊。
下面的查詢顯示了分配給數(shù)據(jù)庫 mydb 設備使用和尺寸情況:
select segmap,size from sysusages
where dbid =
( select dbid from sysdatabases where name = “mydb”)
3、檢查查詢的輸出。在 segmap 列的 ‘3’代表數(shù)據(jù)分配,‘4’代表日志分配。size 列代表 2k 數(shù)據(jù)塊的數(shù)目。注意此信息的次序、使用和尺寸部分。例如,輸出為:
segmapsize
--------------------
310240//實際尺寸為:20m
35120//實際尺寸為:10m
45120//實際尺寸為:10m
31024//實際尺寸為:2m
42048//實際尺寸為:4m
4、用 drop database 命令刪除毀壞設備上的數(shù)據(jù)庫。如果系統(tǒng)報錯,用dbcc dbrepair 命令的 dropdb 選項。
5、刪除數(shù)據(jù)庫后,用 sp_dropdevice 刪除毀壞了的設備。
6、用 disk init 初始化新的數(shù)據(jù)庫設備。
7、重建數(shù)據(jù)庫。用 create database 命令從老的 sysusages 表拷貝所有的行,并包含第一邏輯設備。
對上例,命令為:
create database mydb
on datadev1=20,datadev2=10
log on logdev1=10
8、用 alter database 命令重建其余入口。在此例中,在datadev1上分配更多的空間,命令為:
alter database mydb on datadev1=2
9、用 load database 重新裝入數(shù)據(jù)庫,然后用 load tran 裝入前面卸出的日志。
load database 命令語法是:
load database database_name
from dump_device
load transaction 命令的語法是:
load transaction database_name
from dump_device
卸出數(shù)據(jù)庫和事務日志的缺省權(quán)限歸數(shù)據(jù)庫所有者,且可以傳遞給其他用戶;裝載數(shù)據(jù)庫和事務的權(quán)限也歸數(shù)據(jù)庫所有者,但不能傳遞。
二、產(chǎn)生用戶信息表,并為信息表授權(quán);
系統(tǒng)維護人員的另一個日常事務是為用戶創(chuàng)建新的信息表,并為之授權(quán)。創(chuàng)建表以及為表授權(quán)的方法已經(jīng)在講過,在此只將有關命令語法寫出來。
·創(chuàng)建表的命令為:
create table table_name
( column_1 datatype [null | not null | identity],
column_2 ……
)
go
alter table table_name
add primary key (column_list)
go
·刪除表的命令格式為:
drop table table_name
go
·為表授權(quán)的命令格式為:
grant {all|permission_list}
on table_name to user_name
go
·收回權(quán)限的命令格式為
revoke {all|permission_list}
on table_name from user_name
go
三、監(jiān)視系統(tǒng)運行狀況,及時處理系統(tǒng)錯誤;
系統(tǒng)管理員的另一項日常工作是監(jiān)視系統(tǒng)運行情況。主要有以下幾個方面:
1、監(jiān)視當前用戶以及進程的信息
使用系統(tǒng)過程:sp_who
說明:該命令顯示當前系統(tǒng)所有注冊用戶及進程信息,如下表是某系統(tǒng)的信息。
spidstatusloginamehostnameblkdbnamecmd
---------------------------------------------------------------
1runningsascosysv0masterselect
2sleepingnull0masternetwork handle
3sleepingnull0masterdeadlock tune
4sleepingnull0mastermirror handler
5sleepingnull0masterhousekeeper
6sleepingnull0mastercheckpoint sleep
從左向右依次顯示:進程號、當前狀態(tài)、注冊用戶名、主機名、占用塊數(shù)、數(shù)據(jù)庫名以及當前命令。
如果監(jiān)視時發(fā)現(xiàn)進程總數(shù)接近最大連接數(shù)(用系統(tǒng)過程:sp_configure “user conn” 查看)時,應下掉不活動或無關進程,以保證系統(tǒng)正常運做;另外亦可監(jiān)視非法用戶或用戶使用不屬于自己使用范圍的數(shù)據(jù)庫等情況。
2、監(jiān)視目標占用空間情況
使用系統(tǒng)過程:sp_spaceused
說明:該過程顯示行數(shù)、數(shù)據(jù)頁數(shù)以及當前數(shù)據(jù)庫中由某個目標或所有目標所占用的空間。如下表是某數(shù)據(jù)庫日志表的信息:
namerow_totalreserveddataindex_sizeunused
------------------------------------------------------------
syslogsnot avail32kb32kb0kbnot avail
日常要監(jiān)視的主要目標有:用戶數(shù)據(jù)庫、數(shù)據(jù)庫日志表(syslogs)以及計費原始數(shù)據(jù)表等。如果發(fā)現(xiàn)占用空間過大,對日志表要進行轉(zhuǎn)儲;對其他目標則應擴充空間或清楚垃圾數(shù)據(jù)。
3、監(jiān)視 sql server 統(tǒng)計數(shù)字
使用系統(tǒng)過程:sp_monitor
說明:sp_monitor 顯示sql server 的歷史統(tǒng)計數(shù)字,下表是某系統(tǒng)的統(tǒng)計數(shù)字:
last_runcurrent_runseconds
---------------------------------------------------------------
may 13 2000 1:27pmmay 13 2000 3:01pm5678
cpu_busyio_busyidle
---------------------------------------------------------------
16(6)-0%0(0)-0%5727(5672)-99%
packets_receivedpackets_sentpacket_errors
---------------------------------------------------------------
21(17)100(97)0(0)
total_readtotal_writetotal_errorsconnections
--------------------------------------------------------
785(366)311(113)0(0)3(2)
上表依次給出該系統(tǒng)本次運行統(tǒng)計的上一次時間、本次時間、間隔秒數(shù)、cpu占用、io占用、收發(fā)包情況、系統(tǒng)讀入寫出情況等信息
四、保證系統(tǒng)數(shù)據(jù)安全,周期更改用戶口令;
為保證系統(tǒng)數(shù)據(jù)的安全,系統(tǒng)管理員必須依據(jù)系統(tǒng)的實際情況,執(zhí)行一系列的安全保障措施。其中,周期性的更改用戶口令是比較常用且十分有效的措施。
更改用戶口令是通過調(diào)用系統(tǒng)過程sp_password 來實現(xiàn)的。sp_password 的語法為:
sp_password caller_password,new_password [,loginame]
其中caller_password 是登錄口令(老口令),new_password是新口令,loginame是登錄名稱。