1.引言
使用Mysql的replication機制實現主從同步時,其是由三個線程實現了,主庫一個I/O線程,從庫一個I/O線程和一個SQL線程。配置時主庫需要開始bin-log參數,即在配置文件中添加log-bin = /data/3307/mysql-bin該行,但是當我們需要實現級聯同步時,即以這樣的一個模式,A>B>C實現三級同步時,AB庫除了需要設置log-bin參數還需要添加一個參數:log-slave-updates
log-slave-updates參數默認時關閉的狀態,如果不手動設置,那么bin-log只會記錄直接在該庫上執行的SQL語句,由replication機制的SQL線程讀取relay-log而執行的SQL語句並不會記錄到bin-log,那么就無法實現上述的三級級聯同步。
參見Mysql官網對該參數的介紹:http://dev.mysql.com/doc/refman/5.0/en/replication-options-slave.html#option_mysqld_log-slave-updates
參考:http://815632410.blog.51cto.com/1544685/1420156
最近學mysql復制時,log-slave-updates參數一直沒有搞明白這個參數有什么意義。在上網查了一下,發現網友解釋的,我也沒有看懂。。估計是我這人比較笨的緣故吧。。。我這人比較笨也比較愛鑽牛角。別人可能聽老師講課時,就直接聽明白了。當時上課時,我也感覺沒有什么問題。但是晚上躺床上回想這些內容的時候,發現還是有疑問。。想了好幾天才想明白。。雖然這參數讓我花費了很多時間才想明白,但是心里很高興。。。。
如果寫的不對,還請大家批評指正。謝謝
本文需要驗證的疑問:
從庫做為其他從庫的主庫時 log-slave-updates參數是必須要添加的,因為從庫要作為其他從庫的主庫,必須添加該參數。該參數就是為了讓從庫從主庫復制數據時可以寫入到binlog日志,為什么要用這個參數寫binlog日志呢,不是在配置文件中開啟log-bin = /data/3307/mysql-bin選項就可以嗎?
答:從庫開啟log-bin參數,如果直接往從庫寫數據,是可以記錄log-bin日志的,但是從庫通過I0線程讀取主庫二進制日志文件,然后通過SQL線程寫入的數據,是不會記錄binlog日志的。也就是說從庫從主庫上復制的數據,是不寫入從庫的binlog日志的。所以從庫做為其他從庫的主庫時需要在配置文件中添加log-slave-updates參數。
驗證過程:
實驗環境時多實例主從同步,3306為主庫,3307為從庫。
一、未添加log-slave-updates參數時:
1、兩個數據庫已經可以主從同步,並且主從數據已經一致,從庫開啟log-bin功能。
mysql-slave>system mysql -uroot -p'123' -S /data/3307/mysql.sock -e "show slave status\G"|egrep "Seconds_Behind_Master|_Running"
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
檢查主從數據是否一致:
主庫:
mysql-master>show databases;
+--------------------+
|Database |
+--------------------+
|information_schema |
|mysql |
|oldboy |
|performance_schema |
|test |
+--------------------+
5 rowsin set (0.00 sec)
從庫:
mysql-slave>show databases;
+--------------------+
|Database |
+--------------------+
|information_schema |
|mysql |
|oldboy |
|performance_schema |
|test |
+--------------------+
5 rowsin set (0.01 sec)
查看主庫文件
[root@DRS3306]# ll
total68
drwxr-xr-x6 mysql mysql 4096 Apr 27 03:49 data
-rw-r--r--1 mysql mysql 1899 Apr 26 23:41 my.cnf
-rwx------1 mysql mysql 1304 Apr 26 23:35 mysql
-rw-rw----1 mysql mysql 126 Apr 23 07:35mysql-bin.000001
-rw-rw----1 mysql mysql 126 Apr 26 22:59mysql-bin.000002
-rw-rw----1 mysql mysql 698 Apr 26 23:36mysql-bin.000003
-rw-rw----1 mysql mysql 126 Apr 26 23:42mysql-bin.000004
-rw-rw---- 1 mysqlmysql 1034 Apr 27 03:49 mysql-bin.000005
-rw-rw----1 mysql mysql 140 Apr 26 23:42mysql-bin.index
srwxrwxrwx1 mysql mysql 0 Apr 26 23:42mysql.sock
-rw-r-----1 mysql root 14731 Apr 26 23:51mysql_oldboy3306.err
-rw-rw----1 mysql mysql 6 Apr 26 23:42mysqld.pid
-rw-rw----1 mysql mysql 107 Apr 26 23:42relay-bin.000003
-rw-rw----1 mysql mysql 28 Apr 26 23:42relay-bin.index
-rw-rw----1 mysql mysql 37 Apr 26 23:51relay-log.info
從庫配置文件時間:
[root@DRS3307]# ll
total72
drwxr-xr-x6 mysql mysql 4096 Apr 27 03:49 data
-rw-r--r--1 mysql mysql 1905 Apr 27 03:47 my.cnf
-rwx------1 mysql mysql 1304 Apr 26 23:47 mysql
-rw-rw----1 mysql mysql 203 Apr 27 03:47mysql-bin.000001
-rw-rw---- 1 mysqlmysql 107 Apr 27 03:47 mysql-bin.000002
-rw-rw---- 1 mysqlmysql 56 Apr 27 03:47 mysql-bin.index
srwxrwxrwx1 mysql mysql 0 Apr 27 03:47mysql.sock
-rw-r-----1 mysql root 23291 Apr 27 03:47mysql_oldboy3307.err
-rw-rw----1 mysql mysql 5 Apr 27 03:47mysqld.pid
-rw-rw----1 mysql mysql 150 Apr 27 03:47relay-bin.000005
-rw-rw---- 1 mysqlmysql 413 Apr 27 03:49 relay-bin.000006
-rw-rw----1 mysql mysql 56 Apr 27 03:47relay-bin.index
-rw-rw----1 mysql mysql 54 Apr 27 03:49relay-log.info
測試:在主庫上創建數據庫,看看從庫是否寫二進制日志。
[root@DRS 3306]# date
Sun Apr 27 04:02:26 CST 2014
[root@DRS3306]# ll
total68
drwxr-xr-x7 mysql mysql 4096 Apr 27 04:02 data
-rw-r--r--1 mysql mysql 1899 Apr 26 23:41 my.cnf
-rwx------1 mysql mysql 1304 Apr 26 23:35 mysql
-rw-rw----1 mysql mysql 126 Apr 23 07:35mysql-bin.000001
-rw-rw----1 mysql mysql 126 Apr 26 22:59mysql-bin.000002
-rw-rw----1 mysql mysql 698 Apr 26 23:36mysql-bin.000003
-rw-rw----1 mysql mysql 126 Apr 26 23:42mysql-bin.000004
-rw-rw---- 1 mysqlmysql 1115 Apr 27 04:02 mysql-bin.000005 #時間和操作前不一樣了,證明主庫已經寫binlog日志。
-rw-rw----1 mysql mysql 140 Apr 26 23:42mysql-bin.index
srwxrwxrwx1 mysql mysql 0 Apr 26 23:42mysql.sock
-rw-r-----1 mysql root 14731 Apr 26 23:51mysql_oldboy3306.err
-rw-rw----1 mysql mysql 6 Apr 26 23:42 mysqld.pid
-rw-rw----1 mysql mysql 107 Apr 26 23:42relay-bin.000003
-rw-rw----1 mysql mysql 28 Apr 26 23:42relay-bin.index
-rw-rw----1 mysql mysql 37 Apr 26 23:51relay-log.info
從庫配置文件時間變化:
[root@DRS3307]# ll
total72
drwxr-xr-x7 mysql mysql 4096 Apr 27 04:02 data
-rw-r--r--1 mysql mysql 1905 Apr 27 03:47 my.cnf
-rwx------1 mysql mysql 1304 Apr 26 23:47 mysql
-rw-rw----1 mysql mysql 203 Apr 27 03:47mysql-bin.000001
-rw-rw---- 1 mysqlmysql 107 Apr 27 03:47 mysql-bin.000002 #時間和操作前的是一樣的,確認沒有寫binlog日志
-rw-rw----1 mysql mysql 56 Apr 27 03:47mysql-bin.index
srwxrwxrwx1 mysql mysql 0 Apr 27 03:47mysql.sock
-rw-r-----1 mysql root 23291 Apr 27 03:47mysql_oldboy3307.err
-rw-rw----1 mysql mysql 5 Apr 27 03:47mysqld.pid
-rw-rw----1 mysql mysql 150 Apr 27 03:47relay-bin.000005
-rw-rw---- 1 mysqlmysql 494 Apr 27 04:02 relay-bin.000006 #證明從庫已經寫relay-log日志
-rw-rw----1 mysql mysql 56 Apr 27 03:47relay-bin.index
-rw-rw---- 1 mysqlmysql 54 Apr 27 04:02 relay-log.info
直接向從庫寫入數據:
[root@DRS 3307]# date
Sun Apr 27 04:09:29 CST2014
mysql-slave>create database qq;
QueryOK, 1 row affected (0.00 sec)
mysql-slave>show databases;
+--------------------+
|Database |
+--------------------+
|information_schema |
|cbd |
|mysql |
|oldboy |
|performance_schema |
|qq |
|test |
+--------------------+
7 rowsin set (0.00 sec)
查看從庫日志文件時間變化:
[root@DRS3307]# ll
total72
drwxr-xr-x8 mysql mysql 4096 Apr 27 04:10 data
-rw-r--r--1 mysql mysql 1905 Apr 27 03:47 my.cnf
-rwx------1 mysql mysql 1304 Apr 26 23:47 mysql
-rw-rw----1 mysql mysql 203 Apr 27 03:47mysql-bin.000001
-rw-rw---- 1 mysqlmysql 186 Apr 27 04:10 mysql-bin.000002 #和在從庫上創建qq數據庫的時間一致,證明已經寫bin-log日志了。
-rw-rw----1 mysql mysql 56 Apr 27 03:47mysql-bin.index
srwxrwxrwx1 mysql mysql 0 Apr 27 03:47mysql.sock
-rw-r-----1 mysql root 23291 Apr 27 03:47mysql_oldboy3307.err
-rw-rw----1 mysql mysql 5 Apr 27 03:47mysqld.pid
-rw-rw----1 mysql mysql 150 Apr 27 03:47relay-bin.000005
-rw-rw----1 mysql mysql 494 Apr 27 04:02relay-bin.000006
-rw-rw----1 mysql mysql 56 Apr 27 03:47relay-bin.index
-rw-rw----1 mysql mysql 54 Apr 27 04:02relay-log.info
二、添加log-slave-updates參數后
1、在主庫上做創建操作
[root@DRS 3307]# date
Sun Apr 27 04:19:10 CST2014
mysql-master>create database pang;
QueryOK, 1 row affected (0.00 sec)
mysql-master>show databases;
+--------------------+
|Database |
+--------------------+
|information_schema |
|cbd |
|mysql |
|oldboy |
| pang |
|performance_schema |
|test |
+--------------------+
7 rowsin set (0.00 sec)
檢查同步情況:
mysql-slave>show databases;
+--------------------+
|Database |
+--------------------+
|information_schema |
|cbd |
|mysql |
|oldboy |
| pang | #已經同步完成
|performance_schema |
|qq |
|test |
+--------------------+
8 rowsin set (0.00 sec)
檢查配置文件時間變化:
主庫配置文件時間:
[root@DRS3306]# ll
total68
drwxr-xr-x8 mysql mysql 4096 Apr 27 04:20 data
-rw-r--r--1 mysql mysql 1899 Apr 26 23:41 my.cnf
-rwx------1 mysql mysql 1304 Apr 26 23:35 mysql
-rw-rw----1 mysql mysql 126 Apr 23 07:35mysql-bin.000001
-rw-rw----1 mysql mysql 126 Apr 26 22:59mysql-bin.000002
-rw-rw----1 mysql mysql 698 Apr 26 23:36mysql-bin.000003
-rw-rw----1 mysql mysql 126 Apr 26 23:42mysql-bin.000004
-rw-rw---- 1 mysqlmysql 1198 Apr 27 04:20 mysql-bin.000005 #主庫寫入時的時間,也就創建數據庫時寫入log-bin日志的時間
-rw-rw----1 mysql mysql 140 Apr 26 23:42mysql-bin.index
srwxrwxrwx1 mysql mysql 0 Apr 26 23:42 mysql.sock
-rw-r-----1 mysql root 14731 Apr 26 23:51mysql_oldboy3306.err
-rw-rw----1 mysql mysql 6 Apr 26 23:42mysqld.pid
-rw-rw----1 mysql mysql 107 Apr 26 23:42relay-bin.000003
-rw-rw----1 mysql mysql 28 Apr 26 23:42relay-bin.index
-rw-rw----1 mysql mysql 37 Apr 26 23:51relay-log.info
從庫配置文件時間變化:
[root@DRS3307]# ll
total80
drwxr-xr-x9 mysql mysql 4096 Apr 27 04:20 data
-rw-r--r--1 mysql mysql 1922 Apr 27 04:16 my.cnf
-rwx------1 mysql mysql 1304 Apr 26 23:47 mysql
-rw-rw----1 mysql mysql 203 Apr 27 03:47mysql-bin.000001
-rw-rw----1 mysql mysql 205 Apr 27 04:16mysql-bin.000002
-rw-rw---- 1 mysql mysql 190 Apr 27 04:20 mysql-bin.000003 #從庫已經開始寫binlog日志了,並且和主庫時間一致。
-rw-rw----1 mysql mysql 84 Apr 27 04:16mysql-bin.index
srwxrwxrwx1 mysql mysql 0 Apr 27 04:16mysql.sock
-rw-r-----1 mysql root 25871 Apr 27 04:16mysql_oldboy3307.err
-rw-rw----1 mysql mysql 5 Apr 27 04:16mysqld.pid
-rw-rw----1 mysql mysql 150 Apr 27 04:16relay-bin.000007
-rw-rw----1 mysql mysql 336 Apr 27 04:20relay-bin.000008
-rw-rw----1 mysql mysql 56 Apr 27 04:16relay-bin.index
-rw-rw---- 1 mysql mysql 54 Apr 27 04:20 relay-log.info #relay-log日志文件也變化了
由上面的實驗可以知道,
1、從庫只開啟log-bin功能,不添加log-slave-updates參數,從庫從主庫復制的數據不會寫入log-bin日志文件里。
2、直接向從庫寫入數據時,是會寫入log-bin日志的。
3、開啟log-slave-updates參數后,從庫從主庫復制的數據會寫入log-bin日志文件里。這也是該參數的功能。