注册
数据库突发故障时,如何利用归档日志最大程度减少数据损失
专栏/培训园地/ 文章详情 /

数据库突发故障时,如何利用归档日志最大程度减少数据损失

刘涛 2024/05/24 704 1 0
摘要

在数据库管理领域,面对突发故障,确保数据安全和业务连续性是至关重要的。本文讲解了在达梦数据库如何利用归档日志机制,在数据库发生故障后,最大程度减少数据损失,并提供一套完整的实操指南。

一、归档日志概述及其重要性

归档日志是数据库管理系统在运行期间创建的一系列记录,详细记载了对数据库的所有修改操作,包括但不限于插入、更新、删除等。这一机制在达梦数据库中非常核心,特别是在归档模式下。
为何需要归档日志:

  • 数据恢复的精确性:归档日志支持LSN和时间点恢复,使得数据库可以恢复到故障点之前的任意LSN和时间点。
  • 业务连续性保障:快速恢复至故障前状态,减少业务中断,降低损失。
  • 合规性满足:确保数据可恢复至特定时间点,满足审计和追溯性要求。
  • 增强灾难恢复能力:配合远程备份,实现异地数据恢复,提高系统抗灾能力。

二、归档日志的工作机制

  1. 归档模式与非归档模式:达梦数据库支持两种运行模式,其中归档模式下,重做日志在日志切换时会被归档保存。
  2. 日志切换:联机重做日志文件满后,会触发日志切换,旧日志内容在归档模式下会被归档。
  3. 归档逻辑:归档过程自动进行,确保数据更改记录持久保存,归档日志有序且不可更改,便于管理和恢复。
  4. 备份与恢复:结合完全备份和归档日志,实现到故障点的精确恢复。
  5. 管理与维护:包括监控归档日志的生成与存储,使用系统函数进行归档文件管理,以及日志挖掘功能的运用。

三、关于配置归档的建议如下:

  1. 如何配置:可通过编辑配置文件、使用控制台工具或SQL方式开启归档模式,并调整相关参数,在第六点中,会介绍如何使用SQL的方式开启和配置归档

  2. 出于性能的考虑:

    • 增大联机重做日志文件大小,减少日志切换频率。
    • 使用异步归档减少对在线事务的影响。
    • 将归档日志目录规划到性能较高的存储介质上。
  3. 出于数据安全的考虑:

    • 采用同步归档确保数据即时归档,减少丢失风险。
    • 配置多路归档增加冗余。
    • 设置长期的归档保留策略并定期验证归档日志的完整性。

四、重做日志与归档日志的区别及联系

  1. 重做日志记录了数据库的所有更改操作,是数据库崩溃恢复的基石,循环使用并可能在非归档模式下被覆盖。
  2. 归档日志则是重做日志的备份,确保数据可恢复到任意时间点,即使原始重做日志被覆盖。
  3. 二者共同构成数据库恢复的基础,重做日志实时记录,归档日志长期保存,共同保障数据库的可靠性和可恢复性。

五、面对完全备份与归档的“空窗期”问题,如何解决

当完全备份与现有归档日志间存在未被覆盖的区间时,需要采取措施,确保归档日志的连续性和完整性,具体的方法如下:

  • 增加归档日志的保留期限
  • 实施更为频繁的备份策略
  • 优化存储管理

六、模拟突发故障,利用归档恢复的场景

完全备份+归档备份(假设归档与完全备份不存在空窗期)

  1. 配置归档,并开启归档
-- 将数据库置为mount ALTER DATABASE MOUNT; -- 配置归档 ALTER DATABASE ADD ARCHIVELOG 'DEST = /dmdata/5236/arch, TYPE = local, FILE_SIZE = 1024, SPACE_LIMIT = 2048'; -- 开启归档 ALTER DATABASE ARCHIVELOG; -- 将数据库置为open ALTER DATABASE open; -- 检查归档文件 select arch_mode from v$database;
  1. 创建测试表空间和测试用户
-- 初始化测试表空间 create tablespace "TESTTSB" datafile '/dmdata/5236/DAMENG1/TESTTSB.dbf' size 128 autoextend off CACHE = NORMAL; CREATE USER "TEST" IDENTIFIED BY Dameng123 HASH WITH SHA512 NO SALT PASSWORD_POLICY 2 ENCRYPT BY Dameng123 LIMIT FAILED_LOGIN_ATTEMPS 3, PASSWORD_LOCK_TIME 1, PASSWORD_GRACE_TIME 10 DEFAULT TABLESPACE "TESTTSB"; grant "DBA","RESOURCE","PUBLIC" to "TEST"; grant CREATE SESSION to "TEST";
  1. 执行完全热备
-- 在disql中进行完全热备 backup database full backupset '/dmdata/5236/bak/dbfull_202405221731' COMPRESSED LEVEL 5 TASK THREAD 4 PARALLEL 8;
  1. 生成测试数据
-- 建表,循环插入数据,每秒插入一条 create table TEST.test_tab(id int, createtime datetime); begin for i in 1..1000000 loop insert TEST.test_tab values(i, sysdate); commit; sleep(1); end loop; end -- 重开一个会话进行查询 select * from TEST.test_tab order by createtime desc;
  1. 模拟故障:手动kill掉数据库进程,然后删除TESTTSB测试表空间
ps -ef|grep dmserver kill 2360488 rm -rf /dmdata/5236/DAMENG1/TESTTSB.DBF
  1. 突发故障,无法启动,可离线进行归档备份
-- 使用dmrman工具生成归档备份
./dmrman CTLSTMT="BACKUP ARCHIVE LOG ALL DATABASE  '/dmdata/5236/DAMENG1/dm.ini' backupset '/dmdata/5236/bak/arch_bak_202405221932'"
  1. 使用完全备份+归档备份恢复到指定时间点
-- 基于全备还原
./dmrman CTLSTMT="RESTORE DATABASE '/dmdata/5236/DAMENG1/dm.ini'  FROM BACKUPSET '/dmdata/5236/bak/dbfull_202405221731'" 

-- 基于全备恢复
./dmrman CTLSTMT="RECOVER DATABASE '/dmdata/5236/DAMENG1/dm.ini'  FROM BACKUPSET '/dmdata/5236/bak/dbfull_202405221731'" 

-- 还原归档日志
-- OVERWRITE参数为:1表示认为归档文件完好,不再还原该归档文件,添加一条日志记录;2表示存在同名归档立即报错返回,终止还原;3表示强制删除归档,重新还原同名归档
./dmrman CTLSTMT="RESTORE ARCHIVE LOG FROM BACKUPSET '/dmdata/5236/bak/arch_bak_202405221932' TO DATABASE '/dmdata/5236/DAMENG1/dm.ini' OVERWRITE 3"

-- 查看归档备份的日志范围(查看LSN范围)
./dmrman CTLSTMT="SHOW BACKUPSET '/dmdata/5236/bak/arch_bak_202405221932' INFO meta" 

-- 基于被还原的归档日志恢复到指定的LSN(通过归档备份的日志范围,确定恢复到哪个LSN节点)
./dmrman CTLSTMT="recover database '/dmdata/5236/DAMENG1/dm.ini' with archivedir '/dmdata/5236/arch' until lsn 46160 " 

-- 更新数据库魔术
./dmrman CTLSTMT="RECOVER DATABASE  '/dmdata/5236/DAMENG1/dm.ini'  UPDATE DB_MAGIC"

七、归档备份的其他6种方式

./dmrman CTLSTMT="BACKUP ARCHIVE LOG ALL DATABASE  '/dmdata/5236/DAMENG1/dm.ini' backupset '/dmdata/5236/bak/arch_bak_202405221932'"
./dmrman CTLSTMT="BACKUP ARCHIVE LOG FROM lsn 50414  DATABASE  '/dmdata/5236/DAMENG1/dm.ini' backupset '/dmdata/5236/bak/arch_bak_202405221933'"
./dmrman CTLSTMT="BACKUP ARCHIVE LOG UNTIL lsn 50478  DATABASE  '/dmdata/5236/DAMENG1/dm.ini' backupset '/dmdata/5236/bak/arch_bak_202405221934'"
./dmrman CTLSTMT="BACKUP ARCHIVE LOG lsn between 50414 and 50478  DATABASE  '/dmdata/5236/DAMENG1/dm.ini' backupset '/dmdata/5236/bak/arch_bak_202405221935'"
./dmrman CTLSTMT="BACKUP ARCHIVE LOG FROM TIME '2024-05-22 20:16:29'  DATABASE  '/dmdata/5236/DAMENG1/dm.ini' backupset '/dmdata/5236/bak/arch_bak_202405221936'"
./dmrman CTLSTMT="BACKUP ARCHIVE LOG UNTIL TIME '2024-05-22 20:17:57'  DATABASE  '/dmdata/5236/DAMENG1/dm.ini' backupset '/dmdata/5236/bak/arch_bak_202405221937'"
./dmrman CTLSTMT="BACKUP ARCHIVE LOG TIME between '2024-05-22 20:16:29' and '2024-05-22 20:17:57'  DATABASE  '/dmdata/5236/DAMENG1/dm.ini' backupset '/dmdata/5236/bak/arch_bak_202405221938'"
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服