暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle附加日志概述

作者:Digital Observer(施嘉伟)
Oracle ACE Pro: Database
PostgreSQL ACE Partner
11年数据库行业经验,现主要从事数据库服务工作
拥有Oracle OCM、DB2 10.1 Fundamentals、MySQL 8.0 OCP、WebLogic 12c OCA、KCP、PCTP、PCSD、PGCM、OCI、PolarDB技术专家、达梦师资认证、数据安全咨询高级等认证
ITPUB认证专家、PolarDB开源社区技术顾问、HaloDB技术顾问、TiDB社区技术布道师、青学会MOP技术社区专家顾问、国内某高校企业实践指导教师
公众号:Digital Observer;CSDN:施嘉伟;ITPUB:sjw1933;墨天轮:Digital Observer;PGFans:施嘉伟。

一、描述

数据逻辑同步是基于行的同步,逻辑同步的前提是开启附加日志。在默认情况下,当源端执行 UPDATE 时,目标端无法知道哪些行数据被修改,因为修改的行信息不会记录在 redo log 中。为了解决这个问题,我们需要使用主键来标识修改的行。然而,主键默认情况下并不包含在 redo log 中。因此,需要开启附加日志。开启附加日志的目的,是将主键作为附加信息添加到 redo log 中,使目标端能够获取到源端发生修改的行。

优点:

  1. 可以实现数据逻辑同步,确保数据在源端和目标端的一致性。
  2. 通过使用 Oracle 的 LogMiner 工具,可以实现 DML 误删除和误修改的恢复。

缺点:

  1. 由于 redo log 会记录更多的内容,可能会导致归档日志量的增加,大约是正常日志的十分之一。如果当前环境下归档日志的保留策略较为严格,建议调整归档日志的保留策略,以避免占用过多的存储空间。

二、开启流程

2.1 避免业务高峰期操作

在进行附加日志的开启操作时,应该避开业务高峰期,避免对业务系统的正常运行造成影响。最好选择业务负载较低的时间段进行操作。

2.2 开启前确保没有大事务正在进行

在开启附加日志之前,应确保没有大事务正在运行。使用以下语句可以查询当前数据库中正在进行的事务及其持续时间,从而判断是否可以安全执行附加日志的开启操作:

set linesize 200 set pagesize 5000 col transaction_duration format a45 with transaction_details as ( select inst_id , ses_addr , sysdate - start_date as diff from gv$transaction ) select s.username , to_char(trunc(t.diff)) || ' days, ' || to_char(trunc(mod(t.diff * 24,24))) || ' hours, ' || to_char(trunc(mod(t.diff * 24 * 60,24))) || ' minutes, ' || to_char(trunc(mod(t.diff * 24 * 60 * 60,60))) || ' seconds' as transaction_duration , s.program , s.terminal , s.status , s.sid , s.serial# from gv$session s , transaction_details t where s.inst_id = t.inst_id and s.saddr = t.ses_addr order by t.diff desc;

此查询将列出当前正在执行的事务以及其持续时间。确保没有大事务运行时,再执行后续步骤。

2.3 强制日志及附加日志开启

1. 确保当前环境已开启归档日志

首先,确保归档日志已开启。可以通过以下命令检查归档日志状态:

archive log list;

如果归档日志未开启,需要首先启用归档模式。

2. 开启强制日志模式

强制日志模式确保所有数据变更都被记录到 redo log 中。启用强制日志模式的命令如下:

alter database force logging;

在 Oracle 中,nologging 插入选项会影响数据同步,开启强制日志后,nologging 选项将失效,确保数据同步不会受到影响。如果不开启此模式,当源端执行 nologging 插入操作时,不会记录日志,从而可能导致目标端的数据同步不准确。

3. 开启数据库层面的最小附加日志记录

启用最小的附加日志记录,确保主键等信息可以记录在 redo log 中:

alter database add supplemental log data;

4. 开启具体表的附加日志

为了确保同步的数据表包含必要的日志信息,需要为需要同步的具体表开启附加日志。执行以下命令:

alter table xxx.xxx add supplemental log data(all) columns;

5. 等待事件监控

开启附加日志后,可以通过以下命令监控数据库中等待事件的情况,确保没有异常等待时间。如果出现异常等待时间,可以中断附加日志的开启操作:

select event, count(*) from gv$session where wait_class <> 'Idle' group by event;

如果监控过程中发现多个异常等待事件,可以中止附加日志的开启操作,进行排查和调整。

三、总结

开启附加日志是实现数据逻辑同步的关键步骤。通过确保数据库开启强制日志模式和附加日志记录,我们可以在源端修改数据时,确保目标端能够同步到正确的数据行。此外,附加日志也可以帮助在发生 DML 误操作时恢复数据。尽管开启附加日志会增加一定的日志负担,但其带来的数据一致性保障是非常有价值的。

hhh6.jpg

最后修改时间:2025-05-26 21:06:08
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论