数据库异地备份还原小计
一线数据库: 10.1.8.100
报表数据库: 10.1.8.101
数据库名:crs_test
描述:
由于一线数据库压力过大,决定每天将一线库的BAK备份传输到报表数据库上还原,然后所有报表功能的服务均访问报表数据库,以减轻一线库压力。
备份:
一线库每周一凌晨做一次全备份,周二到周日每天凌晨做差异备份。
过程概述:
10.1.8.100上设置JOB完成以下事务:
1:每天凌晨3点备份。
2:备份后,将备从10.1.8.100份拷贝到10.1.8.101
xcopy t:\crs\full\* \\10.1.8.101\d$\DatabaseBAK\Full\ /c /d /e /h /k /r /y /g
3:然后将备份文件从临时文件夹转移到正式备份文件夹
move t:\crs\full\crs_test_backup_*.bak t:\crs\
10.1.8.101上设置JOB完成以下事务:
SET NOCOUNT ON;
--step 10: 判断数据库是否存在
DECLARE @intDBCount int;
SELECT @intDBCount=COUNT(*) FROM sysdatabases WHERE name='crs_test';
--step 11: 如果数据库存在,判断数据库上是否有session;
--step 12: 如果数据库不存在,则直接还原数据库(to step3)
--step 21: 如果session存在,杀掉所有session
--step 22: 如果session不存在,则直接还原数据库(to step3)
IF @intDBCount=1
BEGIN
DECLARE @strSQL VARCHAR(100);
DECLARE cursorSessions CURSOR FOR SELECT DISTINCT request_session_id FROM master.sys.dm_tran_locks
WHERE resource_type = 'DATABASE' AND resource_database_id = db_id(N'crs_test')
OPEN cursorSessions
DECLARE @intSPID INT FETCH NEXT FROM cursorSessions INTO @intSPID WHILE @@FETCH_STATUS =0
BEGIN SET @strSQL='Kill ' + CONVERT(VARCHAR(10),@intSPID) + ';'
EXEC (@strSQL) FETCH NEXT FROM cursorSessions INTO @intSPID
END
CLOSE cursorSessions
DEALLOCATE cursorSessions
END;
--step 3: 还原数据库全备份
RESTORE DATABASE crs_test
FROM DISK='D:\DatabaseBAK\Full\crs_test_backup_full.bak' WITH NORECOVERY,
MOVE 'CRS_TEST_Data' TO 'E:\DataBaseFolder\CRS_TEST_Data.mdf',
MOVE 'CRS_TEST_Log' TO 'D:\DataBaseLogFolder\CRS_TEST_Log.ldf',
REPLACE ;
--step 4: 判断是否存在差异备份文件,如果存在,则还原数据库差异备份
DECLARE @result INT;
EXEC xp_fileexist 'D:\DatabaseBAK\diff\crs_test_backup_diff.bak', @result OUTPUT;
IF @result=1
BEGIN
RESTORE DATABASE crs_test
FROM DISK='D:\DatabaseBAK\diff\crs_test_backup_diff.bak' WITH NORECOVERY,
MOVE 'CRS_TEST_Data' TO 'E:\DataBaseFolder\CRS_TEST_Data.mdf',
MOVE 'CRS_TEST_Log' TO 'D:\DataBaseLogFolder\CRS_TEST_Log.ldf',
REPLACE ;
END;
--step 5: 将数据库变成可用状态
RESTORE DATABASE crs_test WITH RECOVERY;