資料庫日常維護工作是系統管理員的重要職責。其內容主要包括以下幾個部分:
一、備份系統資料
SYBASE 系統的備份與恢復機制保證了在系統失敗時重新獲取資料的可能性。SQL Server 提供了兩種不同型別的恢復機制:一類是系統自動完成的恢復,這種措施在每次系統啟動時都自動進行,保證了在系統癱瘓前完成的事務都寫到資料庫裝置上,而未完成的事務都被回退;另一類是人工完成的恢復,這是透過 DUMP 和 LOAD 命令來執行人工備份和恢復工作。因此定期備份事務日誌和資料庫是一項十分重要的日常維護工作。
1、備份資料庫
每一個數據庫都應在建立之後卸出,從而提供一個裝入基點。在此之後按排定的時間週期表卸出。比如每週五卸出資料庫。對一般資料庫系統卸出資料庫週期建議為每週一次。
除了按計劃週期卸出資料庫之外,還需在每次執行沒有日誌的操作後卸出資料庫。例如:
·每次強制地運行了 DUMP TRAN WITH NO_LOG (因為資料庫的磁碟空溢位);
·每次用 sp_dboption 允許 select into/bulkcopy 做快速複製,或用 SELECT INTO 命令建立一個永久性的表,或使用了 WRITETEXT 命令。
卸出資料庫的命令為:
DUMP DATABASE database_name
TO dump_device
database_name 是要卸出的資料庫名稱,dump_device 是卸出裝置的名稱。用系統過程 sp_helpdevice 可以獲得裝置的資訊。
下面一條命令用來卸出資料庫 my_db :
DUMP DATABASE my_db
TO db_bk_dev
2、備份事務日誌
如果事務日誌與資料庫放在同一個裝置上,則事務日誌不應與資料庫分開備份。master 資料庫和小於 4M 的使用者資料庫就是這種情況。一般資料庫系統的資料庫和日誌分別放在不同的裝置上,因此,可以用 DUMP TRAN 命令單獨備份日誌。
備份事務日誌的週期直接影響資料的恢復程度,因此建議每天備份。
備份事務日誌的命令格式為:
DUMP TRANsaction database_name
[TO dump_device]
[WITH TRUNCATE_ONLYWITH NO_LOGWITH NO_TRUNCATE]
其中 database_name 是要備份事務的資料庫名稱,dump_device 是備份裝置名稱,僅當包含了 WITH TRUNCATE_ONLY 或 WITH NO_LOG 子句時,才可以備份到裝置。
注意:如果總是用 DUMP DATEBASE (備份資料庫及其日誌),而不用 DUMP TRAN ,事務日誌將不會重新整理,而變得非常龐大。
對於 master 資料庫和小型資料庫每次執行 DUMP DATEBASE 之後應當執行 DUMP TRANsaction 命令重新整理日誌 。
下面一條命令備份資料庫 db160 的事務日誌到備份裝置上:
DUMP TRANsaction db160
TO db_log_bk_dev
WITH TRUNCATE_ONLY
3、備份資料庫及其日誌間的相互作用
在至少卸出一次資料庫前,卸出事務日誌是毫無意義的。下圖顯示了備份資料庫及其日誌間的關係
如果在星期二下午5:01出現非硬體故障,需要做的所有工作是裝入磁帶5(參見下一節:資料恢復),由於磁帶5是下午5:00剛備份的,因此只有備份和裝入之間的一分鐘內的資料損失。
但是,如果在星期二下午4:49失效會怎麼樣呢?在這種情況下,要裝入磁帶1(在星期五下午5:00的卸出)。然後,依次裝入磁帶2,3以及4。這樣,系統將恢復到星期二上午10:00點的狀態,星期二的大部分工作丟失了。此例顯示了經常卸出事務的重要性。
二、萬一系統失敗時恢復資料庫系統
如果使用者資料庫儲存的裝置失效,從而資料庫被破壞或不可存取,透過裝入最新的資料庫備份以及後來的事務日誌備份可以恢復資料庫。假設當前的事務日誌存在於一個並沒有毀壞的裝置上,帶著 WITH NO_TRUNCATE 選項的 DUMP TRANsaction 命令卸出它。
要恢復資料庫按如下步驟去做:
1、如果日誌存在於一個分離的裝置上,用帶著 NO_TRUNCATE 選項的 DUMP TRANsaction 命令卸出被毀壞的或者不可存取的使用者資料庫事務日誌。
2、用下面的查詢檢查裝置分配已毀壞資料庫的裝置使用情況。必須為同一目的賦同樣的空間塊。
下面的查詢顯示了分配給資料庫 mydb 裝置使用和尺寸情況:
SELECT segmap,size FROM sysusages
WHERE dbid =
( SELECT dbid FROM sysdatabases WHERE name = “mydb”)
3、檢查查詢的輸出。在 segmap 列的 ‘3’代表資料分配,‘4’代表日誌分配。size 列代表 2K 資料塊的數目。注意此資訊的次序、使用和尺寸部分。例如,輸出為:
segmapSize
--------------------
310240//實際尺寸為:20M
35120//實際尺寸為:10M
45120//實際尺寸為:10M
31024//實際尺寸為:2M
42048//實際尺寸為:4M
6、用 DISK INIT 初始化新的資料庫裝置。
7、重建資料庫。用 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 重新裝入資料庫,然後用 LOAD TRAN 裝入前面卸出的日誌。
LOAD DATABASE 命令語法是:
LOAD DATABASE database_name
FROM dump_device
LOAD TRANsaction 命令的語法是:
LOAD TRANsaction database_name
卸出資料庫和事務日誌的預設許可權歸資料庫所有者,且可以傳遞給其他使用者;裝載資料庫和事務的許可權也歸資料庫所有者,但不能傳遞。
二、產生使用者資訊表,併為資訊表授權;
系統維護人員的另一個日常事務是為使用者建立新的資訊表,併為之授權。建立表以及為表授權的方法已經在講過,在此只將有關命令語法寫出來。
·建立表的命令為:
CREATE TABLE table_name
( column_1 datatype [NULL NOT NULL IDENTITY],
column_2 ……
)
go
ALTER TABLE table_name
ADD PRIMARY KEY (column_list)
DROP TABLE table_name
·為表授權的命令格式為:
GRANT {ALLpermission_list}
ON table_name TO user_name
·收回許可權的命令格式為
REVOKE {ALLpermission_list}
ON table_name FROM user_name
三、監視系統執行狀況,及時處理系統錯誤;
系統管理員的另一項日常工作是監視系統執行情況。主要有以下幾個方面:
1、監視當前使用者以及程序的資訊
使用系統過程:sp_who
說明:該命令顯示當前系統所有註冊使用者及程序資訊,如下表是某系統的資訊。
SpidStatusLoginamehostnameblkdbnamecmd
---------------------------------------------------------------
1RunningSascosysv0MasterSELECT
2SleepingNULL0MasterNETWORK HANDLE
3SleepingNULL0MasterDEADLOCK TUNE
4SleepingNULL0MasterMIRROR HANDLER
5SleepingNULL0MasterHOUSEKEEPER
6SleepingNULL0MasterCHECKPOINT SLEEP
從左向右依次顯示:程序號、當前狀態、註冊使用者名稱、主機名、佔用塊數、資料庫名以及當前命令。
如果監視時發現程序總數接近最大連線數(用系統過程:sp_configure “user conn” 檢視)時,應下掉不活動或無關程序,以保證系統正常運做;另外亦可監視非法使用者或使用者使用不屬於自己使用範圍的資料庫等情況。
2、監視目標占用空間情況
使用系統過程:sp_spaceused
說明:該過程顯示行數、資料頁數以及當前資料庫中由某個目標或所有目標所佔用的空間。如下表是某資料庫日誌表的資訊:
NameRow_totalreserveddataIndex_sizeunused
------------------------------------------------------------
SyslogsNot avail32KB32KB0KBNot avail
日常要監視的主要目標有:使用者資料庫、資料庫日誌表(syslogs)以及計費原始資料表等。如果發現佔用空間過大,對日誌表要進行轉儲;對其他目標則應擴充空間或清楚垃圾資料。
3、監視 SQL Server 統計數字
使用系統過程:sp_monitor
說明:sp_monitor 顯示SQL Server 的歷史統計數字,下表是某系統的統計數字:
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)
上表依次給出該系統本次執行統計的上一次時間、本次時間、間隔秒數、CPU佔用、IO佔用、收發包情況、系統讀入寫出情況等資訊
四、保證系統資料安全,週期更改使用者口令;
為保證系統資料的安全,系統管理員必須依據系統的實際情況,執行一系列的安全保障措施。其中,週期性的更改使用者口令是比較常用且十分有效的措施。
更改使用者口令是透過呼叫系統過程sp_password 來實現的。Sp_password 的語法為:
sp_password caller_password,new_password [,loginame]
其中caller_password 是登入口令(老口令),new_password是新口令,loginame是登入名稱。
資料庫日常維護工作是系統管理員的重要職責。其內容主要包括以下幾個部分:
一、備份系統資料
SYBASE 系統的備份與恢復機制保證了在系統失敗時重新獲取資料的可能性。SQL Server 提供了兩種不同型別的恢復機制:一類是系統自動完成的恢復,這種措施在每次系統啟動時都自動進行,保證了在系統癱瘓前完成的事務都寫到資料庫裝置上,而未完成的事務都被回退;另一類是人工完成的恢復,這是透過 DUMP 和 LOAD 命令來執行人工備份和恢復工作。因此定期備份事務日誌和資料庫是一項十分重要的日常維護工作。
1、備份資料庫
每一個數據庫都應在建立之後卸出,從而提供一個裝入基點。在此之後按排定的時間週期表卸出。比如每週五卸出資料庫。對一般資料庫系統卸出資料庫週期建議為每週一次。
除了按計劃週期卸出資料庫之外,還需在每次執行沒有日誌的操作後卸出資料庫。例如:
·每次強制地運行了 DUMP TRAN WITH NO_LOG (因為資料庫的磁碟空溢位);
·每次用 sp_dboption 允許 select into/bulkcopy 做快速複製,或用 SELECT INTO 命令建立一個永久性的表,或使用了 WRITETEXT 命令。
卸出資料庫的命令為:
DUMP DATABASE database_name
TO dump_device
database_name 是要卸出的資料庫名稱,dump_device 是卸出裝置的名稱。用系統過程 sp_helpdevice 可以獲得裝置的資訊。
下面一條命令用來卸出資料庫 my_db :
DUMP DATABASE my_db
TO db_bk_dev
2、備份事務日誌
如果事務日誌與資料庫放在同一個裝置上,則事務日誌不應與資料庫分開備份。master 資料庫和小於 4M 的使用者資料庫就是這種情況。一般資料庫系統的資料庫和日誌分別放在不同的裝置上,因此,可以用 DUMP TRAN 命令單獨備份日誌。
備份事務日誌的週期直接影響資料的恢復程度,因此建議每天備份。
備份事務日誌的命令格式為:
DUMP TRANsaction database_name
[TO dump_device]
[WITH TRUNCATE_ONLYWITH NO_LOGWITH NO_TRUNCATE]
其中 database_name 是要備份事務的資料庫名稱,dump_device 是備份裝置名稱,僅當包含了 WITH TRUNCATE_ONLY 或 WITH NO_LOG 子句時,才可以備份到裝置。
注意:如果總是用 DUMP DATEBASE (備份資料庫及其日誌),而不用 DUMP TRAN ,事務日誌將不會重新整理,而變得非常龐大。
對於 master 資料庫和小型資料庫每次執行 DUMP DATEBASE 之後應當執行 DUMP TRANsaction 命令重新整理日誌 。
下面一條命令備份資料庫 db160 的事務日誌到備份裝置上:
DUMP TRANsaction db160
TO db_log_bk_dev
WITH TRUNCATE_ONLY
3、備份資料庫及其日誌間的相互作用
在至少卸出一次資料庫前,卸出事務日誌是毫無意義的。下圖顯示了備份資料庫及其日誌間的關係
如果在星期二下午5:01出現非硬體故障,需要做的所有工作是裝入磁帶5(參見下一節:資料恢復),由於磁帶5是下午5:00剛備份的,因此只有備份和裝入之間的一分鐘內的資料損失。
但是,如果在星期二下午4:49失效會怎麼樣呢?在這種情況下,要裝入磁帶1(在星期五下午5:00的卸出)。然後,依次裝入磁帶2,3以及4。這樣,系統將恢復到星期二上午10:00點的狀態,星期二的大部分工作丟失了。此例顯示了經常卸出事務的重要性。
二、萬一系統失敗時恢復資料庫系統
如果使用者資料庫儲存的裝置失效,從而資料庫被破壞或不可存取,透過裝入最新的資料庫備份以及後來的事務日誌備份可以恢復資料庫。假設當前的事務日誌存在於一個並沒有毀壞的裝置上,帶著 WITH NO_TRUNCATE 選項的 DUMP TRANsaction 命令卸出它。
要恢復資料庫按如下步驟去做:
1、如果日誌存在於一個分離的裝置上,用帶著 NO_TRUNCATE 選項的 DUMP TRANsaction 命令卸出被毀壞的或者不可存取的使用者資料庫事務日誌。
2、用下面的查詢檢查裝置分配已毀壞資料庫的裝置使用情況。必須為同一目的賦同樣的空間塊。
下面的查詢顯示了分配給資料庫 mydb 裝置使用和尺寸情況:
SELECT segmap,size FROM sysusages
WHERE dbid =
( SELECT dbid FROM sysdatabases WHERE name = “mydb”)
3、檢查查詢的輸出。在 segmap 列的 ‘3’代表資料分配,‘4’代表日誌分配。size 列代表 2K 資料塊的數目。注意此資訊的次序、使用和尺寸部分。例如,輸出為:
segmapSize
--------------------
310240//實際尺寸為:20M
35120//實際尺寸為:10M
45120//實際尺寸為:10M
31024//實際尺寸為:2M
42048//實際尺寸為:4M
6、用 DISK INIT 初始化新的資料庫裝置。
7、重建資料庫。用 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 重新裝入資料庫,然後用 LOAD TRAN 裝入前面卸出的日誌。
LOAD DATABASE 命令語法是:
LOAD DATABASE database_name
FROM dump_device
LOAD TRANsaction 命令的語法是:
LOAD TRANsaction database_name
FROM dump_device
卸出資料庫和事務日誌的預設許可權歸資料庫所有者,且可以傳遞給其他使用者;裝載資料庫和事務的許可權也歸資料庫所有者,但不能傳遞。
二、產生使用者資訊表,併為資訊表授權;
系統維護人員的另一個日常事務是為使用者建立新的資訊表,併為之授權。建立表以及為表授權的方法已經在講過,在此只將有關命令語法寫出來。
·建立表的命令為:
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
·為表授權的命令格式為:
GRANT {ALLpermission_list}
ON table_name TO user_name
go
·收回許可權的命令格式為
REVOKE {ALLpermission_list}
ON table_name FROM user_name
go
三、監視系統執行狀況,及時處理系統錯誤;
系統管理員的另一項日常工作是監視系統執行情況。主要有以下幾個方面:
1、監視當前使用者以及程序的資訊
使用系統過程:sp_who
說明:該命令顯示當前系統所有註冊使用者及程序資訊,如下表是某系統的資訊。
SpidStatusLoginamehostnameblkdbnamecmd
---------------------------------------------------------------
1RunningSascosysv0MasterSELECT
2SleepingNULL0MasterNETWORK HANDLE
3SleepingNULL0MasterDEADLOCK TUNE
4SleepingNULL0MasterMIRROR HANDLER
5SleepingNULL0MasterHOUSEKEEPER
6SleepingNULL0MasterCHECKPOINT SLEEP
從左向右依次顯示:程序號、當前狀態、註冊使用者名稱、主機名、佔用塊數、資料庫名以及當前命令。
如果監視時發現程序總數接近最大連線數(用系統過程:sp_configure “user conn” 檢視)時,應下掉不活動或無關程序,以保證系統正常運做;另外亦可監視非法使用者或使用者使用不屬於自己使用範圍的資料庫等情況。
2、監視目標占用空間情況
使用系統過程:sp_spaceused
說明:該過程顯示行數、資料頁數以及當前資料庫中由某個目標或所有目標所佔用的空間。如下表是某資料庫日誌表的資訊:
NameRow_totalreserveddataIndex_sizeunused
------------------------------------------------------------
SyslogsNot avail32KB32KB0KBNot avail
日常要監視的主要目標有:使用者資料庫、資料庫日誌表(syslogs)以及計費原始資料表等。如果發現佔用空間過大,對日誌表要進行轉儲;對其他目標則應擴充空間或清楚垃圾資料。
3、監視 SQL Server 統計數字
使用系統過程:sp_monitor
說明:sp_monitor 顯示SQL Server 的歷史統計數字,下表是某系統的統計數字:
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)
上表依次給出該系統本次執行統計的上一次時間、本次時間、間隔秒數、CPU佔用、IO佔用、收發包情況、系統讀入寫出情況等資訊
四、保證系統資料安全,週期更改使用者口令;
為保證系統資料的安全,系統管理員必須依據系統的實際情況,執行一系列的安全保障措施。其中,週期性的更改使用者口令是比較常用且十分有效的措施。
更改使用者口令是透過呼叫系統過程sp_password 來實現的。Sp_password 的語法為:
sp_password caller_password,new_password [,loginame]
其中caller_password 是登入口令(老口令),new_password是新口令,loginame是登入名稱。