一.备份数据库
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多条记录
sqlserver备份表语句
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操作
两个线程开始执行的瞬间,有两个作用域,如果两个作用域存在交集,则后来的线程等待。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。