Redo log

本文详细介绍了Oracle数据库重做日志文件的作用、特征、管理方法及日志组的维护,包括日志组的添加、成员文件的管理、日志大小调整及日志文件的迁移与恢复。

1 作用

重做日志文件用来记录数据库所有发生过的更改信息(修改、添加、删除等)以及由Oracle内部行为(创建数据表、索引等)而引起的数据库变化信息,在数据库恢复时,可以从该日志文件中读取原始记录。在数据库运行期间,当用户执行commit命令时,数据库首先将每笔操作的原始记录写入日志文件中,写入日志文件后,才把新的记录传递给应用程序,所以,在日志文件上可以随时读取原始记录以恢复某些数据。
实例恢复 instance recovery

2 特征

1)日志条目+记录数据库中块的变化(DML、DDL):由LGWR写入
2)用于数据块的 recover
3)以组的方式管理 redo file,最少两组 redo,循环使用
4)和数据文件存放到不同的磁盘上,需读写速度快的磁盘(比如采用 RAID10)
5)日志的 block 和数据文件的 block 不一样

3 redo file group

在这里插入图片描述
三组循环使用,每组就一个文件。如果有文件坏了,风险会变大,所以会增加第二个member。一个组里的所有文件的内容是同步的。所以部署在不同的磁盘上。
在生产环境中,安全规划是最好一个日志组两个日志成员(在不同路径);根据生产压力来决定组数和日志大小;一般50M比较小,可以根据生产压力适当调大。

4 查看日志信息的三个视图

4.1 v$log

查看组信息

SQL> select group#,sequence#,bytes/1024/1024 size_M,blocksize,members,status from v$log;

    GROUP#  SEQUENCE#	  SIZE_M  BLOCKSIZE    MEMBERS STATUS
---------- ---------- ---------- ---------- ---------- ----------------
	 1	   10	      50	512	     1 INACTIVE
	 2	   11	      50	512	     1 INACTIVE
	 3	   12	      50	512	     1 CURRENT
  • 每一组现在只有一个成员member,也就是说一组只有一个redo log
  • 最大的序列号12就是当前正在被使用的组group 3,如果现在用到group 1了,那么group 1的号会变为13
  • 默认大小是50 M,数据块字节是512

4.2 v$logfile

查看文件信息

SQL> select * from v$logfile;

    GROUP# STATUS  TYPE    MEMBER					      IS_
---------- ------- ------- -------------------------------------------------- ---
	 1	   ONLINE  /oracledata/oradata/nsfcdc/redo01.log	      NO
	 3	   ONLINE  /oracledata/oradata/nsfcdc/redo03.log	      NO
	 2	   ONLINE  /oracledata/oradata/nsfcdc/redo02.log	      NO

4.3 v$archived_log(归档模式下查看)

THREAD#: 线程在单实例的环境下,thread# 永远是 1
SEQUENCE# 日志序列号。在日志切换时会递增,每一个节点有一个自己的编号
FIRST_CHANGE# 在每个日志组对应一个 sequence 号,其中FIRST_CHANGE# 是首条日志条目的第一个的 scn。

5 工作原理

STATUS 列有四种状态:
1.current: 当前日志组对应的脏块还没有全部从 data buffer 写入到 data file,含有实例恢复需要的信息,不能被覆盖
2. active: 日志组对应的脏块还没有完全从 data buffer 写入到 data file,含有实例恢复需要 的信息,不能被覆盖
3.inactive: 日志组对应的脏块已经从 data buffer 写入到 data file,可以覆盖(如果循环回来是active,那么数据库要等到inactive才能用)
4. unused:新添加的日志组,还没有使用
只要redo log的状态不是current和active就都会被用

如果redo特别忙,切换的过程一直是active,就会一直没有可用的,要一直等
切换日志组:
alter system switch logfile;

6 添加日志组

1.查看当前信息
在这里插入图片描述
2.添加日志组
在这里插入图片描述
3.查看状态
在这里插入图片描述4.切换日志组
在这里插入图片描述
*4个组并不是按顺序循环的

7 添加成员文件

1.为每个组增加一个 member(一共是 3个组) 先建好目录,准备放在/opt/oracle/log_member/下(假设这个目录是一块新的磁盘)

[oracle@nsfcdc ~]$ mkdir log_member
[oracle@nsfcdc log_member]$ pwd
/opt/oracle/log_member

2.为group 1 添加成员文件

SQL>alter database add logfile member '/opt/oracle/log_member/redo01.log' to group 1;

3.为所有group添加1个成员

SQL> select group#,sequence#,bytes/1024/1024 size_M,blocksize,members,status from v$log;

    GROUP# SEQUENCE#	 SIZE_M  BLOCKSIZE    MEMBERS STATUS
---------- --------- ---------- ---------- ---------- ----------------
	 1	  10	     50        512	    2 INACTIVE
	 2	  11	     50        512	    2 INACTIVE
	 3	  12	     50        512	    2 CURRENT

SQL> select * from v$logfile;

    GROUP# STATUS  TYPE    MEMBER					      IS_
---------- ------- ------- -------------------------------------------------- ---
	 1	   ONLINE  /oracledata/oradata/nsfcdc/redo01.log	      NO
	 3	   ONLINE  /oracledata/oradata/nsfcdc/redo03.log	      NO
	 2	   ONLINE  /oracledata/oradata/nsfcdc/redo02.log	      NO
	 1 INVALID ONLINE  /opt/oracle/log_member/redo01.log		      NO
	 2 INVALID ONLINE  /opt/oracle/log_member/redo02.log		      NO
	 3 INVALID ONLINE  /opt/oracle/log_member/redo03.log		      NO

6 rows selected.

STATUS 是 INVALID,说明 member 还没有同步好。
4.切换日志组,完成同步,消除invalid

SQL> alter system switch logfile;

System altered.

# 切换三次

SQL> select group#,status,sequence# from v$log;

    GROUP# STATUS	    SEQUENCE#
---------- ---------------- ---------
	 1 INACTIVE		   13
	 2 INACTIVE		   14
	 3 CURRENT		   15
SQL> select * from v$logfile;

    GROUP# STATUS  TYPE    MEMBER					      IS_
---------- ------- ------- -------------------------------------------------- ---
	 1	   ONLINE  /oracledata/oradata/nsfcdc/redo01.log	      NO
	 3	   ONLINE  /oracledata/oradata/nsfcdc/redo03.log	      NO
	 2	   ONLINE  /oracledata/oradata/nsfcdc/redo02.log	      NO
	 1	   ONLINE  /opt/oracle/log_member/redo01.log		      NO
	 2	   ONLINE  /opt/oracle/log_member/redo02.log		      NO
	 3	   ONLINE  /opt/oracle/log_member/redo03.log		      NO

6 rows selected.

8 修改现有的日志文件大小

先删再建
1.删除日志组

  • 先查看各组状态
SQL> select group#,sequence#,bytes/1024/1024 size_M,blocksize,members,status from v$log;

    GROUP#  SEQUENCE#	  SIZE_M  BLOCKSIZE    MEMBERS STATUS
---------- ---------- ---------- ---------- ---------- ----------------
	 1	   16	     100	512	     1 INACTIVE
	 2	   17	      50	512	     2 CURRENT
	 3	   15	      50	512	     2 INACTIVE

current和active状态下的group不能删

  • 删除group 3
SQL> alter database drop logfile group 3;

Database altered.

2.添加组及成员

  • 添加成员及成员文件
SQL> alter database add logfile member '/opt/oracle/log_member/redo03.log' to group 3;
alter database add logfile member '/opt/oracle/log_member/redo03.log' to group 3
*
ERROR at line 1:
ORA-00301: error in adding log file '/opt/oracle/log_member/redo03.log' - file cannot be created
ORA-27038: created file already exists
Additional information: 1

drop logfile group的时候不会删掉磁盘上的文件,删除物理文件需要rm。而且删除日志组的时候,控制文件也被更新。

  • 手动删除物理文件
SQL> ! rm /oracledata/oradata/nsfcdc/redo03.log

SQL> ! rm /opt/oracle/log_member/redo03.log
  • 重新添加成员及成员文件
SQL> alter database add logfile group 3 '/oracledata/oradata/nsfcdc/redo03.log' size 100M;

Database altered.
SQL> alter database add logfile member '/opt/oracle/log_member/redo03.log' to group 3;

Database altered.

SQL> select group#,sequence#,bytes/1024/1024 size_M,archived,members,status from v$log;

    GROUP#  SEQUENCE#	  SIZE_M ARC	MEMBERS STATUS
---------- ---------- ---------- --- ---------- ----------------
	 1	   16	      50 YES	      2 INACTIVE
	 2	   17	      50 NO	      2 CURRENT
	 3	    0	     100 YES	      2 UNUSED
  • 为group 1一次添加两个成员文件
SQL> alter database add logfile group 1 ('/oracledata/oradata/nsfcdc/redo01.log','/opt/oracle/log_member/redo01.log') size 100M;

Database altered.

SQL> select group#,sequence#,bytes/1024/1024 size_M,archived,members,status from v$log;

    GROUP#  SEQUENCE#	  SIZE_M ARC	MEMBERS STATUS
---------- ---------- ---------- --- ---------- ----------------
	 1	   16	      100 YES	      2 INACTIVE
	 2	   17	      50 NO	      2 CURRENT
	 3	    0	     100 YES	      2 UNUSED
  • 把active变为inactive:手动发起检查点
SQL> alter system checkpoint;

System altered.

SQL> select group#,status from v$log;

    GROUP# STATUS
---------- ----------------
	 1 CURRENT
	 2 INACTIVE
	 3 INACTIVE
  • 为group 2扩展大小至100 M
SQL>  select group#,sequence#,bytes/1024/1024 size_M,archived,members,status from v$log;

    GROUP#  SEQUENCE#	  SIZE_M ARC	MEMBERS STATUS
---------- ---------- ---------- --- ---------- ----------------
	 1	   20	     100 NO	      2 CURRENT
	 2	   19	     100 YES	      2 INACTIVE
	 3	   18	     100 YES	      2 INACTIVE

9 日志成员文件的迁移

9.1 方法一:关库-移动

1.关库

SQL> shutdown immediate;

2.重命名文件

mv /oracledata/oradata/nsfcdc/redo02.log /opt/oracle/log_member/redo02_1.log

3.将数据库启动到mount

SQL> statup mount;
SQL> select group#,member from v$logfile order by 1;

4.通知控制文件

SQL> alter database rename file '/oracledata/oradata/nsfcdc/redo02.log' to '/opt/oracle/log_member/redo02_1.log';

5.打开数据库

SQL> alter database open;

9.2 方法二:先删后加

1.查看组信息

SQL> select group#,status from v$log;
SQL> select group#,member from v$logfile;

2.手动发起检查点,切换current组

SQL> alter system checkpoint;
SQL> select group#,status from v$log;

3.删除非current组成员文件

SQL> alter database drop logfile member '/oracledata/oradata/nsfcdc/redo02.log';

4.添加组成员文件

SQL> alter database add logfile member '/opt/oracle/log_member/redo02.log' to group 2;

10 在线日志文件的恢复方法

  • 不小心干掉current日志组的报错信息:
    在这里插入图片描述
  • 解决办法:(不完全恢复)
SQL> conn / as sysdba
Connected to an idle instance.
 
SQL> create pfile from spfile;
File created.
 
SQL> startup mount;
ORACLE instance started.

SQL> recover database until cancel;
Media recovery complete.
 
SQL> alter database open resetlogs;
Database altered.
### MySQL Redo Log 损坏的修复与数据库恢复方法 Redo Log 是 InnoDB 存储引擎的核心组件之一,用于实现事务的持久性和崩溃恢复能力。当 Redo Log 文件损坏时,数据库的恢复将面临挑战。以下是关于 Redo Log 损坏的修复方法和数据库恢复策略的详细说明。 #### Redo Log 损坏的原因 Redo Log 文件损坏可能由多种原因引起,包括: - **硬件故障**:例如硬盘损坏或存储设备故障。 - **文件系统错误**:文件系统损坏可能导致 Redo Log 文件无法正常读取。 - **MySQL 异常关闭**:如果 MySQL 在写入 Redo Log 时异常关闭,可能会导致日志文件不完整或损坏。 - **人为操作失误**:误删或修改 Redo Log 文件也可能导致损坏。 #### 数据库恢复策略 当 Redo Log 损坏时,数据库的恢复主要依赖于以下几种机制和策略: ##### 1. **从备恢复** 如果存在完整的数据库备(如逻辑备或物理备),可以通过备恢复数据。这是最直接且可靠的方法。备可以包括: - **逻辑备**:例如使用 `mysqldump` 生成的 SQL 文件。 - **物理备**:例如使用 `Percona XtraBackup` 工具生成的备。 在恢复过程中,首先需要将备文件还原到数据库中,然后通过 Binlog 补充备之后的增量数据[^1]。 ##### 2. **利用 Binlog 和 Undo Log** 如果 Redo Log 损坏但 Binlog 和 Undo Log 完好,可以通过以下步骤尝试恢复数据: - **分析 Binlog**:Binlog 记录了所有对数据库的修改操作,可以用于恢复到某个时间点的状态。 - **应用 Undo Log**:Undo Log 记录了事务的撤销操作,可用于回滚未提交的事务。 需要注意的是,BinlogRedo Log 的状态必须一致。如果 Redo Log 和 Binlog 的状态不一致(例如 Redo Log 已刷盘但 Binlog 尚未写入),则可能导致数据不一致问题[^4]。 ##### 3. **强制启动数据库** 如果 Redo Log 损坏但数据文件(如 `.ibd` 文件)完好,可以尝试通过修改 MySQL 配置文件强制启动数据库。具体步骤如下: - **设置 `innodb_force_recovery` 参数**:在 MySQL 配置文件中设置 `innodb_force_recovery=1` 到 `6` 之间的值,以尝试强制启动数据库。值越大,强制恢复的力度越强,但可能导致数据丢失。 - **导出数据**:在强制启动后,尽快导出重要数据。 - **重建数据库**:导出数据后,重建数据库并重新导入数据。 需要注意的是,这种方法可能导致部分数据丢失,因此应谨慎使用。 ##### 4. **使用专业工具修复** 如果 Redo Log 损坏且无法通过上述方法恢复,可以尝试使用专业的数据恢复工具或服务。这些工具通常能够直接读取磁盘上的数据文件,并尝试修复损坏的日志文件。 #### 预防措施 为了减少 Redo Log 损坏的风险,建议采取以下预防措施: - **启用双写机制**:InnoDB 的双写机制可以提高数据文件的可靠性。 - **定期备**:定期进行逻辑和物理备,确保在发生故障时能够快速恢复数据。 - **监控硬件健康状态**:使用硬件监控工具(如 `smartctl`)检测硬盘健康状态,及时发现潜在问题。 - **合理配置 Redo Log**:确保 Redo Log 文件的大小和数量足够,并启用 `innodb_flush_log_at_trx_commit=1` 以保证事务的持久性[^3]。 ### 示例代码:强制启动数据库 以下是一个修改 MySQL 配置文件以强制启动数据库的示例: ```ini [mysqld] innodb_force_recovery = 4 ``` 在修改配置文件后,重启 MySQL 服务。强制启动后,应尽快导出数据并重建数据库。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值