1 备份恢复概述
DM7 数据库中的数据存储在数据库的物理数据文件中,数据文件按照页、簇和段的方式进行管理,数据页是最小的数据存储单元。任何一个对 DM7 数据库的操作,归根结底都是对某个数据文件页的读写操作。
关于这些结构可以参考:
DM7 达梦数据库 逻辑结构 说明
https://www.cndba.cn/dave/article/3568
DM7 备份的本质就是从数据库文件中拷贝有效的数据页保存到备份集中,这里的有效数据页包括数据文件的描述页和被分配使用的数据页。而在备份的过程中,如果数据库系统还在继续运行,这期间的数据库操作并不是都会立即体现到数据文件中,而是首先以日志的形式写到归档日志中,因此,为了保证用户可以通过备份集将数据恢复到备份结束时间点的状态,就需要将备份过程中产生的归档日志也保存到备份集中。
还原与恢复是备份的反过程。还原是将备份集中的有效数据页重新写入目标数据文件的过程。恢复则是指通过重做归档日志,将数据库状态恢复到备份结束时的状态;也可以恢复到指定时间点和指定 LSN。恢复结束以后,数据库中可能存在处于未提交状态的活动事务,这些活动事务在恢复结束后的第一次数据库系统启动时,会由 DM7 数据库服务器自动进行回滚。
DM 数据库的备份还原包括两种类型:物理备份还原和逻辑备份还原。
物理备份还原是对数据库的操作系统物理文件(如数据文件、控制文件和日志文件等)的备份还原。例如使用 RMAN 工具进行的备份还原。
逻辑备份还原是对数据库逻辑组件(如表、视图和存储过程等数据库对象)的备份还原。例如使用 dexp和 dimp 进行的备份还原。
2 表空间与数据文件
DM7 数据库的表空间是一个逻辑概念,其目的主要是为了方便数据库的管理,数据库的所有对象在逻辑上都存放在某个表空间中,而物理上都存储在所属表空间的数据文件中。一个表空间由一个或多个数据文件组成。
数据文件是数据库中最重要的文件类型,是真实数据存储的地方。DM7 中数据文件的扩展名为.dbf,分为系统默认生成的数据文件和用户自己创建的数据文件两类。
在创建 DM7 数据库时,系统会自动创建 5 个表空间:SYSTEM 表空间、ROLL 表空间、MAIN 表空间、TEMP 表空间和 HMAIN 表空间。DM7 自动为这几个自动创建的表空间分别生成默认的数据文件:SYSTEM.DBF、ROLL.DBF、MAIN.DBF 和 TEMP.DBF,HMAIN 表空间没有默认的数据文件。
关于表空间的说明也可以参考:
DM7 达梦数据库 逻辑结构 说明
https://www.cndba.cn/dave/article/3568
注意:DM7 的物理备份还原不支持:
TEMP 表空间。
HUGE 表空间,即数据库备份和还原不包括 HMAIN 和用户创建的 HUGE表空间;也不支持对 HMAIN 和用户创建的 HUGE 表空间进行表空间备份和还原。DM7 提供了 HUGE 表备份还原系统函数支持 HUGE 表的联机备份还原。
关于HUGE 表空间的说明可以参考我的博客:
DM7 达梦数据库 列存储表 HUGE表 管理说明
https://www.cndba.cn/dave/article/3583
3 重做日志
重做日志,又叫 REDO 日志,记录了所有物理页的修改,基本信息包括操作类型、表空间号、文件号、页号、页内偏移、实际数据等。数据库中 INSERT、DELETE、UPDATE等 DML 操作以及 CREATE TABLE 等 DDL 操作转化为对某些数据文件、某些数据页的修改。因此,在系统故障重启时,通过重做 REDO 日志,可以将数据库恢复到故障时的状态。
DM7 数据库默认包含两个扩展名为 log 的日志文件,用来保存 REDO 日志,称为联机重做日志文件。这两个文件循环使用。任何数据页从内存缓冲区写入磁盘之前,必须保证其对应的 REDO 日志已经写入到联机日志文件。
4 归档日志
DM7数据库可以在归档和非归档两种模式下运行。
DM7 支持多种归档方式,本文中若无特殊说明,均指本地归档。当数据库处于归档模式下且配置了本地归档时,REDO 日志先写入联机日志文件,然后再异步写入归档日志文件。归档日志文件以配置的归档名称和文件创建时间命名,扩展名也是 log。
系统在归档模式下运行会更安全,当出现介质故障,如磁盘损坏导致数据文件丢失、异常时,利用归档日志,系统可以恢复至故障发生的前一刻。因此,建议将归档目录与数据文件配置、保存到不同的物理磁盘上。
除了表备份还原,其他的联机备份与还原必须运行在归档模式下。
关于重做日志和归档的更多内容可以参考:
DM7 达梦数据库 物理结构 说明
https://www.cndba.cn/dave/article/3571
DM7 达梦数据库 重做日志管理 及 归档模式切换
https://www.cndba.cn/dave/article/3575
5 检查点
DM7 数据库运行过程中,用户的所有操作都在内存中进行。每修改一条记录都必须先把记录所在的数据页加载到 BUFFER 缓冲区中,然后进行修改。事务运行时,会把生成的REDO 日志保留在日志缓冲区 RLOG_BUF 中,每条日志记录对应一个 LSN,当事务提交或日志缓冲区满或执行检查点时会进行日志刷盘。
检查点(checkpoint)是一个数据库事件,它的功能是按照数据页的修改顺序,依次将 BUFFER 缓冲区中的脏页写入磁盘,并在这个过程中动态调整 CKPT_LSN 值,释放日志空间。
DM7 的检查点分为两种:完全检查点和部分检查点:
1)完全检查点:会将内存缓冲区中的所有脏页写入磁盘,并调整 CKPT_LSN,在数据库正常关闭时会产生一个完全检查点。
2)部分检查点 :根据 dm.ini 配置文件中的参数 CKPT_FLUSH_RATE 和CKPT_FLUSH_PAGES,确定每次检查点刷脏页的数量。执行部分检查点的过程中,DDL/DML操作都可以正常执行,DM7 系统中绝大多数情况下触发的都是部分检查点。
DM7 中几个重要的 LSN 值如下:
1.LSN :LSN(Log Sequence Number)是由系统自动维护的 Bigint 类型数值,具有自动递增、全局唯一特性,每一个 LSN 值代表着 DM 系统内部产生的一个物理事务。物理事务(Physical Transaction,简称 ptx)是数据库内部一系列修改物理数据页操作的集合,与数据库管理系统中事务(Transaction)概念相对应,具有原子性、有序性、无法撤销等特性。
2.CUR_LSN:系统当前 LSN,代表已经分配的最大 LSN 值。物理事务提交时,系统会为其分配一个唯一的 LSN 值(CUR_LSN + 1),同时修改 CUR_LSN 值为 CUR_LSN + 1。
3.FILE_LSN :文件 LSN,已经写入联机重做日志文件的最大 LSN 值。每次将 RLOG_BUF 写入联机重做日志文件后,都会修改 FILE_LSN 值。
4.FLUSH_LSN:FLUSH_LSN 是已经发起日志刷盘请求,但还没有真正写入联机,Redo 日志文件的最大 LSN 值。
5.CKPT_LSN :检查点 LSN,所有 LSN <= CKPT_LSN 的物理事务修改的数据页,都已经从 BUFFER缓冲区写入磁盘。因此,数据库故障重启时,CKPT_LSN 之前的 REDO 日志不需要重做,只需要从 CKPT_LSN+1 开始重做 REDO 日志,就可以将系统恢复到故障前状态。并且,在联机重做日志文件中,LSN 值<=CKPT_LSN 的 REDO 日志都可以被覆盖。
根据以上介绍的几个 LSN 值,我们为确定备份范围特别定义了两个 LSN:
1)START_LSN :为了保证备份的完整性和有效性,必须包含的归档日志起始 LSN 值。START_LSN = 备份开始时 CKPT_LSN + 1。
2)END_LSN:为了保证备份的完整性和有效性,必须包含归档日志结束 LSN 值。END_LSN = 备份结束时 FILE_LSN。如果 START_LSN 等于 END_LSN + 1,则表明备份过程中,没有任何数据被修改。
在做增量备份时,要求其 START_LSN 必须大于等于基准备份的 END_LSN 值,这个要求可以简化还原过程,避免还原基准备份后必须先进行恢复再还原增量备份。
在联机日志文件中,可以覆盖写入 REDO 日志的文件长度为可用日志空间;不能被覆盖的 REDO 日志,系统故障重启需要重做的 REDO 日志为有效日志,有效日志的 LSN 取值范围是(CKPT_LSN,FILE_LSN]。
数据库运行过程中产生的待写入日志首先写入日志缓冲区 RLOG_BUF,当日志刷盘时一起写入联机日志文件中。
6 备份集
备份集用来存放备份过程中产生的备份数据及备份信息。一个备份集对应了一次完整的备份。一般情况下,一个备份集就是一个目录,备份集包含一个或多个备份片文件,以及一 个备份元数据文件。
6.1 备份片
备份片用来存储备份数据的文件。备份时,目标数据文件内容或归档日志内容经过处理后,都会存放到各自的备份片文件中。备份片文件后缀为.bak,用来存放备份数据,备份集中存放数据页的文件称为数据备份片,存放 REDO 日志的备份片称为日志备份片。 备份片的大小可以在备份时通过 MAXPIECESIZE 指定,一个备份集中可能生成多个备份片。
6.2 元数据
元数据文件用来存放备份信息,元数据文件的后缀为.meta。通过元数据文件,可以了解整个备份集信息。元数据文件中包含的备份信息包括:
1) 备份集本身相关的信息,如是否联机备份,备份的范围,备份的加密信息,以及备份的压缩信息等;
2) 备份源库的建库参数信息,如 RAC 的节点数,是否大小写敏感,PAGE_CHECK 属性等;
3) 数据文件信息,如备份了哪些数据文件,文件大小,以及文件相关的表空间信息等;
4) 备份片的信息,如包含哪些备份片文件、备份片大小等信息;
5) 备份库的 dm.ini 参数信息 和 密 钥 文件( dm_service.private 或 者dm_external.config,若指定 usbkey 加密,则不备份)。
6.3 备份集搜索目录
备份集搜索目录,用于搜集目标备份集的文件路径。备份集搜索目录包括 4 类:
1)数据库的默认备份目录;
2)WITH BACKUPDIR 子句指定的目录;
3)还原时备份集所在的上级目录;
4)增量备份时基备份集所在的上级目录。
如果使用第三方备份(介质为 TAPE 类型),则只搜索 WITH BACKUPDIR 子句指定的备份集目录,具体搜集方式由第三方备份程序决定。
7 备份
备份就是从源库(备份库)中读取有效数据页、归档日志等相关信息,经过加密、压缩等处理后写入备份片,并将相关备份信息写入备份元数据文件的过程。
7.1 逻辑备份和物理备份
逻辑备份是指利用 dexp 导出工具,将指定对象(库级、模式级、表级)的数据导出到文件的备份方式。逻辑备份针对的是数据内容,并不关心这些数据物理存储在什么位置。
物理备份则直接扫描数据库文件,找出那些已经分配、使用的数据页,拷贝并保存到备份集中。物理备份过程中,不关心数据页的具体内容是什么,也不关心数据页属于哪一张表,只是简单的根据数据库文件系统的描述,来挑选有效的数据页。
7.2 联机备份和脱机备份
数据库处于运行状态、并正常提供数据库服务情况下进行的备份操作,我们称为联机备份。数据库处于关闭状态时进行的备份操作,被称为脱机备份。
从 V2.0 版本开始,使用 DMRMAN 工具进行脱机备份,并且支持对异常关闭的数据库进行脱机库备份。备份异常关闭的数据库,要求配置了本地归档,如果本地归档不完整,则需要先修复本地归档,再进行备份。
联机备份则使用客户端工具连接到服务器实例后,通过执行 SQL 语句进行;也可以通过配置作业,定时完成自动备份。联机备份不影响数据库正常提供服务,是最常用的备份手段之一。
联机备份时,可能存在一些处于活动状态的事务正在执行,为确保备份数据的一致性,需要将备份期间产生的 REDO 日志一起备份。因此,只能在配置本地归档、并开启本地归档的数据库上执行联机备份。
只有已经关闭的数据库才允许执行脱机备份。正在运行的数据库,无法执行脱机备份,系统会报错。
7.3 数据备份和归档日志备份
按照备份内容不同,可以分为数据备份和归档日志备份。数据备份主要针对数据文件内容,包括库备份、表空间备份和表备份。
库备份,又称为库级备份。库备份会拷贝数据库中所有数据文件的有效数据页,如果是联机备份,则还会拷贝备份过程中产生的归档日志,写入到备份集中。
表空间备份是针对特定表空间执行的备份,又称为表空间级备份。表空间备份只能在联机状态下执行。
表备份则拷贝指定表的所有数据页到备份集中,并会记录各个数据页之间的逻辑关系用以恢复。表备份只能在联机状态下执行,一次表备份操作只能备份一张用户表,并且不支持增量表备份。
归档日志备份,是专门针对归档日志文件进行操作,不涉及任何数据文件内容。归档日志备份扫描归档目录收集档文件,并将归档日志写入到备份集中。既可以在数据库运行状态下,执行联机归档日志备份;也可以在数据库关闭状态下执行脱机归档日志备份。
7.4 一致性备份和非一致性备份
按照备份集中的数据是否满足一致性,可以将备份划分为一致性备份和非一致性备份。
一致性备份的备份集包含了完整的数据文件内容和归档日志信息;利用一个单独的备份集可以将数据库恢复到备份时状态。不指定 WITHOUT LOG 选项的联机备份生成的备份集就是一致性备份。脱机数据库备份会强制将检查点之后的有效 REDO 日志拷贝到备份集中,因此,脱机备份一定是一致性备份。数据库正常关闭时,会生成完全检查点,脱机备份生成的备份集中,不包含任何 REDO 日志。
非一致性备份的备份集只包含数据文件相关内容,没有归档日志信息,利用非一致性备份还原的数据库,无法直接启动,必须借助归档日志来恢复。表空间备份、指定 WITHOUT LOG选项的联机备份生成的备份集都是非一致性备份集。
7.5 完全备份和增量备份
按照备份数据完整性,可将备份分为完全备份和增量备份。库备份和表空间备份支持增量备份,表备份不支持增量备份。
完全备份生成的备份集包含了指定库(或者表空间)的全部有效数据页。当数据规模比较大的情况下,生成的完全备份集通常会比较大,而且备份时间也会比较长。
增量备份是在某个特定备份集基础上,收集数据库新修改的数据页进行备份,可以有效减少备份集的空间占用、提高备份速度。这个特定的、已经存在的备份集称为增量备份的基备份,根据对基备份的要求不同,DM 的增量备份分为以下两种:
1. 差异增量备份
差异增量备份的基备份既可以是一个完全备份集,也可以是一个增量备份集。
利用增量备份进行还原操作时,要求其基备份必须是完整的;如果差异增量备份的基备份本身也是一个增量备份,那么同样要求其基备份是完整的;任何一个增量备份,最终都是以一个完全备份作为其基备份。因此,完全备份是增量备份的基础。
2. 累积增量备份
累积增量备份的基备份只能是完全备份集,而不能是增量备份集。
增量备份时,并不关心其基备份集是脱机备份生成的,还是联机备份生成的,脱机增量备份的基备份集可以是联机备份生成的,联机增量备份的基备份集也可以是脱机备份生成的。
8 还原与恢复
还原是备份的逆过程,就是从备份集中读取数据页,并将数据页写入到目标数据库对应数据文件相应位置的过程。
由于联机备份时,系统中可能存在一些处于活动状态的事务正在执行,并不能保证备份集中的所有数据页是处于一致性状态;而脱机备份时,数据页不一定是正常关闭的,也不能保证备份集中所有数据页是处于一致性状态。因此,还原结束后目标库有可能处于非一致性状态,不能马上提供数据库服务;必须要进行数据库恢复操作后,才能正常启动。
8.1 逻辑还原和物理还原
逻辑还原是逻辑备份的逆过程,逻辑还原就是使用 dimp 工具,把 dexp 导出的备份数据重新导入到目标数据库。
物理还原是物理备份的逆过程,物理还原一般通过 DMRMAN 工具(或者 SQL 语句),把备份集中的数据内容(数据文件、数据页、归档文件)重新拷贝、写入目标文件。
8.2 联机还原和脱机还原
联机还原指数据库处于运行状态时,通过 SQL 语句执行还原操作。表空间还原和表还原可以在联机状态下执行,并且表空间还原要求目标表空间不是 ONLINE 状态。
脱机还原指数据库处于关闭状态时执行的还原操作,脱机还原通过 DMRMAN 工具进行。
库备份、表空间备份和归档备份,可以执行脱机还原。脱机还原操作的目标库必须处于关闭状态。
8.3 数据还原和归档日志还原
根据备份集类型,数据还原可以分为库还原、表空间还原和表还原。库还原的目标库必须处于关闭状态;表空间还原既可以脱机执行也可以联机执行;表还原操作只能联机执行。
表空间还原的数据来源既可以是表空间备份集,也可以是库备份集。还原的目标表空间不能是 TEMP 表空间,只能是 MAIN、SYSTEM、ROLL 表空间,或者用户定义的表空间。
表还原从表备份集读取数据,重新恢复目标表数据,还会在目标表上重建索引、约束。
归档日志还原则将归档日志备份集中的归档日志内容,重新生成到指定目录中。
8.4 完全还原和增量还原
完全还原是指直接利用完全备份集进行数据还原操作。增量还原指通过增量备份集进行数据还原操作。但是考虑到增量备份集的基础一定是一个完全备份集,因此增量还原过程中隐含了一个完全还原操作。如果增量备份集的基备份集被删除了,那么单独使用这个增量备份集是无法进行还原操作的。
物理备份还原练习
案例1:对dmserver 数据库进行冷备(完整备份)
第一步: 通过DM服务查看器,先关闭要备份的实例,但是dmap 服务要开启
第二步. 在dm7/bin目录下输入 ./dmrman
第三步:使用命令备份 backup database ‘/dm7/data/DAMENG/dm.ini’;
看到backup successfull 就是备份成功
案例2:对dmserver 数据库进行热备(完整/增量备份)
前提:
1.先把数据库实例启动
2.创建一个备份目录,/dm7/backup
第一步. 开启归档日志,可以用管理工具进行开归档
第二步:进行全备/增量备份
方法1.使用sql命令
SQL> backup database full backupset ‘dm7/backup/full_bak’;
SQL> backup database increment backupset '/dm7/backup/incr_bak';
注意:如果基备没有变化,是不能增量备的
方法2.使用DM管理工具
左侧节点,找到备份--》库备份--》新建备份,选择全备或增量备份
备份成功后可以到/dm7/data/DAMENG/bak/DB_DAMENG_FULL_2019xxxx目录下查看备份文件
备份表空间和表
1. 备份dmhr这个表空间,备份到dm7/backup目录下
SQL> backup tablespace dmhr backupset ‘/dm7/backup/dmhr_bak’;
2. 备份dmhr的employee表,备份到dm7/backup目录下
SQL> backup table dmhr.employee backupset ‘/dm7/backup/dmhr_bak’;
还原表空间
案例:模拟表空间tbs2损坏,从热备全备中恢复tbs2表空间
1.删除tbs2 的两个表空间文件
mv tbs2_01.dbf tbs2_01_bak.dbf
2. 重启数据库实例
3. 手动将数据库实例从mount到open
SQL> alter database open;
4. 查看表空间
SQL> select tablespace_name,status from dba_dablespace;
这时候tbs2是offline
如果alter tablespace tbs2 online;就会提示tbs2_01.dbf不存在
5. 开始恢复表空间
SQL> restore tablespace dmhr.tbs2 from backupset '/dm7/backup/full_bak/';
需要注意事项
备份的数据库和表空间,如果做还原,是还原到当前时刻、如果备份的表做还原,还原到表的备份时刻。
System表空间和roll表空间损坏,要重新初始化数据库实例,在用备份去还原。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。