• MySQL之binlog日志


    一、什么是binlog

    binlog 是一个二进制格式的文件,用于记录用户对数据库 更新的SQL语句 信息,例如更改数据库表和更改内容的SQL语句都会记录到binlog里,但是对库表等内容的查询不会记录

    默认情况下,binlog 日志是二进制格式的,不能使用查看文本工具的命令(比如,cat,vi等)查看,而使用mysqlbinlog 解析查看。

    二、binlog 的作用

    用于数据库的主从复制及数据的增量恢复。

    三、binlog 三种模式

    3.1 Row Level 模式(RBR)

    不记录每条sql语句的上下文信息,只需记录哪条数据被修改了,修改成什么样了。
    

    优点:

    * 准确性强,能准确复制数据的变更
    * 减少数据库锁的使用
    

    缺点:

    * 会产生大量的日志,导致较大的网络IO和磁盘IO
    * 要求主从数据库表结构完全一致
    * 无法在从数据库上单独执行触发器
    

    3.2 Statement Level 模式(SBR)

    每一条修改数据的 sql 都会记录到 master 的 bin_log 中,slave 在复制的时候 sql 进程会解析成 master 端执行过的相同的 sql 在 slave 库上再次执行。
    

    优点:

    * 不需要记录每一条sql语句和每一行的数据变化,减少了binlog日志量,节约IO,提高性能
    * 并不强制要求主从数据库的表结构定义完全相同
    

    缺点:

    * 在某些情况下会导致 master-slave 中的数据不一致(如sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题)
    * 相比于 RBR 模式,在执行复制时需要更多的行锁
    

    3.3 MIXED模式(MBR)

    以上两种模式的混合使用,一般的复制使用 STATEMENT 模式保存 binlog,对于 STATEMENT 模式无法复制的操作使用 ROW 模式保存 binlog,MySQL会根据执行的 SQL 语句选择日志保存方式。
    

    优点:

    准确性强,文件大小适中
    

    缺点:

    有可能发生主从不一致问题
    

    3.4 binlog模式的选择

    1. 不用存储过程、触发器、函数,选择默认的 Statement level
    2. 用到MySQL的特殊功能(存储过程、触发器、函数)选择Mixed模式
    3. 用到MySQL的特殊功能(存储过程、触发器、函数),又希望数据最大化一直则选择Row模式
    

    四、binlog 常用参数

    参数名 含义
    log_bin = {on | off | base_name} 指定是否启用记录二进制日志或者指定一个日志路径
    sql_log_bin ={ on | off } 指定是否启用记录二进制日志
    expire_logs_days 指定自动删除二进制日志的时间,即日志过期时间
    log_bin_index 指定mysql-bin.index文件的路径
    binlog_format = { mixed | row | statement } 指定二进制日志基于什么模式记录
    max_binlog_size 指定二进制日志文件最大值
    binlog_cache_size 指定事务日志缓存区大小
    max_binlog_cache_size 指定二进制日志缓存最大大小
    sync_binlog = { 0 | n } 指定写缓冲多少次,刷一次盘

    五、实践

    5.1 检查 binlog 功能是否开启

    mysql> show variables like 'log_bin';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | log_bin       | OFF   |
    +---------------+-------+
    1 row in set (0.00 sec)
    

    可以看到 binlog 功能默认是关闭的。

    5.2 开启 binlog 功能

    创建 binlog 存放路径并赋权

    [root@VM_0_15_centos log]# mkdir -p /var/log/mysql
    [root@VM_0_15_centos log]# chown -R mysql.mysql /var/log/mysql
    

    编辑 my.cnf 配置文件

    [root@VM_0_15_centos log]# vim /etc/my.cnf
    

    [mysqld] 标签下编辑如下内容:

    # binlog 存放路径
    log_bin=/var/log/mysql/mysql-bin
    # 服务Id,保持唯一
    server_id=1
    

    重启 MySQL 服务

    [root@VM_0_15_centos log]# systemctl restart mysqld
    

    重新检查是否开启日志功能

    mysql> show variables like 'log_bin';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | log_bin       | ON    |
    +---------------+-------+
    1 row in set (0.00 sec)
    

    5.3 查看 binlog 模式

    mysql> show variables like '%binlog_format%';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | binlog_format | ROW   |
    +---------------+-------+
    1 row in set (0.00 sec)
    

    可以看到 MySQL 5.7 版本默认 binlog 模式是 ROW

    5.4 修改 binlog 模式

    编辑 my.cnf 配置文件

    [root@VM_0_15_centos log]# vim /etc/my.cnf
    

    [mysqld] 标签下编辑如下内容:

    binlog_format=mixed 
    

    重启服务

    [root@VM_0_15_centos log]# systemctl restart mysqld
    

    查看 binlog 模式

    mysql> show variables like '%binlog_format%';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | binlog_format | MIXED |
    +---------------+-------+
    1 row in set (0.00 sec)
    

    5.5 查看 binlog 文件

    查看 statement 模式文件:

    mysqlbinlog 文件名
    

    查看 row 模式文件

    mysqlbinlog -vv	文件名
    

    5.6 删除 binlog 文件

    方法一:

    reset master
    

    注:此命令将会删除所有日志,并让日志文件重新从000001开始。

    方法二:

    PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }
    

    实例:

    purge master logs to "binlog_name.00000X" 
    

    将会清空 00000X 之前的所有日志文件.

    方法三:修改 my.cnf 配置

    expire_logs_days = 3             #保留最近3天的binlog;默认值是0,表示不自动删除.
    
  • 相关阅读:
    java 删除文件目录
    java导出echart图到excel 多张图片导出
    java导出sql文件
    split方法使用
    jqgrid列表添加单选框
    会消失的链接
    运用javascript做出链接类特效
    创建守护进程的步骤
    ext2文件系统
    C++枚举类型enum
  • 原文地址:https://www.cnblogs.com/markLogZhu/p/11425179.html
Copyright © 2020-2023  润新知