mysql 的ReLog和BinLog区别

程序浅谈 数据库 2024-11-11

mysql 的ReLog和BinLog区别

MySQL中的重做日志(Redo Log)和二进制日志(Binary Log)是两种重要的日志系统,它们在数据库的事务处理、恢复和复制中扮演着关键角色。以下是它们之间的主要区别:

  1. 作用

    • 重做日志(Redo Log)主要用于保证事务的持久性和原子性。当系统发生故障时,可以使用重做日志来恢复未提交的事务更改,确保数据的完整性 。
    • 二进制日志(Binary Log)则主要用于数据的复制、恢复和审计。它记录了数据库的所有更改操作,包括数据的增删改以及结构变更等 。
  2. 内容形式

    • 重做日志是物理日志,记录的是数据页的物理修改信息,即实际的数据变化 。
    • 二进制日志是逻辑日志,记录的是SQL语句的逻辑变化,即执行的具体SQL操作 。
  3. 写入时机

    • 重做日志在事务进行中不断写入,当事务提交时,相关的重做日志会从日志缓冲区刷新到磁盘上的日志文件中 。
    • 二进制日志则在事务提交时一次性写入,记录了事务期间的所有更改 。
  4. 存储方式

    • 重做日志存储在循环使用的日志文件组中,当写满后会覆盖旧的日志 。
    • 二进制日志文件是追加写入的,每个文件写满后会生成新的日志文件,并且可以通过配置参数进行管理 。
  5. 配置参数

    • 重做日志的配置参数包括innodb_log_file_size(每个重做日志文件的大小)和innodb_log_files_in_group(重做日志文件的数量) 。
    • 二进制日志的配置参数包括log_bin(启用二进制日志并指定日志文件前缀)和expire_logs_days(设置二进制日志的过期天数)等 。
  6. 释放机制

    • 重做日志的释放依赖于脏页的刷新策略,当事务提交后,如果对应的脏页写入磁盘,重做日志就可以被覆盖使用 。
    • 二进制日志文件会根据配置的过期时间自动清理,或者通过PURGE BINARY LOGS命令手动删除 。
  7. 使用范围

    • 重做日志是InnoDB存储引擎特有的,而二进制日志是MySQL服务器层的,所有存储引擎都可以使用二进制日志 。

理解这两种日志的区别对于数据库的维护和管理至关重要,它们共同确保了数据库的稳定性和可靠性。

示例应用

让我们通过示例来说明重做日志(Redo Log)和二进制日志(Binary Log)的用法。

示例环境配置

假设我们有一个MySQL服务器,配置了InnoDB存储引擎和二进制日志。以下是一些基本的配置参数:ini

代码解读
复制代码
[mysqld] innodb_log_file_size = 64M innodb_log_files_in_group = 2 log_bin = /var/log/mysql/mysql-bin.log expire_logs_days = 7 server_id = 1

重做日志(Redo Log)的用法示例

  1. 事务操作和持久性保证:假设我们执行了一系列的INSERT和UPDATE操作,这些操作首先会被记录到重做日志的日志缓冲区中。sql

    代码解读
    复制代码
    START TRANSACTION; INSERT INTO users (username, email) VALUES ('john_doe', 'john@example.com'); UPDATE users SET email = 'john_new@example.com' WHERE username = 'john_doe'; COMMIT;
  2. 系统崩溃后的恢复:如果系统在执行COMMIT之前崩溃,InnoDB存储引擎将在系统重启时使用重做日志来恢复这些未提交的更改,以保证事务的持久性。

二进制日志(Binary Log)的用法示例

  1. 记录事务更改:当执行上面的事务操作时,MySQL服务器层会将这些操作记录到二进制日志中。这包括了INSERT和UPDATE语句的逻辑更改。sql

    代码解读
    复制代码
    -- 这将在二进制日志中记录类似如下的事件: -- # at 123456789 -- ## Update -- UPDATE users SET email = 'john_new@example.com' WHERE username = 'john_doe'; -- ## Insert -- INSERT INTO users (username, email) VALUES ('john_doe', 'john@example.com');
  2. 主从复制:假设我们有一个主从复制环境,主服务器上的二进制日志将被传输到从服务器。从服务器将应用这些日志中的更改来保持数据的同步。sql

    代码解读
    复制代码
    -- 在从服务器上,将执行类似以下的命令来启动复制过程: CHANGE MASTER TO MASTER_HOST = 'master_server_ip', MASTER_USER = 'replica_user', MASTER_PASSWORD = 'replica_password', MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 123; START SLAVE;
  3. 数据恢复:如果需要恢复数据到某个特定的时间点,可以使用mysqlbinlog工具解析二进制日志文件,并按照日志中的事件顺序执行,以实现数据的恢复。sh

    代码解读
    复制代码
    mysqlbinlog --start-datetime="2024-07-01 00:00:00" --stop-datetime="2024-07-02 23:59:59" mysql-bin.000001 | mysql -uroot -p

通过这些示例,我们可以看到重做日志和二进制日志在确保数据库事务的持久性、原子性以及在复制和恢复过程中的不同作用。重做日志关注于事务的物理数据恢复,而二进制日志则记录了逻辑的SQL操作,用于复制和数据恢复。

转载来源:https://juejin.cn/post/7397317017923239962

Apipost 私有化火热进行中

评论