文章目录
本文参考:
https://eco.dameng.com/docs/zh-cn/pm/backup-restore-introduction.html
https://eco.dameng.com/docs/zh-cn/ops/physical-backup.html
【注意】本文暂不涉及增量备份,所有内容均为全量备份
物理备份还原工具介绍
数据库状态 | 命令行 | 图形化 | 备份 | 还原 |
---|---|---|---|---|
联机 | disql | MANAGER | 数据库 / 表空间 / 表 / 归档 | 表 |
脱机 | DMRMAN | CONSOLE | 数据库 / 归档 | 数据库 / 表空间 / 归档 |
概要
什么是物理备份还原?
- 物理备份还原是对数据库的操作系统物理文件(如数据文件、redo日志文件、归档日志)的备份还原
物理备份还原涉及哪些知识点?
- 数据文件、归档日志、重做日志
- LSN、包序号(PKG SEQNO)、检查点
- 备份集、备份片、元数据
- 完全备份、增量备份、联机备份、脱机备份
- 介质管理
- 备份方式
归档配置
与归档相关的两个文件:
- dm.ini
归档启停(由ARCH_INI参数控制) - dmarch.ini
归档配置(设置归档路径、类型、大小等)
归档可分为:
- 本地归档
- 远程归档
DM物理备份还原使用的是:本地归档日志
配置本地归档
配置归档的方式
- 联机归档配置
实例运行期间,使用SQL语句修改参数文件dm.ini和dmarch.ini - 手动归档配置
实例关闭期间,手动修改参数文件dm.ini和dmarch.ini
联机归档配置
准备存放归档的磁盘和目录
[root@localhost ~]# mkdir -p /data/arch
[root@localhost ~]# chown -R dmdba:dinstall /data
将数据库状态修改为mount,以修改数据库的配置
alter database mount;
配置本地归档
alter database add archivelog 'dest=/data/arch ,TYPE=local,FILE_SIZE=1024,SPACE_LIMIT=2048';
开启归档
alter database archivelog;
开启数据库
alter database open;
【要点1】
根据实际提供的参数,系统会自动创建dmarch.ini配置文件,其路径与dm.ini一致
alter database add archivelog 'dest=/data/arch ,TYPE=local,FILE_SIZE=1024,SPACE_LIMIT=2048';
dmarch.ini具体内容如下
[dmdba@localhost DMDB]$ cat dmarch.ini
#DaMeng Database Archive Configuration file
#this is comments
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /data/arch
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 2048
ARCH_FLUSH_BUF_SIZE = 0
【要点2】
此命令将开启归档,系统会自动将dm.ini配置文件中的ARCH_INI参数修改为1
alter database archivelog;
[dmdba@localhost DMDB]$ cat dm.ini|grep ARCH_INI
ARCH_INI = 1 #dmarch.ini
【要点3】
针对本地归档,了解参数具体含义(dmarch.ini配置文件)
配置项 | 参数值 | 配置含义 |
---|---|---|
[ARCH_NAME] | ARCHIVE_LOCAL1 | REDO日志归档名为ARCHIVE_LOCAL1 |
ARCH_TYPE | LOCAL | 本地归档 |
ARCH_DEST | /data/arch | 归档存放在/data/arch目录中 |
ARCH_FILE_SIZE | 1024 | 单个归档日志文件大小为1G |
ARCH_SPACE_LIMIT | 2048 | 所有归档总大小不能超过2G,达到2G系统将自动删除最老的归档日志文件 |
注意:
- ARCH_SPACE_LIMIT会影响归档日志的保留时间,设置需谨慎
- ARCH_DEST设置的目录权限要正确
手动归档配置
- 停库
- 修改配置文件(dmarch.ini、dm.ini,两个文件的路径相同)
vi dmarch.ini
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /data/arch
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 2048
vi dm.ini
修改如下配置
ARCH_INI=1
- 起库
检查归档状态
ARCH_MODE为Y,说明开启归档了
SQL> select arch_mode from v$database;
LINEID ARCH_MODE
---------- ---------
1 Y
还可以到归档日志存放的路径,查看归档日志文件
[dmdba@localhost arch]$ cd /data/arch
[dmdba@localhost arch]$ ls
ARCHIVE_LOCAL1_0x21739092[0]_2021-11-24_08-31-45.log
启动DMAP
备份集备份还原实现策略:
- 使用DMAP辅助进程
备份还原依赖dmap进程,需启动dmap进程,才能进行备份还原 - 不使用辅助进程
由主进程dmserver执行备份还原,不依赖dmap进程
怎么使用dmap辅助进程?
- 启动dmap进程
DmAPService start - dm.ini参数文件中,将BAK_USE_AP参数设为1
对于DMRMAN工具,启动时,需将参数use_ap设为1
使用dmap进程进行备份还原有什么好处?
- 支持第三方备份(DEVICE TYPE=TAPE)
- 提升备份还原效率(可设置并行度,可加速加密、压缩处理)
数据库
数据库级别可以联机备份也可以脱机备份
联机备份
使用SQL语句进行全库备份
注意
联机备份时,关闭已配置的本地归档之后再重新打开,会造成归档文件中部分日志缺失,备份时检查归档文件连续性时将会报错。存在该类操作时,用若要避免该错误,备份前需要调用 checkpo int(100) 主动刷新检查点。
最简单的全备
全库备份的参数很多,下面进行一次最简单的全备
SQL> backup database;
executed successfully
全库备份命令执行后,系统将在与dm.ini相同的路径下,创建bak目录,并根据备份类型、时间等,创建备份目录,存放此次备份的所有备份文件
[dmdba@localhost bak]$ cd /dm/data/DMDB/bak
[dmdba@localhost bak]$ ls
DB_DMDB_FULL_20211124_100658_566130
[dmdba@localhost bak]$ ls DB_DMDB_FULL_20211124_100658_566130/
DB_DMDB_FULL_20211124_100658_566130.bak
DB_DMDB_FULL_20211124_100658_566130.meta
DB_DMDB_FULL_20211124_100658_566130_1.bak
指定备份目录
指定备份集的路径为data/dmbak/db_full_bak_01
SQL> BACKUP DATABASE FULL BACKUPSET '/data/dmbak/db_full_bak_01';
executed successfully
used time: 00:02:58.072. Execute id is 12301.
备份完成后,将创建目录/data/dmbak/db_full_bak_01,此次全库备份产生的备份文件都存放在该目录中
[dmdba@localhost dmbak]$ cd /data/dmbak/
[dmdba@localhost dmbak]$ ls
db_full_bak_01
[dmdba@localhost dmbak]$ ll db_full_bak_01/
total 256200
-rw-r--r--. 1 dmdba dinstall 262207488 Nov 24 10:02 db_full_bak_01.bak
-rw-r--r--. 1 dmdba dinstall 94720 Nov 24 10:02 db_full_bak_01.meta
-rw-r--r--. 1 dmdba dinstall 33280 Nov 24 10:02 db_full_bak_01_1.bak
限制备份片大小
每个备份片不能超过50MB
SQL> BACKUP DATABASE full BACKUPSET '/data/dmbak/weekly_full_bak_20211125' MAXPIECESIZE 50;
[dmdba@localhost weekly_full_bak_20211125]$ du -sh *
33M weekly_full_bak_20211125_1.bak
33M weekly_full_bak_20211125_2.bak
34M weekly_full_bak_20211125_3.bak
33M weekly_full_bak_20211125_4.bak
224K weekly_full_bak_20211125_5.bak
42M weekly_full_bak_20211125.bak
100K weekly_full_bak_20211125.meta
### 压缩备份
```bash
压缩备份集,压缩级别为5
BACKUP DATABASE full BACKUPSET '/data/dmbak/weekly_full_bak_20211125_compressed' COMPRESSED LEVEL 5;
结果对比(一个不添加参数COMPRESSED LEVEL 5)
[dmdba@localhost dmbak]$ du -sh *
172M weekly_full_bak_20211125
28M weekly_full_bak_20211125_compressed
并行备份
SQL> BACKUP DATABASE BACKUPSET '/data/dmbak/weekly_full_bak_20211125' PARALLEL 8;
疑问:
并行度与CPU相关吗?
增量备份
SQL> backup database increment backupset '/data/dmbak/incr_bak';
脱机备份
停库
[root@localhost dmdb]# systemctl stop DmServicedmdb.service
脱机全备
[dmdba@localhost bin]$ dmrman
dmrman V8
RMAN> backup database '/dmdata/dmdb/dm.ini' backupset '/dmdata/dmbak/db_full_20211128';
脱机还原
数据库的还原包括:
- 数据库配置文件还原(例如:dm.ini、dm.ctl、联机日志文件)
- 数据文件还原
restore database '/dmdata/dmdb/dm.ini' from backupset '/dmdata/dmbak/db_full_20211128';
脱机恢复
数据库恢复是指重做REDO日志,有两种方式:
- 基于备份集恢复(即重做备份集中的REDO日志)
- 基于本地归档日志恢复(即重做归档中的REDO日志)
基于备份集恢复
recover database '/dmdata/dmdb/dm.ini' from backupset '/dmdata/dmbak/db_full_20211128';
基于本地归档恢复
recover database '/dmdata/dmdb/dm.ini' with archivedir '/dmdata/arch';
数据库更新
更新数据库的DB_MAGIC,并将数据库调整为可正常工作状态
数据库更新发生在重做REDO日志恢复数据库后,或者目标库不需要执行重做日志已经处于一致状态的情况
recover database '/dmdata/dmdb/dm.ini' update db_magic;
实践
联机备份 & 脱机还原、恢复
联机备份数据库,确保数据库运行在归档模式及OPEN状态
归档已开启、数据库已open
SQL> select arch_mode,status$ from v$database;
行号 arch_mode status$
---------- --------- -----------
1 Y 4
联机全备
SQL> BACKUP DATABASE BACKUPSET '/dmdata/dmbak/db_full_20211127';
操作已执行
已用时间: 00:00:01.111. 执行号:303.
检查全备
[dmdba@localhost bin]$ dmrman
dmrman V8
RMAN> CHECK BACKUPSET '/dmdata/dmbak/db_full_20211127';
CHECK BACKUPSET '/dmdata/dmbak/db_full_20211127';
check backupset successfully.
time used: 50.425(ms)
停库,搞破坏
[root@localhost dmdb]# systemctl stop DmServicedmdb.service
[root@localhost dmdb]# mv dmdb01.log dmdb01.log.bak
[root@localhost dmdb]# mv MAIN.DBF MAIN.DBF.bak
起库,看报错
数据库当然是起不来的
[root@localhost dmdb]# systemctl start DmServicedmdb.service
Job for DmServicedmdb.service failed because the control process exited with error code.
See "systemctl status DmServicedmdb.service" and "journalctl -xe" for details.
到数据库软件安装目录下的log目录,查看日志中的报错信息
[dmdba@localhost log]$ cd /home/dmdba/dmdbms/log
redo日志dmdb01.log不存在,起库失败
[dmdba@localhost log]$ tail -50 dm_DMDB_202111.log
省略49行...
2021-11-27 21:49:15.969 [FATAL] database P0000015827 T0000000000000015827 /dmdata/dmdb/dmdb01.log not exist,can not startup
脱机还原
[dmdba@localhost bin]$ dmrman
dmrman V8
RMAN> restore database '/dmdata/dmdb/dm.ini' from backupset '/dmdata/dmbak/db_full_20211127';
restore database '/dmdata/dmdb/dm.ini' from backupset '/dmdata/dmbak/db_full_20211127';
file dm.key not found, use default license!
[Percent:0.00%][Speed:0.00M/s][Cost:00:00:01][Remaining:00:00:00]Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:02][Remaining:00:00:00]
restore successfully.
time used: 00:00:02.387
【注意 1】
这一步会还原备份集里记录的信息,全备的话会还原数据文件、redo日志(所有的数据文件和redo日志的日期都会更新)
【注意 2】
要想正确执行上面的语句,需要确保控制文件存放路径正确,且控制文件可用
【注意 3】
上面的语句并不会恢复归档日志(因为没有备份归档日志)
【注意 4】
此时仅仅通过备份集还原了数据文件和redo日志,这些文件并不是最新的,故需要"恢复"到最新的时间点。(也就是说,还需要重做redo日志)
若此时起库,日志里会提示:
2021-11-27 22:06:58.566 [FATAL] database P0000016121 T0000000000000016121 Instance DMDB startup failed, execute ‘recover database … update db_magic’ in dmrman.
脱机恢复
RMAN> recover database '/dmdata/dmdb/dm.ini' from backupset '/dmdata/dmbak/db_full_20211127';
recover database '/dmdata/dmdb/dm.ini' from backupset '/dmdata/dmbak/db_full_20211127';
Database mode = 0, oguid = 0
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
EP[0]'s cur_lsn[29829], file_lsn[29829]
EP:0 total 0 pkgs applied, percent: 0%
EP:0 total 2 pkgs applied, percent: 18%
EP:0 total 4 pkgs applied, percent: 36%
EP:0 total 6 pkgs applied, percent: 54%
EP:0 total 8 pkgs applied, percent: 72%
EP:0 total 10 pkgs applied, percent: 90%
EP:0 total 11 pkgs applied, percent: 100%
recover successfully!
time used: 00:00:02.712
【注意 1】
继续观察/dmdata/dmdb里的文件,可以发现部分文件的日志更新了,也就是说这些文件通过重做redo日志恢复到了最新的时间点。(此时,所有的数据文件对于备份的时间点来说,都是最新的了;若想恢复的时间点离当前时间点更接近一些,则需要归档日志,重做归档日志里归档的重做日志,进行更彻底的更新)
更新db_magic
RMAN> recover database '/dmdata/dmdb/dm.ini' UPDATE DB_MAGIC;
recover database '/dmdata/dmdb/dm.ini' UPDATE DB_MAGIC;
Database mode = 0, oguid = 0
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
EP[0]'s cur_lsn[32103], file_lsn[32103]
recover successfully!
time used: 00:00:01.031
【疑问】
这一步更新了什么?为什么更新了redo日志和SYSTEM.DBF,为什么其他的不更新?
起库,验证数据库是否正常
[root@localhost dmdb]# systemctl start DmServicedmdb.service
[dmdba@localhost bin]$ disql SYSDBA/'"Hn@dameng123"'@localhost:5236
服务器[localhost:5236]:处于普通打开状态
登录使用时间 : 2.514(ms)
disql V8
数据库处于open状态
SQL> select status$ from v$database;
行号 status$
---------- -----------
1 4
已用时间: 4.001(毫秒). 执行号:300.
所有表空间都为online状态
SQL> select name,status$ from v$tablespace;
行号 name status$
---------- ------ -----------
1 SYSTEM 0
2 ROLL 0
3 TEMP 0
4 MAIN 0
5 MyTbs 0
已用时间: 1.116(毫秒). 执行号:301.
表空间
表空间备份就是拷贝表空间内所有数据文件中的有效数据的过程,目前表空间仅支持联机备份
表空间备份: 联机
表空间还原&恢复: 脱机
联机备份
确保数据库开了归档,且处于OPEN状态,再执行表空间备份
SQL> create tablespace MyTbs datafile '/dmdata/dmdb/MyTbs.dbf' size 200;
SQL> backup tablespace MyTbs backupset '/dmdata/dmbak/ts_full_MyTbs_20211128';
脱机还原
脱机表空间还原仅涉及表空间数据文件的重建与数据页的拷贝,不需要事先置目标表空间为OFFLINE状态。
RMAN> restore database '/dmdata/dmdb/dm.ini' tablespace MyTbs from backupset '/dmdata/dmbak/ts_full_MyTbs_20211128';
表空间还原后,表空间状态被置为RES_OFFLINE,并设置数据标记FIL_TS_RECV_STATE_RESTORED,表示已经还原但数据不完整。
脱机恢复
表空间恢复通过重做REDO日志,以将数据更新到一致状态
RMAN> recover database '/dmdata/dmdb/dm.ini' tablespace MyTbs;
恢复完成后,表空间状态置为ONLINE,并设置数据标记为FIL_TS_RECV_STAT_RECOVERED,表示数据已恢复到一致状态
SQL> select name,status$ from v$tablespace;
行号 name status$
---------- ------ -----------
1 SYSTEM 0
2 ROLL 0
3 TEMP 0
4 MAIN 0
5 MyTbs 0
已用时间: 4.318(毫秒). 执行号:300.
实践
联机备份 & 脱机还原、恢复
检查数据库状态(归档模式、open状态)
SQL> select arch_mode,status$ from v$database;
行号 arch_mode status$
---------- --------- -----------
1 Y 4
联机备份表空间
SQL> backup tablespace MyTbs backupset '/dmdata/dmbak/ts_full_MyTbs_20211128';
操作已执行
已用时间: 846.654(毫秒). 执行号:306.
联机校验表空间
SQL> select sf_bakset_check('DISK','/dmdata/dmbak/ts_full_MyTbs_20211128');
行号 sf_bakset_check('DISK','/dmdata/dmbak/ts_full_MyTbs_20211128')
---------- --------------------------------------------------------------
1 1
已用时间: 25.859(毫秒). 执行号:302.
删除表空间MyTbs的数据文件,关闭数据库
查看表空间MyTbs的数据文件位置
SQL> select file_name,tablespace_name from dba_data_files where tablespace_name='MyTbs';
行号 file_name tablespace_name
---------- ---------------------- ---------------
1 /dmdata/dmdb/MyTbs.dbf MyTbs
已用时间: 3.892(毫秒). 执行号:309.
删除数据文件
[dmdba@localhost dmdb]$ rm -f /dmdata/dmdb/MyTbs.dbf
停库
[root@localhost dmbak]# systemctl stop DmServicedmdb.service
脱机还原表空间
RMAN> restore database '/dmdata/dmdb/dm.ini' tablespace MyTbs from backupset '/dmdata/dmbak/ts_full_MyTbs_20211128';
restore database '/dmdata/dmdb/dm.ini' tablespace MyTbs from backupset '/dmdata/dmbak/ts_full_MyTbs_20211128';
file dm.key not found, use default license!
Database mode = 0, oguid = 0
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
EP[0]'s cur_lsn[42537], file_lsn[42537]
restore successfully.
time used: 00:00:02.237
脱机恢复表空间
RMAN> recover database '/dmdata/dmdb/dm.ini' tablespace MyTbs
recover database '/dmdata/dmdb/dm.ini' tablespace MyTbs
Database mode = 0, oguid = 0
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
EP[0]'s cur_lsn[42537], file_lsn[42537]
EP:0 total 0 pkgs applied, percent: 0%
EP:0 total 3 pkgs applied, percent: 14%
EP:0 total 6 pkgs applied, percent: 28%
EP:0 total 9 pkgs applied, percent: 42%
EP:0 total 12 pkgs applied, percent: 57%
EP:0 total 15 pkgs applied, percent: 71%
EP:0 total 18 pkgs applied, percent: 85%
EP:0 total 21 pkgs applied, percent: 100%
recover successfully.
time used: 475.353(ms)
启动数据库,检查MyTbs表空间状态
[root@localhost dmbak]# systemctl start DmServicedmdb.service
[dmdba@localhost bin]$ disql SYSDBA/SYSDBA
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 2.663(ms)
disql V8
SQL> select name,status$ from v$tablespace;
行号 name status$
---------- ------ -----------
1 SYSTEM 0
2 ROLL 0
3 TEMP 0
4 MAIN 0
5 MyTbs 0
已用时间: 3.788(毫秒). 执行号:300.
表
表备份不需要开归档
联机备份
联机还原
执行表还原,数据库必须处于OPEN状态
表还原实质是表内数据的还原,以及索引和约束等的重建。
实践
恢复表数据
创建测试表tab_01
SQL> create table tab_01(c1 int);
SQL> insert into tab_01 values(1128);
SQL> commit;
SQL> select * from tab_01;
行号 c1
---------- -----------
1 1128
已用时间: 1.176(毫秒). 执行号:304.
联机备份表tab_01
SQL> backup table tab_01 backupset '/dmdata/dmbak/tb_tab_01_20211128';
操作已执行
已用时间: 825.148(毫秒). 执行号:305.
校验备份
SQL> select sf_bakset_check('DISK','/dmdata/dmbak/tb_tab_01_20211128');
行号 sf_bakset_check('DISK','/dmdata/dmbak/tb_tab_01_20211128')
---------- ----------------------------------------------------------
1 1
已用时间: 39.531(毫秒). 执行号:400.
清空表tab_01
SQL> truncate table tab_01;
还原表tab_01
SQL> restore table tab_01 from backupset '/dmdata/dmbak/tb_tab_01_20211128';
操作已执行
已用时间: 14.568(毫秒). 执行号:402.
检查表数据
SQL> select * from tab_01;
行号 c1
---------- -----------
1 1128
已用时间: 0.768(毫秒). 执行号:403.
【注意 1】
联机还原表时,表必须存在,还原表并不能还原表结构
【注意 2】
此处的表还原语句没有关键字STRUCT,故只还原表内数据(表的索引和约束并不会还原)
恢复索引、约束、表数据
创建测试表
SQL> create table tab_02(c1 int primary key, c2 int);
操作已执行
已用时间: 6.615(毫秒). 执行号:506.
SQL> create index idx_tab_02_c2 on tab_02(c2);
操作已执行
SQL> insert into tab_02 values(2021,1128);
SQL> commit
备份测试表
SQL> backup table tab_02 backupset '/dmdata/dmbak/tb_tab_02_20211128';
操作已执行
已用时间: 798.071(毫秒). 执行号:514.
检查备份
SQL> select sf_bakset_check('DISK','/dmdata/dmbak/tb_tab_02_20211128');
行号 sf_bakset_check('DISK','/dmdata/dmbak/tb_tab_02_20211128')
---------- ---------------------------------------------------------
1 1
已用时间: 61.452(毫秒). 执行号:515.
搞破坏
清空测试表tab_02
SQL> truncate table tab_02;
删除表tab_02的索引
SQL> drop index idx_tab_02_c2;
表结构还原
SQL> restore table tab_02 struct from backupset '/dmdata/dmbak/tb_tab_02_20211128';
操作已执行
已用时间: 26.692(毫秒). 执行号:619.
【注意 1】
由于表备份(tb_tab_02_20211128目录)和目标表(tab_02)都含有约束和索引,故需要先进行表结构还原,才能进行表数据还原。
表数据还原
SQL> restore table tab_02 from backupset '/dmdata/dmbak/tb_tab_02_20211128';
操作已执行
已用时间: 25.311(毫秒). 执行号:621.
表数据恢复了
SQL> select * from tab_02;
行号 c1 c2
---------- ----------- -----------
1 2021 1128
已用时间: 0.771(毫秒). 执行号:622.
表的索引也恢复了
SQL> select name from sysobjects where name='IDX_TAB_02_C2';
行号 name
---------- -------------
1 idx_tab_02_c2
已用时间: 0.472(毫秒). 执行号:642.
归档
归档备份拷贝指定归档目录下的所有的归档文件到备份集中,并记录各个归档文件的属性、文件大小以及LSN区间等。归档备份不存在增量备份之说
联机备份
备份所有的归档日志(归档模式、数据库OPEN或MOUNT)
SQL> backup archive log all backupset '/dmdata/dmbak/arch_all_20211128';
脱机备份
备份所有的归档日志(归档模式、数据库处于关闭状态)
RMAN> backup archive log all database '/dmdata/dmdb/dm.ini' backupset '/dmdata/dmbak/arch_all_20211128';
脱机还原
把归档日志还原到归档路径(/dmdata/arch),若有同名的归档日志,则还原失败(即不覆盖)
RMAN> restore archive log from backupset '/dmdata/dmbak/arch_all_20211128' to archivedir '/dmdata/arch' overwrite 2;
【注意】
没有归档日志没有增量备份,因为归档日志不是覆盖写入的,不会对已有的归档日志进行修改。
脱机修复
归档修复会对目标库dmarch.ini中配置的所有本地归档日志目录执行修复
RMAN> REPAIR ARCHIVELOG DATABASE '/dmdata/dmdb/dm.ini';
一般建议在数据库故障后,应立即执行归档修复,否则后续还原恢复将会导致联机日志中未刷入本地归档的REDO日志丢失,届时再利用本地归档恢复将无法恢复到故障前的最新状态。
【注意】
归档修复,其实就是将未归档的redo日志进行归档。必须在全库还原前执行,因为全库还原将重建redo日志!
实践
确保数据库开了归档,且处于mount或open状态
SQL> select arch_mode,status$ from v$database;
行号 arch_mode status$
---------- --------- -----------
1 Y 4
已用时间: 1.156(毫秒). 执行号:708.
联机归档备份
SQL> backup archivelog all backupset '/dmdata/dmbak/arch_all_20211128';
操作已执行
已用时间: 856.823(毫秒). 执行号:401.
校验备份集
SQL> select sf_bakset_check('DISK','/dmdata/dmbak/arch_all_20211128');
行号 sf_bakset_check('DISK','/dmdata/dmbak/arch_all_20211128')
---------- ---------------------------------------------------------
1 1
已用时间: 26.416(毫秒). 执行号:402.
停库,搞破坏
[root@localhost dmbak]# systemctl stop DmServicedmdb.service
[dmdba@localhost arch]$ cd /dmdata/arch/
[dmdba@localhost arch]$ mkdir test
[dmdba@localhost arch]$ mv ARCHIVE* ./test
脱机归档还原
[dmdba@localhost bin]$ dmrman
dmrman V8
RMAN> restore archivelog from backupset '/dmdata/dmbak/arch_all_20211128' to archivedir '/dmdata/arch' overwrite 2;
restore archivelog from backupset '/dmdata/dmbak/arch_all_20211128' to archivedir '/dmdata/arch' overwrite 2;
restore successfully.
time used: 38.293(ms)
脱机归档修复
RMAN> repair archivelog database '/dmdata/dmdb/dm.ini';
repair archivelog database '/dmdata/dmdb/dm.ini';
file dm.key not found, use default license!
Database mode = 0, oguid = 0
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
EP[0]'s cur_lsn[51357], file_lsn[51357]
repair archive log successfully.
repair time used: 172.841(ms)
time used: 185.204(ms)
达梦云适配中心:
https://eco.dameng.com