반응형

[스크립트 11-10]

--인증키생성

create master key encryption by password = 'www.SQLTAG.org';

GO

 

--인증키 추가( 서버(A), 미러 서버(B), 모니터 서버(C) 구분하자)

create certificate SQLTAG_A_Cert with subject = 'SQLTAG_A certificate', start_date = '2011-01-01', expiry_date = '2020-01-01';

GO

 

[스크립트 11-11]

--인증키백업

Backup certificate SQLTAG_Cert to file = 'C:\SQLTAG_A_Cert.cer';

 

[스크립트 11-12]

--ENDPOINT 생성

Create endpoint Mirroring state = started

as tcp(listener_port = 5022, listener_ip = all)

for data_mirroring (authentication = certificate SQLTAG_A_Cert, encryption = required, role = partner);

GO

 

[스크립트 11-13]

--미러 서버가 사용 계정 생성.

create login SQLTAG_B_Login with PASSWORD = 'www.SQLTAG.org';

GO

 

create user SQLTAG_B_User from login SQLTAG_B_Login;

GO

 

--미러 서버 인증서 등록.

Create certificate SQLTAG_B_cert Authorization SQLTAG_B_user From file = 'c:\SQLTAG_B_cert.cer';

GO

 

Grant CONNECT ON Endpoint::Mirroring to [SQLTAG_B_Login];

GO

 

[스크립트 11-14]

-- 모니터링 서버가 사용 계정 생성.

create login SQLTAG_C_Login with PASSWORD = 'www.SQLTAG.org';

GO

 

create user SQLTAG_C_User from login SQLTAG_C_Login;

GO

 

-- 모니터링 서버 인증서 등록.

Create certificate SQLTAG_C_cert Authorization SQLTAG_C_User From file = 'C:\SQLTAG_C_cert.cer';

GO

 

Grant CONNECT ON Endpoint::Mirroring to [SQLTAG_C_Login];

GO

 

[스크립트 11-15]

-- 미러 서버 파트너 설정

alter database MirrorTest set partner ='TCP://SECOND2008R2.localdomain:5022';

GO

 

-- 모니터링 서버 파트너 설정

alter database MirrorTest set witness = 'TCP://THIRD2008R2.localdomain:5022';

GO

 

[스크립트 11-16]

-- 서버가 사용할 계정 생성.

create login SQLTAG_A_login with PASSWORD = 'www.SQLTAG.org';

GO

 

create user SQLTAG_A_User from login SQLTAG_A_login;

GO

 

-- 서버의 인증서 등록

Create certificate SQLTAG_A_cert Authorization SQLTAG_A_user From file = 'C:\SQLTAG_A_cert.cer';

GO

 

Grant CONNECT ON Endpoint::Mirroring to [SQLTAG_A_login];

GO

 

[스크립트 11-17]

--모니터링 서버가 사용할 계정 생성

create login SQLTAG_C_login with PASSWORD = 'www.SQLTAG.org';

GO

 

create user SQLTAG_C_user from login SQLTAG_C_login;

GO

 

--모니터링 서버의 인증서 등록

Create certificate SQLTAG_C_cert Authorization SQLTAG_C_user From file = 'C:\SQLTAG_C_cert.cer';

GO

Grant CONNECT ON Endpoint::Mirroring to [SQLTAG_C_login];

GO

 

[스크립트 11-18]

-- 파트너 설정

alter database Mu_Log set partner = 'TCP://first2008r2:5022';

 

[스크립트 11-19]

-- 서버 사용할 계정 생성

create login SQLTAG_A_login with PASSWORD = 'www.SQLTAG.org';

GO

 

create user SQLTAG_A_user from login SQLTAG_A_login;

GO

 

-- 서버 인증키 등록

Create certificate SQLTAG_A_cert Authorization SQLTAG_A_user From file = 'c:\SQLTAG_A_cert.cer';

GO

 

Grant CONNECT ON Endpoint::Mirroring to [SQLTAG_A_login];

GO

 

[스크립트 11-20]

--미러 서버 사용할 계정 생성

create login SQLTAG_B_login with PASSWORD = 'www.SQLTAG.org';

GO

 

create user SQLTAG_B_user from login SQLTAG_B_login;

GO

 

--미러 서버 사용할 인증키 등록

Create certificate SQLTAG_B_cert Authorization SQLTAG_B_user From file = 'c:\SQLTAG_B_cert.cer';

GO

 

Grant CONNECT ON Endpoint::Mirroring to [SQLTAG_B_login];

GO

 

[스크립트 11-27]

--스크립트 제공(한국마이크로소프트 송혁)

USE MSDB

GO

 

ALTER DATABASE [msdb] SET ENABLE_BROKER

GO

 

CREATE TABLE tbl_SQLTAG

(

        MirrorStateChange int,

    DBName varchar(100),

    ServerName varchar(100),

    PostTime datetime,

    SPID int,

    TextData nvarchar(500),

    DatabaseID int,

    TransactionsID int,

    StartTime datetime

 )

GO

 

CREATE proc Failover_SQLTAG

as

DECLARE @SQL VARCHAR(8000);

Declare @Message XML

 

WHILE 1=1

BEGIN

WAITFOR(

RECEIVE TOP (1) @Message = Cast(message_body as XML) from DBMirrorQueue

), TIMEOUT 100;

 

IF (@@ROWCOUNT <> 0)

BEGIN

               insert into Failover_SQLTAG values(

               @Message.value('(/EVENT_INSTANCE/State)[1]', 'int')

               ,@Message.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'sysname')

               ,@Message.value('(/EVENT_INSTANCE/ServerName)[1]', 'sysname')

               ,@Message.value('(/EVENT_INSTANCE/PostTime)[1]', 'datetime')

               ,@Message.value('(/EVENT_INSTANCE/SPID)[1]', 'int')

               ,@Message.value('(/EVENT_INSTANCE/TextData)[1]', 'nvarchar(500)')

               ,@Message.value('(/EVENTr_INSTANCE/DatabaseID)[1]', 'int')

               ,@Message.value('(/EVENT_INSTANCE/TransactionsID)[1]', 'int')

               ,@Message.value('(/EVENT_INSTANCE/StartTime)[1]', 'datetime')

               ) 

 

               IF @Message.value('(/EVENT_INSTANCE/State)[1]', 'int')  IN (7,8)

               BEGIN

               SET @SQL = 'USE MASTER  '

               SELECT @SQL = @SQL + 'ALTER DATABASE '+db_name(database_id)

               +' SET PARTNER FAILOVER; '

               FROM sys.database_mirroring WHERE mirroring_state=4 and mirroring_role = 1

                       --SELECT @SQL

                       exec (@sql)

               END

              

               IF @Message.value('(/EVENT_INSTANCE/State)[1]', 'int')  IN (11) -- agent disable

               BEGIN

                      

               SET @SQL = 'USE MSDB '

               SELECT @SQL = @SQL + 'exec sp_update_job @job_id = '''+cast(job_id as varchar(100))+''', @enabled = 0;' 

               FROM msdb.dbo.sysjobs

               where name like '[[mirroring%' ESCAPE '['

               --SELECT @SQL

               exec (@sql)

               END

              

               IF @Message.value('(/EVENT_INSTANCE/State)[1]', 'int')  IN (13) -- agent enable

               BEGIN

                       --DECLARE @SQL VARCHAR(1000)

               SET @SQL = 'USE MSDB '

               SELECT @SQL = @SQL + 'exec sp_update_job @job_id = '''+cast(job_id as varchar(100))+''', @enabled = 1;' 

               FROM msdb.dbo.sysjobs

               where name like '[[mirroring%' ESCAPE '['

                                                            

               --SELECT @SQL

               exec (@sql)

        END

END

END

GO

GO

 

/* Create Queue */

    ALTER Queue DBMirrorQueue

        With Status = On,

        Retention = Off,

        Activation (

        Procedure_Name = dbo.Failover_SQLTAG,

            Max_Queue_Readers = 1,

            Execute As Self)

GO

/* Create Service */

    Create Service DBMirrorService

        On Queue DBMirrorQueue ([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]);

GO

/* Create Route*/

    Create Route DBMirrorRoute

        With Service_Name = 'DBMirrorService',

        Address = 'Local';

GO

/* Create Event */

    Create Event Notification DBMirrorStateChange

        On Server

        For DATABASE_MIRRORING_STATE_CHANGE

        To Service 'DBMirrorService', 'current database';

 

[예제실습 소스 코드]

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

 

using System.Data.SqlClient;

 

namespace MirrorTest

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

 

        SqlConnection myConn;

        SqlCommand myCmd;

        SqlDataReader myReader;

 

        private string conn = "Server=First2008r2; Failover Partner=Second2008r2; Database=MirrorTest; user=sa; password=패스워드";

        private string StrMsg = "";

       

       

        private void btn_Start_Click(object sender, EventArgs e)

        {

            this.myConn = new SqlConnection();

            this.myConn.ConnectionString = conn;

           

            this.myCmd = new SqlCommand();

            this.myCmd.CommandType = System.Data.CommandType.Text;

            this.myCmd.Connection = myConn;

 

            myConn.Open();

            myCmd.CommandText = this.txt_Query.Text;

            myCmd.ExecuteNonQuery();

 

            this.myReader = myCmd.ExecuteReader();

 

            this.myReader.Read();

 

            this.txt_Result.Text = myReader.GetSqlString(0).ToString(); ;

         

 

 

           

 

        }

 

        private void btn_Stop_Click(object sender, EventArgs e)

        {

            myConn.Close();

 

        }

    }

}

 

반응형

+ Recent posts