我愛java系列---【mysql數據庫如何開啟binlog日志】


進入docker中的mysql

docker exec -it b3a852194e9c /bin/bash      #b3a852194e9c為容器id

docker exec -it -u root mysql /bin/bash #以管理員身份登陸容器(推薦,避免修改配置文件時權限不足)

1.查看當前mysql是否開啟binlog模式(默認未開啟)。

SHOW VARIABLES LIKE '%log_bin%'

如果log_bin的值為OFF是未開啟,為ON是已開啟。

2.找到my.cnf :

所以需要在/etc/my.cnf中mysqld節添加開啟binlog的配置,如下有兩種方式:

#第一種方式: #開啟binlog日志
log_bin=ON
#binlog日志的基本文件名
log_bin_basename=/var/lib/mysql/mysql-bin
#binlog文件的索引文件,管理所有binlog文件
log_bin_index=/var/lib/mysql/mysql-bin.index
#配置serverid
server-id=1

#第二種方式:
#此一行等同於上面log_bin三行
log-bin=mysql-bin
#設置日志格式
binlog-format=ROW #配置serverid
server_id=1

修改完配置后,重啟mysql。

service mysqld restart        #如果mysql安裝在linux本地,執行此條命令
docker restart containerID/containerName #如果mysql安裝在docker中,執行此條命令

執行SHOW VARIABLES LIKE 'log_bin'; Value 值為 ON即可。

binlog的配置簡介

MySQL配置文件my.cnf文件中的mysqld節的配置:

[mysqld]
#設置日志三種格式:STATEMENT、ROW、MIXED 。
binlog_format = mixed
#設置日志路徑,注意路經需要mysql用戶有權限寫
log-bin = /data/mysql/logs/mysql-bin.log
#設置binlog清理時間
expire_logs_days = 7
#binlog每個日志文件大小
max_binlog_size = 100m
#binlog緩存大小
binlog_cache_size = 4m
#最大binlog緩存大小
max_binlog_cache_size = 512m

重啟MySQL生效,如果不方便重啟服務,也可以直接修改對應的變量即可。

binlog的三種模式比較

binlog的格式也有三種:STATEMENTROWMIXED

  • STATMENT模式:基於SQL語句的復制(statement-based replication, SBR),每一條會修改數據的sql語句會記錄到binlog中。
    優點:不需要記錄每一條SQL語句與每行的數據變化,這樣子binlog的日志也會比較少,減少了磁盤IO,提高性能。
    缺點:在某些情況下會導致master-slave中的數據不一致(比如:delete from t where a>=4 and t_modified<='2018-11-10' limit 1;在主庫執行這個語句的時候,如果使用的是a索引,會刪除(4,4,'2018-11-10')這條記錄,如果使用的是t_modified的索引則會刪除insert into t values(5,5,'2018-11-09');所以在執行這條sql語句的時候提示:
    Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. The statement is unsafe because it uses a LIMIT clause. This is unsafe because the set of rows included cannot be predicted.
    由於 statement 格式下,記錄到 binlog 里的是語句原文,因此可能會出現這樣一種情況:在主庫執行這條 SQL 語句的時候,用的是索引 a;而在備庫執行這條 SQL 語句的時候,卻使用了索引 t_modified。因此,MySQL 認為這樣寫是有風險的。
    sleep()函數, last_insert_id(),以及user-defined functions(udf)等也會出現問題);
  • ROW基於行的復制(row-based replication, RBR)格式:不記錄每一條SQL語句的上下文信息,僅需記錄哪條數據被修改了,修改成了什么樣子了。
    優點:不會出現某些特定情況下的存儲過程、或function、或trigger的調用和觸發無法被正確復制的問題。
    缺點:會產生大量的日志,尤其是alter table的時候會讓日志暴漲。
  • MIXED混合模式復制(mixed-based replication, MBR):以上兩種模式的混合使用,一般的復制使用STATEMENT模式保存binlog,對於STATEMENT模式無法復制的操作使用ROW模式保存binlog,MySQL會根據執行的SQL語句選擇日志保存方式。

列舉幾個關於binlog常用的命令

#查看日志開啟狀態 
show variables like 'log_%';
#查看所有binlog日志列表
show master logs;
#查看最新一個binlog日志的編號名稱,及其最后一個操作事件結束點 
show master status;
#刷新log日志,立刻產生一個新編號的binlog日志文件,跟重啟一個效果 
flush logs;
#清空所有binlog日志 
reset master;

binlog中到底記錄了什么內容?如何分析binlog日志?

開啟binlog日志之后,我們在登錄mysql,在控制台執行一條sql語句:delete from t where a>=4 and t_modified<='2018-11-10' limit 1;
查看當前的binlog日志文件show master status;;
筆者得到的是mysql-bin.000005,根據binlog日志文件的配置,我們可以去存儲binlog的日志文件下面看看cd /var/lib/mysql/,可以看到文件夾下面有mysql-bin.000005文件。
執行:cat mysql-bin.000005,結果如下:

可以看到,里面的內容根本沒法閱讀。

因為binlog日志文件:mysql-bin.000005是二進制文件,沒法用vi等打開,這時就需要mysql的自帶的mysqlbinlog工具進行解碼,執行:mysqlbinlog mysql-bin.000005可以將二進制文件轉為可閱讀的sql語句。

分析對比binlog的ROW模式和STATEMENT模式下的日志:

ROW模式:

/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
    /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
    DELIMITER /*!*/;
    # at 4
    #190819 15:35:46 server id 1  end_log_pos 123 CRC32 0x2bfa58f0  Start: binlog v 4, server v 5.7.27-log created 190819 15:35:46 at startup
    # Warning: this binlog is either in use or was not closed properly.
    ROLLBACK/*!*/;
    BINLOG '
    UlFaXQ8BAAAAdwAAAHsAAAABAAQANS43LjI3LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAABSUVpdEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
    AfBY+is=
    '/*!*/;
    # at 123
    #190819 15:35:46 server id 1  end_log_pos 154 CRC32 0xe4e91c8f  Previous-GTIDs
    # [empty]
    # at 154
    #190819 15:36:19 server id 1  end_log_pos 219 CRC32 0xcc3dc023  Anonymous_GTID  last_committed=0        sequence_number=1       rbr_only=yes
    /*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
    SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
    # at 219
    #190819 15:36:19 server id 1  end_log_pos 305 CRC32 0xd39f98cf  Query   thread_id=2     exec_time=0     error_code=0
    SET TIMESTAMP=1566200179/*!*/;
    SET @@session.pseudo_thread_id=2/*!*/;
    SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
    SET @@session.sql_mode=1436549152/*!*/;
    SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
    /*!\C utf8 *//*!*/;
    SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
    SET @@session.time_zone='SYSTEM'/*!*/;
    SET @@session.lc_time_names=0/*!*/;
    SET @@session.collation_database=DEFAULT/*!*/;
    BEGIN
    /*!*/;
    # at 305
    #190819 15:36:19 server id 1  end_log_pos 358 CRC32 0x56a1e39d  Table_map: `mysql_test`.`t` mapped to number 108
    # at 358
    #190819 15:36:19 server id 1  end_log_pos 406 CRC32 0xc91237b0  Delete_rows: table id 108 flags: STMT_END_F
    
    BINLOG '
    c1FaXRMBAAAANQAAAGYBAAAAAGwAAAAAAAEACm15c3FsX3Rlc3QAAXQAAwMDEQEAAp3joVY=
    c1FaXSABAAAAMAAAAJYBAAAAAGwAAAAAAAEAAgAD//gEAAAABAAAAFvlrwCwNxLJ
    '/*!*/;
    ### DELETE FROM `mysql_test`.`t`
    ### WHERE
    ###   @1=4 /* INT meta=0 nullable=0 is_null=0 */
    ###   @2=4 /* INT meta=0 nullable=1 is_null=0 */
    ###   @3=1541779200 /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */
    # at 406
    #190819 15:36:19 server id 1  end_log_pos 437 CRC32 0x7898ebf6  Xid = 13
    COMMIT/*!*/;
    SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
    DELIMITER ;
    # End of log file
    /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
    /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

STATEMENT模式:

/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
    /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
    DELIMITER /*!*/;
    # at 4
    #190819 16:19:48 server id 1  end_log_pos 123 CRC32 0xec3e6426  Start: binlog v 4, server v 5.7.27-log created 190819 16:19:48 at startup
    # Warning: this binlog is either in use or was not closed properly.
    ROLLBACK/*!*/;
    BINLOG '
    pFtaXQ8BAAAAdwAAAHsAAAABAAQANS43LjI3LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAACkW1pdEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
    ASZkPuw=
    '/*!*/;
    # at 123
    #190819 16:19:48 server id 1  end_log_pos 154 CRC32 0xc6db211a  Previous-GTIDs
    # [empty]
    # at 154
    #190819 16:20:01 server id 1  end_log_pos 219 CRC32 0x1960cba5  Anonymous_GTID  last_committed=0        sequence_number=1       rbr_only=no
    SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
    # at 219
    #190819 16:20:01 server id 1  end_log_pos 318 CRC32 0x11eecb38  Query   thread_id=2     exec_time=0     error_code=0
    SET TIMESTAMP=1566202801/*!*/;
    SET @@session.pseudo_thread_id=2/*!*/;
    SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
    SET @@session.sql_mode=1436549152/*!*/;
    SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
    /*!\C utf8 *//*!*/;
    SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
    SET @@session.time_zone='SYSTEM'/*!*/;
    SET @@session.lc_time_names=0/*!*/;
    SET @@session.collation_database=DEFAULT/*!*/;
    BEGIN
    /*!*/;
    # at 318
    #190819 16:20:01 server id 1  end_log_pos 473 CRC32 0x390d1f96  Query   thread_id=2     exec_time=0     error_code=0
    use `mysql_test`/*!*/;
    SET TIMESTAMP=1566202801/*!*/;
    delete from t where a>=4 and t_modified<='2018-11-10' limit 1
    /*!*/;
    # at 473
    #190819 16:20:01 server id 1  end_log_pos 504 CRC32 0x2f35c773  Xid = 13
    COMMIT/*!*/;
    SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
    DELIMITER ;
    # End of log file
    /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
    /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

可以看到ROW模式下,binlog日志中的begin和commit之間並沒有sql語句。
STATEMENT模式下,binlog日志中的begin和commit之間是一條sql語句。

原文鏈接: https://www.jianshu.com/p/8e7e288c41b1,感謝作者的分享!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM