达梦数据库备份恢复概念

一、本地归档

与联机 Redo 日志文件可以被覆盖重用不同,本地归档日志文件不能被覆盖,写入其中 的 Redo 日志信息会一直保留,直到用户主动删除;如果配置了归档日志空间上限,系统会 自动删除最早生成的归档 Redo 日志文件,腾出空间。

DM 提供了按指定的时间或指定的 LSN 删除归档日志的系统函数 (SF_ARCHIVELOG_DELETE_BEFORE_TIME 和 SF_ARCHIVELOG_DELETE_BEFORE_LSN),但用户需要谨慎使用。例如,在守护系统中, 如果备库故障了,主库继续服务,主库的日志在继续增长。此时如果删除尚未同步到备库的 主库归档日志,那么等待备库重启之后,会由于备库收到的日志缺失导致主备库无法正常同 步数据。 本地归档文件在配置的归档目录下生成并保存,文件命名规则为:日志归档名_年月日 时分秒毫秒.log,如:ARCHIVE_LOCAL1_20181014153933458.log。如果磁盘空间不 足,且没有配置归档日志空间上限(或者配置的上限超过实际空间),系统将自动挂起,直 到用户主动释放出足够的空间后继续运行。

为了最大限度地保护数据,当磁盘空间不足导致归档写入失败时,系统会挂 起等待,直到用户释放出足够的磁盘空间。 当磁盘损坏导致归档日志写入失败时,系统会强制 HALT。

通过执行以下 SQL 命令,可以完成归档切换功能。三条语句功能一样,选择 一条执行即可。

alter database archivelog current;

alter system archive log current;

alter system switch logfile;

二、归档修复

        DM 数据库服务器正常退出时,会将所有 REDO 日志写入本地归档日志文件中;但是数 据库服务器异常关闭时,可能存在部分 REDO 日志未写入本地归档日志文件中。归档修复会 扫描联机日志文件,将那些已经写入联机日志文件、但还没有写入到归档日志文件的 REDO 日志,重新写入到归档日志文件。

        如果数据库异常关闭后,并且没有进行归档修复,则归档日志文件中的内容比实际可恢 复的数据少一部分,将无法利用归档日志文件将数据恢复到最新状态。利用归档修复功能, 将归档日志文件内容重新补齐后,利用本地归档日志恢复时,就可以将数据库恢复到故障时 刻的最新状态。

归档修复的流程包括:

1. 收集本地归档日志文件;

2. 截断最后一个本地归档日志文件,并创建一个新的归档日志文件;

3. 扫描联机日志文件,将 CKPT_LSN 之后的 REDO 日志拷贝、写入新创建的归档日 志文件。

三、数据库备份

使用 dminit 建库时,通过设置 INI 参数 page_check,指定页校验模式, 当指定值不为 0 时,在执行备份过程中会对数据页执行校验操作,校验结果会 记录在备份集中,并在备份结束后给出警告信息,警告码为 609,告知用户此备 份集中存在被破坏的数据页。该警告只是提示作用,并不影响备份集的有效性。 在还原库上,备份集中备份的被破坏数据页在经过还原和恢复操作后,可以正常 使用。

表备份主要包括数据备份和元信息备份两部分。与库备份和表空间备份不同,表备份不 是直接扫描数据文件,而是从 BUFFER 中加载数据页,拷贝到备份片文件中。表备份的元 信息则包括建表语句、重建约束语句、重建索引语句,以及其他相关属性信息。表备份不需 要配置归档就可以执行,并且不支持增量表备份。

日志备份

        所谓日志备份,就是将备份过程中产生的 REDO 日志拷贝到备份片文件中,用来在数据 库还原结束后,将数据库恢复到一致性状态。在执行备份过程中,用户可 能修改数据库中的数据,并产生对应的 REDO 日志。增量备份和完全备份的日志备份流程完 全相同。

        在备份开始时,记录一个 START_LSN,在备份结束后记录一个 END_LSN,那么 [START_LSN, END_LSN]之间的 REDO 日志,就对应备份过程中用户对数据的修改。其中 START_LSN = CKPT_LSN+1,作为日志备份的起点,END_LSN = 数据备份结束时的 FILE_LSN,作为日志备份的终点。

        联机库备份默认开启日志备份,将备份过程中产生的 REDO 日志单独写入备份片作为备 份集的一部分。也可以通过 WITHOUT LOG 子句取消这部分 REDO 日志的拷贝,这种情况下 生成的备份本身是不完整的,数据库还原后,还要依赖备份库的本地归档日志来进行恢复操 作后,才能将数据恢复到一致性状态;否则,还原后的数据库将无法正常启动。

        还原后目标库中 redo 日志的数量,由目标库本身 redo 日志的数量决定。跟源库中 redo 日志的数量无关。例如,源库中有 3 个 redo 日志,目标库中只有 2 个,将源库还原 到目标库后,目标库仍然只有 2 个 redo 日志。

压缩与加密

如果基备份集指定了加密算法,那么增量备份的加密算法和密码必须与基备 份保持一致;如果基备份没有进行加密,那么增量备份可以使用任意的加密 算法和密码。

并行备份

        库备份、表空间备份以及归档日志备份可以进行并行处理,用户通过关键字 PARALLEL 指定是否执行并行备份,以及并行备份的并行数。并行备份以数据文件为单位,也就是说一 个数据文件仅可能出现在一个并行分支中。如果指定了 PARALLEL 关键字,但不指定并行 数,那么默认的并行数为 4,但实际的备份并行度由 DMAP 最终创建成功的并行子任务数决 定。增量备份是否并行以及并行数与其基备份集无关。

        目前的数据库并行备份还原都是以文件为单位,适用于待备份文件大小比较均匀的情况。 若文件大小差别比较大,特别存在个别文件巨大时,并行备份还原基本没有优势。因此在进 行数据库备份时,需要指定 READ SIZE ,将巨大的数据文件先进行拆分之 后再进行备份。

        目前的数据库并行备份还原都是以文件为单位,适用于待备份文件大小比较均匀的情况。 若文件大小差别比较大,特别存在个别文件巨大时,并行备份还原基本没有优势。因此在进 行数据库备份时,需要指定 READ SIZE ,将巨大的数据文件先进行拆分之 后再进行备份。

以下为一个并行数为 4 的脱机并行备份集(左)和非并行脱机备份集(右)比较截图:

四、还原

(一)库还原

        DM 既可以将一个已存在的数据库作为还原目标库,也可以指定一个路径作为还原目标库的目录。

        库还原的主要步骤包括:清理目标库环境;重建数据库文件; 拷贝数据页;重建联机日志文件;修改配置参数等。

清理目标库环境

        如果指定已存在的数据库作为还原目标库,还原操作首先解析 dm.ini 配置文件,获 取 dm.ctl 控制文件路径,删除控制文件中的数据文件,然后根据 overwrite 选项,如果 指定 overwrite 选项,若待还原文件存在,则删除;如果未指定 overwrite 选项,若待 还原文件存在,则报错,但保留目标库的日志文件、控制文件等。

如果指定还原到一个目录,则根据 OVERWRITE 参数选择策略,检查目标目录内的 dm.ini 文件、dm.ctl 文件,默认的日志文件 DBNAME01.log 和 DBNAME02.log(其中 DBNAME 为数据库名称),待还原的数据文件等。如果用户指定 OVERWRITE,并且存在相关 文件情况下,还原过程中会自动删除这些已经存在的文件;如果没有指定 OVERWRITE,并 且存在相关文件,则会报错。

重建数据库文件

        如果将一个已存在数据库作为还原目标,则需要将目标数据库的 dm.ini 路径作为还 原参数。还原过程中,会重新创建数据文件,并将相关信息写入 dm.ctl 控制文件中。

        如果将数据库还原到指定目录,则会在这个目录创建一个 dm.ini 配置文件,设置 CTL_PATH、SYSTEM_PATH 配置项指向这个目录,并在这个目录下创建 dm.ctl 控制文件。 DMDSC 不支持指定目录还原数据库。

数据文件重建策略:

1)目标库和备份集中的 SYSTEM_PATH 路径相同,则按照备份集中记录的原始路径创 建文件;

2)目标库和备份集中的 SYSTEM_PATH 路径不相同,默认在 SYSTEM_PATH 目录创建 文件; 3)如果已存在同名文件导致文件创建失败,会重命名文件后在 SYSTEM_PATH 目录创 建,文件重命名规则是:DB_NAME+序号.DBF;如果重命名后仍然冲突,则会一直重试;

4)使用 mapped file 指定源文件与目标文件的映射关系,定制数据库文件的物理分 布情况,可以很好的满足用户关于数据文件分布的需求。

重建联机日志文件

        指定目录还原,系统目录使用指定还原目录,所有库配置文件均认为在指定还原目录下。 联机日志文件命名规则,单机环境为 db_name+文件编号.log,其中 db_name 取自备份 集备份库的名称,文件编号从 1 开始,如 DAMENG01.log、DAMENG02.log。联机日志文 件至少 2 个。

拷贝数据页

        拷贝数据页是从备份集中读取数据页,并将数据页写入数据文件指定位置的过程。由于 备份过程中,只将有效的数据页写入备份集中,因此,还原过程也只涉及这些被分配使用的数据页。

重置目标库

具体包括:

 更新日志信息,设置当前 CKPT_LSN 为备份集中 START_LSN-1,并设置日志文 件状态为 INACTIVE;

 更新 DB_MAGIC,还原后,库中 PERMANENT_MAGIC 仍与备份集中相同;

 设置还原标志,标识当前库为指定库要还原的库,不允许使用;

 更新目标库的控制文件 dm.ctl,把当前库中的数据文件信息都记录到控制文件中, 使用备份集中的服务器秘钥文件,重新生成新的秘钥文件。

修改配置参数

        还原到指定库时,默认会保留目标库的配置参数不变,也可以在还原时指定 REUSE DMINI 子句,使用备份集中的配置参数替换目标库 dm.ini 中的配置参数。还原到指定目 录时,会重新建立一个 dm.ini 配置文件,并用备份集中的参数值来设置这些配置项。需 要注意的是,一般与路径相关的配置参数,比如 SYSTEM_PATH 等并不会被替换,而是保 留目标库 dm.ini 的原始值不变。

        服务器秘钥文件(dm_service.private 或者 dm_external.config)仅在备份集 中备份库非 usbkey 加密的情况下重建,并使用备份集中备份的秘钥内容进行还原。

注意事项:

1)指定的 dm.ini 必须存在且各项配置信息有效,其中 CTL_PATH 必须配置且路径必 须有效; 2)若指定目录还原,则指定目录作为数据库系统目录处理;

3)由于还原是要确保数据库数据的完整性,因此,对于增量备份的还原,需要搜集完 整的备份集链表,然后从前到后,逐个还原备份集中数据。鉴于增量备份 START_LSN 确定 规则,增量备份的还原过程中,不需要重做任何归档日志。

(二)表空间还原

        由于表空间的数据库对象等字典信息保存在数据库的 SYSTEM 表空间中,所以表空间备份恢复只能在备份源库上联机执行,且要求在源库正常启动状态下执行表空间还原操作。 同时,由于需要重建表空间文件、并拷贝数据页,还原过程中用户不能访问目标表空间,因 此 ONLINE 状态的表空间不能执行还原动作,必须先将目标表空间 OFFLINE 后,才能执行 表空间还原操作。那些处于 RES_OFFLINE 或者 CORRUPT 状态的表空间,也可以执行表空 间还原操作。开始表空间还原操作时,会修改表空间为 RES_OFFLINE 状态,并在还原结 束后重新设置为 OFFLINE 状态,处于 RES_OFFLINE 状态的表空,在还原结束前不允许重 新 ONLINE。

        在部分数据文件损坏,或者部分物理磁盘损坏情况下,我们可以指定还原数据文件,跳 过那些正常的数据文件,以提升还原速度。

         表空间还原也支持使用 mapped file 进行数据文件映射,如果不指定 mapped file, 则默认当前系统目录与备份集中一致。实际创建过程中,若发现已经存在或者创建失败后, 处理方式与数据库还原中数据重建策略处理一致。

(三)表还原

        表还原是表备份的逆过程,表还原从表备份集中读取数据替换目标表,将目标表还原成 备份时刻的状态。表还原主要包括三部分内容:表结构还原、数据还原、以及重建索引和约 束。

        如果还原目标表不存在,则利用备份集中记录的建表语句重建目标表;如果还原目标表 已经存在,则清除表中的数据、删除二级索引和约束;如果备份表存在附加列(通过 ALTER TABLE 语句快速增加的列),那么还原目标表必须存在、并且目标表所有列的物理存储格式 与备份源表完全一致。

        数据还原过程从表备份集拷贝数据页,重构数据页之间的逻辑关系,并重新形成一个完 整的表对象。

        在数据还原结束后,使用备份集中记录的信息,重新在表上创建二级索引,并建立各种 约束。表还原只支持在联机状态下执行,表还原过程中也不需要重做 REDO 日志。并且,表备 份集允许跨库还原,但要求还原目标库与源库的数据页大小等建库参数相同。需要匹配的建 库参数参考表 2.1 。

五、数据恢复

        数据恢复是指在还原执行结束后,重做 REDO 日志,将数据库恢复到一致性状态,并执 行更新 DB_MAGIC 的过程。其中重做 REDO 日志可以多次执行,直到恢复到目标状态。还 原结束后,必须经过恢复操作,数据库才允许启动。即使备份过程中没有修改任何数据,备 份集不包含任何 REDO 日志,在数据库还原结束后,也必须使用 DMRMAN 工具执行数据恢复 操作后,才允许启动数据库。未经过还原的数据库,也允许执行数据恢复。

        数据恢复重做的 REDO 日志,既可以是那些在备份过程中产生的、包含在备份集中的 REDO 日志,也可以是备份数据库本地归档日志文件。在本地归档日志完整的情况下,数据 还原结束后,可以利用本地归档日志,将数据库恢复到备份结束后任意时间点状态。

        不管采用哪种数据恢复方法,REDO 日志的范围至少要覆盖备份过程中产生的 REDO 日 志,也就是说必须完整包括备份集中记录的[START_LSN, END_LSN]之间的 REDO 日志, 如果归档日志缺失将会导致数据库恢复失败。只有库备份和表空间备份还原后,需要执行数 据恢复,表还原结束后,不需要执行数据恢复。

        PERMANENT_MAGIC 和 DB_MAGIC 是用来标识数据库的 INTEGER 类型值。DM 在初始化数 据库时生成 PERMANENT_MAGIC 和 DB_MAGIC 值,其中 PERMANENT_MAGIC 一经生成, 永远不会改变,称为数据库永久魔数。DB_MAGIC 称为数据库魔数,同样可以用来表示某一 个数据库,但 DB_MAGIC 是可以变化的,每经过一次还原、恢复操作后,DB_MAGIC 就会 产生变化,用来区分备份源库和还原目标库。 可以通过下列语句查看系统的 PERMANENT_MAGIC 和 DB_MAGIC 值。

SELECT PERMANENT_MAGIC;

SELECT DB_MAGIC FROM V$RLOG;

(一)指定备份集恢复

        默认未指定 WITHOUT LOG 子句的联机库备份生成的备份集,包含了备份过程中产生 的 REDO 日志,数据还原结束后,可以直接指定备份集,将数据库恢复到备份结束时的状态。

        由于执行增量备份时,要求<=基备份 END_LSN 的所有数据页已经写入磁盘;因此基备 份集中包含的 REDO 日志不需要重做,只要重做指定执行还原操作的备份集中包含的 REDO 日志,就可以将数据库恢复到一致性状态。

指定备份集恢复的简要过程包括:

1. 从备份集读取 REDO 日志,并生成一个临时的本地归档日志文件;

2. 利用生成的临时归档日志文件,重做 REDO 日志,并将数据修改写入磁盘;

3. 删除临时生成的归档日志文件;

4. 更新数据库日志信息,设置 CKPT_LSN 为最后一个重做的 REDO 日志 LSN 值

5. 修改数据状态为 ACTIVE,标记数据库启动时需要进行相应的回滚活动事务、 PURGE 已提交事务。

(二)指定归档恢复

         如果备份时指定了 WITHOUT LOG 子句,那么产生的备份集不包含备份过程中产生的 REDO 日志。这种备份集还原后,必须利用本地归档日志,将数据库恢复到一致性状态。执 行恢复前,会检查本地归档日志文件的完整性,要求必须包括[START_LSN, END_LSN] 之间完整的 REDO 日志。

        利用本地归档日志进行恢复时,DMRMAN 工具会扫描指定的归档日志目录,收集与恢复 数据库 PERMANENT_MAGIC 值相等的归档日志文件。与指定备份集恢复相比,利用本地归 档日志恢复不需要生成、删除临时归档日志文件,其余的执行流程完全相同。

指定归档恢复的执行场景主要包括:

 将还原后处于非一致性状态的数据库恢复到一致性状态

 将已经处于一致性状态的数据库尽可能地恢复到最新状态

 将数据库恢复到指定时间点状态

 将数据库恢复到指定 LSN 产生时的状态

        DM 中的归档日志包含时间信息,重做归档日志过程中,一旦发现达到了指定时间点, 就马上终止归档日志重做。在出现误操作的情况下,通过指定时间点恢复,可能帮助用户修 复数据。比如:用户在下午 5 点做了一个误操作,删除了某些重要数据;我们可以将恢复 时间设置为下午 4:59 分,在恢复完成后,重新找回被误删的数据。

        除了指定时间点,我们还可以通过指定 LSN 进行恢复。DM 中每条 REDO 日志记录都对 应一个唯一的 LSN 值,指定 LSN 值以后,数据库将会精准的恢复到产生这个 LSN 时间点的 状态。

(三)更新 DB_MAGIC

        若备份集满足 START_LSN 等于 END_LSN + 1,即在备份过程中未产生 REDO 日志, 则使用此备份集还原后只需要更新 DB_MAGIC 即可完成恢复。更新 DB_MAGIC 不重做 REDO 日志,仅仅更新库的 DB_MAGIC 值和数据库状态。

注意:只能在还原后的数据库上执行更新 DB_MAGIC 操作。

(四)表空间恢复

        考虑到用户表空间上的数据库对象定义是保存在 SYSTEM 表空间的系统表内,而用户 表空间仅保存这些数据库对象的数据,为了避免出现数据库对象的数据与定义不一致的情况, 一般要求在表空间还原后,重做指定表空间所有 REDO 日志将这个表空间数据恢复到最新状 态。如果用户确认数据库对象定义没有发生变化,那么表空间也允许恢复到指定时间点,或 者恢复到指定 LSN。否则可能导致数据与定义不一致,致使后续发生访问异常。

        与库恢复一样,表空间恢复的 REDO 日志既可以是来源于一个库备份集,也可以从本地 归档日志文件中提取。表空间备份默认不会拷贝 REDO 日志到备份集中,因此从表空间备份 集还原后,需要从本地归档日志文件获取相关的 REDO 日志。表空间恢复同样要求满足归档 日志覆盖[START_LSN, END_LSN]的要求。

        注意:表空间恢复结束,并执行 ONLINE 表空间操作后,用户就可以访问这个表空间; 但 ONLINE 操作并不会触发事务回滚,所以重做 REDO 日志产生的未 COMMIT 事务,也不 会被回滚掉。比如,插入数据并提交时 LSN 值是 50000,如果因指定 UNTIL 或者数据库故 障恢复到 LSN=49999(此时事务处于未提交状态),与恢复到 LSN=50000 时的数据保持一 致。

        警告:使用表空间还原到指定时间点、或者指定 LSN 功能之前,用户需要确保在指定 时间点或 LSN 之后,没有执行与这个表空间数据库对象相关的 DDL 操作。

(五)未还原库恢复

        未还原库是指没有经过数据还原的库,比如过去工作数据库的一份拷贝,这份拷贝库就 称为未还原数据库。这类库要恢复到最新状态,需要先将数据库调整为还原状态,然后再执 行数据恢复操作即可。

(六)DMDSC 库恢复

        DMDSC 库与普通单节点数据库的区别在于 DMDSC 库的多个节点共同维护一份库数据, 每个节点上都有独立的联机日志和本地归档日志。重做 REDO 日志恢复时,需要重做所有节 点上的 REDO 日志,因此需要提供各个节点的归档日志。

        DMDSC 库恢复也支持未还原库恢复。

六、解压缩与解密

        解密和解压缩是备份过程中加密和压缩的逆操作,如果若备份时未指定加密或压缩,还 原和恢复过程中也不需要执行解密或者解压缩操作。

        如果备份时进行了加密,那么还原时用户必须指定与备份时一致的加密密码和加密算法, 否则还原会报错。DM 还原时的解密过程主要包括:

1.检查用户输入的密码和算法是否与备份集中记录的加密信息一致;

2.从备份集读取数据之后,写到目标文件(包括目标数据文件和临时归档文件)之前 执行解密操作。

        与解密不同,解压缩不需要用户干预,如果备份集指定了压缩,从备份集读取数据写到 目标文件之前,会自动进行解压缩操作。

        如果备份时既指定了加密又指定了压缩,那么与备份过程处理相反,还原时会先进行解 密,再进行解压缩,然后将处理后的数据写入到目标文件中。

七、并行还原        

        指定并行备份生成的备份集,在还原时默认采用并行方式还原,并行度上限为备份时指 定的并行数,实际并行度由 DMAP 最终创建成功的并行子任务数决定。并行备份产生的备份 集,在还原时可以通过指定 NOT PARALLEL 子句关闭并行还原功能,以非并行方式还原。 目前,非并行备份生成的备份集,不支持以并行方式还原。

八、归档日志备份与还原

        除了通常意义上的数据备份、还原之外,DM 还支持对本地归档日志文件进行备份和还原。归档日志备份是数据库备份的一个有效补充,我们知道归档日志文件中保存了所有数据 库操作产生的 REDO 日志,因此,在理论上,只要有一个基准备份集,加上完整的归档日志, 我们可以将数据库恢复到任意时间点的状态。

(一)归档日志备份

        与联机备份收集备份过程中产生的 REDO 日志写入备份集不同,归档日志备份专门用来 备份本地归档日志文件,将符合条件的本地归档日志文件拷贝到备份集中保存起来。

        归档日志备份仅备份指定数据库生成的本地归档日志文件,要求归档日志文件的 DB_MAGIC 与数据库的 DB_MAGIC 保持一致。如果本地归档目录中包含多个不同数据库的 归档日志文件,也只会备份一个特定数据库的归档日志。由于经过还原后数据库的 DB_MAGIC 会产生变化,因此即便 PERMANENT_MAGIC 相同,DB_MAGIC 不同的数据库产 生的归档日志也不会备份。

        与普通的数据库备份一样,归档日志备份也支持加密与压缩功能,可以联机执行归档日 志备份,也可以在数据库关闭情况下使用 DMRMAN 工具进行脱机备份。归档日志备份时, 可以指定是否删除已经备份的归档日志文件,在生成归档日志备份集的同时,删除本地归档 日志文件,释放磁盘空间。

        由于本地归档的异步实现机制,为了确保归档日志备份的完整性,一般会在归档日志备 份之前执行一个归档切换动作。

(二)归档日志还原

        归档日志还原就是将备份集中的归档日志文件重新拷贝到指定归档目录中。使用归档日 志备份集,既可以将归档日志文件还原到指定数据(还原时指定目标库的 dm.ini)的归档 目录,也可以还原到用户指定的任意归档目录中。

归档日志还原的过程包括:

1. 根据过滤条件,从归档日志备份集收集需要还原的归档日志文件;

2. 在指定的归档目录创建归档文件,如果目标归档文件已经存在,默认采用认为该归 档完好,生成一条日志记录,不再还原策略;

        也可以使用 OVERWRITE 指定策略。1:表示认为归档文件完好,不再还原该归档文件, 添        加一条日志记录;2:表示存在同名归档立即报错返回,终止还原;3:表示强制删除归档,重新还原同名归档。

3. 从备份集拷贝 REDO 日志,写入目标归档日志文件; 如果备份时指定了加密或压缩,还原过程中会先经过解压缩和解密处理,再写回到目标 归档日志文件中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值