达梦多次故障恢复后使用不同数据库归档恢复
使用jmeter工具做事务分发
DBURL:jdbc:dm://172.16.10.84:5236?appNAME=dmoa
username:SYSDBA
pwd:Dameng123
在实际应用中可能会遇到以下还原场景:
1) 创建一个数据库 D1;
2) 操作数据库并执行数据库备份 B1;
3) 继续操作数据库的过程中数据库故障,此时生成的归档为 A1;
4) 利用备份 B1 和归档 A1 将数据库 D1 恢复到目标库 D2,此时数据库 D2 为 D1 故障前的状态;
5) 启动数据库 D2,操作数据库过程中数据库第二次故障,此时生成的归档为 A2。(USE DB_MAGIC XXXXXX)
归档 A1、A2 属于不同的数据库,使用备份 B1 和归档 A1、A2 是否可以恢复数据库到第二次故障发生前的状态呢?答案是肯定的。下面将举例详细说明如何使用不同数据库的归档恢复数据库到最新状态。
1) 创建源库 D1,即待备份的数据库,然后启动数据库并配置归档,归档目录为
/dm/dmarch
su - dmdba
cd /dm/dmdbms/dm8/bin
./dminit path=/dm/dmdata db_name=DAMENG instance_name=DMSERVER port_num=5236 LOG_SIZE=256 SYSDBA_PWD=Dameng123 EXTENT_SIZE=16 PAGE_SIZE=32
vi /dm/dmdata/DAMENG/dm.ini
--修改默认备份目录 /dm/dmback
cd /dm/dmdbms/dm8/bin
./dmserver /dm/dmdata/DAMENG/dm.ini
--连接数据库配置归档
cd /dm/dmdbms/dm8/bin
disql sysdba/Dameng123:5236
ALTER DATABASE mount;
ALTER DATABASE ADD archivelog 'DEST=/dm/dmarch,TYPE=local,FILE_SIZE=256,SPACE_LIMIT=10240';
ALTER DATABASE archivelog;
ALTER DATABASE open;
SELECT arch_mode FROM v$database;
SELECT * FROM v$dm_arch_ini;
select * from v$arch_file; --查看归档日志文件信息
- 操作数据库的同时备份数据库,备份集为 B1。此处以向表中循环插入数据为例来操作数据库
/*
SQL>DROP TABLE TAB_FOR_RECOVER;
SQL>CREATE TABLE TAB_FOR_RECOVER(C1 INT);
SQL>BEGIN
FOR I IN 1..100000 LOOP
INSERT INTO TAB_FOR_RECOVER VALUES(I);
COMMIT;
END LOOP;
END;
/
*/
cd /dm/dmdbms/dm8/bin
disql sysdba/Dameng123:5236
--创建测试用户和表空间
CREATE tablespace TEST datafile '/dm/dmdata/DAMENG/test01.dbf' size 128 autoextend ON NEXT 4 maxsize 10240;
--create user dmedu01 identified by dameng123 default tablespace TEST;
--grant dba to dmedu01;
--conn dmedu01/dameng123:5236
CREATE TABLE test_student (
id bigint identity,
name varchar(20),
birthday date,
math int,
english int,
science int
)STORAGE ( ON TEST );
--插入一些基础数据
insert into test_student
select
dbms_random.string('1',trunc(dbms_random.value(3,8))),
current_date()-365*20+dbms_random.value(-365,365),
trunc(dbms_random.value(40,100)),
trunc(dbms_random.value(40,100)),
trunc(dbms_random.value(40,100))
from dual
connect by level <=100;
commit;
--插入数据的同时,另外一个会话联机备份数据库,这里我使用jmeter压测工具来模拟数据插入
开始压数据进去
3) 继续向数据库插入数据一段时间后关掉数据库实例,模拟数据库故障。从备份后到数据库故障这段时间生成的归档集称为 A1;--在联机备份完成后,过一会再shutdown immediate; 数据库----模拟数据库故障
su - dmdba
cd /dm/dmdbms/dm8/bin
disql sysdba/Dameng123:5236
SQL>BACKUP DATABASE FULL TO B1 BACKUPSET '/dm/dmback/B1' DEVICE TYPE DISK BACKUPINFO 'DAMENG FULL BACKUP ONLINE' MAXPIECESIZE 2048;
由于是正常关的库(即一致性关的库),所以可以不用修复归档。如果非正常关库,一定要去修复归档
/dm/dmarch/ARCHIVE_LOCAL1_0xACE097[0]_2022-06-15_15-43-13.log
4) 创建目标库 D2,即待还原的库,并配置归档,归档目录与数据库 D1 相同
su - dmdba
cd /dm/dmdbms/dm8/bin
./dminit path=/dm/dmdata db_name=DAMENG_FOR_RES
vi /dm/dmdata/DAMENG_FOR_RES/dm.ini
ARCH_INI = 1 #打开归档配置
cd /dm/dmdata/DAMENG_FOR_RES
cp /dm/dmdata/DAMENG/dmarch.ini .
启动 DMRMAN 工具,利用备份集 B1和归档A1 恢复数据库 D2 到D1 故障前的状态;
su - dmdba
cd /dm/dmdbms/dm8/bin
./dmrman
RMAN>RESTORE DATABASE '/dm/dmdata/DAMENG_FOR_RES/dm.ini' FROM BACKUPSET '/dm/dmback/B1';
RMAN>RECOVER DATABASE '/dm/dmdata/DAMENG_FOR_RES/dm.ini' WITH ARCHIVEDIR '/dm/dmarch';
RMAN>RECOVER DATABASE '/dm/dmdata/DAMENG_FOR_RES/dm.ini' UPDATE DB_MAGIC;
启动目标库 D2(DAMENG_FOR_RES),向数据库中继续插入数据:--再次使用jmeter压测工具来模拟数据插入
su - dmdba
cd /dm/dmdbms/dm8/bin
./dmserver /dm/dmdata/DAMENG_FOR_RES/dm.ini
启动后还未插入数据前的情况。
6) 插入数据一段时间后,关掉数据库实例,模拟数据库第二次故障(我们这里使用shutdown immediate;一致性关库,因此归档文件没有损坏,不用修复归档,如果非一致性关库以及意外关闭dmserver进程,都是要做归档修复的)。数据库 D2 启动到第二次故障之间产生的归档文件集为 A2;
- 恢复目标库D2到第一次故障前的状态。恢复一次,目标库的DB_MAGIC都会改变,因此归档 A1、A2 的 DB_MAGIC 不同,属于不同的数据库。第一次恢复只能先重做归档 A1,即恢复到第一次故障前的状态;
su - dmdba
cd /dm/dmdbms/dm8/bin
./dmrman
RMAN>RESTORE DATABASE '/dm/dmdata/DAMENG_FOR_RES/dm.ini' FROM BACKUPSET '/dm/dmback/B1';
RMAN>RECOVER DATABASE '/dm/dmdata/DAMENG_FOR_RES/dm.ini' WITH ARCHIVEDIR '/dm/dmarch';
8) 查看归档 A2 的 DB_MAGIC;
cd /dm/dmdbms/dm8/bin
./dmrachk arch_fil=/dm/dmarch/ARCHIVE_LOCAL1_0x7408949C[0]_2022-06-15_16-42-06.log --注意这里的文件名称已实际的为准
查看一下之前的归档下DB_MAGIC
9) 利用归档 A2 恢复数据库至第二次故障前的状态。从归档恢复时,默认使用目标库的 DB_MAGIC,此时目标库 DB_MAGIC 值被替换为 B1 备份集源库 DB_MAGIC,与归档 A2 DB_MAGIC 值不一致,无法利用该部分归档恢复到最新状态。此时可指定 USE DB_MAGIC参数,指定 DB_MAGIC 值为待恢复归档的 DB_MAIGC 值即可;
RMAN>RECOVER DATABASE '/dm/dmdata/DAMENG_FOR_RES/dm.ini' WITH ARCHIVEDIR '/dm/dmarch' USE DB_MAGIC 1946719388; ---这里 DB_MAGIC 1946719388 是上一步分析出来新的值
至此我们来查看数据库的情况:无法启动,并提示更新DB_MAGIC
更新DB_MAGIC
RMAN>RECOVER DATABASE '/dm/dmdata/DAMENG_FOR_RES/dm.ini' UPDATE DB_MAGIC;
启动成功了,然后查看数据
数据库恢复正常
想象一下这种还原恢复方式的应用场景。
这是应用归档恢复数据库的案例,在理想环境,也就是数据库是正常退出的,在联机备份后,又有大量的数据插入数据库,我们为了追平数据就必须使用数据库的归档日志。
总结:
1.在实际的工作中,如果要关闭数据库服务,最好提前做几次归档切换以及checkpoint(100);
数据库自动完成归档的切换,DM 支持手工切换归档;
alter SYSTEM ARCHIVE LOG CURRENT;
alter SYSTEM SWITCH LOGFILE;
alter DATABASE ARCHIVELOG CURRENT;
- 假设数据库的数据量很大,很有可能某些脏数据是还没有写入数据文件的,我们将DB_BUFFER和LOG_BUFFER中的数据落盘后,如果我们要非常规关库也会降低数据库损坏的风险。
- 这是因为在非常规关库后,数据库再次启动时回去重演redo日志中的内容,直到最后一个有效的归档文件为止才会打开数据库。这样启动数据库的过程就可快可慢,甚至会报错。因此在关闭数据库和启动数据库时一定要谨慎的对待。
- 不要轻易的删除任何一个你认为或者客户认为没有作用的归档日志文件。
- 即便是要删除,可以用mv命令来代替rm命令,将归档日志移动到其他地方。
点不点看你哦:https://eco.dameng.com/




