DM8 数据库备份&恢复
1 备份还原简介
数据库备份是 DBA 日常最重要的工作内容。备份的主要目的是数据容灾,保证数据的安全性,在数据库发生故障时,通过还原备份集,将数据恢复到可用状态。
本章主要介绍 DM 备份与还原的概述和基本概念,为理解归档配置、备份还原的原理与工具使用奠定基础,内容主要包括:
- 概述
- 基本概念
1.1 概述
DM 数据库中的数据存储在数据库的物理数据文件中,数据文件按照页、簇和段的方式进行管理,数据页是最小的数据存储单元。任何一个对 DM 数据库的操作,归根结底都是对某个数据文件页的读写操作。
因此,DM 备份的本质就是从数据库文件中拷贝有效的数据页保存到备份集中,这里的有效数据页包括数据文件的描述页和被分配使用的数据页。而在备份的过程中,如果数据库系统还在继续运行,这期间的数据库操作并不是都会立即体现到数据文件中,而是首先以日志的形式写到归档日志中,因此,为了保证用户可以通过备份集将数据恢复到备份结束时间点的状态,就需要将备份过程中产生的归档日志也保存到备份集中。
还原与恢复是备份的逆过程。还原是将备份集中的有效数据页重新写入目标数据文件的过程。恢复则是指通过重做归档日志,将数据库状态恢复到备份结束时的状态;也可以恢复到指定时间点和指定 LSN。恢复结束以后,数据库中可能存在处于未提交状态的活动事务,这些活动事务在恢复结束后的第一次数据库系统启动时,会由 DM 数据库自动进行回滚。备份、还原与恢复的关系如图 所示。
1.2 LSN 介绍
LSN(Log Sequence Number)是由系统自动维护的 Bigint 类型数值,具有自动递增、全局唯一特性,每一个 LSN 值代表着 DM 系统内部产生的一个物理事务。物理事务(Physical Transaction,简称 ptx)是数据库内部一系列修改物理数据页操作的集合,与数据库管理系统中事务(Transaction)概念相对应,具有原子性、有序性、无法撤销等特性。
DM 数据库中与 LSN 相关的信息,可以通过查询 v$rlog 和 V$RAPPLY_PARALLEL_INFO 表来获取。DM 主要包括以下几种类型的 LSN:
- CUR_LSN 是系统已经分配的最大 LSN 值。物理事务提交时,系统会为其分配一个唯一的 LSN 值,大小等于 CUR_LSN+1,然后再修改 CUR_LSN=CUR_LSN+1。
- FLUSH_LSN 是已经发起日志刷盘请求,但还没有真正写入联机 Redo 日志文件的最大 LSN 值。
- FILE_LSN 是已经写入联机 Redo 日志文件的最大 LSN 值。每次将 Redo 日志包 RLOG_PKG 写入联机 Redo 日志文件后,都要修改 FILE_LSN 值。
- CKPT_LSN 是检查点 LSN,所有 LSN <= CKPT_LSN 的物理事务修改的数据页,都已经从 Buffer 缓冲区写入磁盘,CKPT_LSN 由检查点线程负责调整。
数据库故障重启时,CKPT_LSN 之前的 REDO 日志不需要重做,只需要从 CKPT_LSN+1 开始重做 REDO 日志,就可以将系统恢复到故障前状态。并且,在联机重做日志文件中,LSN 值<=CKPT_LSN 的 REDO 日志都可以被覆盖。
- APPLY_LSN 是数据库还原恢复后已经写入联机 Redo 日志文件的日志包的原始最大 LSN 值,APPLY_LSN 取自源库的原始日志包中的最大 LSN 值。DSC 集群的每一个节点独立维护 APPLY_LSN。
- RPKG_LSN 是数据库还原恢复后已经重演日志的最大 LSN。DSC 集群的每一个节点独立维护 RPKG_LSN。
2 数据库备份
2.1 前提条件:数据库已开启归档日志
SQL> SELECT ARCH_DEST, ARCH_FILE_SIZE, ARCH_SPACE_LIMIT FROM V$DM_ARCH_INI;
未选定行
查询结果为空,则表示数据库没有开启归档日志,执行操作:配置归档日志。
查询结果存在,则表示数据库已经开启归档日志,则可以执行操作:备份数据库。
2.1.1 配置归档日志
编辑 dm.ini 文件,设置参数 ARCH_INI=1,并保存
[root@bingo DMTEST]# vim dmarch.ini ^C
[root@bingo DMTEST]# cat dmarch.ini
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dmdata/arch/ #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb,0 表示无限制,范围 1024~4294967294M
/home/dmdba/dmdbms/bin/DmServiceDMTEST stop
/home/dmdba/dmdbms/bin/DmServiceDMTEST start
2.2 备份数据库测试
全备份数据库
SQL> BACKUP DATABASE FULL BACKUPSET '/dmdata/dmbak/db_full_bak_2025051301';
操作已执行
创建一个新表t3
SQL> select count(*) from dba_tables where owner='BINGO';
行号 COUNT(*)
---------- --------------------
1 10
SQL> create table bingo.t3(id number,name varchar2(20));
SQL> insert into bingo.t3 values(1,'bingo');
SQL> commit;
SQL> select count(*) from dba_tables where owner='BINGO';
行号 COUNT(*)
---------- --------------------
1 11
增量备份数据库
SQL> BACKUP DATABASE INCREMENT WITH BACKUPDIR '/dmdata/dmbak' BACKUPSET '/dmdata/dmbak/db_incr_bak_2025051301_01';
创建新表t4
SQL> create table bingo.t4(id number,name varchar2(20));
SQL> insert into bingo.t4 values(1,'bingo');
SQL> commit;
SQL> select count(*) from dba_tables where owner='BINGO';
行号 COUNT(*)
---------- --------------------
1 12
增量备份数据库
SQL> BACKUP DATABASE INCREMENT WITH BACKUPDIR '/dmdata/dmbak' BACKUPSET '/dmdata/dmbak/db_incr_bak_2025051301_02';
[root@bingo dmbak]# pwd
/dmdata/dmbak
[root@bingo dmbak]# ls -lrth
总用量 0
drwxr-xr-x 2 dmdba dinstall 111 5月 13 15:37 db_full_bak_2025051301
drwxr-xr-x 2 dmdba dinstall 120 5月 13 15:41 db_incr_bak_2025051301_01
drwxr-xr-x 2 dmdba dinstall 120 5月 13 15:44 db_incr_bak_2025051301_02
2.3 还原测试
2.3.1 停服务或注册新的服务
/home/dmdba/dmdbms/bin/DmServiceDMTEST stop
2.3.2 检验备份集是否正确
CHECK BACKUPSET '/dmdata/dmbak/db_full_bak_2025051301';
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:00][Remaining:00:00:00]
check backupset successfully.
time used: 218.192(ms)
2.3.3 还原
RESTORE DATABASE '/dmdata/data/DMTEST/dm.ini' FROM BACKUPSET '/dmdata/dmbak/db_full_bak_2025051301';
2.3.4 恢复
RECOVER DATABASE '/dmdata/data/DMTEST/dm.ini' FROM BACKUPSET '/dmdata/dmbak/db_full_bak_2025051301';
2.3.5 更新数据
RECOVER DATABASE '/dmdata/data/DMTEST/dm.ini' UPDATE DB_MAGIC;
2.3.6 启动服务
/home/dmdba/dmdbms/bin/DmServiceDMTEST start
Starting DmServiceDMTEST: [ OK ]
2.3.7 验证
SQL> select count(*) from dba_tables where owner='BINGO';
行号 COUNT(*)
---------- --------------------
1 10
2.3.8 增量测试
##还原
RESTORE DATABASE '/dmdata/data/DMTEST/dm.ini' FROM BACKUPSET '/dmdata/dmbak/db_incr_bak_2025051301_02';
##恢复
RECOVER DATABASE '/dmdata/data/DMTEST/dm.ini' FROM BACKUPSET '/dmdata/dmbak/db_incr_bak_2025051301_02';
##更新数据库魔数
RECOVER DATABASE '/dmdata/data/DMTEST/dm.ini' UPDATE DB_MAGIC;
[dmdba@bingo DMTEST]$ /home/dmdba/dmdbms/bin/DmServiceDMTEST start
Starting DmServiceDMTEST: [ OK ]
[dmdba@bingo DMTEST]$ disql sysdba/DMdbatest1
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 5.630(ms)
disql V8
SQL> select count(*) from dba_tables where owner='BINGO';
行号 COUNT(*)
---------- --------------------
1 12
……
关于达梦数据库更多的相关问题请浏览达梦云适配技术社区
达梦云适配技术社区
https://eco.dameng.com/




