注册
达梦数据库异机全量、增量、归档的完全/不完全恢复
技术分享/ 文章详情 /

达梦数据库异机全量、增量、归档的完全/不完全恢复

DM_336625 2026/06/18 382 0 0

环境规划

IP 数据库 系统
192.168.163.128(A) dm8 centos7.9
192.168.163.131(B) dm8 centos7.9

准备源库

  1. 安装略

  2. A库构造数据执行全量备份,增量备份,归档备份等

    -- 1.创建一张用于测试的大表 CREATE TABLE "TEST_USER_5KW" ( ID BIGINT IDENTITY(1,1) NOT NULL, USER_ID VARCHAR(50) NOT NULL, USER_NAME VARCHAR(100), AGE TINYINT, SCORE NUMBER(10,2), CREATE_TIME DATETIME DEFAULT SYSDATE, UPDATE_TIME DATETIME, IS_ACTIVE CHAR(1) DEFAULT 'Y', REGION_CODE VARCHAR(20), -- ⭐ JSON 列(达梦支持 JSON 类型) USER_JSON JSON, -- 普通大文本备用 REMARK VARCHAR(4000) ) STORAGE (ON "MAIN", CLUSTERBTR) -- 可按需改为行/列存 ; COMMENT ON TABLE TEST_USER_5KW IS '5kw 测试表,含 JSON 数据'; COMMENT ON COLUMN TEST_USER_5KW.USER_JSON IS '用户画像 JSON:包含地址、设备、标签、扩展信息'; -- 2. 插入第一批基础数据(例如 1000 行) INSERT INTO TEST_USER_5KW (USER_ID, USER_NAME, AGE, SCORE, CREATE_TIME, REGION_CODE, USER_JSON) SELECT 'U_' || LEVEL, 'name_' || LEVEL, MOD(LEVEL, 100) + 18, DBMS_RANDOM.VALUE(1000, 100000), SYSDATE - DBMS_RANDOM.VALUE(0, 365), CASE MOD(LEVEL, 10) WHEN 0 THEN 'BJ' WHEN 1 THEN 'SH' WHEN 2 THEN 'GZ' ELSE 'OTHER' END, ('{ "addr": { "city": "' || CASE MOD(LEVEL, 5) WHEN 0 THEN 'Beijing' WHEN 1 THEN 'Shanghai' ELSE 'Guangzhou' END || '", "zone": "zone_' || MOD(LEVEL, 20) || '" }, "device": { "os": "' || CASE MOD(LEVEL, 3) WHEN 0 THEN 'Android' WHEN 1 THEN 'iOS' ELSE 'Harmony' END || '", "ver": "' || ROUND(DBMS_RANDOM.VALUE(1, 15), 1) || '" }, "tags": ["vip", "level_' || MOD(LEVEL, 10) || '", "active_' || MOD(LEVEL, 2) || '"], "score_meta": ' || DBMS_RANDOM.VALUE(0, 99999) || ' }') FROM DUAL CONNECT BY LEVEL <= 10000; ---3.插入数据脚本 INSERT INTO TEST_USER_5KW (USER_ID, USER_NAME, AGE, SCORE, CREATE_TIME, REGION_CODE, USER_JSON) SELECT 'COPY_' || USER_ID, USER_NAME || '_c', AGE, SCORE * 0.99, CREATE_TIME + 1, REGION_CODE, USER_JSON FROM TEST_USER_5KW WHERE ID <= 10000; COMMIT; ---查询一下构造的数据 SQL> select count(*) from TEST_USER_5KW; 行号 COUNT(*) ---------- -------------------- 1 80000 SQL> select id from TEST_USER_5KW order by id desc limit 10; 行号 ID ---------- -------------------- 1 80000 2 79999 3 79998 4 79997 5 79996 6 79995 7 79994 8 79993 9 79992 10 79991 ---联机全量备份,然后插入数据 SQL> backup database backupset '/dmdata/dmbak/fullbak_0604'; SQL> select id from TEST_USER_5KW order by id desc limit 2; 行号 ID ---------- -------------------- 1 90000 2 89999 ---联机增量备份,然后插入数据 SQL> backup database increment base on backupset '/dmdata/dmbak/fullbak_0604' backupset '/dmdata/dmbak/fullbak_0604_incre1'; SQL> select id from TEST_USER_5KW order by id desc limit 2; 行号 ID ---------- -------------------- 1 100000 2 99999 --继续联机增量备份,然后插入数据 SQL> backup database increment base on backupset '/dmdata/dmbak/fullbak_0604' backupset '/dmdata/dmbak/fullbak_0604_incre2'; SQL> select id from TEST_USER_5KW order by id desc limit 2; 行号 ID ---------- -------------------- 1 110000 2 109999 ---查看最新归档和redolog SQL> select STATUS,PATH,ARCH_LSN,CLSN from v$arch_file; 行号 STATUS PATH ARCH_LSN ---------- -------- ------------------------------------------------------------------------ -------------------- CLSN -------------------- 10 INACTIVE /dmdata/arch/arch2/ARCHIVE_LOCAL1_0x109C76AB_EP0_2026-06-01_16-54-31.log 13288343 13318912 11 ACTIVE /dmdata/arch/arch2/ARCHIVE_LOCAL1_0x109C76AB_EP0_2026-06-02_17-08-22.log 13318913 13501928 SQL> SELECT FILE_LSN,FLUSH_LSN,CUR_LSN FROM v$rlog; 行号 FILE_LSN FLUSH_LSN CUR_LSN ---------- -------------------- -------------------- -------------------- 1 13501928 13501928 13501928

准备目标库

  1. 安装略
  2. 拷贝备份
  3. 查看备份信息
    RMAN> show backupset ‘/dmdata/dmbak/fullbak_0604’;

同目录全备恢复

#还原 #指定REUSE DMINI参数,可恢复dm.ini中除路径相关的INI参数 dmrman ctlstmt="restore database '/dmdata/data2/DAMENG/dm.ini' reuse dmini from backupset '/dmdata/dmbak/fullbak_0604'" #恢复 RMAN> recover database '/dmdata/data2/DAMENG/dm.ini' from backupset '/dmdata/dmbak/fullbak_0604' #更新db_magic RMAN> recover database '/dmdata/data2/DAMENG/dm.ini' update db_magic #启动数据库 dmserver /dmdata/data2/DAMENG/dm.ini #disql查询数据与源库一直 SQL> select id from TEST_USER_5KW order by id desc limit 2; LINEID ID ---------- -------------------- 1 80000 2 79999

全备恢复,使用映射文件改变文件路径

#根据全备份文件生成映射文件 RMAN> dump backupset '/dmdata/dmbak/fullbak_0604' mapped file '/dmdata/data3/map_file_01.txt' #修改映射文件中的路径 [dmdba@dm4 data3]$ cat map_file_01.txt /**************************************************************/ /*** Delete the unnecessary modified groups **/ /*** Modify the data_path or mirror_path only in one group **/ /**************************************************************/ /**=============================================================**/ /*[DAMENG2_SYSTEM_FIL_0]*/ fil_id = 0 ts_id = 0 ts_name = "SYSTEM" data_path = "/dmdata/data3/DAMENG2/SYSTEM.DBF" mirror_path = data_mirror = 1 data_striping = 0 /**=============================================================**/ /*[DAMENG2_ROLL_FIL_0]*/ fil_id = 0 ts_id = 1 ts_name = "ROLL" data_path = "/dmdata/data3/DAMENG2/ROLL.DBF" mirror_path = data_mirror = 1 data_striping = 0 /**=============================================================**/ /*[DAMENG2_RLOG_FIL_4]*/ ts_id = 2 ts_name = "RLOG" data_path = data_mirror = 1 data_striping = 0 /**=============================================================**/ /*[DAMENG2_MAIN_FIL_0]*/ fil_id = 0 ts_id = 4 ts_name = "MAIN" data_path = "/dmdata/data3/DAMENG2/MAIN.DBF" mirror_path = data_mirror = 1 data_striping = 0 /***************************** END ****************************/ #全备还原时MAPPED FILE指定映射文件 RMAN> restore database '/dmdata/data2/DAMENG/dm.ini' reuse dmini from backupset '/dmdata/dmbak/fullbak_0604' mapped file '/dmdata/data3/map_file_01.txt' #全备恢复 RMAN> recover database '/dmdata/data2/DAMENG/dm.ini' from backupset '/dmdata/dmbak/fullbak_0604' RMAN> recover database '/dmdata/data2/DAMENG/dm.ini' update db_magic #启动数据库后查询表空间目录和数据 SQL> select t.name,d.path from v$tablespace as t,v$datafile as d where t.id=d.id; LINEID NAME PATH ---------- ------ -------------------------------- 1 SYSTEM /dmdata/data3/DAMENG2/SYSTEM.DBF 2 SYSTEM /dmdata/data3/DAMENG2/MAIN.DBF 3 SYSTEM /dmdata/data2/DAMENG/TEMP.DBF 4 SYSTEM /dmdata/data3/DAMENG2/ROLL.DBF used time: 17.104(ms). Execute id is 601. SQL> select id from TEST_USER_5KW order by id desc limit 2; LINEID ID ---------- -------------------- 1 80000 2 79999

增量备份恢复

#使用某个增量备份文件还原,自动会还原其依赖的基全备份 RMAN> restore database '/dmdata/data2/DAMENG/dm.ini' reuse dmini from backupset '/dmdata/dmbak/fullbak_0604_incre1' #恢复 RMAN> recover database '/dmdata/data2/DAMENG/dm.ini' from backupset '/dmdata/dmbak/fullbak_0604_incre1' RMAN> recover database '/dmdata/data2/DAMENG/dm.ini' update db_magic #启动数据库查询数据,和第一个增量备份数据相同 SQL> select id from TEST_USER_5KW order by id desc limit 2; LINEID ID ---------- -------------------- 1 90000 2 89999

最新增量备份+归档进行完全恢复

#查看备份集信息,查看clsn信息,备份时间信息等 RMAN> check backupset '/dmdata/dmbak/fullbak_0604_incre2' RMAN> show backupset '/dmdata/dmbak/fullbak_0604_incre2' #从源库拷贝需要的归档 scp ARCHIVE_LOCAL1_0x109C76AB_EP0_2026-06-02_17-08-22.log dmdba@192.168.163.131:/dmdata/dmbak/ #使用最后1个增量备份还原,自动会还原基全备份 RMAN> restore database '/dmdata/data2/DAMENG/dm.ini' from backupset '/dmdata/dmbak/fullbak_0604_incre2' #恢复归档,不指定恢复到某个时间点或者LSN,如果不指定恢复到某个时间点或者LSN会应用归档中所有日志 RMAN> recover database '/dmdata/data2/DAMENG/dm.ini' with archivedir '/dmdata/dmbak' RMAN> recover database '/dmdata/data2/DAMENG/dm.ini' update db_magic #启动服务查询数据,为最新插入的数据 SQL> select id from TEST_USER_5KW order by id desc limit 2; LINEID ID ---------- -------------------- 1 110000 2 109999 SQL> SELECT N_EP, APPLY_LSN_ARR FROM V$RAPPLY_LSN_INFO; LINEID N_EP APPLY_LSN_ARR ---------- ----------- ------------- 1 0 (13501940) #源库查询 SQL> SELECT CKPT_LSN,FILE_LSN from v$rlog; 行号 CKPT_LSN FILE_LSN ---------- -------------------- -------------------- 1 13501940 13501945

最新备份+归档进行不完全恢复

#继续插入数据 #查看备份集信息,查看clsn信息,备份时间信息等 RMAN> check backupset '/dmdata/dmbak/fullbak_0604_incre2' RMAN> show backupset '/dmdata/dmbak/fullbak_0604_incre2' #从源库拷贝需要的归档 scp ARCHIVE_LOCAL1_0x109C76AB_EP0_2026-06-02_17-08-22.log dmdba@192.168.163.131:/dmdata/dmbak/ #使用最后1个增量备份还原,自动会还原基全备份 RMAN> restore database '/dmdata/data2/DAMENG/dm.ini' from backupset '/dmdata/dmbak/fullbak_0604_incre2' #恢复归档到某个时间点或者LSN until lsn /until time RMAN> recover database '/dmdata/data2/DAMENG/dm.ini' with archivedir '/dmdata/dmbak' until time '2026-06-04 15:00:00' #恢复完成后,不更新update db_magic,使用dmserver启动时配置recover_check=0,这种状态下是以备库配置状态启动数据库, 对数据库进行只读操作,然后登录数据库后查询 dmserver /dmdata/data2/DAMENG/dm.ini recover_check=0 #启动服务,查询数据 SQL> alter database open force; executed successfully SQL> select id from TEST_USER_5KW order by id desc limit 2; LINEID ID ---------- -------------------- 1 110000 2 109999 #没有想要的数据,关闭服务,继续恢复到其他时间点 RMAN> recover database '/dmdata/data2/DAMENG/dm.ini' with archivedir '/dmdata/dmbak' until time '2026-06-04 17:00:00' #启动服务,查询数据 dmserver /dmdata/data2/DAMENG/dm.ini recover_check=0 SQL> alter database open force; executed successfully SQL> select id from TEST_USER_5KW order by id desc limit 2; LINEID ID ---------- -------------------- 1 120000 2 119999 #如果已经找到数据想正常使用,在关闭数据库,更新db_magic即可

数据库备份加归档备份完全/不完全恢复

#源库备份所有归档 SQL> backup archivelog all backupset '/dmdata/dmbak/arch_all_bak'; #传输备份归档到目标库 scp -r arch_all_bak dmdba@192.168.163.131:/dmdata/dmbak #需要先将归档备份集还原成原始归档文件 RMAN> RESTORE ARCHIVE LOG FROM BACKUPSET '/dmdata/dmbak/arch_all_bak' TO ARCHIVEDIR '/dmdata/dmbak' #检查归档连续性 dmrachk F_TYPE=1 F_PATH=/dmdata/dmbak/ #还原 RMAN> restore database '/dmdata/data2/DAMENG/dm.ini' from backupset '/dmdata/dmbak/fullbak_0604_incre2' #恢复 RMAN> recover database '/dmdata/data2/DAMENG/dm.ini' with archivedir '/dmdata/dmbak' #不完全恢复 RMAN> recover database '/dmdata/data2/DAMENG/dm.ini' with archivedir '/dmdata/dmbak' until time '2026-06-04 17:00:00' #只读打开或者更新打开 RMAN> recover database '/dmdata/data2/DAMENG/dm.ini' update db_magic #如果源库故障,归档不完整,即redolog还未写入归档日志,此时无法恢复最新数据,需要修复归档 RMAN> REPAIR ARCHIVELOG DATABASE '/opt/dmdbms/data/dm.ini';

达梦社区技术 https://eco.dameng.com

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服