DM 数据库可以运行在归档模式或非归档模式下。如果是归档模式,联机日志文件中的
内容保存到硬盘中,形成归档日志文件;如果是非归档模式,则不会形成归档日志。
查询 v$dm_arch_ini、v$arch_status 等动态视图可以获取归档配置以及归档状态
等相关信息。
联机备份数据库必须要配置归档,脱机备份数据库可以配置也可以不配置。正常退出的数据库会调用检查点刷盘,此时归档是完整的。故障推出的数据库必须配置归档。
备份表空间属于联机备份,必须配置归档。
备份表虽然是联机完全备份,但不需要配置归档。因为表在还原之后不需要再进行恢复
操作,用不到归档日志。
备份归档日志必须配置归档。
alter database mount;
alter database add archivelog 'dest=/dmarch ,TYPE=local,FILE_SIZE=1024,SPACE_LIMIT=102400';
alter database archivelog;
alter database open;
alter database mount;
alter database noarchivelog;
alter database open;
(1)配置dmarch.ini
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = d:\dm_arch\arch
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 2048
ARCH_HANG_FLAG = 1
DSC集群两节点为例
DSC0 实例的 dmarch.ini 配置:
ARCH_LOCAL_SHARE = 1
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = +DMDATA/dameng/arch_dsc0
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
ARCH_HANG_FLAG = 1
[ARCH_REMOTE1]
ARCH_TYPE = REMOTE
ARCH_DEST = DSC1
ARCH_INCOMING_PATH =+DMDATA/dameng/arch_dsc1
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
DSC1 实例的 dmarch.ini 配置:
ARCH_LOCAL_SHARE = 1
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST =+DMDATA/dameng/arch_dsc1
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
ARCH_HANG_FLAG = 1
[ARCH_REMOTE1]
ARCH_TYPE = REMOTE
ARCH_DEST = DSC0
ARCH_INCOMING_PATH =+DMDATA/dameng/arch_dsc0
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
BACKUP DATABASE [<备份类型>][<指定备份集子句>] [TO <备份名>] [BACKUPSET '<备份集路径>']
[DEVICE TYPE <介质类型> [PARMS '<介质参数>']]
[BACKUPINFO '<备份描述>'] [MAXPIECESIZE <备份片限制大小>]
[LIMIT
[IDENTIFIED BY <密码>|"<密码>" [WITH ENCRYPTION
[COMPRESSED [LEVEL <压缩级别>]] [WITHOUT LOG][WITHOUT MIRROR]
[TRACE FILE '
[TASK THREAD <线程数>][PARALLEL [<并行数>] [READ SIZE <拆分块大小>]];
·备份类型,省缺为FULL
完全备份FULL:完全备份生成的备份集包含了指定库(或者表空间)的全部有效数据页在完全备份中又可以具体指定为 DDL_CLONE(只拷贝元数据,不拷贝数据,仅在数据库备份中支持) 或 SHADOW(只备份SYSTEM.DBF及日志相关信息,用于还原成影子库)
增量备份INCREMENT
2.2.1在 DIsql 工具中使用 BACKUP 语句可以备份整个数据库。
只有在归档模式下才能操作联机备份数据库
语句执行完后会在默认的备份路径下生成名为“db_bak_01”的备份集目录。默认的备
份路径为 dm.ini 中 BAK_PATH 配置的路径,若未配置 BAK_PATH,则默认使用
SYSTEM_PATH 下的 bak 目录-/dmdata/DMDB/bak/
BACKUP DATABASE BACKUPSET '/dmbak/db_bak_1_01/';
BACKUP DATABASE BACKUPSET '/dmbak/db_bak/';
2.2.4创建备份集,备份名设置为“WEEKLY_FULL_BAK”。
BACKUP DATABASE TO WEEKLY_FULL_BAK BACKUPSET '/dmbak/db_bak_1_02/';
BACKUP DATABASE BACKUPSET '/dmbak/db_bak_1_03/' BACKUPINFO '完全备份';
BACKUP DATABASE BACKUPSET '/dmbak/db_bak_1_04/' MAXPIECESIZE 300;
BACKUP DATABASE BACKUPSET '/dmbak/db_bak_1_5/' COMPRESSED LEVEL 5;
BACKUP DATABASE BACKUPSET '/dmbak/db_bak_1_06/' PARALLEL 8;
BACKUP DATABASE INCREMENT WITH BACKUPDIR '/dmbak' BACKUPSET '/dmbak/db_increment_bak_01';
-WITH BACKUPDIR:指定基备份目录
-CUMULATIVE:创建累积增量备份(基备份必须是完全备份集),与之对应的是差异增量备份(基备份可以是完全备份集,也可以是增量备份集),若不指定则省缺为差异增量备份。
1) 保证故障节点的[CKPT_LSN,FILE_LSN]之间日志修改的数据页已写入磁盘。只有所有活动节点的 CKPT_LSN 大于等于故障节点的 FILE_LSN 才允许备份操作。
2) 主库备份时,只有所有活动节点 CKPT_LSN 推进到 MAX[APPLY_LSN]之后,才允许备份操作。
3) 备库备份时,需要触发检查点将所有活动节点 CKPT_LSN 推进到 MAX[APPLY_LSN]之后,才能启动备份操作。
BACKUP TABLESPACE <表空间名> [FULL | INCREMENT
句>] [TO <备份名>] [BACKUPSET '<备份集路径>'][DEVICE TYPE <介质类型> [PARMS '<介质参数>']]
[BACKUPINFO '<备份描述>'] [MAXPIECESIZE <备份片限制大小>]
[LIMIT
[IDENTIFIED BY <密码>|"<密码>" [WITH ENCRYPTION
[COMPRESSED [LEVEL <压缩级别>]][WITHOUT LOG][WITHOUT MIRROR]
[TRACE FILE '
[TASK THREAD <线程数>][PARALLEL [<并行数>][READ SIZE <拆分块大小>]];
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 作为基备份。
BACKUP TABLESPACE MAIN FULL BACKUPSET '/dmbak/ts_full_bak_01';
BACKUP TABLE <表名> [TO <备份名>] [BACKUPSET '<备份集路径>']
[DEVICE TYPE <介质类型> [PARMS '<介质参数>']] [BACKUPINFO '<备份描述>'] [MAXPIECESIZE <备份
片限制大小>] [LIMIT
[IDENTIFIED BY <密码>|"<密码>" [WITH ENCRYPTION
[COMPRESSED [LEVEL <压缩级别>]]
[TRACE FILE '
CREATE TABLE TAB_01(C1 INT);
BACKUP TABLE TAB_01 BACKUPSET '/dmbak/tab_bak_01';
BACKUP
[LSN BETWEEN
[TIME BETWEEN'
[TO <备份名>][<备份集子句>];
<备份集子句>::=BACKUPSET ['<备份集路径>'][DEVICE TYPE <介质类型> [PARMS '<介质参数>']]
[BACKUPINFO '<备份描述>'] [MAXPIECESIZE <备份片限制大小>]
[LIMIT
[IDENTIFIED BY <密码>|"<密码>" [WITH ENCRYPTION
[COMPRESSED [LEVEL <压缩级别>]] [WITHOUT LOG]
[TRACE FILE '
[TASK THREAD <线程数>][PARALLEL [<并行数>][READ SIZE <拆分块大小>]]
ALL:备份所有的归档。若不指定,则默认为 ALL。
FROM LSN:指定备份的起始 LSN。
UNTIL LSN:指定备份的截止 LSN。
FROM TIME:指定备份的开始的时间点。
UNTIL TIME:指定备份的截止的时间点。
BETWEEN ... AND ...:指定备份的区间。指定区间后,只会备份指定区间内的归档文件。
DEVICE TYPE:指存储备份集的介质类型。
LIMIT:指定备份时最大的读写文件速度,单位为 MB/S,默认为 0,表示无速度限制。
select ARCH_LSN, CLSN, PATH from V$ARCH_FILE;
存在多个归档文件时,可以选择多个归档文件组成的LSN区间进行备份。
BACKUP ARCHIVELOG LSN BETWEEN 40743 AND 43064 BACKUPSET'/dmbak/arch_bak_time_40743-43064';
l V$BACKUPSET:显示备份集基本信息。
l V$BACKUPSET_DBINFO:显示备份集的数据库相关信息。
l V$BACKUPSET_DBF:显示备份集中数据文件的相关信息。
l V$BACKUPSET_ARCH:显示备份集的归档信息。
l V$BACKUPSET_BKP:显示备份集的备份片信息。
l V$BACKUPSET_SEARCH_DIRS:显示备份集搜索目录。
l V$BACKUPSET_TABLE:显示表备份集中备份表信息。
l V$BACKUPSET_SUBS:显示并行备份中生成的子备份集信息。
l V$BACKUP_MONITOR:显示当前备份任务实时监控信息。
l V$BACKUP_HISTORY:显示最近 100 条备份监控信息。
l V$BACKUP_FILES:显示当前备份任务待备份数据文件列表。
SF_BAKSET_BACKUP_DIR_ADD:添加备份目录。
SF_BAKSET_BACKUP_DIR_REMOVE:删除内存中指定的备份目录。
SF_BAKSET_BACKUP_DIR_REMOVE_ALL:删除内存中全部的备份目录。
SF_BAKSET_CHECK:对备份集进行校验。
SF_BAKSET_REMOVE:删除指定设备类型和指定备份集目录的备份集。
SF_BAKSET_REMOVE_BATCH:批量删除满足指定条件的所有备份集。
SF_BAKSET_REMOVE_BATCH_S:批量安全删除满足指定条件的所有库级备份集。
SP_DB_BAKSET_REMOVE_BATCH:批量删除指定时间之前的数据库备份集。
SP_TS_BAKSET_REMOVE_BATCH:批量删除指定表空间对象及指定时间之前的表空间备份集。
SP_TAB_BAKSET_REMOVE_BATCH:批量删除指定表对象及指定时间之前的表备份集。
SP_ARCH_BAKSET_REMOVE_BATCH:批量删除指定条件的归档备份集
SELECT * FROM V$BACKUPSET_SEARCH_DIRS
BACKUP DATABASE FULL BACKUPSET '/dmbak/db_bak_for_check';
SELECT SF_BAKSET_CHECK('DISK','/dmbak/db_bak_for_check');
联机还原仅支持到表级,数据库、表空间、归档日志的还原必须脱机通过DMRMAN进行。
RESTORE TABLE [<表名>] [STRUCT] [KEEP TRXID]
FROM BACKUPSET'<备份集路径>' [DEVICE TYPE <介质类型> [PARMS '<介质参数>']]
[IDENTIFIED BY <密码>|"<密码>" [ENCRYPT WITH <加密算法>]]
[TRACE FILE '
STRUCT:执行表结构还原,若未指定,则认为是表中数据还原;
TRACE FILE:指定生成的 TRACE 文件。
不包含索引的简单备份还原
CREATE TABLE TAB_01(C1 INT);
BACKUP TABLE TAB_01 BACKUPSET '/dmbak/tab_bak_01';
SELECT SF_BAKSET_CHECK('DISK','/dmbak/tab_bak_01');
RESTORE TABLE TAB_01 FROM BACKUPSET '/dmbak/tab_bak_01';
包含索引的表备份恢复
CREATE INDEX I_TAB_FOR_RES_02 ON TAB_FOR_RES_02(C1);
BACKUP TABLE TAB_FOR_RES_02 BACKUPSET '/dmbak/tab_bak_for_res_02';
SELECT SF_BAKSET_CHECK('DISK','/dmbak/tab_bak_for_res_02');
INSERT INTO TAB_FOR_RES_02 VALUES(1);
COMMIT;
SELECT * FROM TAB_FOR_RES_02;
RESTORE TABLE TAB_FOR_RES_02 STRUCT FROM BACKUPSET '/dmbak/tab_bak_for_res_02';
RESTORE TABLE TAB_FOR_RES_02 FROM BACKUPSET '/dmbak/tab_bak_for_res_02';
指定还原时不重建索引
RESTORE TABLE TAB_FOR_RES WITHOUT INDEX FROM BACKUPSET '/dmbak/tab_bak_for_res_01';
指定还原时不重建约束
RESTORE TABLE TAB_FOR_RES WITHOUT CONSTRAINT FROM BACKUPSET '/home/dm_bak/tab_bak_for_res_01';
·源库:待备份的数据库。
·目标库:待还原的数据库。
DMRMAN可以在不开启归档的情况下就实现备份还原,但是硬性条件是CTL_PATH所指向的实例也就是目标库必须处于停机状态。
·启动
bin/dmrman
·退出
RMAN> exit
./dmrman CTLFILE=/home/dm_cmd/cmd_rman.txt
./dmrman CTLSTMT="BACKUP DATABASE'/opt/dmdbms/data/DAMENG/dm.ini';"
CONFIGURE |
CONFIGURE CLEAR |
CONFIGURE DEFAULT
·部分参数
BACKUPDIR:指定默认搜集备份的目录。
ARCHIVEDIR:默认搜集归档的目录。
查看当前配置
RMAN>CONFIGURE
恢复某个配置项为默认
RMAN> CONFIGURE DEFAULT DEVICE CLEAR;
恢复所有配置项为默认
RMAN> CONFIGURE CLEAR;
配置存储介质类型为TAPE
RMAN> CONFIGURE DEFAULT DEVICE TYPE TAPE PARMS 'command';
配置追踪日志文件
RMAN> CONFIGURE DEFAULT TRACE FILE '/home/trace.log ' TRACE LEVEL 2;
配置备份集搜索目录
RMAN> CONFIGURE DEFAULT BACKUPDIR;
RMAN> CONFIGURE DEFAULT BACKUPDIR '/dmbak';
插入和删除在BACKUPDIR后配置ADD/DELETE即可
·全量备份
RMAN> BACKUP DATABASE 'E:\dmdbms\data\DMDB\dm.ini' FULL BACKUPSET 'E:\dmbak\db_full_bak_01';
·增量备份
RMAN> BACKUP DATABASE 'E:\dmdbms\data\DMDB\dm.ini' INCREMENT WITH BACKUPDIR 'E:\dmbak\' BACKUPSET 'E:\dmbak\db_increment_bak_02';
·创建归档备份
RMAN> BACKUP ARCHIVE LOG ALL DATABASE 'E:\dmdbms\data\DMDB\dm.ini' BACKUPSET 'E:\dmbak\arch_all_bak_01';
·创建设置条件的归档备份
RMAN> BACKUP ARCHIVE LOG LSN BETWEEN 50000 AND 120000 DATABASE 'E:\dmdbms\data\DMDB\dm.ini' BACKUPSET 'E:\dmbak\arch_lsn_bak_02';
SHOW BACKUPSET 'E:\dmbak\db_full_bak_01';
分为DB INFO META INFO EP INFO FILE INFO 等信息
SHOW BACKUPSETS WITH BACKUPDIR 'E:\dmbak\';
SHOW BACKUPSET 'E:\dmbak\db_full_bak_01';
SHOW BACKUPSETS WITH BACKUPDIR 'E:\dmbak\' USE DB_MAGIC 1491135681;
show backupset 'E:\dmbak\db_full_bak_01' info meta
Check backupset 'E:\dmbak\db_full_bak_01'
Remove backupset 'E:\dmbak\db_full_bak_01'
REMOVE ... BACKUPSET每次只能删除一个备份集。若 删除备份集已经被引用为其他备份集的基备份且未指定 CASCADE,则报错。
Remove backupsets withBACKUPDIR 'E:\dmbak\' [until time '2019-6-1 00:00:00';]
批量删除备份集
导出磁带/dev/nst0上所有备份集的meta文件到目录E:\dmbak 中
LOAD BACKUPSETS FROM DEVICE TYPE TAPE TO BACKUPDIR 'E:\dmbakr';
导出备份集原始路径
DUMP BACKUPSET 'E:\dmbak\db_full_bak_01' DEVICE TYPE DISK MAPPED FILE 'E:\dmbak\db_bak_mapped.txt';
通过 RESTORE 命令还原后的数据库不可用,需进一步执行 RECOVER 命令,将数据库 恢复到备份结束时的状态。
RESTORE DATABASE 'E:\dmdbms\data\DMDB\dm.ini' FROM BACKUPSET 'E:\dmbak\db_full_bak_01';
REUSE DMINI 参数会将备份集中的dm.ini中除了路径参数之外的其他参数都同步到当前dm.ini中
RESTORE DATABASE 'E:\dmdbms\data\DMDB\dm.ini' REUSE DMINI FROM BACKUPSET 'E:\dmbak\db_full_bak_01';
·从备份集恢复
在进行RESTORE之后再通过RECOVER将数据库恢复
RECOVER DATABASE 'E:\dmdbms\data\DMDB\dm.ini' FROM BACKUPSET 'E:\dmbak\db_full_bak_01';
·从归档恢复(正常退出)
1) 启动 DIsql 联机备份数据库,以及备份从检查点开始的本地归档日志;
BACKUP ARCHIVELOG FROM LSN 90000 BACKUPSET'E:\dmbak\arch_bak_lsn_90175';
//查看动态视图 V$RLOG 中的 CKPT_LSN 列,可以得出当前检查点 LSN
BACKUP DATABASE BACKUPSET 'E:\dm_bak\db_full_bak_for_recover_arch';
RMAN>CHECK BACKUPSET 'E:\dmbak\db_full_bak_for_recover_arch';
RMAN>RESTORE DATABASE 'E:\dmdbms\data\DMDB\dm.ini' FROM BACKUPSET 'E:\dmbak\db_full_bak_for_recover_arch';
5)查看备份集数据信息获取DB_MAGIC(若还原后,立即执行恢复,可以不用获取源库 DB_MAGIC)
RMAN>SHOW BACKUPSET 'E:\dmbak\db_full_bak_for_recover_arch' INFO DB;
6)利用归档恢复数据库。由步骤 5 显示的备份集信息可知,源库的 DB_MAGIC 值为 1491135681;
RMAN>RECOVER DATABASE 'E:\dmdbms\data\DMDB\dm.ini' FROM BACKUPSET 'E:\dmbak\db_full_bak_for_recover_arch';[use db_magic 1491135681]
7)若执行后归档恢复过程中,出现归档不足的错误,则利用归档校验工具 dmrachk
./dmrachk arch_path=E:\dmarch
归档缺失范围是[86273,86440]
DMRMAN 查看归档备份的范围
show backupset 'E:\dmbak\arch_bak_lsn_90175' INFO META;
arch start lsn: 90100
arch end lsn: 90296
归档范围由这两个参数确定,之前缺失的范围不在归档备份中,所以归档日志出现问题,需要根据最新状态做备份与归档。
·从归档恢复(异常退出)
RMAN>REPAIR ARCHIVELOG DATABASE 'E:\dmdbms\data\DMDB\dm.ini';
2)使用备份集以及归档将目标库恢复
RMAN>RESTORE DATABASE 'E:\dmdbms\data\DMDB\dm.ini' FROM BACKUPSET 'E:\dmbak\db_full_bak_01';
RMAN>RECOVER DATABASE 'E:\dmdbms\data\DMDB\dm.ini' WITH ARCHIVEDIR 'E:\dmarch\';
更新数据库的 DB_MAGIC,并将数据库调整为可正常工作状态
RECOVER DATABASE 'E:\dmdbms\data\DMDB\dm.ini' WITH ARCHIVEDIR 'E:\dmarch\';
1) 启动 DMRMAN,脱机备份数据库;
RMAN>BACKUP DATABASE 'E:\dmdbms\data\DMDB\dm.ini' BACKUPSET 'E:\dmbak\db_bak_for_map_01';
2) 生成映射文件
RMAN>DUMP BACKUPSET 'E:\dmbak\db_bak_for_map_01' DATABASE 'E:\dmdbms\data\DMDB\dm.ini' MAPPED FILE'E:\dmbak\map_file_01.txt';
3) 指定映射文件还原。还原前可选择对备份文件进行校验。
RMAN> RESTORE DATABASE 'E:\dmdbms\data\DMDB\dm.ini' FROM BACKUPSET 'E:\dmbak\db_bak_for_map_01' MAPPED FILE 'E:\dmbak\map_file_01.txt';
利用增量备份集还原来修复主备集群。主要内容包括:
l 指定 INCREMENT FROM LSN 语法项生成增量备份集
l 利用增量备份集修复备库,包括还原、恢复和更新步骤
1) 获取待同步数据的起始 LSN。
SQL> SELECT N_EP, APPLY_LSN_ARR FROM V$RAPPLY_LSN_INFO;
包含了备库缺失的所有数据。
SQL> BACKUP DATABASE INCREMENT FROM LSN 90794 BACKUPSET 'E:\dmdbms\bak_inc_lsn';
DSC环境下LSN要小于等于所有节点的APLLY_LSN;
RMAN>RESTORE DATABASE 'E:\dmdbms\data\DMDB\dm.ini' FROM BACKUPSET 'E:\dmdbms\bak_inc_lsn';
RMAN>RECOVER DATABASE 'E:\dmdbms\data\DMDB\dm.ini' FROM BACKUPSET 'E:\dmdbms\bak_inc_lsn';
RMAN>RECOVER DATABASE 'E:\dmdbms\data\DMDB\dm.ini' update db_magic
用户在下午 5 点做了一个误操作,删除了某些重要数据;我们可以指定恢复时间点到下午 4:59 分,恢复被误删除的数据。
1) 准备数据;
CREATE TABLE TAB_FOR_RECOVER_01(C1 INT);
INSERT INTO TAB_FOR_RECOVER_01 VALUES(1);
COMMIT;
2) 备份数据库;
BACKUP DATABASE BACKUPSET 'E:\dmbak\db_full_bak_for_time_lsn';
3) 正确操作数据库,产生一些归档;
CREATE TABLE TAB_FOR_RECOVER_02(C1 INT);
INSERT INTO TAB_FOR_RECOVER_02 VALUES(1);
COMMIT;
使用 SELECT SYSDATE 命令查询此时的时间为:21-11月-23 05.47.07. 下午。
使用 SELECT FILE_LSN FROM V$RLOG 命令查询此时的 LSN 为:91089。
4) 误操作数据库。此步骤误删除了表 TAB_FOR_RECOVER_01 中数据;
DELETE FROM TAB_FOR_RECOVER_01;
COMMIT;
操作步骤同步骤 3),此时的时间和 LSN 分别为:21-11月-23 05.47.56. 下午、91096。
5) 还原数据库。步骤 4)为误操作,因此我们需要将数据库恢复到步骤 3)的状态。
首先需要关闭数据库实例,然后利用 DMRMAN 工具还原数据库:
RMAN>RESTORE DATABASE 'E:\dmdbms\data\DMDB\dm.ini' FROM BACKUPSET 'E:\dmbak\db_full_bak_for_time_lsn';
6) 恢复数据库到指定时间点/LSN。还原后数据库的数据与备份时一致,如果要恢复
数据库至步骤 3)的状态可以指定 UNTIL TIME 或 UNTIL LSN 参数重做部分归档。
使用 RECOVER DATABASE...UNTIL TIME 命令恢复到指定的时间:
RMAN>RECOVER DATABASE 'E:\dmdbms\data\DMDB\dm.ini' WITH ARCHIVEDIR'E:\dmarch\' UNTIL TIME'2023-11-21 17:47:07';
或者使用 RECOVER DATABASE...UNTIL TIME 命令恢复到指定的 LSN:
RMAN> RECOVER DATABASE 'E:\dmdbms\data\DMDB\dm.ini' WITH ARCHIVEDIR'E:\dmarch\' UNTIL LSN 91089;
主备架构下缺失归档的节点可以从保存有完整归档的节点恢复。
1) 搭建主备环境并备份任意节点;
RMAN>BACKUP DATABASE 'E:\dmdbms\data\DMDB\dm.ini' BACKUPSET 'E:\dmbak\db_full_bak';
2) 启动主备,登录主节点插入部分数据后退出,然后删除该节点下所有归档日志;
3) 指定备份集还原到主节点;
RMAN>RESTORE DATABASE 'E:\dmdbms\data\DMDB\dm.ini' FROM BACKUPSET '/home/dm_bak/db_full_bak';
4) 指定 DB_MAGIC,使用备库归档进行恢复。由于该节点下所有归档已被删除,无
法恢复到最新状态,此时需要借助备库存在的归档。
RMAN> RECOVER DATABASE 'E:\dmdbms\data\DMDB\dm.ini' WITH ARCHIVEDIR 'E:\dmarch' USE DB_MAGIC 1447060264;
1) 搭建 DMDSC 环境,每个节点都需要配置双向的远程归档。
2) 启动 DIsql,联机备份数据库。备份其中任意一个节点即可备份整个 DMDSC 环境;
BACKUP DATABASE BACKUPSET 'E:\dmbak\db_full_bak_for_dsc';
3) 还原数据库。还原数据库之前可选择对备份文件进行校验。需要注意的是,待还原的目标库可以是单机库,也可以是 DMDSC 库,且节点个数允许不同;
RMAN> RESTORE DATABASE 'E:\dmdbms\data\DMDB\dm.ini' FROM BACKUPSET 'E:\dmbak\db_full_bak_for_dsc';
4) 恢复数据库。DMDSC 库恢复要求各节点归档完整性由用户保证,即各节点的本地归档都能够访问到,若本地存在 REMOTE 归档,则可以使用 REMOTE 归档代替远程节点的本地归档;
RMAN> RECOVER DATABASE 'E:\dmdbms\data\DMDB\dm.ini' WITH ARCHIVEDIR'+DMDATA/dameng/arch_dsc0','+DMDATA/dameng/arch_dsc1';
5) 数据库更新。
RMAN> RECOVER DATABASE 'E:\dmdbms\data\DMDB\dm.ini' UPDATE DB_MAGIC;
在实际应用中可能会遇到以下还原场景:
1) 创建一个数据库 D1;
2) 操作数据库并执行数据库备份 B1;
3) 继续操作数据库的过程中数据库故障,此时生成的归档为 A1;
4) 利用备份 B1 和归档 A1 将数据库 D1 恢复到目标库 D2,此时数据库 D2 为 D1 故障
前的状态;
5) 启动数据库 D2,操作数据库过程中数据库第二次故障,此时生成的归档为 A2。
归档 A1、A2 属于不同的数据库,使用备份 B1 和归档 A1、A2 是否可以恢复数据库到第
二次故障发生前的状态呢?答案是肯定的。下面将举例详细说明如何使用不同数据库的归档
恢复数据库到最新状态。具体步骤如下:
DROP TABLE TAB_FOR_RECOVER;
CREATE TABLE TAB_FOR_RECOVER(C1 INT);
BEGIN
FOR I IN 1..1000000 LOOP
INSERT INTO TAB_FOR_RECOVER VALUES(I);
COMMIT;
END LOOP;
END;
/
//插入数据的同时,另外一个会话备份数据库
BACKUP DATABASE FULL TO B1 BACKUPSET 'E:\dmbak\B1' DEVICE TYPE DISK BACKUPINFO
'DAMENG FULL BACKUP ONLINE' MAXPIECESIZE 2048;
3) 继续向数据库插入数据一段时间后关掉数据库实例,模拟数据库故障。从备份后到数据库故障这段时间生成的归档称为 A1;
4) 创建目标库 D2,即待还原的库,并配置归档(参考 3.1.2 归档配置),归档目录与
数据库 D1 相同;
./dminit path=E:\dmdbms\data db_name=DAMENG_FOR_RES
5) 启动DMRMAN工具,利用备份集B1和归档A1恢复数据库D2到D1故障前的状态;DM8
RMAN> RESTORE DATABASE 'E:\dmdbms\data\DAMENG_FOR_RES\dm.ini' FROM BACKUPSET 'E:\dmbak\B1';
RMAN> RECOVER DATABASE 'E:\dmdbms\data\DAMENG_FOR_RES\dm.ini' WITH ARCHIVEDIR 'E:\dmarch\';
RMAN> RECOVER DATABASE 'E:\dmdbms\data\DAMENG_FOR_RES\dm.ini' UPDATE DB_MAGIC;
启动目标库 D2,向数据库中继续插入数据:
dmserver E:\dmdbms\data\DAMENG_FOR_RES\dm.ini
alter database mount;
alter database add archivelog 'dest=E:\dmarch ,TYPE=local,FILE_SIZE=1024,SPACE_LIMIT=102400';
alter database archivelog;
alter database open;
BEGIN
FOR I IN 1..1000000 LOOP
INSERT INTO TAB_FOR_RECOVER VALUES(I);
COMMIT;
END LOOP;
END;
/
6) 插入数据一段时间后,关掉数据库实例,模拟数据库第二次故障。数据库 D2 启动
到第二次故障之间产生的归档为 A2;
7) 恢复目标库 D2 到第一次故障前的状态。恢复一次,目标库的 DB_MAGIC 都会改变,因此归档 A1、A2 的 DB_MAGIC 不同,属于不同的数据库。第一次恢复只能先重做归档 A1,即恢复到第一次故障前的状态;
RMAN> RESTORE DATABASE 'E:\dmdbms\data\DAMENG_FOR_RES\dm.ini' FROM BACKUPSET 'E:\dmbak\B1';
RMAN> RECOVER DATABASE 'E:\dmdbms\data\DAMENG_FOR_RES\dm.ini' WITH ARCHIVEDIR 'E:\dmarch';
8) 查看归档 A2 的 DB_MAGIC;
./dmrachk arch_fil=E:\dmarch\ARCHIVE_LOCAL1_0x54144C11_EP0_2023-11-23_10-31-18.log
1043682857--B1--70000+
253427476--A1--303385
1410616337-A2--303319
9)利用归档 A2 恢复数据库至第二次故障前的状态。从归档恢复时,默认使用目标库的 DB_MAGIC,此时目标库 DB_MAGIC 值被替换为 B1 备份集源库 DB_MAGIC,与归档A2 DB_MAGIC 值不一致, 无法利 用该部 分归档 恢复到 最新状态 。此时 可指定 USE DB_MAGIC 参数,指定 DB_MAGIC 值为待恢复归档的 DB_MAIGC 值即可;
RMAN> RECOVER DATABASE 'E:\dmdbms\data\DAMENG_FOR_RES\dm.ini' WITH ARCHIVEDIR 'E:\dmarch\' USE DB_MAGIC 1410616337;
10) 更新数据库。
RMAN> RECOVER DATABASE 'E:\dmdbms\data\DAMENG_FOR_RES\dm.ini' UPDATE DB_MAGIC;
·周期性执行完全备份和增量备份
1) 在周日执行完全备份。
SQL> BACKUP DATABASE BACKUPSET 'E:\dmbak\DB_FULL_BAK';
2) 使用完全备份集还原出新的库。
RMAN> RESTORE DATABASE to 'E:\dmdbms\data\db_for_merge' FROM BACKUPSET 'E:\dmbak\DB_FULL_BAK'
3) 一周的其他时间里每天生成增量备份集。
SQL> BACKUP DATABASE INCREMENT BACKUPSET 'E:\dmbak\DB_INCR_BAK';
·分批合并增量备份集数据到目标库
定期合并增量备份集数据到目标库。
RMAN> MERGE DATABASE 'E:\dmdbms\data\db_for_merge\dm.ini' FROM BACKUPSET
'E:\dmbak\DB_INCR_BAK'
1) 源库故障后,重演最后一个时间窗口内的归档日志以将目标库恢复到最新状态。
RMAN>RECOVER DATABASE 'E:\dmdbms\data\db_for_merge\dm.ini' WITH ARCHIVEDIR 'E:\dmarch'
2) 重演所有日志后,更新数据库魔数标识恢复操作完成。
RMAN> RECOVER DATABASE 'E:\dmdbms\data\db_for_merge\dm.ini' UPDATE DB_MAGIC
3) 正常启动新的库,恢复数据库服务。
使用 RESTORE 命令完成表空间的脱机还原,还原的备份集可以是联机或脱机生成的库备份集,也可以是联机生成的表空间备份集 。
注意事项:
1. 表空间还原不能是 TEMP 表空间,指定文件还原也不能为 TEMP 表空间中文件。
2. 表空间还原要求还原目标库与备份库为同一个库。
3. 还原目标库不能为已经执行过 RESTORE 但未执行过 RECOVER 的库
4. 不管是 DSC 环境,还是单机环境,若异常退出,需手动指定各节点归档修复后,使用各节点完整的归档日志执行还原恢复;否则,将可能无法恢复到最新状态。
5. 若目标库中 SYSTEM 表空间故障,则必须优先还原 SYSTEM 表空间。
6. DMDSC环境进行表空间还原时,所有实例节点必须退出,并且只在一个节点执行还原即可还原所有节点。
·实操:
1) 联机备份表空间,保证数据库运行在归档模式及 OPEN 状态;
BACKUP TABLESPACE MAIN BACKUPSET 'E:\dmbak\ts_full_bak_for_restore';
2) 校验备份,校验待还原备份集的合法性。校验备份有两种方式,联机和脱机,此处使用脱机校验;
RMAN> CHECK BACKUPSET 'E:\dmbak\ts_full_bak_for_restore';
3) 还原表空间。需要注意,表空间还原的目标库只能是备份集产生的源库,否则将报错。启动 DMRMAN,输入以下命令:
RMAN> RESTORE DATABASE 'E:\dmdbms\data\DMDB\dm.ini' TABLESPACE MAIN FROM BACKUPSET 'E:\dmbak\ts_full_bak_for_restore';
表空间恢复通过重做 REDO 日志,以将数据更新到一致状态。表空间恢复过程中不允许异常中断。
·实操:
1) 联机备份表空间,保证数据库运行在归档模式及 OPEN 状态;
BACKUP TABLESPACE MAIN BACKUPSET 'E:\dmbak\ts_full_bak_for_recover';
2) 校验备份,校验待还原备份集的合法性,此处使用脱机校验;
RMAN> CHECK BACKUPSET 'E:\dmbak\ts_full_bak_for_recover';
3) 还原表空间。启动 DMRMAN,输入以下命令:
RMAN> RESTORE DATABASE 'E:\dmdbms\data\DMDB\dm.ini' TABLESPACE MAIN FROM BACKUPSET 'E:\dmbak\ts_full_bak_for_recover';
4) 恢复表空间。启动 DMRMAN,输入以下命令:
RMAN> RECOVER DATABASE 'E:\dmdbms\data\DMDB\dm.ini' TABLESPACE MAIN;
1) 创建待备份的表空间 TS_FOR_RES_01,并在库目录下创建 3 个数据文件;
CREATE TABLESPACE TS_FOR_RES_01 DATAFILE 'ts_for_res_01_01.dbf' SIZE 128;
ALTER TABLESPACE TS_FOR_RES_01 ADD DATAFILE 'ts_for_res_01_02.dbf' SIZE 128;
ALTER TABLESPACE TS_FOR_RES_01 ADD DATAFILE 'ts_for_res_01_03.dbf' SIZE 128;
2) 备份表空间;
BACKUP TABLESPACE TS_FOR_RES_01 BACKUPSET 'E:\dmbak\ts_bak_for_dbf';
3) 查询数据文件的文件编号或路径。还原指定的数据文件需知道数据文件对应的文件
编号或路径,相关信息可通过查询动态视图 V$DATAFILE 获取;
SELECT ID, PATH FROM V$DATAFILE;
4) 校验备份。此步骤为可选;
RMAN> CHECK BACKUPSET 'E:\dmbak\ts_bak_for_dbf';
5) 通 过 文 件 编 号 还 原 表 空 间 TS_FOR_RES_01 中 的 数 据 文 件 ts_for_res
_01_02.dbf 和 ts_for_res_01_03.dbf;
RMAN> RESTORE DATABASE 'E:\dmdbms\data\DMDB\dm.ini' TABLESPACE TS_FOR_RES_01 DATAFILE 1, 2 FROM BACKUPSET 'E:\dmbak\ts_bak_for_dbf';
6) 如果不想使用文件编号还原,使用指定数据文件路径还原数据文件的语句如下:
RMAN> RESTORE DATABASE 'E:\dmdbms\data\DMDB\dm.ini' TABLESPACE TS_FOR_RES_01 DATAFILE 'E:\dmdbms\data\DMDB\ts_for_res_01_02.dbf', 'E:\dmdbms\data\DMDB\ts_for_res_01_03.dbf' FROM BACKUPSET 'E:\dmbak\ts_bak_for_dbf';
1) 备份 MAIN 表空间;
BACKUP TABLESPACE MAIN BACKUPSET 'E:\dmbak\ts_bak_for_map';
2) 创建映射文件;
RMAN>DUMP BACKUPSET 'E:\dmbak\ts_bak_for_map' MAPPED FILE 'E:\dmbak\map_file.txt';
3) 还原 MAIN 表空间。
RMAN>RESTORE DATABASE 'E:\dmdbms\data\DMDB\dm.ini' TABLESPACE MAIN FROM BACKUPSET 'E:\dmbak\ts_bak_for_map' MAPPED FILE 'E:\dmbak\map_file.txt';
1) 备份用户表空间 MAIN;
BACKUP TABLESPACE MAIN BACKUPSET 'E:\dmbak\ts_bak_for_arch';
2) 校验备份。此步骤可选;
RMAN> CHECK BACKUPSET 'E:\dmbak\ts_bak_for_arch';
3) 还原用户表空间 MAIN;
RMAN> RESTORE DATABASE 'E:\dmdbms\data\DMDB\dm.ini' TABLESPACE MAIN FROM BACKUPSET 'E:\dmbak\ts_bak_for_arch';
4) 恢复用户表空间 MAIN 。 假 设 归 档 日 志 分 布 在 /home/dm_arch1 和
/home/dm_arch2 两个目录下。
RMAN> RECOVER DATABASE 'E:\dmdbms\data\DMDB\dm.ini' TABLESPACE MAIN WITH ARCHIVEDIR 'E:\dm_arch1', 'E:\dm_arch2';
1) 搭建主备环境并登录任意节点进行备份;
BACKUP TABLESPACE MAIN BACKUPSET 'E:\dmbak\ts_bak_for_arch';
2) 登录主节点插入部分数据后退出,然后删除该节点下所有归档日志;
3) 从备份集还原表空间 LIBRARY到主节点;
RMAN> RESTORE DATABASE 'E:\dmdbms\data\DMDB\dm.ini' TABLESPACE LIBRARY FROM BACKUPSET 'E:\dmbak\ts_bak_for_arch';
4) 指定 DB_MAGIC,使用备库归档进行恢复。由于主节点下所有归档已被删除,无
法恢复到最新状态,此时需要借助备库存在的归档进行恢复。
RMAN> RECOVER DATABASE 'E:\dmdbms\data\DMDB\dm.ini' TABLESPACE MAIN WITH ARCHIVEDIR '/home/dm_arch2' USE DB_MAGIC 18446520;
1. 联机备份归档,保证数据库运行在归档模式及 OPEN 状态;
BACKUP ARCHIVE LOG ALL BACKUPSET 'E:\dmbak\arch_all_for_restore';
2. 校验备份,校验待还原备份集的合法性。校验备份有两种方式,联机和脱机,此处
使用脱机校验;
RMAN> CHECK BACKUPSET 'E:\dmbak\arch_all_for_restore';
3. 还原归档。启动 DMRMAN,设置 OVERWRITE 为 2,如果归档文件已存在,会报错。 指定还原的目标归档日志目录:
RMAN> RESTORE ARCHIVE LOG FROM BACKUPSET 'E:\dmbak\arch_all_for_restore' TO ARCHIVEDIR'E:\dmdbms\data\DAMENG_FOR_RESTORE\arch_dest' OVERWRITE 2;
指定还原目标库的 dm.ini 文件路径:
RMAN> RESTORE ARCHIVE LOG FROM BACKUPSET 'E:\dmbak\arch_all_for_restore' TO DATABASE 'E:\dmdbms\data\DMDB\dm.ini' OVERWRITE 2;
RMAN> REPAIR ARCHIVELOG DATABASE 'E:\dmdbms\data\DMDB\dm.ini';
库备份和表空间备份不支持联机还原,只有表备份支持联机还原。表还原过程中表空间
中其他的表还可以正常操作。
社区地址:https://eco.dameng.com