• 数据库的备份和还原(slqserver)


    数据库的备份

    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]
       }
    ]
    [;]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    语法解释:

    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 }**:指定必须经过多少天才可以覆盖备份媒体集。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    2.例子:
    在本地磁盘中创建一个文件夹(例如D:\databackup),用来存储你的备份文件。然后我们来创建 Test 数据库的完整备份,语句如下图:

    BACKUP DATABASE 数据库 TO disk='备份路径' WITH INIT NAME = '备份名字' DESRIPTION='描述'
    
    • 1

    在!这里插备份入图片描述

    差异备份的使用

    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]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    实战检测

    在右侧编辑器中的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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    数据库的还原

    语法

    主要利用的是 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 }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    各个字段的解释

    **{ 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
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    差异备份还原

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    事务日志备份的还原

    事务日志备份还原比较频繁,因此事务日志备份的还原步骤比较多。例如周末对数据库进行完整备份,每天晚上 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    实战检测

    在右侧编辑器中的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 **********--
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    golang基础:channel的应用场景
    C++ 命名空间 & 模板
    CSC公派遭美德拒签|计算机专业老师终赴意大利都灵理工大学访学
    2022年新能源汽车行业分析
    JAVASE零基础到高级教程
    简单的分析react框架与vue框架的区别
    Maven settings文件对应的标签及含义
    优先队列式广度优先搜索
    Springboot+美妆网站的设计与实现 毕业设计-附源码211539
    Linux---Socket
  • 原文地址:https://blog.csdn.net/weixin_57128596/article/details/127908630