標籤:
原文: 第三篇——第二部分——第四文 配置SQL Server鏡像——非域環境
本文為非域環境搭建鏡像示範,對於域環境搭建,可參照上文:http://blog.csdn.net/dba_huangzj/article/details/28904503 原文出處:http://blog.csdn.net/dba_huangzj/article/details/27652857
前面已經示範了域環境下的鏡像搭建,本文將使用非域環境來搭建鏡像,同樣,先按照不帶見證伺服器的高安全模式(同步)的方式搭建,然後 示範非同步模式,最後會示範帶有見證伺服器的高安全模式。
準備條件 伺服器
| 伺服器角色 |
機器名/執行個體名 |
版本 |
IP |
| 主體伺服器 |
RepA |
Windows Server 2008R2 英文x64 |
192.168.1.2 |
| 鏡像伺服器 |
RepB |
Windows Server 2008R2 英文x64 |
192.168.1.3 |
| 見證伺服器 |
Win7 |
Win7 企業版 |
192.168.1.4 |
註:Rep是Replication(複製)的縮寫,RepA和RepB一開始是搭建來做複製示範,本文借用這3台伺服器。
SQL Server
均使用SQL Server 2008 R2 企業版 英文 X64
示範資料庫
AdventureWorks2008R2
第一步:檢查環境
由於在非域環境內,所以需要做的檢查相對來說多很多,下面按照示範環境,逐個測試下面的條件:
- Windows 帳號。
- 網路是否能聯通,並且連接埠可用。
- 主體伺服器和鏡像伺服器的磁碟配置是否正確。
- SQL Server版本、補丁是否滿足鏡像要求。
- SQL Server資料庫的復原模式、相容層級。
- SQL Server上是否有常規的備份作業,特別是記錄備份。
- 主體伺服器和鏡像伺服器的SQL Server能否互連。
- 主體伺服器和鏡像伺服器中是否有共用資料夾。
Windows帳號:
搭建鏡像中,涉及Windows帳號的主要是在共用資料夾中,非域環境下需要認證來搭建鏡像,另外對於小庫,一般使用備份還原的方式,也就是說,需要把主體資料庫上的備份檔案傳輸到鏡像伺服器上,這些都需要用到Windows帳號操作共用資料夾。本文為了示範方便,使用了Administrator作為Windows的帳號,作為最佳實務,建議真正搭建時使用專用的Windows帳號,並且保證有足夠的許可權。
網路是否聯通,並且連接埠可用:
非單機下的高可用都嚴重依賴網路,網路不通,一切都白搭。所以首先要確保網路是能互訪的。下面測試一下本例中使用的主體伺服器和鏡像伺服器是否能互訪:
在RepA上ping RepB(本例IP地址192.168.1.3)
在RepB上ping RepA(本例IP地址192.168.1.2)
可見是能ping通的,為了方便,本例已關閉防火牆,所以連接埠問題不需要檢查,如果在生產環境,就需要和網路系統管理員確認連接埠是否已經開啟。檢查連接埠可以用Telnet命令。如果輸入Telnet後出現下面的錯誤:
英文:‘telnet’ is not recognized as an internal or external command, operable program or batch file.
中文:‘telnet‘ 不是內部或外部命令,也不是可啟動並執行程式或批次檔。
可以在“開始”→“控制台”→“程式”,“在程式和功能”找到並點擊“開啟或關閉Windows功能”進入Windows 功能設定對話方塊。找到並勾選“Telnet用戶端”和“Telnet伺服器”,最後“確定”。依據版本不同,開啟方式也會不同,具體版本請自行尋找搜尋引擎的方案。
主體伺服器和鏡像伺服器的磁碟配置是否正確:
在正式環境中,往往不會只有一個磁碟,本例由於實體機的資源限制,所以只保留系統硬碟,即C盤做示範。下面先檢查主體伺服器(RepA)上示範庫(AdventureWorks2008R2)的資料檔案和記錄檔所在的盤符和目錄:
USE master go SELECT physical_name--物理檔案路徑 FROM sys.master_files WHERE database_id = DB_ID(‘AdventureWorks2008R2‘)
本例結果如下:
接下來到鏡像伺服器,也就是RepB上檢查是否存在這個盤符和目錄,如果不存在,要手動建立。下面是手動建立後的檔案夾:
要注意,後續還原的時候,要檢查還原時檔案路徑是否也指向相同的目錄。檔案名稱也要一致。
SQL Server版本、補丁是否滿足鏡像要求:
本例使用相同的安裝檔案,且均為2008R2(OS和SQL),並且沒有連網更新,所以基本上可以確保版本和補丁一致。如果是正式環境,需要考慮,雖然從2005 SP1開始就支援鏡像,但是真正完整支援鏡像功能的還是從2005 SP2開始,另外除了SQL Server版本之外,Windows 的版本、補丁也要檢查,雖然沒有很確切指定OS也必須完全一致,但是一致的版本會比較少異常。
SQL Server資料庫的復原模式、相容層級:
檢查復原模式和相容層級,可以使用下面的語句實現:
USE master go SELECT name [資料庫名] , recovery_model_desc [復原模式] , CASE WHEN [compatibility_level] = 90 THEN ‘2005‘ WHEN [compatibility_level] = 100 THEN ‘2008‘ WHEN [compatibility_level] > 100 THEN ‘2008+‘ ELSE ‘2000 or lower version‘ END [相容層級] FROM sys.databases WHERE name = ‘AdventureWorks2008R2‘
在本例中,示範庫為簡單模式,所以用SSMS或者命令修改:
SSMS修改:
T-SQL修改:
USE [master] GO ALTER DATABASE [AdventureWorks2008R2] SET RECOVERY FULL WITH NO_WAIT GO
本人建議使用T-SQL修改,因為在伺服器比較繁忙的時候,使用圖形化介面操作會很慢甚至逾時。並且一個DBA應該會使用這些T-SQL命令。否則就太不專業了。
再次執行檢查指令碼,可見復原模式已經變回了Full:
SQL Server上是否有常規的備份作業,特別是記錄備份:
這一步就不做示範了,開啟SQL Server Agent即可檢查,另外搭建鏡像的人應該具有會看是否有常規備份的能力。
主體伺服器和鏡像伺服器的SQL Server能否互連:
在前面的第二步中,主要是檢查OS的網路,但是OS能連通不代表SQL Server能連通,所以有必要檢查SQL Server是否能互聯。方法很簡單,分別開啟SSMS,並且輸入夥伴伺服器的SQL Server IP/執行個體名。本例先使用SA來檢查:
在RepA上串連RepB:
在RepB上串連RepA:
主體伺服器和鏡像伺服器中是否有共用資料夾:
前面說過,對非域環境下,需要使用認證來搭建鏡像,另外需要對備份檔案進行傳輸,這些都會使用到共用資料夾,當然可以用別的方式實現,不過共用資料夾可能是最為簡單的方式。本例中,我將在主體伺服器(RepA)上建立一個共用資料夾,以便RepB能訪問。不過如果條件允許,我更建議在有容錯能力的磁碟上(比如RAID、SAN等)建立共用資料夾,這樣即使主體伺服器崩潰,也不至於影響鏡像伺服器對共用資料夾的操作。
現在來簡單操作一下: 建立檔案夾:
授予Everyone讀寫權限:
再次提醒,針對正式環境,強烈建議使用專用帳號,並且適當控制許可權,比如對檔案夾在搭建過程中允許完全控制,但是在正式運行時只允許“讀”操作等。
搭建成功:
檢查是否能訪問:
這一步可以在RepB中,輸入UNC路徑,如本例的:\\RepA\ShareFolders
到目前為止,準備工作已經完畢。下面開始第二步。
第二步:使用認證配置鏡像,並備份還原資料庫
在這一步中,我們將做兩件事,第一件是使用認證來配置鏡像,第二件是備份還原資料庫。在非域環境下,必須使用認證來搭建鏡像,所以我把搭建認證放在第一步。有些資料上會把備份還原作業放在認證搭建之前,但是根據個人經驗,當磁碟IO、網路效能不佳的時候,備份、傳輸、還原都會浪費大量的時間(個人操作過2個小時),並且期間伺服器幾乎不能操作。這種時候,我會選擇先搭建好,再還原,然後馬上進行同步。
建立認證:
如果伺服器使用Local System作為SQL Server服務帳號,就需要使用認證授權。認證授權同時也可以在你的伺服器不能通過其他伺服器的帳號訪問對方伺服器或者你不想授權給Windows登入時使用。
使用認證搭建鏡像的步驟如下:
- 建立資料庫主要金鑰(如果主要金鑰不存在)。
- 在Master資料庫中建立認證並用主要金鑰加密。
- 使用認證授權建立端點(endpoint)。
- 備份認證成為認證檔案。
- 在伺服器上建立登入帳號,用於提供其他執行個體訪問。
- 在master庫中建立使用者,並映射到上一步的登入帳號中。
- 把認證授權給這些使用者。
- 在端點上授權。
- 設定主體伺服器的鏡像夥伴。
- 設定鏡像伺服器的主體夥伴。
- 配置見證伺服器。
Step 1:建立資料庫主要金鑰
主要金鑰的用處在這裡是用於加密認證,當然主要金鑰不僅僅只有這個作用。對資料庫主要金鑰的密碼及儲存保護要小心,這是實力層級的對象,影響面非常廣。可以使用下面語句來建立:
USE master GO CREATE MASTER KEY ENCRYPTION BY PASSWORD = ‘Pa$$w0rd‘; /*--刪除主要金鑰USE master;DROP MASTER KEY*/
使用相同方式在鏡像伺服器建立資料庫主要金鑰。
Step 2:建立認證,並用主要金鑰加密
建立認證時,預設在建立日期開始一年後到期,所以針對認證的建立,要注意其到期時間。下面是在“主體伺服器”上建立HOST_A_cert認證的建立
USE master GO CREATE CERTIFICATE Host_A_Cert WITH Subject = ‘Host_A Certificate‘, Expiry_Date = ‘2015-1-1‘; --到期日期 /*--刪除認證USE master;DROP CERTIFICATE HOST_A_cert*/
使用相同的方法在鏡像伺服器上實現對HOST_B_cert認證的建立
Step 3:建立端點
可以使用下面的代碼在主體伺服器中建立端點,並且指定使用5022,連接埠,連接埠在鏡像配置過程中不強制使用特定連接埠(被佔用或者特定連接埠如1433除外)。
--使用Host_A_Cert認證建立端點 IF NOT EXISTS ( SELECT 1 FROM sys.database_mirroring_endpoints ) BEGIN CREATE ENDPOINT [DatabaseMirroring] STATE = STARTED AS TCP ( LISTENER_PORT = 5022, LISTENER_IP = ALL ) FOR DATABASE_MIRRORING ( AUTHENTICATION = CERTIFICATE Host_A_Cert, ENCRYPTION = REQUIRED Algorithm AES, ROLE = ALL ); END
在鏡像伺服器對認證名稍作修改,建立鏡像伺服器的端點。
Step 4:備份認證
備份認證的目的是發送到別的伺服器並匯入認證,以便別的伺服器能通過認證訪問這台伺服器(主體伺服器)。
BACKUP CERTIFICATE Host_A_Cert TO FILE = ‘C:\ShareFolders\Host_A_Cert.cer‘;
同理,在鏡像伺服器上重複一次,注意認證名和路徑。備份之後可以在目標檔案夾上看到有一個cer檔案:
這裡有個建議,分別在RepA和RepB本地建立一個單獨的檔案夾Certifications,然後用來儲存本伺服器和夥伴伺服器的認證,認證一直存放在共用資料夾並不合理。本例分別在原生C盤上建立一個Certifications的檔案夾並存放所有的認證,
Step 5:建立登入帳號
針對每個伺服器單獨建立一個伺服器登入帳號,這裡只需要建立一個登入給鏡像伺服器即可:
CREATE LOGIN Host_B_Login WITH PASSWORD = ‘Pa$$w0rd‘;
同理,在鏡像伺服器上建立Host_A_Login給主體伺服器。
Step 6:建立使用者,並映射到Step 5中建立的登入帳號中
在主體伺服器上運行:
CREATE USER Host_B_User For Login Host_B_Login;
同理在鏡像伺服器也建立。
Step 7:使用認證授權使用者
建立一個新的認證,並使用從夥伴伺服器中複製過來的認證匯入,然後映射step 6中的帳號到這個新認證上。
CREATE CERTIFICATE Host_B_Cert AUTHORIZATION Host_B_User FROM FILE = ‘C:\Certifications\Host_B_Cert.cer‘;
注意鏡像伺服器上也同樣。
Step 8:把Step 5中的登入帳號授權訪問連接埠
GRANT CONNECT ON ENDPOINT::[DatabaseMirroring] TO [Host_B_Login];
鏡像伺服器也一樣。
到此為止,配置鏡像的步驟已經完畢,後續會給出儘可能自動化的配置指令碼。
備份還原資料庫:
這一步,把主體伺服器(RepA)上的示範Database Backup並還原到RepB上進行初始化操作:
- 完整備份AdventureWork2008R2到共用資料夾C:\ShareFolders
- 複本備份檔案到鏡像伺服器(如果許可權足夠,直接使用共用路徑來還原即可)
- 以Nonrecovery選項還原AdventureWork2008R2到鏡像伺服器(RepB)
- 記錄備份AdventureWork2008R2,並同樣方式還原到RepB
Step 1:完整備份:
Step 2:在鏡像伺服器(RepB)上還原資料庫,並使用Nonrecovery方式:
注意路徑和還原的檔案名稱:
Step 3:備份及還原日誌:
同樣以Nonrecovery方式還原:
第三步:啟動鏡像
前面兩步主要是對鏡像的配置準備,下面開始正式啟動鏡像:
Step 1:右鍵主體伺服器的主體資料庫,選擇【鏡像】
Step 2:選擇【配置鏡像】:這一步我們主要是擷取主體伺服器的網路地址,看的紅框部分
Step 3:在鏡像伺服器(RepB)上執行下面指令碼:
注意順序,先要在RepB上執行
ALTER DATABASE AdventureWorks2008R2 SET PARTNER = ‘TCP://RepA:5022‘;GO
Step 4:在主體伺服器(RepA)執行下面指令碼,把RepB添加成RepA的夥伴
ALTER DATABASE AdventureWorks2008R2 SET PARTNER = ‘TCP://RepB:5022‘;GO
執行後,可以看到RepA上的鏡像配置:
Step 5:切換模式
Step 3~4中的搭建是使用高安全模式搭建,如果希望使用高效能模式(再次提醒,本例沒有使用見證伺服器,所以不能使用自動容錯移轉的高安全模式),可以使用下面指令碼在RepA上實現:
ALTER DATABASE AdventureWorks2008R2 SET PARTNER SAFETY OFFGO
再次開啟,可見運行模式已經是高效能模式:
Step 6:驗證容錯移轉
下面再用語句來試一下是否能容錯移轉,先檢查兩個庫的狀態,這裡用個小技巧,使用 【註冊伺服器】,
然後建立註冊:
同理把RepB也加進去:
然後開啟一個查詢時段,用於一次性查詢兩個伺服器,前提是要有足夠的許可權,本例用sa來串連:
注意的粉紅色的部分,如果出現(1/2)這種情況,表示有一台伺服器不能串連成功:
結果如下:我們只關注一小部分內容:
現在切換回RepA的查詢時段,然後輸入:
ALTER DATABASE AdventureWorks2008R2 SET PARTNER FAILOVER;--在主體伺服器上執行
然後到【註冊管理器】中再查詢,可以看到現在RepB已經是Principal,也就是主體伺服器了:
讀者可以用GUI介面操作,這裡就不做過多示範。
帶有見證伺服器的非域環境鏡像配置
下面示範如何把見證伺服器加進鏡像環境中,首先,我們保持前面的配置,即搭建好主體和鏡像伺服器,然後我們使用一個Win7的系統來做見證伺服器,上面裝有SQL Server 2008 R2企業版,可以使用Express或者工作群組版來做見證伺服器。
Step 1:驗證三台伺服器的網路互連,這裡就不做累贅,讀者可以參考前面的方法檢查。Step 2:根據前面的步驟,在見證伺服器上建立主要金鑰、認證等:
--建立主要金鑰 USE master; CREATE MASTER KEY ENCRYPTION BY PASSWORD = ‘Pa$$w0rd‘; --示範所需,否則不要設定這麼簡單的密碼 GO/* --刪除主要金鑰 USE master; DROP MASTER KEY */ USE master; CREATE CERTIFICATE HOST_C_cert WITH SUBJECT = ‘HOST_C certificate‘--在Winess執行個體上建立認證,命名為HOST_C_cert,這個選項是描述認證 ,EXPIRY_DATE =‘2015-6-5‘ ;--認證到期時間,可以適當設定長一點,具體按實際需要設定 GO/* --刪除認證 USE master; DROP CERTIFICATE HOST_C_cert */ CREATE ENDPOINT Endpoint_Mirroring STATE = STARTED AS TCP ( LISTENER_PORT=5022 --使用5022連接埠,這個連接埠可以改成未被使用的連接埠,但是鏡像過程中的所有合作者都應該使用相同的連接埠 , LISTENER_IP = ALL ) FOR DATABASE_MIRRORING ( AUTHENTICATION = CERTIFICATE HOST_C_cert --使用認證來授權端點 , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL --表示這個端點可以作為任何角色,包括主伺服器、鏡像伺服器、見證伺服器。具體可看聯機叢書。 ); GO/* --刪除鏡像端點 IF EXISTS (SELECT * FROM sys.endpoints e WHERE e.name = N‘Endpoint_Mirroring‘) DROP ENDPOINT [Endpoint_Mirroring] GO */ BACKUP CERTIFICATE HOST_C_cert TO FILE = ‘C:\Certifications\HOST_C_cert.cer‘; GO
確保RepA、RepB、Win7這三台機上都有主體、鏡像和見證所產生的3個認證。
在見證伺服器上為主體、鏡像伺服器建立以認證為驗證的帳號、使用者名稱及端點。
--在Witness執行個體上建立一個登入名稱給Principal執行個體 USE master; CREATE LOGIN HOST_A_login WITH PASSWORD = ‘Pa$$w0rd‘; GO --建立一個用於給這個登入名稱 CREATE USER HOST_A_user FOR LOGIN HOST_A_login; GO --讓該帳號使用認證授權 CREATE CERTIFICATE HOST_A_cert AUTHORIZATION HOST_A_user FROM FILE = ‘C:\Certifications\HOST_A_cert.cer‘ GO --授予這個新帳號串連端點的許可權 GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO HOST_A_login; GO/* --刪除帳號 DROP LOGIN HOST_A_user */ --在Witness執行個體上建立一個登入名稱給Mirror執行個體 USE master; CREATE LOGIN HOST_B_login WITH PASSWORD = ‘Pa$$w0rd‘; GO --建立一個用於給這個登入名稱 CREATE USER HOST_B_user FOR LOGIN HOST_B_login; GO --讓該帳號使用認證授權 CREATE CERTIFICATE HOST_B_cert AUTHORIZATION HOST_B_user FROM FILE = ‘C:\Certifications\HOST_B_cert.cer‘ GO --授予這個新帳號串連端點的許可權 GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO HOST_B_login; GO/* --刪除帳號 DROP LOGIN HOST_B_user */
分別在RepA和RepB中執行下面語句,為見證伺服器建立串連端點的許可權:
USE master; CREATE LOGIN HOST_C_login WITH PASSWORD = ‘Pa$$w0rd‘; GO --建立一個用於給這個登入名稱 CREATE USER HOST_C_user FOR LOGIN HOST_C_login; GO --讓該帳號使用認證授權 CREATE CERTIFICATE HOST_C_cert AUTHORIZATION HOST_C_user FROM FILE = ‘C:\Certifications\HOST_C_cert.cer‘ GO --授予這個新帳號串連端點的許可權 GRANT CONNECT ON ENDPOINT::DatabaseMirroring TO HOST_C_login; GO
在RepB中應該存在這兩個登入,而在RepA中應該存在Host_B_Login和Host_C_Login兩個賬戶:
然後在主體伺服器上執行下面語句,加入見證伺服器:
ALTER DATABASE AdventureWorks2008R2 SET WITNESS = ‘TCP://win7:5022‘
完畢之後,開啟RepA的鏡像配置,可以見到見證伺服器已經加入:
我們可以測試一下,把RepA的SQL Server服務關閉,實現主體伺服器的“故障”,看是否RepB能自動切換:
第一步,檢查RepB的狀態:
第二步,關閉RepA的服務:
第三步,重新整理RepB的狀態:
可見已經切換過去,並且狀態為Disconnected,注意,即使此時RepA再次聯機,也不會自動切換成為主體伺服器,需要手動切換,這部分讀者可以自行測試。把RepA再次啟動之後,可以對比鏡像的狀態,從Disconnected變成了Synchronized。
到處為止,非域環境下的鏡像配置已經完畢。
第三篇——第二部分——第四文 配置SQL Server鏡像——非域環境