怎樣定時自動還原數據庫

<第一方案>

你的數據庫服務器-》企業管理器-》管理-》SQL Server 代理-》作業-》新建作業,按照要求填就可以了,在“步驟”的“命令”中填寫你要執行的存儲過程或語句,在“調度”裏面填寫什麼時間執行


EXEC sp_add_job @job_name = '作業名字'


EXEC sp_add_jobstep @job_name = '作業名字',
@step_name = '步驟名子',
@subsystem = 'TSQL',
@command = '恢復數據庫的代碼',
@retry_attempts = 5, --重試次數
@retry_interval = 5 --重試間隔

EXEC sp_add_jobschedule @job_name = '作業名字',
@name = '作業調度名字',
@freq_type = 4, -- 每天
@freq_interval = 26, --間隔
@active_start_time = 10000 --開始時間  
  

<第二方案>

use master
go
create proc killspid (@dbname varchar(20))
as
begin
declare @sql nvarchar(500),@temp varchar(1000)
declare @spid int
set @sql='declare getspid cursor for
select spid from sysprocesses where dbid=db_id('''+@dbname+''')'
exec (@sql)
open getspid
fetch next from getspid into @spid
while @@fetch_status<>-1
begin
set @temp='kill '+rtrim(@spid)
exec(@temp)
fetch next from getspid into @spid
end
close getspid
deallocate getspid
end

--用法
use master
exec killspid '數據庫名' ---斷開與數據庫的聯接(殺死各用戶與數據庫的聯接ID)

你的數據庫服務器-》企業管理器-》管理-》SQL Server 代理-》作業-》新建作業,按照要求填就可以了,在“步驟”的“命令”中填寫你要執行的存儲過程或語句,在“調度”裏面填寫什麼時間執行

代碼是先:
USE master

exec killspid '數據庫名'
再:
restore database 數據庫名 from disk='c:=\test.bak' with REPLACE 

<第三方案>

SQL code
/*--說明:
    下面的代碼演示瞭如何利用日誌還原功能,將主數據庫中的數據變化及時反饋到備用數據庫中
    備用數據庫的數據可以隨時用於查詢,但不能被更新(備用數據庫只讀)。
--轉:鄒建
--*/

--首先,創建一個演示用的數據庫(主數據庫)
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

--對數據庫進行備份
BACKUP DATABASE Db_test TO DISK='c:\test_data.bak' WITH FORMAT
GO

--把數據庫還原成備用數據庫(演示主數據庫與這個備用數據庫之間的同步)
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

--啓動 SQL Agent 服務
EXEC master..xp_cmdshell 'net start sqlserveragent',no_output
GO

--創建主服務器數據訓與備用服務器數據庫之間同步的作業
DECLARE  @jogid uniqueidentifier
EXEC msdb..sp_add_job
    @job_id = @jogid OUTPUT,
    @job_name = N'數據同步處理'

--創建同步處理步驟
EXEC msdb..sp_add_jobstep
    @job_id = @jogid,
    @step_name = N'數據同步',
    @subsystem = 'TSQL',
    @command = N'
--主數據庫中進行日誌備份
BACKUP LOG Db_test TO DISK=''c:\test_log.bak'' WITH FORMAT

--備用數據庫中還原主數據庫的日誌備份(應用主數據庫中的最新變化
--實際應該時主數據庫備份與備用數據庫的還原作業應該分別在主服務器和備用服務器上建立,並且備份文件應該放在主服務器和備用都能訪問的共享目錄中
RESTORE LOG Db_test_bak FROM DISK=''c:\test_log.bak'' WITH STANDBY=''c:\test_log.ldf''',
    @retry_attempts = 5,
    @retry_interval = 5

--創建調度(每分鐘執行一次)
EXEC msdb..sp_add_jobschedule
    @job_id = @jogid,
    @name = N'時間安排',
    @freq_type=4,
    @freq_interval=1,
    @freq_subday_type=0x4,
    @freq_subday_interval=1,
    @freq_recurrence_factor=1

-- 添加目標服務器
EXEC msdb.dbo.sp_add_jobserver
    @job_id = @jogid,
    @server_name = N'(local)'
GO

--通過上述處理,主數據庫與備用數據庫之間的同步關係已經設置完成
--下面開始測試是否能實現同步

--在主數據庫中創建一個測試用的表
CREATE TABLE Db_test.dbo.TB_test(ID int)
GO

--等待1分鐘30秒(由於同步的時間間隔設置爲1分鐘,所以要延時才能看到效果)
WAITFOR DELAY '00:01:30'
GO

--查詢一下備用數據庫,看看同步是否成功
SELECT * FROM Db_test_bak.dbo.TB_test

/*--結果:
ID         
-----------

(所影響的行數爲 0 行)
--*/

--測試成功
GO

--最後刪除所有的測試
DROP DATABASE Db_test,Db_test_bak
EXEC msdb..sp_delete_job @job_name=N'數據同步處理'
GO

/*===========================================================*/

/*--服務器檔機處理說明
    使用這種方式建立的數據庫同步,當主數據庫不可用時(例如,主數據庫損壞或者停機檢修)
    可以使用以下兩種方法使備用數據庫可用。
--*/

--1. 如果主數據庫損壞,無法備份出最新的日誌,可以直接使用下面的語句使備用數據庫可讀寫(丟失最近一次日誌還原後的所有數據)。
RESTORE LOG Db_test_bak WITH RECOVERY

--2. 如果主數據庫可以備份出最新日誌,則可以使用下面的語句。
--先備份主數據庫的最新的事務日誌
BACKUP LOG Db_test TO DISK=''c:\test_log.bak'' WITH FORMAT
--再在備用數據庫中恢復最新的事務日誌,並且使備用數據庫可讀寫(升級爲主數據庫)
RESTORE LOG Db_test_bak FROM DISK='c:\test_log.bak'定時備份數據庫可採用“數據庫維護計劃”來實現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章