数据库备份分为数据文件备份和日志文件备份,数据文件的备份分为:完整备份和差别备份。在SQL Server 2012中,可以将数据分布式备份到不一样的存储设备上,通常状况,只将数据备份到一个备份文件(.bak)中,只有在备份超大的数据库时,才须要分布式备份,对于备份集(backup set),备份介质(backup Media),备份族(backup family),镜像备份,等等看似复杂的术语,不用深刻了解,简单了解一下基本知识:sql
数据库备份的策略通常是:一周一次完整备份,一天一次差别备份,一小时一次事务日志备份,根据数据容灾的要求,适当增减备份的时间间隔。数据库
为了便于管理数据备份文件,推荐的作法是:app
一,建立数据库的完整备份和差别备份less
使用backup database命令建立数据库的数据文件的备份,backup database 命令语法(简化):分布式
BACKUP DATABASE database_name TO DISK = 'physical_device_name' [ WITH { DIFFERENTIAL | COPY_ONLY | { COMPRESSION | NO_COMPRESSION } | { NOINIT | INIT } | { NOSKIP | SKIP } | { NOFORMAT | FORMAT } | STATS [ = percentage ] }]
1,完整备份和差别备份ui
差别备份由DIFFERENTIAL 关键字指定,只备份从上一次完整备份以后发生更新的数据,而不是备份整个数据库,一般状况下,差别备份比完整备份占用的空间更少。差别备份的参考基准是上一次完整备份,而,事务日志,只备份是从上一次差别备份以后产生的事务日志。所以,备份是有顺序的,若是存在如下备份序列:this
还原的策略是:备份尾日志,使数据库处于Restoring状态,依次还原FullBackup1.bak,DifferentialBackup4.bak,LogBackup5.trn,尾日志,就能将数据库还原到一个合适的有效时间点。atom
在执行完整备份和差别备份时,SQL Server会备份足够的事务日志,用于将数据库还原到一致性的状态。对于master数据库,只能执行完整备份。spa
2,只复制(COPY_ONLY )备份rest
备份是有顺序的,使用COPY_ONLY选项不会影响备份的正常顺序,仅仅建立一个数据库的副本。
差别备份的基准是上一次完整备份,即差别是指从上一次full backup以后,对数据文件执行的更新操做。若是执行一次Copy-Only的完整数据库备份,不会影响差别备份的base(基准),该base是上一次full backup,而非本次 Copy-only full backup。
3,压缩数据{ COMPRESSION | NO_COMPRESSION }
在备份时,将数据压缩,因为压缩的备份较小,可以减小Disk Sapce和Disk IO消耗,提升数据备份的速度,可是,备份文件的压缩和解压缩十分消耗CPU资源。
4,建议:每一次数据备份,都存储在单个备份文件上
因为硬盘空间有限,不可能保留过多的备份文件,将数据的每一次备份都存储在单个文件上,便于对备份文件进行管理(删除或归档)。
每次备份都存储在新的备份上,搭配选项 Init、Skip、Format,将数据备份存储在新的备份文件上,这三个选项的含义是:
5,备份进度(stats)
使用stats选项,每当备份进行到必定的百分比时,SQL Server显式进度消息,默认值是10,即,每完成10%,SQL Server显式完成的进度消息,例如,设置stats=10,当备份进程完成30%时,SQL Server会打印消息:30 percent processed.
The STATS option reports the percentage complete as of the threshold for reporting the next interval. This is at approximately the specified percentage; for example, with STATS=10, if the amount completed is 40 percent, the option might display 43 percent. For large backup sets, this is not a problem, because the percentage complete moves very slowly between completed I/O calls.
二,数据备份操做
建议:每一次数据备份,都存储在单个备份文件上
1,数据库完整备份,没有指定Differential选项
backup database [TestSite] to disk = 'D:\TestDBBackupFolder\Sitedb_bak1.bak' --specify new backup file with compression, format, init, skip, stats=5
2,数据库差别备份,指定Differential选项
backup database [TestSite] to disk = 'D:\TestDBBackupFolder\Sitedb_bak2.bak' --specify new backup file with differential, compression, format, init, skip, stats=5
三,事务日志备份
要执行事务日志的备份,数据库的恢复模式(Recovery Mode)必须是FULL,而且数据库必须执行过一次数据库的完整备份操做,不然,事务日志将处于自动截断(Auto-Truncate)状态,没法进行事务日志备份。
使用backup log命令对事务日志进行备份,跟backup database命令的差别是,不能使用differential选项,多了NoRecovery 和 NO_Truncate选项;
BACKUP LOG database_name TO DISK = 'physical_device_name' [ WITH { COPY_ONLY | { COMPRESSION | NO_COMPRESSION } | { NOINIT | INIT } | { NOSKIP | SKIP } | { NOFORMAT | FORMAT } | STATS [ = percentage ] | { NORECOVERY | STANDBY = undo_file_name } | NO_TRUNCATE }]
1,尾日志备份
NORECOVERY 选项,指定备份事务日志的尾部,并使数据库处于RESTORING状态
Backs up the tail of the log and leaves the database in the RESTORING state. NORECOVERY is useful when failing over to a secondary database or when saving the tail of the log before a RESTORE operation. To perform a best-effort log backup that skips log truncation and then take the database into the RESTORING state atomically, use the NO_TRUNCATE and NORECOVERY options together.
2,日志截断
正常状况下,数据库处于Online状态,在进行事务日志备份时,若是不指定 NO_TRUNCATE 选项,那么数据库将已备份的事务日志文件截断,避免事务日志过大,耗尽disk空间;若是指定 NO_TRUNCATE 选项,表示日志备份不会将事务日志文件截断,该选项通常在数据库处于异常状态时使用。
Specifies that the log not be truncated and causes the Database Engine to attempt the backup regardless of the state of the database. Consequently, a backup taken with NO_TRUNCATE might have incomplete metadata. This option allows backing up the log in situations where the database is damaged.
The NO_TRUNCATE option of BACKUP LOG is equivalent to specifying both COPY_ONLY and CONTINUE_AFTER_ERROR.
Without the NO_TRUNCATE option, the database must be in the ONLINE state. If the database is in the SUSPENDED state, you might be able to create a backup by specifying NO_TRUNCATE. But if the database is in the OFFLINE or EMERGENCY state, BACKUP is not allowed even with NO_TRUNCATE.
3,自动截断模式
若是数据库符合如下两种条件之一,那么Database就处于自动截断模式:
自动截断模式是指数据库引擎把处于可还原状态(recoverable)状态的事务日志自动截断,使日志文件可以重复使用,避免日志文件无限增加。若是事务日志不是自动截断模式,那么事务日志会保存到日志文件中,致使日志文件持续增加。只有作日志备份时,日志文件才会被截断;若是没有按期的日志备份,那么日志文件会持续地增加,直到耗尽磁盘的全部空间,所以,必须制定一个日志备份计划,把事务日志截断,才能使数据库的事务日志文件的大小保持在一个能够管理的水平上。
select db_name(database_id) as DBName, case when last_log_backup_lsn is null then 'Auto' else 'Manul' end as TruncateMode from sys.database_recovery_status
四,事务日志备份
1,正常状况下的事务日志备份
backup log [TestSite] to disk = 'D:\TestDBBackupFolder\Sitedb_bak3.trn' with compression, format, init, skip, stats=5
2,备份尾日志,进而还原数据库
backup log [TestSite] to disk = 'D:\TestDBBackupFolder\Sitedb_bak4.trn' with compression, format, init, skip, stats=5, norecovery
参考doc: