注册
DCP培训之数据恢复
专栏/培训园地/ 文章详情 /

DCP培训之数据恢复

dm_forever 2025/04/24 84 0 0
摘要

数据备份恢复

归档配置

DM 数据库可以运行在归档模式或非归档模式下。如果是归档模式,联机日志文件中的内容保存到硬盘中,形成归档日志文件;如果是非归档模式,则不会形成归档日志。联机备份数据库必须要配置归档。联机备份时,大量的事务处于活动状态,为确保备份数据的一致性,需要同时备份一段日志(备份期间产生的 REDO 日志),因此要求数据库必须配置本地归档且归档必须处于开启状态。脱机备份数据库可配置归档也可以不配置。正常退出的库的备份不需要考虑本地归档日志的完整性,可以不配置归档;但对于故障退出的库的备份要求因故障未刷盘的日志也必须存在于本地归档中,因此必须配置归档,如果本地归档缺失,需要用户先修复归档,然后再备份。备份表空间属于联机备份,必须配置归档。备份表虽然是联机完全备份,但不需要配置归档。因为表在还原之后不需要再进行恢复操作,用不到归档日志。备份归档日志必须配置归档。

联机配置归档:

可根据需要修改归档日志的位置,和文件大小
ALTER DATABASE MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE ADD ARCHIVELOG 'DEST=/data/dmdbms/data/DAMENG/arch,
TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=51200';
ALTER DATABASE OPEN;

手动配置归档:

手动配置归档即在数据库实例未启动的情况下,手动编写 dmarch.ini 文件和设置参数ARCH_INI。

联机执行 SQL 语句进行备份

在 Disql 中执行该命令,备份数据库,默认为完全备份,下面两个 sql 执行的效果是一样的:
BACKUP DATABASE BACKUPSET 'db_bak_01';
BACKUP DATABASE FULL BACKUPSET 'db_bak_01';
语句执行完后会在默认的备份路径下生成名为“db_bak_01”的备份集目录,默认的备 份路径为 dm.ini 中 BAK_PATH 配置的路径,若未配置,则使用 SYSTEM_PATH 下的 bak 目录。如需指定备份集路径,可使用以下命令:
指定备份集路径为“/home/dm_bak/db_bak_3_01”
BACKUP DATABASE BACKUPSET '/home/dm_bak/db_bak_3_01';
创建备份集,备份名设置为
“WEEKLY_FULL_BAK” BACKUP DATABASE TO WEEKLY_FULL_BAK BACKUPSET '/home/dm_bak/db_bak_3_02';
创建备份为备份集添加描述信息为“完全备份”
BACKUP DATABASE BACKUPSET '/home/dm_bak/db_bak_3_04' BACKUPINFO '完全备份';
创建备份限制备份片大小为 300MB
BACKUP DATABASE BACKUPSET '/home/dm_bak/db_bak_3_05' MAXPIECESIZE 300;
执行备份压缩,压缩级别设置为 5
BACKUP DATABASE BACKUPSET '/home/dm_bak/db_bak_3_06' COMPRESSED LEVEL 5;
创建并行备份,指定并行数为 8
BACKUP DATABASE BACKUPSET '/home/dm_bak/db_bak_3_07' PARALLEL 8;

增量备份

增量备份指基于指定的库(或者表空间)的某个备份(完全备份或者增量备份),备份自该备份以来所有发生修改的数据页。执行增量备份的主要目的是快速备份数据库中的修改,减少备份时间和避免重复的备份。DIsql 中输入备份数据库语句,最简单的不设置其他参数的增量备份语句如下:
BACKUP DATABASE INCREMENT WITH BACKUPDIR '/home/dm_bak' BACKUPSET '/home/dm_bak/db_increment_bak_02';
备份语句中的 INCREMENT 参数不可省略,该参数用来指定执行的备份类型为增量备份。若要创建累积增量备份,还需要指定 CUMULATIVE 参数,否则缺省为差异增量备份。WITHBACKUPDIR 参数用来指定基备份集的搜索目录,如果基备份集不在默认备份目录或当前备份目录则该参数不可省略。
表空间备份
BACKUP TABLESPACE MAIN BACKUPSET 'ts_bak_01';
增量备份指定基备份集路径BASE ON BACKUPSET 参数用于增量备份中,用来指定基备份集路径。如果不指定该参数,会在备份搜索目录中搜索最近一次的完全备份或增量备份作为这次增量备份的基备份。若需要在特定的备份集基础上执行增量备份就需要使用该参数。
下面以增量备份用户 MAIN 表空间为例,指定 BASE ON BACKUPSET 参数执行增量备份:
BACKUP TABLESPACE MAIN BACKUPSET 'ts_full_bak_01';
BACKUP TABLESPACE MAIN INCREMENT BACKUPSET 'ts_increment_bak_01';
BACKUP TABLESPACE MAIN INCREMENT BASE ON BACKUPSET'ts_full_bak_01' BACKUPSET 'ts_increment_bak_02';
增量备份ts_increment_bak_02若不指定备份集ts_full_bak_01作为基备份,那么默认会使用最近一次的备份集 ts_increment_bak_01 作为基备份。

表备份

与备份数据库与表空间不同,备份表不需要服务器配置归档,DIsql 中输入以下即可 备份用户表:
BACKUP TABLE TAB_01 BACKUPSET 'tab_bak_01';

备份归档

归档备份拷贝指定归档目录下的所有的归档文件到备份集中,并记录各个归档文件的属 性、文件大小以及 LSN 区间等。归档备份不存在增量备份之说。当需要保存库的归档时, 可以使用归档备份。
例 备份归档日志,通过 LSN BETWEEN ... AND ...来指定起始和截至 LSN。 首先,确定 LSN
范围。
select ARCH_LSN, CLSN, PATH from V$ARCH_FILE;
查询结果如下:
ARCH_LSN CLSN PATH


38758 40301 d:\arch\ARCHIVE_LOCAL1_20230727105417748.log
40302 40303 d:\arch\ARCHIVE_LOCAL1_20230727111411079.log
40304 40305 d:\arch\ARCHIVE_LOCAL1_20230727111513679.log
……
50412 50413 d:\arch\ARCHIVE_LOCAL1_20230727171801098.log
50414 50478 d:\arch\ARCHIVE_LOCAL1_20230727171849712.log
……
//通过查询结果选出备份的起始 LSN 和截至 LSN。比如 50414 50478
其次,备份归档。
BACKUP ARCHIVELOG LSN BETWEEN 50414 AND 50478 BACKUPSET
'/home/dm_bak/arch_bak_time_14-78';

联机表还原

表还原之后不需要恢复操作。DIsql 中输入以下简单的 RESTORE 语句就可还原表:
RESTORE TABLE TAB_01 FROM BACKUPSET 'tab_bak_01';
执行表还原,数据库必须处于 OPEN 状态,MOUNT 和 SUSPEND 状态下不允许执行表还原。表还原不需要配置归档,因为表还原是联机完全备份还原,所以不需要借助本地归档日志进行恢复。完整的表备份还原步骤如下:

  1. 保证数据库为 OPEN 状态;
  2. 创建待备份的表;
    CREATE TABLE TAB_FOR_RES_01(C1 INT);
  3. 备份表数据;
    BACKUP TABLE TAB_FOR_RES_01 BACKUPSET '/home/dm_bak/tab_bak_for_res_01';
  4. 校验备份,此步骤为可选;
    SELECT SF_BAKSET_CHECK('DISK','/home/dm_bak/tab_bak_for_res_01');
  5. 还原表数据。
    RESTORE TABLE TAB_FOR_RES_01 FROM BACKUPSET '/home/dm_bak/tab_bak_for_res_01';
    表还原实质是表内数据的还原,以及索引和约束等的重建。如果备份文件与目标表中都包含索引或约束该如何还原呢?下面以表中包含索引为例说明如何还原表,具体步骤如下:
    5.1) 保证数据库为 OPEN 状态;
    5.2) 创建待备份的表;
    CREATE TABLE TAB_FOR_RES_02(C1 INT);
    5.3) 创建索引;
    CREATE INDEX I_TAB_FOR_RES_02 ON TAB_FOR_RES_02(C1);
    5.4) 备份表;
    BACKUP TABLE TAB_FOR_RES_02 BACKUPSET '/home/dm_bak/tab_bak_for_res_02';
    5.5) 校验备份,此步骤为可选;
    SELECT SF_BAKSET_CHECK('DISK','/home/dm_bak/tab_bak_for_res_02');
    5.6) 执行表结构还原,表备份和目标表中都包含索引,如果直接执行表数据还原会报错: 还
    原表中存在二级索引或冗余约束;
    RESTORE TABLE TAB_FOR_RES_02 STRUCT FROM BACKUPSET
    '/home/dm_bak/tab_bak_for_res_02';
    5.7) 执行表数据还原。
    RESTORE TABLE TAB_FOR_RES_02 FROM BACKUPSET '/home/dm_bak/tab_bak_for_res_02';
    当然也可以指定还原时不重建索引:
    RESTORE TABLE TAB_FOR_RES_02 WITHOUT INDEX FROM BACKUPSET
    '/home/dm_bak/tab_bak_for_res_02'
    也可以还原表数据,但不还原约束:
    RESTORE TABLE TAB_FOR_RES_02 WITHOUT CONSTRAINT FROM BACKUPSET '/home/dm_bak/tab_bak_for_res_02';

使用脱机工具 DMRMAN 进行备份还原

DMRMAN 工具支持控制台输入命令、命令行设置参数两种操作方式。下面分别对这两种操作方式进行介绍。

DMRMAN 控制台输入命令

当 DMRMAN 客户端已经启动且可以输入命令时会显示命令提示符。如下所示:
RMAN>
例如,输入以下用于执行的 DMRMAN 命令:
RMAN> HELP
RMAN> BACKUP DATABASE'/opt/dmdbms/data/DAMENG/dm.ini';
DMRMAN 控制台还可以执行脚本。如首先创建一个名为 cmd_file.txt 的文件,文件 中包含“BACKUP DATABASE'/opt/dmdbms/data/DAMENG/dm.ini'”命令,保存到 /home/dm_cmd目录下,则该文件的执行方式如下:
RMAN> `/home/dm_cmd/cmd_file.txt
DMRMAN 是按行解析命令,如果输入一行不完整的命令执行会报错,如一条完整的命令分三行输入会导致报错,例如:
BACKUP DATABASE '/opt/dmdbms/data/DAMENG/dm.ini';

DMRMAN 命令行设置参数执行

命令行指定脚本执行,要求我们先创建一个包含 DMRMAN 命令的文件,然后设置 CTLFILE参数,参数后面指定文件的路径。例如,创建一个名为cmd_rman.txt 的文件, 保存/home/dm_cmd 目录下,文件中包含一行如下所示的 DMRMAN 命令:
BACKUP DATABASE'/opt/dmdbms/data/DAMENG/dm.ini';
设置 CTLFILE 参数启动 DMRMAN 工具,指定脚本文件中的命令将被执行:
./dmrman CTLFILE=/home/dm_cmd/cmd_rman.txt
命令执行完后 DMRMAN 工具会自动退出。
命令行执行语句执行,是 DMRMAN 工具设置 CTLSTMT 参数,参数后面执行需要执行的DMRMAN 命令,使用方法如下所示:
./dmrman CTLSTMT="BACKUP DATABASE'/opt/dmdbms/data/DAMENG/dm.ini';

数据备份

创建完全备份

RMAN> BACKUP DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FULL BACKUPSET '/home/dm_bak/db_full_bak_01';
备份成功后会在或者默认备份目录下生成备份集。备份集中包括一个 备份元数据文件,后缀.meta,以及一个或多个备份片文件,后缀.bak。
在执行脱机数据库备份过程中,如果报错归档不完整,则需要检查库是不是异常退 出。如果库是异常退出,则需要先进行归档修复。

创建增量备份

RMAN> BACKUP DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' INCREMENT WITH BACKUPDIR '/home/dm_bak' BACKUPSET '/home/dm_bak/db_increment_bak_02';

数据库还原

使用 RESTORE 命令完成脱机还原操作,在还原语句中指定库级备份集,可以是脱机库级备份集,也可以是联机库级备份集。
数据库备份集分为联机和脱机两种类型。通常情况下,用户会在联机状态下备份数据库,因此下面以联机数据库备份为例说明使用 DMRMAN 如何执行数据库还原操作。

  1. 联机备份数据库,保证数据库运行在归档模式及 OPEN 状态;
    BACKUP DATABASE BACKUPSET '/home/dm_bak/db_full_bak_for_restore';
  2. 准备目标库。还原目标库可以是已经存在的数据库,也可使用 dminit 工具初始 化一个
    新库。如下所示:
    ./dminit path=/opt/dmdbms/data db_name=DAMENG_FOR_RESTORE
  3. 校验备份,校验待还原备份集的合法性。校验备份有两种方式,联机和脱机,此 处使用
    脱机校验;
    RMAN> CHECK BACKUPSET '/home/dm_bak/db_full_bak_for_restore';
  4. 还原数据库。启动 DMRMAN,输入以下命令:
    RMAN> RESTORE DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' FROM
    BACKUPSET '/home/dm_bak/db_full_bak_for_restore';

数据库恢复

使用 RECOVER 命令完成数据库恢复工作,可以是基于备份集的恢复工作,也可以是使 用本地归档日志的恢复工作。如果还原后,数据已经处于一致性状态了,则可以使用更新DB_MAGIC 方式恢复,前提是不需要重做日志。
从备份集恢复

  1. 启动 DIsql 联机备份数据库;
    BACKUP DATABASE BACKUPSET '/home/dm_bak/db_full_bak_for_recover_backupset';
  2. 准备目标库,可以使用备份库,也可以重新生成库;
    重新生成库操作如下:
    ./dminit path=/opt/dmdbms/data db_name=DAMENG_FOR_RESTORE auto_overwrite=1
  3. 启动 RMAN,校验备份;
    RMAN> CHECK BACKUPSET '/home/dm_bak/db_full_bak_for_recover_backupset';
  4. 还原数据库;
    RMAN> RESTORE DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' FROM
    BACKUPSET '/home/dm_bak/db_full_bak_for_recover_backupset';
  5. 恢复数据库。
    RMAN> RECOVER DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' FROM
    BACKUPSET '/home/dm_bak/db_full_bak_for_recover_backupset';
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服