--创建测试数据库 CREATE DATABASE Db GO --对数据库进行备份 BACKUP DATABASE Db TO DISK='c:\db.bak' WITH FORMAT GO --创建测试表 CREATE TABLE Db.dbo.TB_test(ID int) --延时1秒钟,再进行后面的操作(这是由于SQL Server的时间精度最大为百分之三秒,不延时的话,可能会导致还原到时间点的操作失败) WAITFOR DELAY '00:00:01' GO --假设我们现在误操作删除了 Db.dbo.TB_test 这个表 DROP TABLE Db.dbo.TB_test --保存删除表的时间 SELECT dt=GETDATE() INTO # GO --在删除操作后,发现不应该删除表 Db.dbo.TB_test --下面演示了如何恢复这个误删除的表 Db.dbo.TB_test --首先,备份事务日志(使用事务日志才能还原到指定的时间点) BACKUP LOG Db TO DISK='c:\db_log.bak' WITH FORMAT GO --接下来,我们要先还原完全备份(还原日志必须在还原完全备份的基础上进行) RESTORE DATABASE Db FROM DISK='c:\db.bak' WITH REPLACE,NORECOVERY GO --将事务日志还原到删除操作前(这里的时间对应上面的删除时间,并比删除时间略早 DECLARE @dt datetime SELECT @dt=DATEADD(ms,-20,dt) FROM # --获取比表被删除的时间略早的时间 RESTORE LOG Db FROM DISK='c:\db_log.bak' WITH RECOVERY,STOPAT=@dt GO --查询一下,看表是否恢复 SELECT * FROM Db.dbo.TB_test /*--结果: ID ----------- (所影响的行数为 0 行) --*/ --测试成功 GO --最后删除我们做的测试环境 DROP DATABASE Db DROP TABLE #
事务日志备份 ------------------------------------------------------------- (1)基于完全备份。 (2)为递增备份,即备份从上一次备份以来到备份时所写的事务日志。 (3)允许恢复到故障时刻或者一个强制时间点。 (4)恢复时,需要应用完全备份和完全备份后的每次日志备份。 ------------------------------------------------------------- backup database d3 to bak3 with init,name='d3_full' --日志备份,第一次备份时应做完全备份 create table b1(c1 int not null,c2 char(10) not null) backup log d3 to bak3 with insert b1 values(1,'a') backup log d3 to bak3 with insert b1 values(2,'b') backup log d3 to bak3 with insert b1 values(3,'c') backup log d3 to bak3 with restore headeronly from bak3 ---------------------------------------------------------------------- create table b1(c1 int not null,c2 char(10) not null) --Full+Log+Diff backup log d4 to bak4 with insert b1 values(1,'a') backup log d4 to bak4 with insert b1 values(2,'b') backup database d4 to bak4 with differential,name='d4_diff1' insert b1 values(3,'c') backup log d4 to bak4 with insert b1 values(4,'d') backup log d4 to bak4 with insert b1 values(5,'d') backup database d4 to bak4 with differential,name='d4_diff2' restore headeronly from bak4 ---------------------------------------------------------------------- 日志清除 ----------------------------------------- 1)如果日志空间被填满,数据库将不能记录修改。 2)数据库在做完全备份时日志被截断。 3)如果将'Trans log on checkpoint'选项设为TRUE,则结果为不保存日志,即没有日志记录,不建议使用。 4)with truncate_only和with no_log设置日志满时清除日志 5)with no_truncate则可以完整保存日志,不清除,即使在数据文件已经损坏情况下。主要用于数据库出问题后在恢复前使用。可以将数据还原到出故障的那一时刻。 ------------------------------------------- exec sp_dboption d3 exec sp_dboption sp_dboption 'd3','trunc. log on chkpt.','true' --设置自动清除数据库日志 sp_dboption 'd3','trunc. log on chkpt.','false' --将自动清除数据库日志的选项去除 ---------------------------------------------------------------------- backup log d4 with truncate_only --设置D4日志满时清除日志,并做清除记录 ---------------------------------------------------------------------- backup log d4 with no_log --设置D4日志满时清除日志,但不做清除记录 ---------------------------------------------------------------------- backup log d4 to bak4 with no_truncate--在D4数据库损坏时马上备份当前数据库日志(DEMO) -------- 使用no_truncate 完全+修改1+差异+修改2+差异+修改3+停止SQL,删除数据库数据文件+重启SQL backup log no_truncate 再还原,可还原到修改3 ----------------------------------------------------------------------
{
TO < backup_device > [ ,...n ]
[ WITH
[ BLOCKSIZE = { blocksize | @blocksize_variable } ]
[ [ , ] DESCRIPTION = { 'text' | @text_variable } ]
[ [ ,] EXPIREDATE = { date | @date_var }
| RETAINDAYS = { days | @days_var } ]
[ [ , ] PASSWORD = { password | @password_variable } ]
[ [ , ] FORMAT | NOFORMAT ]
[ [ , ] { INIT | NOINIT } ]
[ [ , ] MEDIADESCRIPTION = { 'text' | @text_variable } ]
[ [ , ] MEDIANAME = { media_name | @media_name_variable } ]
[ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ]
[ [ , ] NAME = { backup_set_name | @backup_set_name_var } ]
[ [ , ] NO_TRUNCATE ]
[ [ , ] { NORECOVERY | STANDBY = undo_file_name } ]
[ [ , ] { NOREWIND | REWIND } ]
[ [ , ] { NOSKIP | SKIP } ]
[ [ , ] { NOUNLOAD | UNLOAD } ]
[ [ , ] RESTART ]
[ [ , ] STATS [ = percentage ] ]
]
}
CREATE DATABASE Db
GO
--对数据库进行备份
BACKUP DATABASE Db TO DISK='c:\db.bak' WITH FORMAT
GO
--创建测试表
CREATE TABLE Db.dbo.TB_test(ID int)
--延时1秒钟,再进行后面的操作(这是由于SQL Server的时间精度最大为百分之三秒,不延时的话,可能会导致还原到时间点的操作失败)
WAITFOR DELAY '00:00:01'
GO
--假设我们现在误操作删除了 Db.dbo.TB_test 这个表
DROP TABLE Db.dbo.TB_test
--保存删除表的时间
SELECT dt=GETDATE() INTO #
GO
--在删除操作后,发现不应该删除表 Db.dbo.TB_test
--下面演示了如何恢复这个误删除的表 Db.dbo.TB_test
--首先,备份事务日志(使用事务日志才能还原到指定的时间点)
BACKUP LOG Db TO DISK='c:\db_log.bak' WITH FORMAT
GO
--接下来,我们要先还原完全备份(还原日志必须在还原完全备份的基础上进行)
RESTORE DATABASE Db FROM DISK='c:\db.bak' WITH REPLACE,NORECOVERY
GO
--将事务日志还原到删除操作前(这里的时间对应上面的删除时间,并比删除时间略早
DECLARE @dt datetime
SELECT @dt=DATEADD(ms,-20,dt) FROM # --获取比表被删除的时间略早的时间
RESTORE LOG Db FROM DISK='c:\db_log.bak' WITH RECOVERY,STOPAT=@dt
GO
--查询一下,看表是否恢复
SELECT * FROM Db.dbo.TB_test
/*--结果:
ID
-----------
(所影响的行数为 0 行)
--*/
--测试成功
GO
--最后删除我们做的测试环境
DROP DATABASE Db
DROP TABLE #
-------------------------------------------------------------
(1)基于完全备份。
(2)为递增备份,即备份从上一次备份以来到备份时所写的事务日志。
(3)允许恢复到故障时刻或者一个强制时间点。
(4)恢复时,需要应用完全备份和完全备份后的每次日志备份。
-------------------------------------------------------------
backup database d3 to bak3 with init,name='d3_full' --日志备份,第一次备份时应做完全备份
create table b1(c1 int not null,c2 char(10) not null)
backup log d3 to bak3 with
insert b1 values(1,'a')
backup log d3 to bak3 with
insert b1 values(2,'b')
backup log d3 to bak3 with
insert b1 values(3,'c')
backup log d3 to bak3 with
restore headeronly from bak3
----------------------------------------------------------------------
create table b1(c1 int not null,c2 char(10) not null) --Full+Log+Diff
backup log d4 to bak4 with
insert b1 values(1,'a')
backup log d4 to bak4 with
insert b1 values(2,'b')
backup database d4 to bak4 with differential,name='d4_diff1'
insert b1 values(3,'c')
backup log d4 to bak4 with
insert b1 values(4,'d')
backup log d4 to bak4 with
insert b1 values(5,'d')
backup database d4 to bak4 with differential,name='d4_diff2'
restore headeronly from bak4
----------------------------------------------------------------------
日志清除
-----------------------------------------
1)如果日志空间被填满,数据库将不能记录修改。
2)数据库在做完全备份时日志被截断。
3)如果将'Trans log on checkpoint'选项设为TRUE,则结果为不保存日志,即没有日志记录,不建议使用。
4)with truncate_only和with no_log设置日志满时清除日志
5)with no_truncate则可以完整保存日志,不清除,即使在数据文件已经损坏情况下。主要用于数据库出问题后在恢复前使用。可以将数据还原到出故障的那一时刻。
-------------------------------------------
exec sp_dboption d3
exec sp_dboption
sp_dboption 'd3','trunc. log on chkpt.','true' --设置自动清除数据库日志
sp_dboption 'd3','trunc. log on chkpt.','false' --将自动清除数据库日志的选项去除
----------------------------------------------------------------------
backup log d4 with truncate_only --设置D4日志满时清除日志,并做清除记录
----------------------------------------------------------------------
backup log d4 with no_log --设置D4日志满时清除日志,但不做清除记录
----------------------------------------------------------------------
backup log d4 to bak4 with no_truncate--在D4数据库损坏时马上备份当前数据库日志(DEMO)
--------
使用no_truncate
完全+修改1+差异+修改2+差异+修改3+停止SQL,删除数据库数据文件+重启SQL
backup log no_truncate
再还原,可还原到修改3
----------------------------------------------------------------------