sqlserver:数据库备份和恢复(含时间线)
环境:
window10 x64 专业版
sqlsever2014 x64
参考:
⼀、sqlserver存储⽂件类型
sqlserver中有两类⽂件:数据⽂件和事务⽇志⽂件。
默认情况下,我们新建数据库test后,会有test.mdf和test.ldf两个⽂件,它们分别存储数据和事务⽇志。
1.1 数据⽂件:
这⾥存储的就是现有的数据。⽐如:我们插⼊数据,然后将这个数据删除,那么数据⽂件⾥是没有这个数据的。
1.2 事务⽇志⽂件:
这⾥存储的是我们所有的历史操作。⽐如:我们插⼊数据,然后将这个数据删除,那么事务⽇志⽂件中存储了插⼊和删除的动作。
1.3 数据完整性
⼀个完整的数据库,必然是它的数据和事务⽇志在某⼀个时间点能对的上,并且事务⽇志能追溯到建库阶段。
我们恢复⼀个数据库,也就是要达到这个效果。
⼆、数据库的备份
2.1 三种备份⽅式
四级考试流程时间安排数据库备份的⽅式有如下三种,它们的概念如下:
完整备份
这种备份将数据⽂件和事务⽇志⽂件进⾏⼀起压缩,然后存放到了备份介质中(如:⽂件test.bak)。
当我们恢复的时候,可以根据这次的备份结果进⾏完整的恢复。
事务⽇志备份
这种⽇志备份是将上次事务⽇志备份或完整备份后,数据库⼜修改的操作备份到备份介质中(注意:仅备份事务⽇志,不备份数据)。
我们可以连续的进⾏事务⽇志备份,这样就形成了备份链,它们之间是后者依赖前者。所以当我们根据事务⽇志进⾏恢复的时候,必须提供完整的事务⽇志备份链并且这个备份链的开头必须是⼀个完整备份。
注意: 为了能进⾏事务⽇志备份,我们必须先进⾏完整备份。可以从下图中的提⽰中看的出来:
差异备份
这种备份记录的是从上次完整备份到当前的差异部分(注意:包含数据差异和⽇志差异,下⾯会有实验证明)。它和事务⽇志的备份除了在备份内容的不同之外,它们的参照点也不同。事务⽇志备份参照的是上次事务备份或上次完整备份,⽽差异备份仅参照上次完整备份。
注意: 为了能进⾏差异备份,我们必须先进⾏完整备份。可以从下图中的提⽰中看的出来:
2.2 关于备份和还原的操作记录
在上⾯讲事务⽇志备份和差异备份的时候,我们知道必须先进⾏完整备份,那么系统是怎么判断的呢?
其实,数据库服务器会将我们对服务器上的数据库进⾏的所有备份和还原操作都记录到系统数据库msdb中。服务器凭借这⾥⾯的记录,决定我们能不能进⾏事务⽇志备份和差异备份,并且决定我们备份的参照点。
dnf剑魂改版所以说:对于完整备份后的事务⽇志备份结果要可靠的存储起来,不能丢失,知道你进⾏了下⼀次完整备份。下⾯的sql语句是⽤来查询备份和还原操作历史的:
查看备份操作记录:
SELECT
bs.backup_set_id,
bs.database_name,
bs.backup_start_date,
高铁买票bs.backup_finish_date,
CAST(CAST(bs.backup_size/1000000AS INT)AS VARCHAR(14))+' '+'MB'AS[Size],
CAST(DATEDIFF(second, bs.backup_start_date,
bs.backup_finish_date)AS VARCHAR(4))+' '+'Seconds'[TimeTaken],
CASE bs.[type]工作检讨书大全
WHEN'D'THEN'Full Backup'
WHEN'I'THEN'Differential Backup'
WHEN'L'THEN'TLog Backup'
WHEN'F'THEN'File or filegroup'
WHEN'G'THEN'Differential file'
WHEN'P'THEN'Partial'
WHEN'Q'THEN'Differential Partial'
END AS BackupType,
bmf.physical_device_name,
CAST(bs.first_lsn AS VARCHAR(50))AS first_lsn,
CAST(bs.last_lsn AS VARCHAR(50))AS last_lsn,
bs.server_name,
FROM msdb.dbo.backupset bs
INNER JOIN msdb.dbo.backupmediafamily bmf
dia_set_id = dia_set_id
ORDER BY bs.server_name,bs.database_name,bs.backup_start_date;
GO
查看还原操作记录:
SELECT
rs.[restore_history_id],
rs.[restore_date],
rs.[destination_database_name],
bmf.physical_device_name,
rs.[user_name],
rs.[backup_set_id],
CASE rs.[restore_type]
WHEN'D'THEN'Database'
WHEN'I'THEN'Differential'
WHEN'L'THEN'Log'
WHEN'F'THEN'File'
WHEN'G'THEN'Filegroup'
WHEN'V'THEN'Verifyonly'
END AS RestoreType,
rs.[replace],
rs.[recovery],
数据库恢复rs.[restart],
rs.[stop_at],
rs.[device_count],
rs.[stop_at_mark_name],
rs.[stop_before]
FROM[msdb].[dbo].[restorehistory] rs
INNER JOIN[msdb].[dbo].[backupset] bs
--on rs.backup_set_id = bs.media_set_id
ON rs.backup_set_id = bs.backup_set_id INNER JOIN msdb.dbo.backupmediafamily bmf dia_set_id = dia_set_id
GO
⽰例如下:
2.3 关于备份介质和备份集
备份介质
其实就是备份后存储到的位置,⽐如:test2.bak⽂件。
备份集
表⽰的是⼀次备份。结合备份介质去理解就是:我们可以将多次备份都指定到相同的备份介质中(⽐如:test2.bak),这样
test2.bak⽂件中就有多次备份的数据。那么,对于test2.bak中每⼀次的备份,我们都称之为“备份集”。
2.4 关于还原
从操作的对象上来划分,有以下两类:
在现有的数据库上进⾏恢复
⽐如说,服务器上已经有test2数据库了,我们想根据另外⼀个test2.bak备份⽂件对这个test2数据库进⾏恢复。因为这个还牵扯到结尾⽇志的概念,所以先不深⼊。
在服务器上以新建的⽅式进⾏恢复(下⾯的实验,如⽆说明,均使⽤这种⽅式)
这个和上⾯的相反,服务器上原来没有test2数据库,我们根据test2.bak⽂件可以直接以恢复的⽅式建⼀个test2数据库。
三、实验⼀:证明差异备份存储的是数据差异和事务⽇志差异
新建数据库test2,⽇志增量改为1M,其他默认:
⽴刻做完整备份:
数据库中查看备份记录:
什么都不做,连续做两个差异备份(第⼀个备份集:test2-差异1,第⼆个备份集:test2-差异2),观察⽂件⼤⼩变化:
买东西货到付款可以看到,尽管两次备份时并没有差异,备份⽂件依然增长,第⼀次增长了397k⼤⼩,第⼆次增长了469k,其实这很好理解:记录这次备份的信息也需要存储空间吧。
现在,我们⽤程序,重复的插⼊删除数据:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论