- 论坛徽章:
- 0
|
http://xhsjs.com/NET/ZhiShi/100001038.shtml
http://bluedest.iteye.com/blog/830511
http://topic.csdn.net/u/20100512 ... dfdfa118.html?59343
尾日志备份
对于将数据库恢复到即时点,很好理解也很好操作。下面我们重点来研究将数据库恢复到故障点时必不可少的操作,即尾日志备份。
但是,需要注意的是,如果在Management Studio中按照默认设置是永远无法完成尾日志备份的。
14.2.1 图形化尾日志备份操作
图14-7所示为选择日志备份的数据库的【选项】选项卡。默认情况下选择的是【截断事务日志】单选按钮,这样将永远无法备份尾日志。
提示:要完成尾日志备份,需要在图14-7中选择“备份日志尾部,并使数据库处于还原状态”选项。
图14-7 【选项】选项卡
14.2.2 用Backup Log语句完成尾日志备份
也可以直接执行Backup Log语句来完成日志备份。下面介绍该语句的语法形式。
1.语法形式
Backup Log语句的语法形式如下。
BACKUP LOG { database_name | @database_name_var }
{
TO <backup_device> [ ,...n ]
[ [ MIRROR TO <backup_device> [ ,...n ] ] [ ...next-mirror ] ]
[ WITH
[ BLOCKSIZE = { blocksize | @blocksize_variable } ]
[ [ , ] { CHECKSUM | NO_CHECKSUM } ]
[ [ , ] { STOP_ON_ERROR | CONTINUE_AFTER_ERROR } ]
[ [ , ] DESCRIPTION = { 'text' | @text_variable } ]
[ [ , ] EXPIREDATE = { date | @date_var }
| RETAINDAYS = { days | @days_var } ]
[ [ , ] PASSWORD = { password | @password_variable } ]
[ [ , ] { FORMAT | NOFORMAT } ]
[ [ , ] { INIT | NOINIT } ]
[ [ , ] { NOSKIP | SKIP } ]
[ [ , ] 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 } ]
[ [ , ] { NOUNLOAD | UNLOAD } ]
[ [ , ] RESTART ]
[ [ , ] STATS [ = percentage ] ]
[ [ , ] COPY_ONLY ]
]
}
2.主要参数
对于其他参数读者可以参阅联机丛书的有关说明。与备份尾日志有关的主要参数如下。
— NO_TRUNCATE:只与BACKUP LOG一起使用。指定不截断日志,并使数据库引擎尝试执行备份,而不考虑数据库的状态。该选项允许在数据库损坏时备份日志。
— BACKUP LOG的NO_TRUNCATE选项相当于同时指定COPY_ONLY和CONTINUE_AFTER_ERROR。
— NO_LOG | TRUNCATE_ONLY:通过放弃活动日志以外的所有日志,无须备份复制日志即可删除不活动的日志部分,并截断日志。该选项会释放空间。因为并不保存日志备份,所以没有必要指定备份设备。NO_LOG和TRUNCATE_ONLY是同义的。使用NO_LOG或TRUNCATE_ONLY截断日志后,记录在日志中的更改不可恢复。为了进行恢复,请立即执行BACKUP DATABASE以执行完整备份或完整差异备份。
3.使用方法
要备份尾日志,主要使用Truncate_Only参数就可以。本书的实例代码如下。
BACKUP LOG [db_test] TO DISK = N'C:\test2.bak'
WITH NO_TRUNCATE ,
NOFORMAT,
NOINIT,
NAME = N'db_test-事务日志 备份',
SKIP,
NOREWIND,
NOUNLOAD,
NORECOVERY ,
STATS = 10
GO
来源:http://book.csdn.net/bookfiles/473/10047316591.shtml
SQLServer备份,还原,尾日志备份 方法
ASP.NET编程爱好QQ群:44074249
作者:管理员 发布时间:2011-2-14 阅读(61)
从日志回复数据库 :自己一步一步按照说明试着看
--创建测试数据库
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 #
sqlserver日志的备份还原笔记
文章分类:数据库
一.备份数据库
BACKUP DATABASE test to disk ='D:/cbmBack/previousDay.bak' with init,name='full backup'
备注:with init表示指针移动文件头部去写。
二.备份日志
BACKUP LOG test to disk ='D:/cbmBack/log.bak' with init
备注:在备份周期开始的时候,要加上with init,表示文件的写指针移动文件头部。
在备份周期内部,就不要加with init了,表示备份的日志附加到原文件之后。
三.查看备份文件
restore headeronly from disk='D:/cbmBack/log.bak'
restore headeronly from disk='D:/cbmBack/previousDay.bak'
四.备份尾日志
BACKUP LOG test TO DISK = N'D:/cbmBack/log.bak'
WITH NO_TRUNCATE ,
NOFORMAT,
NOINIT,
NAME = N'db_test-事务日志备份',
SKIP,
NOREWIND,
NOUNLOAD,
NORECOVERY ,
STATS = 10
备注:如果数所据库的备份程序还不到10分钟间隔,而没有备份日志,这个时候要手动备份日志,就用以上语句。
这里有个疑问,就是备份尾日志和备份普通时候的日志有什么不一样?我测试了没什么不同,这可能是因为测试的时候,数据库是好着的,如果遇到数据库已经崩溃了,可能就要用以上的语句才能把尾日志备出来。
五.恢复数据库
1.首先恢复完整备份
RESTORE DATABASE test FROM DISK = N'D:/cbmBack/previousDay.bak'
WITH FILE = 1,
NORECOVERY,
NOUNLOAD,
REPLACE,
STATS = 10
2.恢复非尾日志
RESTORE LOG test FROM DISK = N'D:/cbmBack/log.bak'
WITH FILE =1,
NORECOVERY,
NOUNLOAD,
STATS = 10
3.恢复尾日志
RESTORE LOG test FROM DISK = N'D:/cbmBack/log.bak'
WITH FILE =2,
RECOVERY,
NOUNLOAD,
STATS = 10
备注:尾日志恢复的时候,要用RECOVERY
利用bak恢复数据库,强制还原(REPLACE)
STATS = 10 每完成10%显示一条记录
DBTest和DBTest_log是上面g:\back.Bak里的逻辑文件
*/
USE master
RESTORE DATABASE DB
FROM DISK = 'g:\back.Bak'
WITH MOVE 'DBTest' TO 'E:\Program Files\Microsoft SQL Server2005\Data\DB.mdf',
MOVE 'DBTest_log' TO 'E:\Program Files\Microsoft SQL Server2005\Data\DB_log.ldf',
STATS = 10, REPLACE
GO
++++++++++++++++++++++++++++++++
/**//*
备份数据DB 到.bak文件。然后利用此bak文件恢复一个新的数据库DBTest。
*/
USE master
BACKUP DATABASE DB
TO DISK = 'g:\DBBack0930.bak'
RESTORE FILELISTONLY
FROM DISK = 'g:\DBBack0930.bak'
RESTORE DATABASE DBTest
FROM DISK = 'g:\DBBack0930.bak'
WITH MOVE 'DBTest' TO 'E:\Program Files\Microsoft SQL Server2005\Data\DBTest.mdf',
MOVE 'DBTest_log' TO 'E:\Program Files\Microsoft SQL Server2005\Data\DBTest_log.ldf'
GO
一.线程2select
线程1
线程2
条件
结果
Insert多条记录
select
TRANSACTION_READ_UNCOMMITTED
线程2无阻塞,直接取到了线程1中的实时操作,虽然这些操作未提交
Insert多条记录
select
TRANSACTION_READ_COMMITTED
线程2阻塞,直到线程1提交事务,才取到了线程1中的所有操作结果
Insert多条记录
select
TRANSACTION_SERIALIZABLE
内容同
TRANSACTION_READ_UNCOMMITTED
如果在事务中应用了select 的串行化事务,则其他事务要等这个select结束
二.线程2update
线程1
线程2
条件
结果
Update某条记录
Update线程1相同的记录
任何条件
线程2阻塞,直到线程1提交事务,接着线程2才执行自己的update操作
Update某条记录
Update线程1不相同的记录
任何条件
线程2无阻塞,直接提交自己的事务
三.线程2insert
线程1
线程2
条件
结果
Delete所有记录
Insert一条记录
非TRANSACTION_SERIALIZABLE
线程2无阻塞,直接插入并提交,线程1只删除它那个瞬间可以删除的数据
Delete所有记录
Insert一条记录
TRANSACTION_SERIALIZABLE
线程2阻塞,直到线程1结束,然后线程2才插入记录。最后表中看到的记录和上面一项的结果一样
四.线程2delete
线程1
线程2
条件
结果
Insert一条记录
Delete 所有记录
任何条件
线程2阻塞,直到线程1提交事务,接着线程2才执行自己的delete操作
Insert一条记录
Delete 某条记录
任何条件
线程2无阻塞,直接删除并提交
Connection 设置事务级别,是告诉别人我的事务有多高.
1.读已提交
如果另一个事务对本事务的读有影响,并且另一个事务没有结束,则本事务的读操作等另一事务结束
2.update ,delete
在update一条记录时,如果另一个事务也在update此记录(包括update 表 set field=value 无where条件),则本事务等另一个事务结束
3.insert操作
两个线程开始执行的瞬间,有两个作用域,如果两个作用域存在交集,则后来的线程等待。 |
|