数据库的备份
1.语法:
BACKUP DATABASE { database_name | @database_name_var }
TO <backup_device> [,...n]
[ WITH
{
COPY_ONLY
| NAME = {backup_set_name | @backup_set_name_var }
| { NOINIT | INIT }
| DESCRIPTION = { 'test' | @text_variable }
| PASSWORD = { password | @password_variable }
| { EXPIREDATE = { 'date' | @date_var }
| RETAINDAYS = { days | @days_var } } [,...n]
}
]
[;]
语法解释:
DATABASE:指定一个完整数据库备份。
**{ database_name | @ database_name_var }**:备份事务日志、部分数据库或者完整的数据库时所用的数据源。如果作为变量(@ database_name_var)提供,则可以将该名称指定为字符串常量(@ database_name_var=database name)或指定为字符串数据类型(ntext 或 text 数据类型除外)的变量。
**<backup_device>**:指定用于备份操作的逻辑备份设备或物理备份设备。
COPY_ONLY:指定备份为仅复制备份,该备份不影响正常的备份顺序。仅复制备份是独立于定期计划的常规备份而创建的。仅复制备份不会影响数据库的总体备份和还原过程。
**NAME = {backup_set_name | @ backup_set_name_var }**:指定备份集的名称。如果未指定 NAME 它将为空。
**{ NOINIT | INIT }**:控制备份操作是追加还是覆盖备份媒体中的现有备份。默认为追加到媒体中最新的备份集(NOINIT)。
**DESCRIPTION = { 'test' | @ text_variable }**:指定说明备份集的自由格式文本。
**PASSWORD = { password | @ password_variable }**:为备份集设置密码,PASSWORD 是一个字符串。
**{ EXPIREDATE = { 'date' | @ date_var }**:指定允许覆盖该设备的备份集的日期。
**RETAINDAYS = { days | @ days_var }**:指定必须经过多少天才可以覆盖备份媒体集。
2.例子:
在本地磁盘中创建一个文件夹(例如D:\databackup),用来存储你的备份文件。然后我们来创建 Test 数据库的完整备份,语句如下图:
BACKUP DATABASE 数据库 TO disk='备份路径' WITH INIT NAME = '备份名字' DESRIPTION='描述'
差异备份的使用
1.概念:
差异备份是指,备份自上一次完整备份之后有变化的数据。差异备份过程中,只备份那些有标记的选中的文件和文件夹。但是它不清除标记,也就是在备份文件后,不会将文件标记为已备份文件。换言之,它不清除存档属性。所谓存档属性,是用来标记文件改动的,一旦文件有所改动,备份程序就会以此来确定哪些文件需要备份
总计而言之就是,更加细节化,比如具体到某一天的postion备份
2.使用:
差异备份也是使用 BACKUP 命令,主要是参数需要指定 Differential
事务日志备份
1.概念:
事务日志备份就是备份所有数据库的修改记录,用来在还原操作期间,提交完成的事务以及回滚未完成的事务,事务日志备份记录备份操作开始时的事务日志状态。(相当于某一个时间节点的备份)
对比于前两种备份节省了时间和空间,可以指定恢复到某一个时间,其语法如下:
BACKUP LOG { database_name | @database_name_var }
TO <backup_device> [,...n]
[ WITH
NAME = { database_set_name | @backup_set_name_var }
| DESCRIPTION = { 'test' | @test_variable }
]
{ { NORECOVERY | STANDBY = undo_file_name } } [,...n]
实战检测
在右侧编辑器中的Begin-End之间补充代码,使用完整备份模式完成对 studb 数据库的备份,具体要求如下
-
1.备份文件路径为/usr/local/databackup/studb.bak(注意路径不要输错了,平台会在此路径下查询备份集);
-
2.备份集名称 NAME 为“full backup”;
-
3.备份集说明 DESCRIPTION 文字为“this is full backup file”。
BACKUP DATABASE mydb TO disk='/usr/local/databackup/studb.bak'
WITH INIT,
NAME = 'full backup',
DESCRIPTION='this is full backup file'
GO
数据库的还原
语法
主要利用的是 RESTORE 语句
RESTORE DATABASE{ database_name | @database_name_var}
FROM <backup_device> [,...n]
[ WITH
{
[ { CHECKSUM | NO_CHECKSUM }
| [ RECOVERY | NORECOVER | STANDBY = {standby_file_name | @standby_file_name_var}]
| FILE = { backup_set_file_number | @back_set_file_number }
| PASSWORD = { password | @password_variable }
| MEDIANAME = { media_name | @media_name_variable}
| MEDIAPASSWORD = { mediapassword | @mediapassword_variable }
| MOVE 'logical_file_name_in_backup' TO 'operating_system_file_name' [,...n]
| REPLACE
| STOPAT = {'datatime' | @datatime_var}
}
]
[;]
<backup_device> :: =
{
{ logical_backup_device_name | @logical_backup_device_name_var }
| { DISK | TAPE } = { 'pysical_backup_device_name' | @pysical_bakcup_device_name_var }
}
各个字段的解释
**{ CHECKSUM | NO_CHECKSUM }**:默认行为是在存在校验和时验证校验和,不存在校验和时不进行验证并继续执行操作。
RECOVERY:指示还原操作回滚任何未提交的事务。在恢复进行后即可随时使用数据库。如果既没有指定 NORECOVERY 和 RECOVERY,则默认为 RECOVERY。
NORECOVRY:指示还原操作不回滚任何未提交的事务。
**FILE = { backup_set_file_number | @ back_set_file_number }**:标识要还原的备份集。例如,backup_set_file_number 为 1,指示备份媒体中的第一个备份集;backup_set_file_number 为 2,指示第二个备份集。可以通过使用 RESTORE HEADERONLY 语句来获取备份集的 backup_set_file_number。未指定时,默认值为1。
**MEDIANAME = { media_name | @ media_name_variable}**:指定媒体名称。
**MEDIAPASSWORD = { mediapassword | @ mediapassword_variable }**:指定媒体集的密码,密码为一个字符串。
**MOVE 'logical_file_name_in_backup' TO 'operating_system_file_name' [...n]**:对于由 logical_file_name_in_backup 指定的数据或日志文件,应当通过将其还原到 operating_system_file_name 所指定的位置来对其进行移动。默认情况下,logical_file_name_in_backup 文件将还原到它的原始位置。
REPLACE:指定即使存在另一个具有相同名称的数据库,SQL Server 也创建指定的数据库及其相关文件。在这种情况下将删除现有的数据库。如果不指定则会执行安全检查。这样可以防止以外覆盖其他数据库。REPLACE 还会覆盖在恢复数据库之前备份尾日志的要求。
**STOPAT = {'datatime' | @ datatime_var}**:指定将数据库还原到它在 datatime 或 @ datatime_var 参数指定的日期和时间状态。
**{ logical_backup_device_name | @ logical_backup_device_name_var }**:是由存储过程创建的备份设备(数据库将从该备份设备还原)的逻辑名称。
**{ DISK | TAPE } = { 'pysical_backup_device_name' | @ pysical_bakcup_device_name_var }**:允许从命名磁盘或磁带设备还原备份。
差异备份还原
1.介绍:
完整备份还原之后,可以执行差异备份还原。例如在周末晚上执行一次完整数据库备份,以后每隔一天创建一个差异备份集,如果在周三数据库发生了故障,则首先用最近上个周末的完整备份做一个完整备份还原,然后还原周二做的差异备份。
差异备份还原与完整备份还原的语法基本一样,只是在还原差异备份时,必须先还原完整备份,再还原差异备份,具体请看如下案例:
2.案例
--创建数据库
CREATE DATABASE student
GO
--打开创建的数据库
USE student
GO
--创建测试表
create table tb_test(num int);
--插入一条数据
INSERT INTO tb_test values(1);
--做完整备份
backup database student to disk='d:\test.bak';
--再插入一条数据
INSERT INTO tb_test values(2);
--做差异备份
backup database student to disk='d:\test.bak' with differential;
--删除数据库
drop database student;
GO
事务日志备份的还原
事务日志备份还原比较频繁,因此事务日志备份的还原步骤比较多。例如周末对数据库进行完整备份,每天晚上 8 点对数据库进行差异备份,每隔 3 小时做一次事务日志备份。如果周三早上 9 点钟数据库发生故障,那么还原数据库的步骤如下:首先恢复周末的完整备份,然后恢复周二下午做的差异备份,最后依次还原差异备份到损坏为止的每一个事物日志备份,即周二晚上 11 点、周三早上 5 点和周三早上 8 点所做的事务日志备份。
与差异备份还原类似,事务日志备份还原时只要知道它在备份集中的位置即可。还原事务日志备份之前,必须先还原在其之前的完整备份,除了最后一个还原操作,其他所有操作都必须加上 NORECOVERY 或 STANDBY 参数。
类似于先确定大体上的哪一周,再确定哪一天,最后确定时间节点
举个例子
--创建数据库
CREATE DATABASE student
GO
--做一个完整备份
backup database student to disk='d:\test.bak'
--打开创建的数据库
USE student
GO
--创建测试表
create table tb_test(num int);
--插入一条数据
INSERT INTO tb_test values(1)
--做一个日志备份
backup log student to disk='d:\test.bak'
--再插入一条数据
INSERT INTO tb_test values(2)
--做尾日志备份
use master;
GO
backup log student to disk='d:\test.bak' with norecovery
--删除数据库
drop database student
GO
实战检测
在右侧编辑器中的Begin-End之间补充代码,完成 school 数据库的还原,具体要求如下:
-
1.studb 数据库做了三个备份,依次是完整备份、差异备份和事务日志备份(数据库中创建了一张表,一共三条数据,每向表里插入一条数据依次进行备份);
-
2.备份文件路径为/usr/local/databackup/studb.bak;
-
3.使用 master 数据库还原,还原的数据库名称为 studb(平台会在你还原的这个数据库中查询表中数据,以此来判断是否完成还原操作)。
--********** Begin **********--
use master;
GO
RESTORE DATABASE studb from disk='/usr/local/databackup/studb.bak'
with file=1,norecovery
RESTORE DATABASE studb from disk='/usr/local/databackup/studb.bak'
with file=2,norecovery
RESTORE LOG studb from disk='/usr/local/databackup/studb.bak'
with file=3,recovery
GO
--********** End **********--