• 正文
  • 相关推荐
申请入驻 产业图谱

DBA | Oracle 重做日志文件介绍配置实践指南

05/26 10:30
1647
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

大家好,我是 WeiyiGeek,一名深耕安全运维开发(SecOpsDev)领域的技术从业者,致力于探索DevOps与安全的融合(DevSecOps),自动化运维工具开发与实践,企业网络安全防护,欢迎各位道友一起学习交流、一起进步 ,若此文对你有帮助,一定记得倒点个关注⭐与小红星❤️,收藏学习不迷路  。

Oracle 重做日志文件

什么是重做日志文件?

描述:重做日志文件(Redo Log Files)是Oracle数据库中记录所有数据变更操作的关键组件,它以循环方式记录数据库中发生的所有事务(变更操作),用于在数据库发生异常时进行容灾恢复的重要文件。每个Oracle数据库必须至少有两个重做日志组,每组可以包含一个或多个成员(镜像文件),组中的每个日志文件被称作一个组成员。

重做日志文件的作用,如下所示:

    数据恢复:确保数据库在故障后可以恢复已提交的事务实例恢复:在数据库异常关闭后重启时,自动前滚已提交但未写入数据文件的事务介质恢复:配合归档日志文件,可以恢复到特定时间点保证数据一致性:确保事务的ACID特性(原子性、一致性、隔离性、持久性)支持数据库操作:为数据库的正常运行提供必要支持

重做日志文件结构特点及工作流程

    重做日志文件结构和特点

你可以将重做日志放入到两个磁盘中DISK1DISK2,组中的成员可以互为镜像,Oracle循环使用日志组,后台进程 LGWR 负责写操作,写满一组后切换到下一组,当前亦可手动触发日志切换, 每个日志组可以包含多个相同的成员(实现冗余),日志文件大小影响检查点和日志切换频率。

    重做日志文件工作流程

当一个重做日志文件在 Group3 写满后,LGWR 将重做日志写入到下一个重做日志组 Group1,若已经归档记录归档日志,否则清空,同理在 Group1 写满后,将写Group2 ,此步骤叫做日志切换,同时会触发执行检查点作者,并会将相关操作及数据信息写入到控制文件中。


weiyigeek.top-重做日志文件结构特点及工作流程

如何修改查询与重做日志文件?

1.查询日志组及成员信息:

-- # 查看 v$log 视图
SQL> select * from v$log;
    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME     NEXT_CHANGE# NEXT_TIME          CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -------------- ------------ -------------- ----------
         1 [组号]          1 [线程]          1 [序列]  209715200 [日志大小200M]       512 [块大小512K]          1 [成员数量] NO [是否归档]  INACTIVE [当前状态]               1490582 [当前SCN] 24-3月 -25          1534500 [下一个SCN] 08-4月 -25              0
         2          1          2  209715200        512          1 NO  INACTIVE               1534500 08-4月 -25          1581300 09-4月 -25              0
         3          1          3  209715200        512          1 NO  CURRENT                1581300 09-4月 -25       1.8447E+19                         0

-- # 查看当前重做日志文件路径及状态  
SQL> col MEMBER for a50;
SQL> select * from v$logfile;
GROUP#    STATUS  TYPE    MEMBER                                      IS_     CON_ID
---------- ------- ------- -----------------------------------------  --- --------
3[组号]  ONLINE[STATUS]  C:APPORACLEORADATAHISTDBREDO03.LOG [成员路径]            NO           0
2         ONLINE  C:APPORACLEORADATAHISTDBREDO02.LOG            NO           0
1         ONLINE  C:APPORACLEORADATAHISTDBREDO01.LOG            NO           0

2.重做日志文件手工切换命令:

alter system switch logfile

3.新增重做日志文件命令:

# 新增重做日志组,日志文件后缀可以随意通常为LOG,或者rdo。
alter database add logfile group 4 ('C:apporacleoradatahistdbREDO04a.LOG','C:apporacleoradatahistdbREDO04b.LOG',,'C:apporacleoradatahistdbREDO04c.LOG') SIZE 100M;

# 新增重做日志组成员
alter database add logfile member
'C:apporacleoradatahistdbREDO1c.LOG' to group 1,
'C:apporacleoradatahistdbREDO2c.LOG' to group 2,
'C:apporacleoradatahistdbREDO3c.LOG' to group 3;

4.重命名/重定位日志文件命令:

-- 1. 关闭数据库
SHUTDOWN IMMEDIATE;

-- 2. 在操作系统层面移动或重命名文件
cp 或者 mv 命令

-- 3. 启动到mount状态
STARTUP MOUNT;

-- 4. 更新控制文件中的信息
ALTERDATABASERENAMEFILE
'/old_location/redo01.log'
TO'/new_location/redo01.log';

-- 5. 打开数据库
ALTERDATABASEOPEN;

5.删除重做日志文件组与组成员命令:

-- # 确认要删除的组不是当前活动组
-- 查看日志组信息
SELECTgroup#, sequence#, bytes/1024/1024 "SIZE(MB)", members, status , archived
FROM v$log;
-- 1 4192 200 1 INACTIVE NO
-- 2 4193 200 1 CURRENT NO
-- 3 4191 200 1 INACTIVE NO
-- 查看日志成员信息
SELECTgroup#, member, status FROM v$logfile;
-- 3 C:APPORADATAORCLREDO03.LOG 
-- 2 C:APPORADATAORCLREDO02.LOG 
-- 1 C:APPORADATAORCLREDO01.LOG 

-- 查看当前日志序列号
SELECTsequence# FROM v$log WHERE status = 'CURRENT';
-- 4193

-- # 如果状态为ACTIVE或CURRENT,需要先执行日志切换
ALTERSYSTEMSWITCHLOGFILE;

-- # 删除组
alterdatabasedroplogfilegroup4;
-- # 删除组成员
alterdatabasedroplogfilemember'C:apporacleoradatahistdbREDO04b.LOG';

6.修改重做日志文件大小命令:

-- 无法直接修改现有日志文件大小,必须创建新组然后删除旧组
-- 1. 添加新大小的日志组
ALTERDATABASEADDLOGFILEGROUP4
  ('/path/redo04a.log', '/path/redo04b.log') SIZE200M;

-- 2. 切换日志直到旧组变为INACTIVE状态
ALTERSYSTEMSWITCHLOGFILE;

-- 3. 删除旧日志组
ALTERDATABASEDROPLOGFILEGROUP1;

实例演示

    由于当前数据库实例 REDO 日志组不足,需要增加二组重做日志文件(默认为 200M),生产环境常常遇到。
# 1.由于作者已经有三组,所以新增组号 4,5
alter database add logfile group 4 'C:apporacleoradatahistdbREDO04a.LOG' SIZE 200M;
alter database add logfile group 5 'C:apporacleoradatahistdbREDO05a.LOG' SIZE 200M;

# 2.手动切换重做日志文件
SQL> alter system switch logfile;

# 3.切换后组4 状态为 CURRENT, 表明正常使用。
SQL> select * from v$log;
    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME     NEXT_CHANGE# NEXT_TIME          CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -------------- ------------ -------------- ----------
         1          1          1  209715200        512          1 NO  INACTIVE               1490582 24-3月 -25          1534500 08-4月 -25              0
         2          1          2  209715200        512          1 NO  INACTIVE               1534500 08-4月 -25          1581300 09-4月 -25              0
         3          1          3  209715200        512          1 NO  ACTIVE                 1581300 09-4月 -25          1615472 09-4月 -25              0
         4          1          4  209715200        512          1 NO  CURRENT                1615472 09-4月 -25       1.8447E+19                         0
         5          1          0  209715200        512          1 YES UNUSED                       0                           0                         0


weiyigeek.top-新增增加二组重做日志

    由于数据库系统空间不足,需要删除两组重做日志文件,需要在开启归档的状态下,以释放空间。
# 1.首先,将切换到 组1、组2、组3 都可以,不要占用要删除的两组重做日志组,切换日志直到旧组变为INACTIVE状态
SQL> alter system switch logfile;

# 2.其次,删除上面新增的两组重做日志文件。
SQL> alter database drop logfile group 5;
SQL> alter database drop logfile group 4;

# 3.最后,查看日志文件相关成员。
SQL> select * from v$log;

weiyigeek.top-删除增加的二组重做日志

最后提及一点,重做日志文件是Oracle数据库高可用性和可恢复性的核心组件,合理配置和管理对数据库性能和数据安全至关重要。在生产环境中,一般3-5组,避免过多导致管理复杂,每个日志组至少应有2个成员,存储在不同磁盘上,通常建议100-200MB,根据事务量调整,并且建议将日志文件分散在不同I/O通道上,以减少I/O争用。

加入:作者【全栈工程师修炼指南】知识星球

相关推荐