大家好,我是 WeiyiGeek,一名深耕安全运维开发(SecOpsDev)领域的技术从业者,致力于探索DevOps与安全的融合(DevSecOps),自动化运维工具开发与实践,企业网络安全防护,欢迎各位道友一起学习交流、一起进步 ,若此文对你有帮助,一定记得倒点个关注⭐与小红星❤️,收藏学习不迷路 。
Oracle 重做日志文件
什么是重做日志文件?
描述:重做日志文件(Redo Log Files)是Oracle数据库中记录所有数据变更操作的关键组件,它以循环方式记录数据库中发生的所有事务(变更操作),用于在数据库发生异常时进行容灾恢复的重要文件。每个Oracle数据库必须至少有两个重做日志组,每组可以包含一个或多个成员(镜像文件),组中的每个日志文件被称作一个组成员。
重做日志文件的作用,如下所示:
- 数据恢复:确保数据库在故障后可以恢复已提交的事务实例恢复:在数据库异常关闭后重启时,自动前滚已提交但未写入数据文件的事务介质恢复:配合归档日志文件,可以恢复到特定时间点保证数据一致性:确保事务的ACID特性(原子性、一致性、隔离性、持久性)支持数据库操作:为数据库的正常运行提供必要支持
重做日志文件结构特点及工作流程
- 重做日志文件结构和特点
你可以将重做日志放入到两个磁盘中
DISK1、DISK2,组中的成员可以互为镜像,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争用。
1647