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

    今天的学习是为了以后的工作更加的轻松!
  • 相关阅读:
    PAT顶级 1024 Currency Exchange Centers (35分)(最小生成树)
    Codeforces 1282B2 K for the Price of One (Hard Version)
    1023 Have Fun with Numbers (20)
    1005 Spell It Right (20)
    1092 To Buy or Not to Buy (20)
    1118 Birds in Forest (25)
    1130 Infix Expression (25)
    1085 Perfect Sequence (25)
    1109 Group Photo (25)
    1073 Scientific Notation (20)
  • 原文地址:https://www.cnblogs.com/tz90/p/14531827.html
Copyright © 2011-2022 走看看