zoukankan      html  css  js  c++  java
  • 二十一、二进制日志介绍

    二进制日志作用

    记录的对数据库进行的增删改等操作。

    可以用于
    1、主从复制
    2、数据恢复

    开启二进制日志

    默认未开启,开启需要修改配置文件/etc/my.cnf

    $ vim /etc/my.cnf
    [mysqld]
    server_id=6
    #当log_bin=1表示开启二进制日志并放在mysql的data/目录下
    log_bin=/data/binlog/mysql-bin
    #5.7版本默认配置是row,可以省略该行参数配置,下文会有解释
    binlog_format=row 
    #每次事务提交都立即将二进制日志刷写到磁盘中
    sync_binlog=1	
     
    #创建目录并授权
    $ mkdir -p /data/binlog/
    $ chown -R mysql.mysql /data
    
    #重启
    $ /etc/init.d/mysqld restart
    

    查看二进制日志发现文件名为mysql-bin.000001,mysql-bin.000002以此类推
    mysql-bin.index记录的是存在的二进制日志文件名

    $ cd /data/binlog/ && ll
    total 24
    -rw-r-----. 1 mysql mysql 680 Mar 29 16:42 mysql-bin.000001
    -rw-r-----. 1 mysql mysql 501 Mar 30 20:48 mysql-bin.000002
    -rw-r-----. 1 mysql mysql 177 Mar 30 20:50 mysql-bin.000003
    -rw-r-----. 1 mysql mysql 177 Mar 30 20:51 mysql-bin.000004
    -rw-r-----. 1 mysql mysql 154 Mar 30 20:51 mysql-bin.000005
    -rw-r-----. 1 mysql mysql 150 Mar 30 20:51 mysql-bin.index
    
    #index文件记录的是二进制日志文件名
    $ cat mysql-bin.index 
    /data/binlog/mysql-bin.000001
    /data/binlog/mysql-bin.000002
    /data/binlog/mysql-bin.000003
    /data/binlog/mysql-bin.000004
    /data/binlog/mysql-bin.000005
    

    查看二进制日志文件位置

    mysql> show variables like '%log_bin%';
    +---------------------------------+------------------------------+
    | Variable_name                   | Value                        |
    +---------------------------------+------------------------------+
    | log_bin                         | ON                           |
    | log_bin_basename                | /data/binlog/mysql-bin       |
    | log_bin_index                   | /data/binlog/mysql-bin.index |
    | log_bin_trust_function_creators | OFF                          |
    | log_bin_use_v1_row_events       | OFF                          |
    | sql_log_bin                     | ON                           |
    +---------------------------------+------------------------------+
    6 rows in set (0.00 sec)
    

    需要注意的是二进制文件可能有多个,但mysql只使用最后一个。

    查看已存在的二进制日志

    滚动刷新一个新的二进制文件并查看他的位置

    mysql> flush logs; #滚动产生一个新的日志文件
    mysql> show binary logs;
    +------------------+-----------+
    | Log_name         | File_size |
    +------------------+-----------+
    | mysql-bin.000001 |       680 |
    | mysql-bin.000002 |       501 |
    | mysql-bin.000003 |       177 |
    | mysql-bin.000004 |       177 |
    | mysql-bin.000005 |       154 |
    +------------------+-----------+
    5 rows in set (0.00 sec)
    

    查看正在使用的二进制日志

    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000005 |      154 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    
    

    查看二进制日志内容

    $ cd /data/binlog
    $ mysqlbinlog mysql-bin.000004
    
    #不显示SET开头的内容
    $ mysqlbinlog mysql-bin.000004 | grep -v '^SET' 
    
    #-vvv详细显示,--base64-output解密输出,因为默认row模式是以base64加密的需要使用base64解密
    $ mysqlbinlog --base64-output=decode-rows -vvv mysql-bin.000004  
    

    二进制是以事件为最小记录单元,at到下一个at为一个事件。

    因为默认使用RBR模式也就是行模式记录所以需要进行base64解密才能看到事务的具体内容。

    内容是伪代码,含义是往第一列插入值1

    -d参数只显示有关数据库的二进制日志内容

    #只显示有关test数据库的二进制日志内容
    $ mysqlbinlog -d test mysql-bin.000004 
    
    #导出指定库test的二进制日志
    $  mysqlbinlog -d test mysql-bin.000004 -r bin.sql
    
    #注意使用-d参数时,二进制日志文件中必须记录如下写法
    use test;
    insert into student values(1,'tz');
    
    #使用如下写法不能使用-d参数
    insert into test.student values(1,'tz');
    

    清理二进制日志

    随着数据库使用,二进制日志占用空间会越来越大,此时有两种清理方式

    1、自动清理方式
    使用expire_logs_days参数,0为永不过期

    mysql> show variables like '%expire%';
    +--------------------------------+-------+
    | Variable_name                  | Value |
    +--------------------------------+-------+
    | disconnect_on_expired_password | ON    |
    | expire_logs_days               | 0     |
    +--------------------------------+-------+
    2 rows in set (0.00 sec)
    
    #过期时间根据生产环境调整设置,这里设置7天
    mysql> set global expire_logs_days=7;
    

    注意:即便是设置了过期时间,也不会到期自动删除日志,需要以下条件触发才会删除过期日志
    1、当binlog大小超过max_binlog_size值
    2、手动执行flush logs
    3、重启数据库(重启MySQL将会自动生成一个新的二进制日志文件用于记录binlog)

    2、手工清理方式
    查看purge命令帮助信息

    mysql> help purge 
    

    使用purge命令删除,适用于主从复制,使用这种方式删除主库的二进制日志,从库不会崩溃

    #删除000032之前的二进制日志,不包括000032日志文件
    mysql> PURGE BINARY LOGS TO 'mysql-bin.000032';
    
    #按照时间方式,删除2008-04-02 22:46:26之前的日志文件
    mysql> PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26'; 
    
    #清除3天前的日志文件
    mysql> PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 3 DAY);  
    

    3、使用reset master删除所有日志

    #慎用,如果在主从复制的主库执行该操作,从库会崩溃
    mysql> reset master ;
    

    日志文件滚动生成

    有如下几种方式生成新的二进制日志文件
    1、使用flush logs;命令
    2、重启数据库
    3、日志文件达到最大上限,默认1G大小,可通过max_binlog_size=1073741824参数控制

    学习来自:老男孩深标DBA课程 第六章 日志管理,《MySQL入门与提高实践》第七章,其余参考1,其余参考2

    今天的学习是为了以后的工作更加的轻松!
  • 相关阅读:
    Strapi and MongoDB
    Windows 下入手 MongoDB
    npm 创建一个 github action
    Vue3: does not provide an export named 'createRouter'
    How To Use Rocketbots As A Dialogflow CRM
    Telegram Groups vs Telegram Channels
    WhatsApp Group vs WhatsApp Broadcast for Business
    Instant Messaging for Business: Your 10 Best Options
    How to Create and Use Facebook Messenger Codes (June 2019)
    Ultimate Guide to Line For Business (May 2019)
  • 原文地址:https://www.cnblogs.com/tz90/p/14531827.html
Copyright © 2011-2022 走看看