一、什麼是mysql主從同步?mysql
當master(主)庫的數據發生變化的時候,變化會實時的同步到slave(從)庫。sql
二、主從同步有什麼好處?數據庫
三、主從同步的原理是什麼?ubuntu
首先咱們來了解master-slave的體系結構。以下圖:服務器
無論是delete、update、insert,仍是建立函數、存儲過程,全部的操做都在master上。當master有操做的時候,slave會快速的接收到這些操做,從而作同步。架構
可是,這個機制是怎麼實現的呢?在master機器上,主從同步事件會被寫到特殊的log文件中(binary-log);在slave機器上,slave讀取主從同步事件,並根據讀取的事件變化,在slave庫上作相應的更改。函數
如此,就實現了主從同步了!spa
下面咱們來詳細的瞭解。3.1主從同步事件有哪些上面說到:在master機器上,主從同步事件會被寫到特殊的log文件中(binary-log);線程
主從同步事件有3種形式:statement、row、mixed。rest
3.2在master機器上的操做
當master上的數據發生改變的時候,該事件(insert、update、delete)變化會按照順序寫入到binlog中。binlog dump線程當slave鏈接到master的時候,master機器會爲slave開啓binlog dump線程。當master 的 binlog發生變化的時候,binlog dump線程會通知slave,並將相應的binlog內容發送給slave。
3.3在slave機器上的操做
當主從同步開啓的時候,slave上會建立2個線程。
3.4如何在master、slave上查看上述的線程?
使用SHOW PROCESSLIST命令能夠查看。如圖,在master機器上查看binlog dump線程
如圖,在slave機器上查看I/O、SQL線程。
接下來給你們講解mysql主從同步實戰系統環境:系統的話大同小異,都差很少,我這裏用的是ubuntu16.04+mysql5.7,用到兩臺服務器:其中master IP:192.168.33.22,另外一個slave IP:192.168.33.33
master機器上的操做
一、更改配置文件咱們找到文件/etc/mysql/mysql.conf.d/mysqld.cnf
。
配置以下:
bind-address = 192.168.33.22 #your master ip server-id = 1 #在master-slave架構中,每臺機器節點都須要有惟一的server-id log_bin = /var/log/mysql/mysql-bin.log #開啓binlog
二、重啓mysql,以使配置文件生效。
sudo systemctl restart mysql
三、建立主從同步的mysql user。
$ mysql -u root -p Password: ##建立slave1用戶,並指定該用戶只能在主機192.168.33.33上登陸。 mysql> CREATE USER 'slave1'@'192.168.33.33' IDENTIFIED BY 'slavepass'; Query OK, 0 rows affected (0.00 sec) ##爲slave1賦予REPLICATION SLAVE權限。 mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'192.168.33.33'; Query OK, 0 rows affected (0.00 sec)
四、爲MYSQL加讀鎖爲了主庫與從庫的數據保持一致,咱們先爲mysql加入讀鎖,使其變爲只讀。
mysql> FLUSH TABLES WITH READ LOCK; Query OK, 0 rows affected (0.00 sec)
五、記錄下來MASTER REPLICATION LOG 的位置該信息稍後會用到。
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 613 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
六、將master DB中現有的數據信息導出
$ mysqldump -u root -p --all-databases --master-data > dbdump.sql
七、接觸master DB的讀鎖
mysql> UNLOCK TABLES;
八、將步驟6中的dbdump.sql文件copy到slave
scp dbdump.sql ubuntu@192.168.33.33:/home/ubuntu
slave機器上的操做
一、更改配置文件咱們找到文件/etc/mysql/mysql.conf.d/mysqld.cnf
。
更改配置以下:
bind-address = 192.168.33.33 #your slave ip server-id = 2 #master-slave結構中,惟一的server-id log_bin = /var/log/mysql/mysql-bin.log #開啓binlog
二、重啓mysql,以使配置文件生效
sudo systemctl restart mysql
三、導入從master DB。導出的dbdump.sql文件,以使master-slave數據一致
$ mysql -u root -p < /home/ubuntu/dbdump.sql
四、使slave與master創建鏈接,從而同步
$ mysql -u root -p Password: mysql> STOP SLAVE; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> CHANGE MASTER TO -> MASTER_HOST='192.168.33.22', -> MASTER_USER='slave1', -> MASTER_PASSWORD='slavepass', -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=613; Query OK, 0 rows affected, 2 warnings (0.01 sec) mysql> START SLAVE; Query OK, 0 rows affected (0.00 sec) MASTER_LOG_FILE='mysql-bin.000001'與MASTER_LOG_POS=613的值,是從上面的SHOW MASTER STATUS獲得的。通過如此設置以後,就能夠進行master-slave同步了
~