1. 程式人生 > >SQL Server資料庫映象部署 錯誤1418’處理及證書驗證

SQL Server資料庫映象部署 錯誤1418’處理及證書驗證

SQL Server資料庫映象部署

‘資料庫映象’是SQLServer資料庫功能最強的一種熱備份方法,也是環境要求最高的一種。其配置環節比較麻煩,本人新手研究了三天,中途遇到了許多問題,希望其他第一次做這個部署的同行不要像我這樣走許多彎路。

  一.原理(零基礎者看,三天之前我就不知道)

  通俗點,就是有兩個伺服器上存在一個相同的資料庫,一個作為主伺服器,一個備用,備用伺服器上的資料庫始終與主伺服器保持同步更改。當主伺服器掛掉的時候,備用的資料庫就被啟用(之前是映象狀態不可訪問)代替主伺服器工作。見證伺服器(可選,也可以就是備用伺服器用不同埠,只是會降低效能)用來檢測主伺服器狀態是否正常,當主的壞掉後會知道切換到備用的,檢測主的修好後再切換回來,切換時間很快。

  二.環境要求

  至少兩臺伺服器,伺服器與伺服器能內部訪問,安裝相同版本的SQL Server(2000,2005,2008),且SQLserver必須為專業版(professional)、企業版(enterprise),測試版(evaluation)和標準版不支援,我的是SQLserver 2008 enterprise,不知道SQL Server2012標準版和測試版是否支援,開啟TCP/IP協議。

   伺服器一般不會關防火牆,為了SQL08R2能夠正常工作,需要在防火牆上開啟相應

的埠。本文中介紹資料庫鏡 像需要開啟的埠是TCP-1433和TCP-5022埠。

  三.開始映象

  1.準備資料庫

  假定主伺服器名稱為SQL-1,備用伺服器名稱為SQL-2,見證伺服器名稱為SQL-3。開始資料庫存在SQL-1上,要映象的資料庫名為Test

  2.備份資料庫

  定位Test,右鍵-‘屬性’-選擇‘選項’頁,將其恢復模式設定為完整。(SQL-1)

SQL <wbr>Server資料庫映象部署

SQL <wbr>Server資料庫映象部署

備份該資料庫,兩次:完整備份及事物日誌備份Test.bak(SQL-1)

SQL <wbr>Server資料庫映象部署
事物日誌備份:
SQL <wbr>Server資料庫映象部署

  3.還原資料庫(關鍵)

  將備份檔案拷貝到備用伺服器上,在備份伺服器上,新建與主伺服器上同名的資料庫Test,還原備份檔案Test.bak,操作與以往不同,具體:定位Test右鍵-任務-還原,選擇資料來源檔案Test.bak,勾選完整和事物日誌(SQL-2)

SQL <wbr>Server資料庫映象部署

在‘選項’中,勾選‘覆蓋現有資料庫’,同時選擇‘不對資料庫執行任何操作,不回滾未提交的事務。可以還原其他事務日誌。(RESTOREWITH NORECOVERY

)’。

SQL <wbr>Server資料庫映象部署

  擊確定之後Test資料庫會呈現‘正在還原。。。’不可訪問狀態,然後操作主伺服器SQL-1。

 3.部署映象

  定位Test資料庫,右鍵-‘任務’-‘映象’在彈出的視窗中選擇‘配置安全性’(SQL-1)。

SQL <wbr>Server資料庫映象部署

  選擇‘是’,點選下一步。

SQL <wbr>Server資料庫映象部署

為了方便,取消選擇‘見證伺服器例項選項’,可以在今後新增。點選‘下一步’

SQL <wbr>Server資料庫映象部署

  偵聽埠預設5022,埠名稱自定,點選‘下一步’。

SQL <wbr>Server資料庫映象部署
  選擇備份伺服器SQL-2,會提示連線,可以直接用預設的‘sa’賬戶連線,埠預設5022,名稱隨意。點選‘下一步’

SQL <wbr>Server資料庫映象部署

  要求輸入賬戶名稱,這裡比較麻煩,輸入的賬戶在另一臺伺服器上必須要有connect許可權(SQL Server預設會阻止匿名訪問)。我使用的是SQL證書驗證,關於證書會在下一篇進行詳解。這裡輸入相應的賬戶。點選‘下一步’。

SQL <wbr>Server資料庫映象部署

  會出現相關的配置資訊,點選‘完成’.

SQL <wbr>Server資料庫映象部署
 新彈出的視窗中會驗證你輸入的登入賬戶,點選‘關閉’,在彈出的視窗中選擇‘開始映象’。

SQL <wbr>Server資料庫映象部署

 可能會跳出下面這個錯誤,提示缺少限定域名FQDN,可以無視。

SQL <wbr>Server資料庫映象部署

 接下來到了最後一步,也是最讓人頭疼地方,相信大多數人第一次操作時都會遇到這個錯誤,我在這裡停了一天。引起這個錯誤的原因很多,這裡說其中一種,其他的下一篇部落格記錄。進行映象同步時,需要在每一臺伺服器上啟用“RemoteDAC”:
SQL <wbr>Server資料庫映象部署
  選中伺服器 右鍵-‘方面’,開啟“檢視方面”視窗,在“方面”下拉選單中選擇“外圍應用配置器”,指定“方面屬性”的“RemoteDacEnabled”值為“True”。我認為這個操作不能解決90%的1418錯誤。。。執行失敗後在SQLServer日誌上會有詳細的錯誤資訊

SQL <wbr>Server資料庫映象部署

四.測試手動故障轉移(SQL-1)

在SQL-1上選擇Test資料庫,右鍵-‘任務’-‘映象’,在彈出視窗中點選‘故障轉移’。

SQL <wbr>Server資料庫映象部署
  此時SQL-1上的Test資料庫變成了映象不可用狀態(下圖),SQL-2上則變成了主題資料庫代替SQL-1運作。
SQL <wbr>Server資料庫映象部署

SQL映象部署‘錯誤1418’處理及證書驗證

SQL映象部署能很好的應對伺服器資料庫崩潰甚至整個伺服器資料被破壞的情況。如何部署在我的上一篇文章中,只要不出錯很快就能操作完成,但是這種機率很小。我分享一下我第一次部署中遇到的各種問題,主要針對1418錯誤。

  一、首先在備用伺服器上還原的時候,點了‘還原’之後資料庫一直顯示‘正在還原…’且不可用,當時以為還需要等一段時間,其實它是在等你在主伺服器上對它進行映象操作。不知道有木有人也犯過這種錯誤。

  二、在點選開始映象時出現下面的警告:缺少完全限定域名(FQDN)

SQL映象部署鈥槾砦1418鈥櫞砑爸な檠櫓
  解決方法很簡單,提示此錯誤,意思是說你不在同一個網域,只是一個WORKGROUP,通常在同一個網域不會有此錯誤出現,但SQLServer 2008映象設定,並不一定需要在同一個網域中,只要修改電腦的DNS尾碼即可,修改方式如下:
右鍵點選【計算機】選擇屬性,選擇計算機名稱tab,點選【其他】按鈕,將DNS尾碼設定成相同的值,如test.com,電腦名稱若為primary,則完整的電腦名稱就為primary.test.com,將映象server的DNS尾碼設定成相同值,需要重啟計算機

SQL映象部署鈥槾砦1418鈥櫞砑爸な檠櫓
  三、錯誤1418,單純的看彈出的錯誤訊息沒有任何幫助,具體錯誤原因要檢視主伺服器和備用伺服器的SQLServer日誌,我就是根據這個一步一步解決了表面原因相同的1418錯誤。

  1.第一次點選‘開始映象’報1418錯誤,多半是主備伺服器之間TCP協議無法通過電腦名稱確定對方的IP地址,這個錯誤會在主伺服器上的SQLServer日誌中找到。其實在最開始配置完成之後點選‘開始映象’之前留意一下下圖中的‘網路伺服器地址’直接顯示備用伺服器的IP地址那絕對是這個原因SQL映象部署鈥槾砦1418鈥櫞砑爸な檠櫓

解決方式:用記事本修改系統盤下WINDOWS/system32/drivers/etc下面的檔案hosts(可能需要修改hosts的許可權),在該檔案下加入主體及映象地址的IP及對應的電腦名稱,格式如下:

#127.0.0.1 localhost——#號代表註釋了,後面不要加

192.168.0.101 primary.test.com

192.168.0.102 mirror.test.com

注意,在兩臺server上都要加,如果還有見證server,見證server上也要加入,就會有3條

2.還是定位到SQL Server日誌,如果出現下面的錯誤

SQL映象部署鈥槾砦1418鈥櫞砑爸な檠櫓

也許中文版的SQL提示會是中文的,我的是英文版。這個錯誤的主要意思是‘正在在訪問xpstar.dll,但是沒有使用者可以對其進行操作’,OK,修改xpstar.dll的許可權。

操作:找到xpstar.dll這個檔案,我這兒在C:\ProgramFiles\Microsoft SQLServer\MSSQL10.MSSQLSERVER\MSSQL\Binn目錄下,修改它的許可權,我把它上面的‘當前使用者和組’都設為了完全控制,操作完成後還會提示xplog70.dll也要修改,xplog70在相同目錄下。我在兩臺伺服器上都做了修改(一勞永逸,不知道有無副作用),問題解決。

SQL映象部署鈥槾砦1418鈥櫞砑爸な檠櫓
  3.在我這兒執行上面的操作後依然報1418錯誤,也許其他人沒我這麼悲催。依然SQL Server日誌
SQL映象部署鈥槾砦1418鈥櫞砑爸な檠櫓
  意思是它在訪問備用伺服器上的映象資料庫時被備用伺服器給終止了,這個錯誤糾結了我一天。轉到備用伺服器上,它是這樣提示的(看來中文SQLServer還是提示的英文)

SQL映象部署鈥槾砦1418鈥櫞砑爸な檠櫓
  大概意思是它不接受匿名的訪問,這裡涉及到兩臺資料庫伺服器之間的訪問許可權問題了。通過百度(準確率讓人汗顏)終於找到了解決辦法,利用SQL證書能讓兩個SQLServer相互信任。建立證書利用SQL Query語句完成

首先在主伺服器上,一段一段執行一下語句(以‘go’為一段)

Use master
    Creat masterkey encryption by password='mainpassword';--建立資料庫主金鑰
    go

Createcertificate host_A_cert withsubject='host_A_certificate', start_date='05/05/2012',expiry_date='12/12/2050';--建立主伺服器SQL證書‘host_A_cert’,過期時間‘2050’,預設1年
   go

Create endpointEndpoint_Mirroring
state=started
as TCP(listener_port=5022,Listener_IP=all)
for Database_Mirroring(AUTHENTICATION=CERTIFICATEhost_A_cert,ENCRYPTION=REQUIRED ALGORITHMAES,ROLE=PARTNER);--建立依附與證書的映象端點'Endpoint_Mirroring',預設5022埠
   go

BACKUPCERTIFICATE host_A_cert TOFILE='D:\dbMirror\host_A.cer';--將證書備份到D盤

變換一下證書名稱,在備份伺服器和見證伺服器上執行上述語句,可以設定備機證書為host_B_cert,見證機為host_C_cert.

證書互換:將主機上的host_A.cer拷貝到備機和見證機上,備機的host_B.cer拷貝到主機和見證機上,見證機的host_C.cer拷貝到主機和備機上,為了方便,將證書都統一放到D:\dbMirror資料夾下面。

主機依次執行下面語句

Create loginhost_B_login withpassword='123'--為備機建立一個登入帳號‘host_B_login’

go

create userhost_B_user for loginhost_B_login;--為帳號‘host_B_login’建立登入名

go

Createcertificate host_B_cert

authorizationhost_B_user

fromfile='D:\dbMirror\host_B.cer'--將賬戶與證書關聯起來

go

grant connect onendpoint::Endpoint_Mirroring to[host_B_login];--新增Connect許可權

go

將上述的‘B’改為‘C’再次執行為見證機新增Connect許可權(沒有見證機的跳過);

最後主機新增自己的登入賬戶和登入名

Create loginhost_A_login with password='123'

go

create userhost_A_user for Certificate host_A_cert;

go

grant connect onendpoint::Endpoint_Mirroring to [host_A_login];

go

主機上的操作算是告一段落

在備機和見證機上執行上面的所有語句,關鍵的地方(‘ABC’的地方互換一下)修改一下,注意幾點:上述語句都是在master資料庫上完成的;執行的語句針對的是整個SQLServer,不是某一個數據庫;登入賬戶的密碼必須一致(這裡是123);如果備機和見證機是同一臺伺服器,會涉及到不同埠,上述語句改動會很大。

執行後的效果:在三天伺服器上都會有‘host_A_login’、‘host_B_login’、‘host_C_login’三個登入賬戶,且可以用該賬戶登入相應伺服器上的SQLServer。

可以說前面都是在為映象做準備工作,現在重新配置映象,具體操作檢視我上一篇blog:SQLServer資料庫映象部署 ,依然用sa連線備機,但在輸入賬戶名稱的地方改為剛剛建立的‘host_A_login’、‘host_B_login’、‘host_C_login’。如下圖

SQL映象部署鈥槾砦1418鈥櫞砑爸な檠櫓

其他步驟不變,最後點選‘開始映象’,應該就不會報1418錯誤了

4.這是在我第二次作映象部署測試時遇到的錯誤。主伺服器上日誌和“3”的一樣,只是備機上變成了這樣

SQL映象部署鈥槾砦1418鈥櫞砑爸な檠櫓

  這個問題很簡單,在SQLServer中找到sa賬戶,右鍵屬性,取消選擇其中的‘強制實施密碼策略’複選框

SQL映象部署鈥槾砦1418鈥櫞砑爸な檠櫓

我所瞭解的問題就這些了,其他問題也許在以後的部署中會發現