日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql binlog 权限_MySQL如何开启binlog?binlog三种模式的分析

發布時間:2024/10/5 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql binlog 权限_MySQL如何开启binlog?binlog三种模式的分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前提,創建表t,并插入數據,語句如下:

CREATE TABLE `t` (

`id` int(11) NOT NULL,

`a` int(11) DEFAULT NULL,

`t_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,

PRIMARY KEY (`id`),

KEY `a` (`a`),

KEY `t_modified`(`t_modified`)

) ENGINE=InnoDB;

insert into t values(1,1,'2018-11-13');

insert into t values(2,2,'2018-11-12');

insert into t values(3,3,'2018-11-11');

insert into t values(4,4,'2018-11-10');

insert into t values(5,5,'2018-11-09');

判斷MySQL是否已經開啟binlog?

登錄mysql,執行:SHOW VARIABLES LIKE 'log_bin';

OFF:關閉

ON:開啟

如何開啟binlog日志?

找到my.cnf :

select @@basedir;

如果還是找不到文件的位置,可以執行下面命令,可以得到mysql的配置文件的默認加載順序

mysql --help | grep 'Default options' -A 1

執行結果:

Default options are read from the following files in the given order:

/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf

可以看到mysql優先加載/etc/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=/var/lib/mysql/mysql-bin

#配置serverid

server-id=1

修改完配置后,重啟mysql。執行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的格式也有三種:STATEMENT、ROW、MIXED。

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,結果如下:

[root@mysql]# cat mysql-bin.000005

n

MZ]w{5.7.27-log

_ MZ]8

**4Z]#

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

因為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語句。

本文是作者根據日常業務場景,寫出的一些解決問題或學習實驗的歷程。如有錯誤的地方,還請指出,相互學習,共同進步。謝謝!

總結

以上是生活随笔為你收集整理的mysql binlog 权限_MySQL如何开启binlog?binlog三种模式的分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。