
正文
sqlserver数据库日志备份 sql数据库每日备份
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
SQLserver数据库备份后,怎么查询备份的日志
SQL Server的备份有三种形式:
一是全备份(full backup)
这个备份里面包含的内容是值得商榷的,我们知道数据库有两种文件,数据文件与日志文件,全备份是不是将所有的数据文件与日志文件打包,备份成一个文件? 那么还原的时候是不是需要做恢复,将备份过后发生的事务接着备份时间点重新执行一边? 上面的问题细想都是肯定的。全备份做的事情,就是将所有的缓存先flush到磁盘上,不管在进行的事务是否提交,这样保证了日志的连续性,数据与日志的一致性,如果事务没提交 ,在日志文件上的标记是active的,这段日志也就不会被清空,下次恢复的时候,就从这段日志开始,接着使用新的日志执行。因此 全备份之前肯定会执行一次checkpoint;、
二是差异备份(differential backup)
这个备份会不会也重复full backup的过程,先执行checkpoint,然后再将上一次备份之后,发生数据页变化的这些数据页都备份起来,这部分备份就不会有日志。但是和全备份一样,备份的容积体量比较大,差异备份备份的是数据页,不管这一页是不是只有一条数据更改了,还是全部更改了;
三是日志备份(transaction log backup)
日志备份中需要注意的就是对未提交事务的理解,没有提交的事务其实还是占用日志文件的VLF,shrink并不能回收日志空间;提交事务的日志如被备份之后,就会将日志VLF打上unactive或者truncated标记,这个时候执行shrink就可以回收这部分日志VLF了。日志备份体量小,比较适合频率高的执行,比如每5分钟执行一次。
全备份:
全备份用到的命令,涉及到两方面的参数,一是指定相应的备份设备,可以是磁盘,也可以是磁带;另一方面 就是备份可用的选项,比如是否压缩,是否加密。
BACKUP DATABASE database
TO backup_device [ ,...n ]
[ WITH with_options [ ,...o ] ] ;
备份设备很讲究,可以事先定义好逻辑设备,也可以直接指定物理设备。磁带备份机倒是没见过,但是常规的磁盘备份还是可以讨论一下的:
我们可以将一个本机带路径的物理文件名指定为备份设备:
backup database lenistest
to disk = 'E:\Data_BU\lenistest5__backup.bck';
也可以将网络上的一个带路径的物理文件名指定为备份设备:
backup database AdventureWorks2012
to disk = '\\BackupSystem\BackupDisk1\AW_backups\AdventureWorksData.Bak';
这里有个有趣的现象,如果我们在全备份之后 ,没有备份好日志,这个时候故障突然发生了,我们需要作恢复,但是恢复的时候因为会重写日志,这样就会丢失数据,如果不采取额外地措施,系统是会报错的:
restore database lenistest
from disk = 'E:\Data_BU\lenistest5__backup.bck'
Msg 3159, Level 16, State 1, Line 6
The tail of the log for the database “lenistest” has not been backed
up. Use BACKUP LOG WITH NORECOVERY to backup the log if it contains
work you do not want to lose. Use the WITH REPLACE or WITH STOPAT
clause of the RESTORE statement to just overwrite the contents of the
log.
Msg 3013, Level 16, State 1, Line 6
RESTORE DATABASE is terminating abnormally.
所以如果对丢失的数据不关心或者认为不会丢失数据,可以采用with replace选项来重写原来的日志文件进行强制恢复。
restore database lenistest
from disk = 'E:\Data_BU\lenistest5__backup.bck'
with replace;
差异备份:
差异备份相对全备份,优越的地方在于备份数据量少,但是有趣的是差异备份不能独立存在(日志备份也不能独立存在,他俩只能依附于全备份,也就是说在执行差异备份和日志备份的时候,必须先有一个全备份做好在那里), 差异备份必须以一个全备份做基准,在这基础之上再判断哪些数据页是有过更新的,这些更新的数据页计算出来并被备份起来。
use master;
go
backup database lenistest
to disk = 'E:\Data_BU\lenistest5__backup.bck';
backup database lenistest
to disk = 'E:\Data_BU\lenistest5__backup.bck'
with differential;
假如我们没有事先做好全备份,就直接作差异备份了,那么这是不成功的:
backup database lenistest
to disk = 'E:\Data_BU\lenistest5__backup2.bck'
with differential;
Msg 3035, Level 16, State 1, Line 11
Cannot perform a differential backup for database “lenistest”, because
a current database backup does not exist. Perform a full database
backup by reissuing BACKUP DATABASE, omitting the WITH DIFFERENTIAL
option.
Msg 3013, Level 16, State 1, Line 11
BACKUP DATABASE is terminating abnormally.
日志备份:
日志备份相对差异备份来说,体量更小,同样它也需要全备份事先存在:
backup log lenistestto disk = 'E:\Data_BU\lenistest5__backup.bck';
假如我没有事先做好全备份,我们看看直接备份日志会出现什么结果:
Msg 4214, Level 16, State 1, Line 15
BACKUP LOG cannot be performed because there is no current database
backup.
Msg 3013, Level 16, State 1, Line 15
BACKUP LOG is terminating abnormally.
提示先做全备份!
备份我们都讨论完了,接下来我们看看还原。还原通常有两个步骤,一是还原,二是恢复。当然我们也可以直接还原不恢复,但是可能会丢失数据,除非全备份之后 ,没有任何操作。假设我们一天一个全备份,每15分钟做一个差异备份 ,每5分钟做一个日志备份,我们该如何还原我们的数据库呢?
通常我们首先要知道我们的备份文件名或者物理路径,这个地方涉及到很多术语很难理解,比如说backup device, backupset, backup media, media set ,media family.
MSDN上有一个解释,先看这个脚本:
backup database AdventureWorks2012
to tape = '\\.\tape0'
, tape = '\\.\tape1'
, tape = '\\.\tape2'
with format
, medianame = 'MyAdvWorks_MediaSet_1';
解释说到,这个备份操作产生了一个 media set, 这个media set就是命名为MyAdvWorks_MediaSet_1, 这个media set还有个media header, media header一旦生成,就可以往里面写入备份文件了。这段脚本也同时生成了一个横跨三个tape的备份文件, 他们统称为backup set.
当我们指定3个backup device作为backup set(备份集)并且执行第一次全备份的时候,接下来所有的备份都需要同时指定这3个backup device作为backup set:
backup database lenistest
to disk = 'E:\Data_BU\lenistest5__backup01.bck'
, disk = 'E:\Data_BU\lenistest5__backup02.bck'
, disk = 'E:\Data_BU\lenistest5__backup03.bck'
with format
, medianame = 'lenistestbackupset';
backup database lenistest
to disk = 'E:\Data_BU\lenistest5__backup01.bck'
, disk = 'E:\Data_BU\lenistest5__backup03.bck'
with noinit
, differential
, medianame = 'lenistestbackupset';
Msg 3231, Level 16, State 1, Line 10
The media loaded on “E:\Data_BU\lenistest5__backup01.bck” is formatted
to support 3 media families, but 2 media families are expected
according to the backup device specification.
Msg 3013, Level 16, State 1, Line 10
BACKUP DATABASE is terminating abnormally.
上面我先作了一次全备份,指定了三个backup device作为一份backup set, 接下来作差异备份的时候,我只指定了其中两个backup device作为backup set, 操作失败,提示就是少了一个backup device.
backup database lenistest
to disk = 'E:\Data_BU\lenistest5__backup01.bck'
, disk = 'E:\Data_BU\lenistest5__backup03.bck'
, disk = 'E:\Data_BU\lenistest5__backup02.bck'
with noinit
, differential
, medianame = 'lenistestbackupset';
这次我们指定了同样个数的backup device,但backup device的顺序颠倒了一下,操作成功。
到目前为止,我们的脚本已经新建了 1 个media set,名为 lenistestbackupset , 2 个backup set, 第一个backup set是全备份的backup set,另外一个backup set是差异备份。所以每一次备份都会产生一个backup set. Media set产生的时间则是第一次给数据库作全备份的时候。
这个时候我们需要恢复数据库,那么第一步就是要先还原全备份,但是先不恢复,等全备份还原过后,再用差异备份做恢复:
restore database lenistest
from disk = 'E:\Data_BU\lenistest5__backup01.bck'
, disk = 'E:\Data_BU\lenistest5__backup03.bck'
, disk = 'E:\Data_BU\lenistest5__backup02.bck'
with file = 1
, replace
, norecovery;
restore database lenistest
from disk = 'E:\Data_BU\lenistest5__backup01.bck'
, disk = 'E:\Data_BU\lenistest5__backup03.bck'
, disk = 'E:\Data_BU\lenistest5__backup02.bck'
with file = 2
, recovery;
这里一定是用replace来重写日志。
select mf.media_set_id
, isnull(ms.name, 'no media name') as media_name
, mf.physical_device_name
, mf.family_sequence_number
, mf.media_family_id
, bs.database_name
, bs.backup_start_date
, bs.backup_finish_date
from backupmediafamily mf
inner join backupset bs
on mf.media_set_id = bs.media_set_id
left join backupmediaset ms
on bs.media_set_id = ms.media_set_id
where bs.database_name = 'lenistest';
上面的脚本可以抓出来这些media family, media set, backup set的信息,如果像上面的例子一样, 我们用3个backup device来承载备份,那么这3个backup device组成了一个media family, 按照family_sequence_number来编排,1,2,3。
下面实现一个备份到恢复的全过程例子,分别在full backup, differential backup, log backup之前各出入同样的数据,看看是不是还原的时候,能正确还原过来:
insert into dbo.dataloading
(
object_id
, object_name
)
select object_id
, name as object_name
from sys.objects;
backup database lenistest
to disk = 'E:\Data_BU\lenistest5__backup01.bck'
, disk = 'E:\Data_BU\lenistest5__backup02.bck'
, disk = 'E:\Data_BU\lenistest5__backup03.bck'
with format
, medianame = 'lenistestbackupset';
insert into dbo.dataloading
(
object_id
, object_name
)
select object_id
, name as object_name
from sys.objects;
backup database lenistest
to disk = 'E:\Data_BU\lenistest5__backup01.bck'
, disk = 'E:\Data_BU\lenistest5__backup03.bck'
, disk = 'E:\Data_BU\lenistest5__backup02.bck'
with noinit
, differential
, medianame = 'lenistestbackupset';
insert into dbo.dataloading
(
object_id
, object_name
)
select object_id
, name as object_name
from sys.objects;
backup log lenistest
to disk = 'E:\Data_BU\lenistest5__backup01.bck'
, disk = 'E:\Data_BU\lenistest5__backup03.bck'
, disk = 'E:\Data_BU\lenistest5__backup02.bck'
with noinit
, medianame = 'lenistestbackupset';
接着我们做还原与恢复:
restore database lenistest
from disk = 'E:\Data_BU\lenistest5__backup01.bck', disk = 'E:\Data_BU\lenistest5__backup03.bck', disk = 'E:\Data_BU\lenistest5__backup02.bck'
with file = 1
, replace
, norecovery;
restore database lenistest
from disk = 'E:\Data_BU\lenistest5__backup01.bck', disk = 'E:\Data_BU\lenistest5__backup03.bck', disk = 'E:\Data_BU\lenistest5__backup02.bck'
with file = 2
, norecovery;
restore database lenistest
from disk = 'E:\Data_BU\lenistest5__backup01.bck', disk = 'E:\Data_BU\lenistest5__backup03.bck', disk = 'E:\Data_BU\lenistest5__backup02.bck'
with file = 3
, recovery;
这里的file选项就是backup set选项,表示第一个备份集,第二个备份集,第三个备份集。如果想还原到最新的故障发生时间点,前面的restore都不能recovery,只有在最后的时候才能作recovery.
如果我们只想恢复全备份的数据,只要执行recovery就可以了,但是数据肯定是少了:
restore database lenistest
from disk = 'E:\Data_BU\lenistest5__backup01.bck', disk = 'E:\Data_BU\lenistest5__backup03.bck', disk = 'E:\Data_BU\lenistest5__backup02.bck'
with file = 1
, replace
, recovery;
相关问答
Q1: sqlserver数据库几种备份方法
数据库备份可以分为4个备份类型。
l 全备份:创建备份完成时数据库内存在的数据的副本。
l 差异备份:只记录自上次数据库备份后发生更改的数据。差异数据库备份比数据库备份小,而且备份速度快,因此可以更经常地备份,经常备份将减少丢失数据的危险。
l 日志备份:是自上次备份事务日志后对数据库执行的所有事务的一系列记录。可以使用事务日志备份将数据库恢复到特定的即时点(如输入多余数据前的那一点)或恢复到故障点。
l 文件组备份:可以备份和还原数据库中的个别文件。可以只还原已损坏的文件,而不用还原数据库的其余部分,从而加快了恢复速度。
不同的备份类型适用的范围也不同。全备份,可以只用一步操作完成数据的全部备份,但执行时间比较长。差异备份和日志备份,都不能独立作为一个备份集来使用,需要进行一次全备份。文件备份必须与事务日志备份一起使用,所以文件备份只适用于完全恢复模型和大容量日志记录恢复模型。
每一种备份类型都有不足之处,要针对需要选择备份类型,或者使用几种备份方式的配合来完成数据库的备份。
经常使用备份方式组合有以下几种:
l 全备份+差异备份:以一周为周期,星期日进行全备份,星期一到星期六每天进行差异备份。
l 全备份+日志备份:以一周为周期,星期日进行全备份,星期一到星期六每天进行日志备份。
l 文件组备份+日志备份:备份周期取决于数据库的大小和能力,每周期分别进行一部分数据文件备份,每天进行日志备份。
Q2: sqlserver备份日志文件需要备份数据库文件吗
需要,为了完成sqlserver数据库的备份,必须同时进行数据库文件和日志文件的备份。
Q3: SqlServer备份数据库的4种方式分别是什么?
SqlServer备份数据库的4种方式分别是:
全备份:创建备份完成时数据库内存在的数据的副本;
差异备份:只记录自上次数据库备份后发生更改的数据。差异数据库备份比数据库备份小,而且备份速度快,因此可以更经常地备份,经常备份将减少丢失数据的危险;
日志备份:是自上次备份事务日志后对数据库执行的所有事务的一系列记录。可以使用事务日志备份将数据库恢复到特定的即时点(如输入多余数据前的那一点)或恢复到故障点;
文件组备份:可以备份和还原数据库中的个别文件。可以只还原已损坏的文件,而不用还原数据库的其余部分,从而加快了恢复速度。
需要注意的点:
有备份任务里边选择备份的库尽量选‘所有用户数据库'这项,以免选择了特定数据库备份以后某天添加了新数据库却忘了勾选导致丢备份;
选项验证备份集完整性和压缩备份尽量都选上;
备份的路径尽量别选磁盘根目录。
Q4: SQLserver2012怎么备份数据库(sqlserver2012数据库备份和还原)
SQLserver2012可以做维护计划,来对数据库进行自动的备份。
例如这样一个数据库维护的计划,每天0点对数据库进行差异备份,每周日0点对数据库进行完全备份,并且每天晚上10点删除一次过期备份(两个星期前的)。
做这样一个维护计划的方法如下:
1、在做计划之前,需要先启用SQLServer代理,并将启动模式设为自动。
2、接下来,依次点击“SQLServerManagementStudio”--“管理”--“维护计划”--“维护计划向导”--“维护计划向导”
3、在这里由于这里有三项计划,并且每项计划周期不同,所以选择“每项任务单独计划”。
4、接着根据需求选择维护任务,我这边选择的是“备份数据库(完整)”、“备份数据库(差异)”、“清楚维护”任务”这三项
5、接着开始定义每一项任务,首先是定义“备份数据库(完整)”任务,我这边要对SharePoint进行备份,所以选择了特定数据库SharePoint的内容数据库WSS_Content,并且选定了备份集过期时间为晚于14天(这里的设置对清楚维护任务有用),最后选择你需要写入备份的文件夹,比如D:/Backup/Full;
6、然后是定义“备份数据库(差异)”任务,同样的选择特定的WSS_Content数据库,选定过期时间为14天,选定需要写入备份的文件夹,比如D:/Backup/Diff;
7、最后,定义“清楚维护”任务,在删除以下类型的文件中选择“备份文件”,在文件位置处选择搜索文件夹D:/Backup,文件扩展名bak,勾选包括一级子文件夹,在文件保留时间中选择2周,更改计划“在每天的22:00:00执行”。
8、然后一直点击“下一步”,直到完成维护计划向导,但是到这里维护计划并没有结束,前两项任务并没有做计划,需要单独为它们做计划
9、在这里,对完整备份设置每周日0点备份一次的计划,对差异备份设置每天备份一次的计划。
10、最后保存维护计划,这样就完成了对SharePoint内容数据库的备份计划。
Q5: 关于SQL数据库自动备份(sql怎么自动备份)
一、简单实用的备份方法:
企业管理器中的Tools,DatabaseMaintenancePlanner,可以设置数据库的定期自动备份计划。并通过启动SqlserverAgent来自动运行备份计划。具体步骤如下:1、打开企业管理器,在控制台根目录中依次点开MicrosoftSQLServer--
修改备份计划:打开企业管理器,在控制台根目录中依次点开MicrosoftSQLServer--
关于sqlserver数据库日志备份和sql数据库每日备份的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。





