> ***主從復制也叫主從同步,就是在一臺服務器上指定一臺主數據庫,另一臺指定一臺從數據庫,兩者同時開啟遠程連接,通過主數據庫中的二進制日志事件被從數據庫中的IO線程調用到中繼日志事件中,從數據庫再根據SQL線程來進行寫入操作。***
* [ ] 主從復制是異步進行的,所以會有一定的延遲
* [ ] 主從復制可以實現讀寫分離
* [ ] 主從復制可以緩解數據庫的壓力
> #### ***主從復制原理***
MySQL主從復制涉及到三個線程,一個運行在主節點(log dump thread),其余兩個(I/O thread, SQL thread)運行在從節點,如下圖所示:

> #### ***主從復制配置***
windows配置:my.ini
linux配置:my.cnf
* [ ] 先關閉防火墻
windows在網絡里面設置防火墻,linux關閉:service iptables stop
* [ ] centos7關閉防火墻
~~~
#查看防火墻
firewall-cmd --state
#停止防火墻
systemctl stop firewalld.service
#禁止防火墻開機啟動
systemctl disable firewalld.service
~~~
* [ ] debian關閉防火墻
~~~
/etc/init.d/ufw stop
/etc/init.d/ufw start
#或者
sudo ufw status 狀態
sudo ufw enable 開啟
sudo ufw disable 禁用
~~~
* [ ] 授權(遠程訪問)
```
#允許任何ip地址(%表示允許任何ip地址)的電腦用admin帳戶和密碼(123456)來訪問這個mysql server。
注意admin賬戶不一定要存在。
grant all on *.* to admin@'%' identified by '123456' with grant option;
flush privileges;
#支持root用戶允許遠程連接mysql數據庫
grant all privileges on *.* to 'root'@'192.168.1.%' identified by '123456789' with grant option;
flush privileges;
```
* [ ] 在配置文件中的[mysqld]中進行以下配置(主機配置)
```
#id
server-id =1
#二進制文件
log-bin ="/www/server/data/mysql-bin"
log-error ="/www/server/data/mysql-error"
#主從同步時 忽略的數據庫
binlog-ignore-db=mysql
#只同步shop數據庫
binlog-do-db=shop
```
* [ ] 授權哪臺主機為從數據庫
```
grant replication slave,reload,super ON *.* TO 'root'@'192.168.1.%' identified by '123456'
```
* [ ] 查看主數據庫狀態(每次在做同步前/重啟mysql時,需要觀察一些最新狀態)
```
show master status;
```
* [ ] 從機配置(my.cnf)
```
#id
server-id =2
#二進制文件
log-bin =mysql-bin
#同步test數據庫
replicate-do-db=shop
```
* [ ] 授權哪臺數據庫是自己的主數據庫
```
STOP SLAVE;
CHANGE MASTER TO master_host = '192.168.1.105',
master_user = 'root',
master_password = '123456789',
master_log_file = 'mysql-bin.000054',
master_log_pos = 1254;
START SLAVE;
SHOW SLAVE STATUS;
```
如果此時出錯...
解決:stop slave
然后再次執行授權的哪一步
* [ ] 開啟主從同步
```
在從機里面執行(linux),start slave;
檢驗:show slave status \G;
```
* [ ] 主要觀察兩個
```
Slave_IO_Running
Slave_SQL_Running
```
如果都是YES,則說明配置成功!
如果此時出現錯誤,看下面的日志說明。主要可能是id相同了,這里可能是個bug。
首頁先檢查serverid
`show variables like 'server_id'` #注意這里是下劃線,配置時是-
解決:set global server_id = 2;