最近熬出病來了,都說IT行業傷不起,不說了,說回今天的正題
正題
上個月月底的時候因為要搬遷機房,需要將一個數據信息數據庫先搬到我們的機房,然后將客戶的數據庫
從原來的機房A搬到機房B,原來我們的數據信息庫(DataInfo)是放在機房A的,但是為了以后方便和防止信息泄露
就放到我們的托管機房,這里叫機房C
在搬遷機房的時候,盡量減少宕機時間,數據不能丟,搬遷機房真是一門學問。。。
雖然這麼忙,但我還是把寫文章的時間騰出來,把干貨分享給大家o(∩_∩)o
因為很多系統都在讀寫機房A的數據信息庫(DataInfo),我在上個月底的時候用備份文件初始化的方式搭建好復制把機房A的
機房A的數據信息庫(DataInfo)新插入的數據實時復制到機房C,先讓一部分系統能讀取機房C的數據信息庫(DataInfo),
等以后搬遷完所有系統之后再統一全部改連接地址
當然這篇文章不是講我這次的搬遷過程,在搭建好復制之后,由于我沒有設置訂閱庫的登錄用戶的權限為只讀,導致前幾天開發那邊
同時把新數據插入到訂閱庫,導致復制失敗(主鍵重復),分發命令積壓(大概26w+條命令未分發),然后一大堆后續工作。。。。。。
復制的坑其實挺多的,因為我們不可能24小時用肉眼盯著復制監視器,所以我們需要一些監控手段,
當遇到復制出錯的時候可以盡快知道然后進行修復
監控考慮的條件:
(1)單個點監控、多個點監控
(2)購買、自己開發
(3)比較實時、不是很實時
(4)數據庫服務器是否負載過高
我這里只考慮最簡單的一種:單個點的,不需要很實時,負載不高,如果服務器負載過高有可能連郵件也發不出了
然后就考慮到使用SQLSERVER自帶的數據庫郵件來發告警郵件
當然,如果需要同時滿足實時、多個點監控、成本足夠可以考慮購買成熟的解決方案
例如:微軟的System Center 2012 R2
又或者
自己公司開發監控程序,支持短信告警更加及時
需求
(1)當遇到復制出錯的時候發郵件到我的郵箱
(2)每天間隔一定時間發郵件告訴我當前復制的情況
測試環境:Windows7 64位 、發布庫SQL2005 SP4 、訂閱庫SQL2012 SP1、發布庫和訂閱庫都在我的筆記本上
復制所用登錄用戶:[ReplicationUser]
在進行實驗之前,需要測試一下smtp.163.com,端口為25,這個地址是否可以訪問。如果不通有可能是你機器防火墻的問題
還有可能需要檢查殺毒軟件有沒有屏蔽了端口,否則會發送郵件失敗
呈上完整腳本
--測試復制郵件告警USE [sss]GO--建立測試表 發布表一定要有主鍵CREATE TABLE Repl_Test ( ID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY , TestNAME VARCHAR(100) NULL , CreatDate DATETIME NULL )/*********************************************************************/--在發布庫和訂閱庫建立一個同名的登錄用戶,這兩個登錄用戶都對發布庫有訪問權限/*********************************************************************/--設置指定數據庫的復制選項--存儲過程說明http://msdn.microsoft.com/zh-tw/library/ms188769.aspxuse [sss]exec sp_replicationdboption @dbname = N'sss', @optname = N'publish', @value = N'true'GO/*********************************************************************/-- 添加事務發布--存儲過程說明http://www.yesky.com/imagesnew/software/tsql/ts_sp_repl_4s32.htmuse [sss]exec sp_addpublication @publication = N'testpub-sss', @description = N'來自發布服務器“JOE”的數據庫“sss”的事務發布。', @sync_method = N'concurrent', @retention = 0, --訂閱是否過期,0為永不過期@allow_push = N'true', --推送訂閱@allow_pull = N'true', --請求訂閱為@allow_anonymous = N'false', --false則表示不允許在該發布上使用匿名訂閱@repl_freq = N'continuous', --是復制頻率的類型。默認設置為 continuous。如果是 continuous,則表示發布服務器提供所有基于日志的事務輸出。如果是 Snapshot,則表示發布服務器只生成已調度同步事件@status = N'active', --指定發布數據是否可用@independent_agent = N'true', --指定是否有用于發布的單獨的分發代理程序@immediate_sync = N'false', --指定是否每次快照代理程序運行時都創建發布的同步文件@replicate_ddl = 1, --復制DDL語句@allow_initialize_from_backup = N'true' --是否允許備份初始化GO/*********************************************************************/--添加快照代理--存儲過程說明http://www.yesky.com/imagesnew/software/tsql/ts_sp_repl_7ecj.htmexec sp_addpublication_snapshot @publication = N'testpub-sss', @frequency_type = 1, @frequency_interval = 0, @frequency_relative_interval = 0, @frequency_recurrence_factor = 0, @frequency_subday = 0, @frequency_subday_interval = 0, @active_start_time_of_day = 0, @active_end_time_of_day = 235959, @active_start_date = 0, @active_end_date = 0, @job_login = null, @job_passWord = null, @publisher_security_mode = 1/*********************************************************************/-- 添加發布項目--存儲過程說明http://www.yesky.com/imagesnew/software/tsql/ts_sp_repl_27s5.htmuse [sss]exec sp_addarticle @publication = N'testpub-sss', @article = N'Repl_Test', @source_owner = N'dbo', @source_object = N'Repl_Test', --要發布的表@type = N'logbased', @pre_creation_cmd = N'drop', --當應用該項目的快照時,指定系統在訂閱服務器上檢測到同名的現有對象時所應采取的操作@schema_option = 0x000000000803509F, @identityrangemanagementoption = N'manual', --自增列范圍管理選項,manual為手動管理@destination_table = N'Repl_Test', --是目的(訂閱)表@destination_owner = N'dbo', @ins_cmd = N'CALL sp_MSins_dboRepl_Test', --是復制項目的插入時使用的復制命令類型@del_cmd = N'CALL sp_MSdel_dboRepl_Test', --是復制項目的刪除時使用的復制命令類型@upd_cmd = N'SCALL sp_MSupd_dboRepl_Test' --是復制項目的更新時使用的復制命令類型GO/*********************************************************************/--完整備份發布庫BACKUP DATABASE [sss] TO DISK ='C:/SSS_FULLBACKUP2014-4-13.BAK' /*********************************************************************/--在訂閱庫上還原數據庫USE [master]RESTORE DATABASE [sss] FROM DISK = N'D:/sss_fullbackup2014-4-6.bak' WITH FILE = 1, MOVE N'sss' TO N'D:/Program Files/Microsoft SQL Server/MSSQL11.SQL2012/MSSQL/DATA/sss.mdf', MOVE N'sss_log' TO N'D:/Program Files/Microsoft SQL Server/MSSQL11.SQL2012/MSSQL/DATA/sss_log.ldf', NOUNLOAD, REPLACE, STATS = 5GO/*********************************************************************/--在發布庫新建訂閱 使用推送訂閱use [sss]exec sp_addsubscription @publication = N'testpub-sss', @subscriber = N'JOE/SQL2012', @destination_db = N'sss', @subscription_type = N'Push', @sync_type = N'initialize with backup',@article = N'all', @update_mode = N'read only', @subscriber_type = 0,@backupdevicetype='disk',@backupdevicename='C:/SSS_FULLBACKUP2014-4-13.bak'--最后一次備份的備份文件(發布服務器上的存放位置)/*********************************************************************/--添加分發代理exec sp_addpushsubscription_agent @publication = N'testpub-sss', @subscriber = N'JOE/SQL2012', @subscriber_db = N'sss', @job_login = null, @job_password = null, @subscriber_security_mode = 0, @subscriber_login = N'ReplicationUser', @subscriber_password = N'ReplicationForUser', @frequency_type = 64, @frequency_interval = 0, @frequency_relative_interval = 0, @frequency_recurrence_factor = 0, @frequency_subday = 0,@frequency_subday_interval = 0,@active_start_time_of_day = 0, @active_end_time_of_day = 235959, @active_start_date = 20140408, @active_end_date = 99991231, @enabled_for_syncmgr = N'False', @dts_package_location = N'Distributor'GO/*********************************************************************/--腳本創建數據庫郵件--開啟數據庫郵件EXEC sp_configure 'show advanced options',1RECONFIGURE WITH OVERRIDEGOEXEC sp_configure 'database mail xps',1RECONFIGURE WITH OVERRIDE/*********************************************************************/--創建郵件帳戶信息EXEC msdb..sysmail_add_account_sp @ACCOUNT_NAME ='ReplicationErrorMailLog',--郵件帳戶名稱 @EMAIL_ADDRESS ='hiAT163.com',--發件人郵件地址 @DISPLAY_NAME ='系統管理員',--發件人姓名 @REPLYTO_ADDRESS =NULL, @DESCRIPTION = NULL, @MAILSERVER_NAME = 'SMTP.163.COM',--郵件服務器地址 @MAILSERVER_TYPE = 'SMTP',--郵件協議 @PORT =25,--郵件服務器端口 @USERNAME = 'hiAT163.com',--用戶名 @PASSWORD = 'xxx',--密碼 @USE_DEFAULT_CREDENTIALS =0, @ENABLE_SSL =0, @ACCOUNT_ID = NULLGO/*********************************************************************/--數據庫配置文件IF EXISTS(SELECT name FROM msdb..sysmail_profile WHERE name=N'ReplicationErrorProfileLog')BEGIN EXEC msdb..sysmail_delete_profile_sp @profile_name='ReplicationErrorProfileLog'ENDEXEC msdb..sysmail_add_profile_sp @profile_name = 'ReplicationErrorProfileLog',--profile名稱 @description = '數據庫郵件配置文件',--profile描述 @profile_id = nullGO/*********************************************************************/--用戶和郵件配置文件相關聯EXEC msdb..sysmail_add_profileaccount_sp @profile_name = 'ReplicationErrorProfileLog',--profile名稱 @account_name = 'ReplicationErrorMailLog',--account名稱 @sequence_number = 1--account 在profile 中順序GO/*********************************************************************/--發送簡單文本的郵件/*********************************************************************/--創建鏈接服務器--要開啟分發服務器上的Distributed Transaction Coordinator(MSDTC服務)USE [master]GOEXEC master.dbo.sp_addlinkedserver @server = N'JOE_DI
新聞熱點
疑難解答