<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        SQLServer的數據庫鏡像實施筆記

        來源:懂視網 責編:小采 時間:2020-11-09 07:45:09
        文檔

        SQLServer的數據庫鏡像實施筆記

        SQLServer的數據庫鏡像實施筆記:最初在為公司設計SQLServer數據庫鏡像的時候,首先考慮的是高可用性(三臺計算機,一臺見證服務器,一臺做主數據庫,一臺做鏡像) 在虛擬機環境下部署成功,一切都是那么的完美。 故障轉移3秒之內就可以順利完成。 1.高可用性的實施代碼: 主體數據庫 /*
        推薦度:
        導讀SQLServer的數據庫鏡像實施筆記:最初在為公司設計SQLServer數據庫鏡像的時候,首先考慮的是高可用性(三臺計算機,一臺見證服務器,一臺做主數據庫,一臺做鏡像) 在虛擬機環境下部署成功,一切都是那么的完美。 故障轉移3秒之內就可以順利完成。 1.高可用性的實施代碼: 主體數據庫 /*

        最初在為公司設計SQLServer數據庫鏡像的時候,首先考慮的是高可用性(三臺計算機,一臺見證服務器,一臺做主數據庫,一臺做鏡像) 在虛擬機環境下部署成功,一切都是那么的完美。 故障轉移3秒之內就可以順利完成。 1.高可用性的實施代碼: 主體數據庫 /* ***

        最初在為公司設計SQLServer數據庫鏡像的時候,首先考慮的是高可用性(三臺計算機,一臺見證服務器,一臺做主數據庫,一臺做鏡像)

        在虛擬機環境下部署成功,一切都是那么的完美。 故障轉移3秒之內就可以順利完成。

        1.高可用性的實施代碼:

        主體數據庫
        /********************************************************
        此腳本在主體服務器執行
        ********************************************************/
        --鏡像只支持完全恢復模式,在備份數據庫之前檢查恢復的模式
        --對要鏡像的數據庫進行完整備份后,復制到鏡像數據庫以NORECOVERNY選項進行恢復
        USE master;
        --DROP MASTER KEY
        CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
        GO
        --為此服務器實例制作一個證書。
        --DROP CERTIFICATE HOST_A_cert
        CREATE CERTIFICATE HOST_A_cert
        WITH SUBJECT = 'HOST_A certificate',START_DATE = '01/01/2009';
        GO
        --使用該證書為服務器實例創建一個鏡像端點。
        --DROP ENDPOINT Endpoint_Mirroring
        CREATE ENDPOINT Endpoint_Mirroring
        STATE = STARTED
        AS TCP (
        LISTENER_PORT=5022
        , LISTENER_IP = ALL
        )
        FOR DATABASE_MIRRORING (
        AUTHENTICATION = CERTIFICATE HOST_A_cert
        , ENCRYPTION = REQUIRED ALGORITHM AES
        , ROLE = PARTNER
        );
        GO

        --備份 HOST_A 證書,并將其復制到其他機器,將 C:\HOST_A_cert.cer 復制到 HOST_B\HOST_C。
        BACKUP CERTIFICATE HOST_A_cert TO FILE = 'e:\HOST_A_cert.cer';
        GO
        --為入站連接配置 Host_A
        --在 HOST_A 上為 HOST_B 創建一個登錄名。
        USE master;
        --DROP LOGIN HOST_B_login
        CREATE LOGIN HOST_B_login WITH PASSWORD = 'password';
        GO

        --創建一個使用該登錄名的用戶。
        --DROP USER HOST_B_user
        CREATE USER HOST_B_user FOR LOGIN HOST_B_login;
        GO
        --使證書與該用戶關聯。
        --DROP CERTIFICATE HOST_B_cert
        CREATE CERTIFICATE HOST_B_cert
        AUTHORIZATION HOST_B_user
        FROM FILE = 'e:\HOST_B_cert.cer'
        GO

        --授予對遠程鏡像端點的登錄名的 CONNECT 權限。
        GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login];
        GO

        --在 HOST_A 上為 HOST_C 創建一個登錄名。
        USE master;
        --DROP LOGIN HOST_C_login
        CREATE LOGIN HOST_C_login WITH PASSWORD = 'password';
        GO

        --創建一個使用該登錄名的用戶。
        --DROP USER HOST_C_user
        CREATE USER HOST_C_user FOR LOGIN HOST_C_login;
        GO
        --使證書與該用戶關聯。
        --DROP CERTIFICATE HOST_C_cert
        CREATE CERTIFICATE HOST_C_cert
        AUTHORIZATION HOST_C_user
        FROM FILE = 'e:\HOST_C_cert.cer'
        GO

        --授予對遠程鏡像端點的登錄名的 CONNECT 權限。
        GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_C_login];
        GO

        USE master;
        --DROP LOGIN HOST_A_login
        CREATE LOGIN HOST_A_login WITH PASSWORD = 'password';
        GO
        --創建一個使用該登錄名的用戶。
        --DROP USER HOST_A_user
        CREATE USER HOST_A_user FOR CERTIFICATE HOST_A_cert;
        GO
        --授予對遠程鏡像端點的登錄名的 CONNECT 權限。
        GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login];
        GO

        --必須要在鏡像數據庫中先設置好伙伴后,才能在主體服務器執行
        --在 HOST_A 的主體服務器實例上,將 HOST_B 上的服務器實例設置為伙伴(使其成為初始鏡像服務器實例)。
        ALTER DATABASE crm
        SET PARTNER = 'TCP://192.168.1.205:5022';
        GO

        --設置見證服務器
        ALTER DATABASE crm SET WITNESS = N'TCP://192.168.1.204:5022';
        GO

        鏡像數據庫
        /***********************************************
        在鏡像服務器執行此腳本
        ***********************************************/
        USE master;
        --DROP MASTER KEY
        CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
        GO
        --為 HOST_B 服務器實例制作一個證書。
        --DROP CERTIFICATE HOST_B_cert
        CREATE CERTIFICATE HOST_B_cert
        WITH SUBJECT = 'HOST_B certificate for database mirroring',START_DATE = '01/01/2009';
        GO
        --在 HOST_B 中為服務器實例創建一個鏡像端點。
        --DROP ENDPOINT Endpoint_Mirroring
        CREATE ENDPOINT Endpoint_Mirroring
        STATE = STARTED
        AS TCP (
        LISTENER_PORT=5022
        , LISTENER_IP = ALL
        )
        FOR DATABASE_MIRRORING (
        AUTHENTICATION = CERTIFICATE HOST_B_cert
        , ENCRYPTION = REQUIRED ALGORITHM AES
        , ROLE = PARTNER
        );
        GO
        --備份 HOST_B 證書,將 C:\HOST_B_cert.cer 復制到 HOST_A\HOST_C。
        BACKUP CERTIFICATE HOST_B_cert TO FILE = 'e:\HOST_B_cert.cer';
        GO

        --為入站連接配置 Host_B
        --在 HOST_B 上為 HOST_A 創建一個登錄名。
        USE master;
        --DROP LOGIN HOST_A_login
        CREATE LOGIN HOST_A_login WITH PASSWORD = 'password';
        GO
        --創建一個使用該登錄名的用戶。
        --DROP USER HOST_A_user
        CREATE USER HOST_A_user FOR LOGIN HOST_A_login;
        GO
        --使證書與該用戶關聯。
        --DROP CERTIFICATE HOST_A_cert
        CREATE CERTIFICATE HOST_A_cert
        AUTHORIZATION HOST_A_user
        FROM FILE = 'e:\HOST_A_cert.cer'
        GO

        --授予對遠程鏡像端點的登錄名的 CONNECT 權限。
        GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login];
        GO

        --在 HOST_B 上為 HOST_C 創建一個登錄名。
        USE master;
        --DROP LOGIN HOST_C_login
        CREATE LOGIN HOST_C_login WITH PASSWORD = 'password';
        GO

        --創建一個使用該登錄名的用戶。
        --DROP USER HOST_C_user
        CREATE USER HOST_C_user FOR LOGIN HOST_C_login;
        GO
        --使證書與該用戶關聯。
        --DROP CERTIFICATE HOST_C_cert
        CREATE CERTIFICATE HOST_C_cert
        AUTHORIZATION HOST_C_user
        FROM FILE = 'e:\HOST_C_cert.cer'
        GO

        --授予對遠程鏡像端點的登錄名的 CONNECT 權限。
        GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_C_login];
        GO

        --在 HOST_B 上為 HOST_B 創建一個登錄名。
        USE master;
        --DROP LOGIN HOST_B_login
        CREATE LOGIN HOST_B_login WITH PASSWORD = 'password';
        GO
        --創建一個使用該登錄名的用戶。
        --DROP USER HOST_B_user
        CREATE USER HOST_B_user FOR CERTIFICATE HOST_B_cert;
        GO
        --授予對遠程鏡像端點的登錄名的 CONNECT 權限。
        GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login];
        GO
        --在 HOST_B 的鏡像服務器實例上,將 HOST_A 上的服務器實例設置為伙伴(使其成為初始主體服務器實例)。
        ALTER DATABASE crm
        SET PARTNER = 'TCP://192.168.1.203:5022';
        GO

        見證服務器
        /****************************
        見證服務器執行
        *****************************/
        --ALTER DATABASE MirrorDB SET PARTNER OFF
        USE master;
        --DROP MASTER KEY
        CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
        GO

        --為此服務器實例制作一個證書。
        --DROP CERTIFICATE HOST_C_cert
        CREATE CERTIFICATE HOST_C_cert
        WITH SUBJECT = 'HOST_C certificate',START_DATE = '01/01/2009';
        GO

        --使用該證書為服務器實例創建一個鏡像端點。
        --DROP ENDPOINT Endpoint_Mirroring
        CREATE ENDPOINT Endpoint_Mirroring
        STATE = STARTED
        AS TCP (
        LISTENER_PORT=5022
        , LISTENER_IP = ALL
        )
        FOR DATABASE_MIRRORING (
        AUTHENTICATION = CERTIFICATE HOST_C_cert
        , ENCRYPTION = REQUIRED ALGORITHM AES
        , ROLE = WITNESS
        );
        GO


        --備份 HOST_C 證書,并將其復制到其他系統,即 HOST_B\HOST_A。
        BACKUP CERTIFICATE HOST_C_cert TO FILE = 'e:\HOST_C_cert.cer';
        GO

        --為入站連接配置 Host_C
        --在 HOST_C 上為 HOST_B 創建一個登錄名。
        USE master;
        --DROP LOGIN HOST_B_login
        CREATE LOGIN HOST_B_login WITH PASSWORD = 'password';
        GO

        --創建一個使用該登錄名的用戶。
        --DROP USER HOST_B_user
        CREATE USER HOST_B_user FOR LOGIN HOST_B_login;
        GO
        --使證書與該用戶關聯。
        --DROP CERTIFICATE HOST_B_cert
        CREATE CERTIFICATE HOST_B_cert
        AUTHORIZATION HOST_B_user
        FROM FILE = 'e:\HOST_B_cert.cer'
        GO

        --授予對遠程鏡像端點的登錄名的 CONNECT 權限。
        GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login];
        GO

        --在 HOST_C 上為 HOST_A 創建一個登錄名。
        USE master;
        --DROP LOGIN HOST_A_login
        CREATE LOGIN HOST_A_login WITH PASSWORD = 'password';
        GO
        --創建一個使用該登錄名的用戶。
        --DROP USER HOST_A_user
        CREATE USER HOST_A_user FOR LOGIN HOST_A_login;
        GO
        --使證書與該用戶關聯。
        --DROP CERTIFICATE HOST_A_cert
        CREATE CERTIFICATE HOST_A_cert
        AUTHORIZATION HOST_A_user
        FROM FILE = 'e:\HOST_A_cert.cer'
        GO

        --授予對遠程鏡像端點的登錄名的 CONNECT 權限。
        GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login];
        GO

        --在 HOST_C 上為 HOST_C 創建一個登錄名。
        USE master;
        --DROP LOGIN HOST_C_login
        CREATE LOGIN HOST_C_login WITH PASSWORD = 'password';
        GO
        --創建一個使用該登錄名的用戶。
        --DROP USER HOST_C_user
        CREATE USER HOST_C_user FOR CERTIFICATE HOST_C_cert;
        GO

        可能有朋友們會比較有疑惑,你一下搞兩個數據庫出來,他們的ip地址都不一樣,到時候數據庫切換過去了,我的數據庫的連接字符串可如何是好?難道還得在代碼中去控制是連接哪個數據庫嗎?

        其實這個問題是這樣的,使用ADO.NET或者SQL Native Client能夠自動連接到故障轉移后的伙伴,連接字符串如下所示:

        ConnectionString="DataSource= A;Failover Partner=B;Initial Catalog=AdventureWorks;Integrated Security=true;"

        DataSource= A;這個就是我們常用的主數據庫的ip地址,Failover Partner=B;這個填寫的就是鏡像數據庫的ip地址,一旦出現了連接錯誤,ado.net會在超時以后自動去連接鏡像數據庫。

        2.高級別保護模式

        在昨天晚上加班做實施的時候,才發現我的設計已經被修改了,由于以前的項目有java寫的也有c#寫的,全自動的故障轉移不能夠實現 。換句話說,由于老項目中的歷史遺留問題,以及特殊模塊的耦合性過高,無法解耦,只能在高級別保護模式或高性能模式中選擇一種了。那么這兩者有什么區別呢?

        簡單一點來說,區別就在與事務安全模式上跟應用場景上。

        高級別保護模式采用的是同步鏡像, SAFETY FULL。應用場景:通常在局域網中或對數據要求比較高的場景中。

        高性能保護模式采用的是異步鏡像, SAFETY OFF。應用場景:通常在廣域網或對數據要求不太高,丟失幾條數據是允許的,但是必須保證它不中斷服務。

        在微軟的SQLServer2005的課程上是這么說的。如果是高級別保護模式的話,主、從數據庫只要有一臺不能正常保證服務,數據庫就不能夠對外進行服務了,我在開始的時候就沒有打算采用這種模式,因為部門經理說了,丟失一兩條數據是可以接受的,況且我們公司是做運營的,按照起先微軟的課程的理論,高級別保護模式是不太適合我們公司的應用場景的,萬一有一臺數據庫出問題了,整個服務就被中斷,這是不能讓人接受的。再說了,公司對數據要求不太苛刻,兩臺服務器都有內網線連接,由于內網傳輸速度非常的快,即使采用高性能模式,一般來說也是不會丟失數據的。于是我打算采用高性能模式來做數據庫的鏡像。由于公司服務器沒有域環境,所以我就采用了證書驗證來做SQLServer鏡像。

        意外收獲:

        兩臺服務器全部都安裝了SQLServer2008,在設置事務安全模式的時候,才發現SQLServer2008不支持異步模式。提示大概如下:此SQLServer版本不支持修改事務安全模式,alter database失敗。 我當時汗都出來了,忙活了一晚上,到最后居然是這個結果。

        由于是服務器維護時間,我大膽的把鏡像服務器停止了,結果卻讓我大吃一驚,主數據庫依舊可以正常工作,正常對外提供服務。也就是說,起先微軟的課程講的知識是錯誤的,兩臺數據庫做鏡像,不管是哪臺數據庫出了問題,另外的一臺數據庫都可以保證正常對外提供服務。于是我反復試驗反復切換了一下,結果依然是這樣。

        由于高級別保護模式與高性能模式代碼差不太多,只是在事務安全模式的設置上有些小區別,前面已經提到,這里就不再多解釋了。實施的代碼如下:

        主體服務器
        USE master;
        CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
        CREATE CERTIFICATE HOST_A_cert WITH SUBJECT = 'HOST_A certificate' ,
        START_DATE = '01/01/2009';


        CREATE ENDPOINT Endpoint_Mirroring
        STATE = STARTED
        AS
        TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL )
        FOR
        DATABASE_MIRRORING
        ( AUTHENTICATION = CERTIFICATE HOST_A_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );


        BACKUP CERTIFICATE HOST_A_cert TO FILE = 'e:\HOST_A_cert.cer';


        CREATE LOGIN HOST_B_login WITH PASSWORD = 'password';
        CREATE USER HOST_B_user FOR LOGIN HOST_B_login;
        CREATE CERTIFICATE HOST_B_cert AUTHORIZATION HOST_B_user FROM FILE = 'e:\HOST_B_cert.cer';
        GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login];


        ALTER DATABASE crm SET PARTNER = 'TCP://10.10.10.8:5022';





        鏡像數據庫
        USE master;
        CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
        CREATE CERTIFICATE HOST_B_cert WITH SUBJECT = 'HOST_B certificate',
        START_DATE = '01/01/2009';


        CREATE ENDPOINT Endpoint_Mirroring
        STATE = STARTED
        AS
        TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL )
        FOR
        DATABASE_MIRRORING
        ( AUTHENTICATION = CERTIFICATE HOST_B_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );


        BACKUP CERTIFICATE HOST_B_cert TO FILE = 'e:\HOST_B_cert.cer';


        CREATE LOGIN HOST_A_login WITH PASSWORD = 'password';
        CREATE USER HOST_A_user FOR LOGIN HOST_A_login;
        CREATE CERTIFICATE HOST_A_cert AUTHORIZATION HOST_A_user FROM FILE = 'e:\HOST_A_cert.cer';
        GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login];


        ALTER DATABASE crm SET PARTNER = 'TCP://10.10.10.6:5022';

        可能有朋友會比較奇怪,你這里也沒有使用ALTER DATABASE crm SET SAFETY FULL; 按理應該是高性能模式才對呀?

        其實這個問題是這樣的,我的這個SQLServer2008默認已經是將事務安全模式設置為full了,即使是手動設置也一樣,并且我實施的時候SQLServer2008不支持將事務安全模式設置為OFF。

        OK,一切都設置好了,那么就可以模擬服務器真的down機時候的操作了,后續的工作我也把代碼做了總結,具體代碼如下:

        手動故障轉移代碼
        --主備互換
        --主機執行:

        ALTER DATABASE crm SET PARTNER FAILOVER

        --主服務器Down掉,備機緊急啟動并且開始服務
        ALTER DATABASE crm SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS


        原來的主服務器恢復,可以繼續工作,需要重新設定鏡像
        --備機執行:
        USE master
        ALTER DATABASE crm SET PARTNER RESUME --恢復鏡像

        ALTER DATABASE crm SET PARTNER FAILOVER; --切換主備


        3.監視數據庫鏡像

        SQLServer提供了一些視圖,可以供查詢鏡像的各種狀態,到時候可以根據這個做一個監視,一旦發生故障轉移群集,發郵件給系統管理員,好讓系統管理員及時的知道數據庫服務器發生了什么問題,即使的做故障分析、排查。有關這方面資料,MSDN上已經提供太多資料了。感興趣的朋友可以去查這方面的資料。

        在文章的最后提出一個有爭議的問題:SQLServer(2008)高級別保護模式,只要有一臺數據庫能夠保證正常運行,就可以正常對外提供服務。我的實驗結果是這樣的,這的確跟以往的理論知識有些出入。

        還等什么,趕快搭環境動手實驗一下吧,體驗一下SQLServer鏡像帶來的快感。 希望有興趣的朋友們一起學習探討。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        SQLServer的數據庫鏡像實施筆記

        SQLServer的數據庫鏡像實施筆記:最初在為公司設計SQLServer數據庫鏡像的時候,首先考慮的是高可用性(三臺計算機,一臺見證服務器,一臺做主數據庫,一臺做鏡像) 在虛擬機環境下部署成功,一切都是那么的完美。 故障轉移3秒之內就可以順利完成。 1.高可用性的實施代碼: 主體數據庫 /*
        推薦度:
        標簽: 最初 數據庫 筆記
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲国产第一站精品蜜芽| 日本一道本高清免费| 国产亚洲综合成人91精品 | 国产线视频精品免费观看视频| 免费人成无码大片在线观看| 国产偷国产偷亚洲清高APP| 日本最新免费不卡二区在线| 亚洲精品宾馆在线精品酒店| 国产又黄又爽又刺激的免费网址 | 中文字幕亚洲综合小综合在线| 免费观看黄色的网站| 亚洲另类古典武侠| 国产成人免费爽爽爽视频 | 亚洲国产精品久久久久秋霞影院| 一区二区免费视频| 亚洲精品二三区伊人久久| 国内一级一级毛片a免费| 色吊丝免费观看网站| 亚洲伊人久久精品影院| 18女人水真多免费高清毛片| 中文无码亚洲精品字幕| 亚洲av无码不卡私人影院| 久久99精品免费一区二区| 亚洲人成电影亚洲人成9999网| 免费精品国偷自产在线在线| 亚洲精品av无码喷奶水糖心| 亚洲色偷拍区另类无码专区| 三年片在线观看免费观看大全一 | 精品亚洲一区二区三区在线观看| 国产免费无码AV片在线观看不卡| 亚洲精品在线播放视频| 日韩黄色免费观看| 国产精品免费观看调教网| 亚洲一区欧洲一区| 久久亚洲国产成人影院网站| 最近中文字幕mv免费高清视频8| 亚洲AV成人精品一区二区三区| 亚洲另类少妇17p| 国产精品免费网站| 一级黄色片免费观看| 亚洲国产成人超福利久久精品|