事務日志傳送這個功能有點像Oracle的DataGuard,具體介紹就不在這裡廢話了,本文主要記錄我在實施過程中所遇到的問題以及解決方法。
事務日志傳送的“傳送”這個功能是通過Windows共享實現的,而不是好像Oracle那樣由數據庫本身的機制來進行傳送(log_archive_dest_X = 'service=XXXXX'),一說到Windows共享就牽涉到用戶權限的問題,所以配置事務日志傳送這個功能所遇到的故障絕大部分都是由於用戶的權限問題所造成的。
先上一張架構圖,可以看到事務日志傳送的就是由主庫不斷產生事務日志文件的備份(或者叫歸檔日志,可能更好理解)而備庫不斷還原這些事務日志備份文件的過程。
細心的朋友可能已經發現中間的backup文件是一個共享文件夾,如果這個共享文件夾位於主庫的服務器上,主庫的備份路徑可以不寫成UNC路徑的形式,而備庫則必須寫成UNC路徑的形式。如果這個共享文件夾位於備庫的服務器上,主庫的備份路徑就要寫成UNC路徑,而備庫可以寫成本地路徑的形式。如果共享文件夾即不在主庫也不在備庫的服務器上面,那麼備份、還原目錄的名稱都要寫成UNC路徑了。
現在開始配置事務日志傳送
第一部先確認備庫中運行SQL Server的用戶是什麼:
在這裡可以到SQL Server (MSSQLSERVER)這個服務是用“本地系統”這個用戶啟動的,這個用戶在安裝SQL Server的時候可以指定的。如果你的SQL Server是使用“本地系統”這個用戶啟動的話,就不能正常訪問網絡,也就不可以還原遠程的備份文件,如果不修改啟動的用戶的話,等一下做事務日志傳送的時候就會報這個錯:
10.168.4.18是我主機的IP地址,此時,在備機的應用程序日志裡面可以看到如下信息:
BackupDiskFile::OpenMedia: 備份設備 '\\10.168.4.18\backup\Lucky.bak' 無法open。操作系統錯誤 5(拒絕訪問。)。
為了解決這個問題,我們需要讓備機的不運行在“本地系統”這個帳號上面,我們創建一個普通的用戶,例如叫做SqlUser,然後將這個用戶加入到那堆SQLServer2005**************的組裡面,如果不加入這些組的話,SQL Server會啟動不了。
然後修改SQL Server的啟動帳戶,並重新啟動SQL Server 服務。
在備庫的服務器上面,也建一個SqlUser的用戶,但是這個用戶自需要屬於Users組就可以了,當然主庫、備庫的SqlUser的密碼得一樣。
在主庫上面建一個共享文件夾backup。
好了,自此准備工作已經完成,下面開始正式開始配置事務日志傳送。
這兩個窗口主要是調節備份歸檔事務日志的策略,注意,這裡的本地路徑要對應UNC路徑,不明白的就看一下以下這張圖:
然後,添加備庫,為了盡快看到效果,我將“事務日志備份”,“復制文件”,“還原事務日志”的調度時間都調整為1分鐘
一切OK之後,就可以開始創建事務日志傳送,但是通常來說都會出現如下的問題:
10.168.4.100是我備庫的服務器地址,大家仔細看一下錯誤,說是無法訪問C:\Windows\System32\目錄下的一個文件,實際上是無法寫入創建該文件,此時,到備庫的服務器上面,將已經還原出來的數據庫(我這裡是Lucky)刪除掉,然後給C:\Windows\System32\這個目錄加上一個用戶權限,如下圖所示:
我見過某些文章為省事特意將SqlUser這個用戶加入到Administrators組裡面,估計就是為了逃避這個問題,但是我不建議這樣做,而且我覺得奇怪的是怎麼會在這個目錄建立文件呢,我很懷疑這是一個Bug。
然後再試一下,就可以了。
取消事務日志備份之後,備庫依然是處於“備用/只讀”的狀態,可以查詢,但是,還是不能寫入,執行以下語句就可以使備庫正式使用了
restore database Lucky with recovery