/*--說(shuō)明:
?下面的代碼演示了如何利用日志還原功能,將主數(shù)據(jù)庫(kù)中的數(shù)據(jù)變化及時(shí)反饋到備用數(shù)據(jù)庫(kù)中
?備用數(shù)據(jù)庫(kù)的數(shù)據(jù)可以隨時(shí)用于查詢(xún),但不能被更新(備用數(shù)據(jù)庫(kù)只讀)。
--*/
--首先,創(chuàng)建一個(gè)演示用的數(shù)據(jù)庫(kù)(主數(shù)據(jù)庫(kù))
CREATE DATABASE Db_test
ON
( NAME = Db_test_DATA,
????? FILENAME = 'c:\Db_test.mdf' )
LOG ON
( NAME = Db_test_LOG,
?? FILENAME = 'c:\Db_test.ldf')
GO
--對(duì)數(shù)據(jù)庫(kù)進(jìn)行備份
BACKUP DATABASE Db_test TO DISK='c:\test_data.bak' WITH FORMAT
GO
--把數(shù)據(jù)庫(kù)還原成備用數(shù)據(jù)庫(kù)(演示主數(shù)據(jù)庫(kù)與這個(gè)備用數(shù)據(jù)庫(kù)之間的同步)
RESTORE DATABASE Db_test_bak FROM DISK='c:\test_data.bak'
WITH REPLACE,STANDBY='c:\db_test_bak.ldf'
?,MOVE 'Db_test_DATA' TO 'c:\Db_test_data.mdf'
?,MOVE 'Db_test_LOG' TO 'c:\Db_test_log.ldf'
GO
--啟動(dòng) SQL Agent 服務(wù)
EXEC master..xp_cmdshell 'net start sqlserveragent',no_output
GO
--創(chuàng)建主服務(wù)器數(shù)據(jù)訓(xùn)與備用服務(wù)器數(shù)據(jù)庫(kù)之間同步的作業(yè)
DECLARE? @jogid uniqueidentifier
EXEC msdb..sp_add_job
?@job_id = @jogid OUTPUT,
?@job_name = N'數(shù)據(jù)同步處理'
--創(chuàng)建同步處理步驟
EXEC msdb..sp_add_jobstep
?@job_id = @jogid,
?@step_name = N'數(shù)據(jù)同步',
?@subsystem = 'TSQL',
?@command = N'
--主數(shù)據(jù)庫(kù)中進(jìn)行日志備份
BACKUP LOG Db_test TO DISK=''c:\test_log.bak'' WITH FORMAT
--備用數(shù)據(jù)庫(kù)中還原主數(shù)據(jù)庫(kù)的日志備份(應(yīng)用主數(shù)據(jù)庫(kù)中的最新變化
--實(shí)際應(yīng)該時(shí)主數(shù)據(jù)庫(kù)備份與備用數(shù)據(jù)庫(kù)的還原作業(yè)應(yīng)該分別在主服務(wù)器和備用服務(wù)器上建立,并且備份文件應(yīng)該放在主服務(wù)器和備用都能訪問(wèn)的共享目錄中
RESTORE LOG Db_test_bak FROM DISK=''c:\test_log.bak'' WITH STANDBY=''c:\test_log.ldf''',
?@retry_attempts = 5,
?@retry_interval = 5
--創(chuàng)建調(diào)度(每分鐘執(zhí)行一次)
EXEC msdb..sp_add_jobschedule
?@job_id = @jogid,
?@name = N'時(shí)間安排',
?@freq_type=4,
?@freq_interval=1,
?@freq_subday_type=0x4,
?@freq_subday_interval=1,
?@freq_recurrence_factor=1
-- 添加目標(biāo)服務(wù)器
EXEC msdb.dbo.sp_add_jobserver
?@job_id = @jogid,
?@server_name = N'(local)'
GO
--通過(guò)上述處理,主數(shù)據(jù)庫(kù)與備用數(shù)據(jù)庫(kù)之間的同步關(guān)系已經(jīng)設(shè)置完成
--下面開(kāi)始測(cè)試是否能實(shí)現(xiàn)同步
--在主數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)測(cè)試用的表
CREATE TABLE Db_test.dbo.TB_test(ID int)
GO
--等待1分鐘30秒(由于同步的時(shí)間間隔設(shè)置為1分鐘,所以要延時(shí)才能看到效果)
WAITFOR DELAY '00:01:30'
GO
--查詢(xún)一下備用數(shù)據(jù)庫(kù),看看同步是否成功
SELECT * FROM Db_test_bak.dbo.TB_test
/*--結(jié)果:
ID?????????
-----------
(所影響的行數(shù)為 0 行)
--*/
--測(cè)試成功
GO
--最后刪除所有的測(cè)試
DROP DATABASE Db_test,Db_test_bak
EXEC msdb..sp_delete_job @job_name=N'數(shù)據(jù)同步處理'
GO
/*===========================================================*/
/*--服務(wù)器檔機(jī)處理說(shuō)明
?使用這種方式建立的數(shù)據(jù)庫(kù)同步,當(dāng)主數(shù)據(jù)庫(kù)不可用時(shí)(例如,主數(shù)據(jù)庫(kù)損壞或者停機(jī)檢修)
?可以使用以下兩種方法使備用數(shù)據(jù)庫(kù)可用。
--*/
--1. 如果主數(shù)據(jù)庫(kù)損壞,無(wú)法備份出最新的日志,可以直接使用下面的語(yǔ)句使備用數(shù)據(jù)庫(kù)可讀寫(xiě)(丟失最近一次日志還原后的所有數(shù)據(jù))。
RESTORE LOG Db_test_bak WITH RECOVERY
--2. 如果主數(shù)據(jù)庫(kù)可以備份出最新日志,則可以使用下面的語(yǔ)句。
--先備份主數(shù)據(jù)庫(kù)的最新的事務(wù)日志
BACKUP LOG Db_test TO DISK=''c:\test_log.bak'' WITH FORMAT
--再在備用數(shù)據(jù)庫(kù)中恢復(fù)最新的事務(wù)日志,并且使備用數(shù)據(jù)庫(kù)可讀寫(xiě)(升級(jí)為主數(shù)據(jù)庫(kù))
RESTORE LOG Db_test_bak FROM DISK='c:\test_log.bak'
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
