1、原理mysql
該過程的第一部分就是master記錄二進制日誌。在每一個事務更新數據完成以前,master在二日誌記錄這些改變。MySQL將事務串行的寫入二進制日誌,即便事務中的語句都是交叉執行的。在事件寫入二進制日誌完成後,master通知存儲引擎提交事務。 git
下一步就是slave將master的binary log拷貝到它本身的中繼日誌。首先,slave開始一個工做線程——I/O線程。I/O線程在master上打開一個普通的鏈接,而後開始binlog dump process。Binlog dump process從master的二進制日誌中讀取事件,若是已經跟上master,它會睡眠並等待master產生新的事件。I/O線程將這些事件寫入中繼日誌。 sql
SQLslave thread(SQL從線程)處理該過程的最後一步。SQL線程從中繼日誌讀取事件,並重放其中的事件而更新slave的數據,使其與master中的數據一致。只要該線程與I/O線程保持一致,中繼日誌一般會位於OS的緩存中,因此中繼日誌的開銷很小。 數據庫
此外,在master中也有一個工做線程:和其它MySQL的鏈接同樣,slave在master中打開一個鏈接也會使得master開始一個線程。複製 過程有一個很重要的限制——複製在slave上是串行化的,也就是說master上的並行更新操做不能在slave上並行操做。centos
(簡短描述:主從數據庫同步工做原理(流程):緩存
但主庫的數據發生修改時,數據更改的記錄將寫入到主庫的二進制文件中,從庫此時將會調用一個IO線程讀取主庫的二進制文件,並與中繼日誌做對比,並將存在差別的事件寫入到中繼日誌中(當兩日誌內容事件一致時,IO線程將處於睡眠狀態),而後從庫再調用SQL線程去讀取中繼日誌,並將剛寫入的事件數據放入到從庫中以保持主從數據庫數據同步。)服務器
2、要求mysql主從的環境要求網絡
一、互相同步的兩臺mysql的版本必須保證大版本號一致。好比5.5+和5.6+之間同步數據,5.6的數據同步到5.5就會出現問題。保證大版本號一致很重要。tcp
二、每臺服務器必須開啓binlog,不開啓binlog則根本沒法開始數據同步。ide
三、每臺服務器必須配置不一樣的server-id,範圍在1到(2^32-1)之間。
四、要保證防火牆對3306端口的開啓,爲了學習數據庫的主從配置。
五、保證網絡暢通
主從系統要保持一致:包括數據庫版本,操做系統版本,磁盤IO磁盤容量,網絡帶寬等。
[root@data02 ~]# cat /etc/redhat-release
CentOS release 6.2 (Final)
[root@data02 ~]#
|
主庫master |
從庫slave |
OS系統版本 |
CentOS release 6.2 (Final) |
CentOS release 6.2 (Final) |
數據庫版本 |
5.6.12-log |
5.6.12-log |
磁盤容量 |
50G |
30G |
主機ip地址 |
192.168.52.129 |
192.168.52.130 |
端口 |
3306 |
3306 |
內存 |
1G |
1G |
服務器類型 |
虛擬機 |
3、主服務配置
1. MySQL的配置文件的位置是在 /etc/my.cnf
添加
server_id=
#指定binlog的生成目錄,不少人不是這麼寫的
log-bin=/var/lib/mysql-log/mastera
gtid_mode=on
enforce_gtid_consistency=1
2.建立binlog目錄並受權mysql用戶
mkdir /var/lib/mysql-log/mastera
chown mysql . /var/lib/mysql-log/mastera
3.重啓mysql服務
service mysqld restart
4.查看binlog是否生成
ls /var/lib/mysql-log/mastera
5.導出主數據庫(注:若是兩個數據庫狀態一致即表及數據記錄都同樣,就不用作5,6這兩步了)
mysqldump -uroot -p'密碼' -A --single-transaction > /tmp/mysql.all.sql
這個過程會發生報警,由於用了明碼。不用擔憂
6.將mysql.all.sql 拷貝到slave上,能夠用scp命令
7.在slave服務器上將導出的mysql.all.sql腳本,導入mysql服務器
mysql -uroot -p'密碼' < sql備份文件
8.查看slave上是否導入
四.從服務器操做
修改my.cnf
1.#設置和master不一樣的server-id
server-id=
gtid_mod=on
enforce_git_consistency=1
2.重啓mysql服務
service mysqld restart
防火牆開啓master 服務器的3306端口
centos6.* 開啓方式
centos7.*的開啓方式
[root@localhost ~]# firewall-cmd –add-port=3306/tcp
[root@localhost ~]# firewall-cmd –permanent –add-port=3306/tcp
[root@localhost ~]# firewall-cmd –reload success
五.最後兩步
1.登陸master受權slave
grant replication slave on *.* to ‘用戶名’@'slaveip' identified by '密碼';
flush privileges;
2.登陸slave修改master
change master to master_host='192.168.0.103',master_user='slave1',master_password='123456',master_auto_position=1;
3.slave 上打開復制線程
start slave(中止slave 命令:stop slave)
4.查看slave狀態
show slave status;
查看返回狀態找到一下兩個字段,
1) Slave_IO_Running: Yes
IO線程狀態,必須YES
2) Slave_SQL_Running: Yes
SQL線程狀態,必須YES
六.這時候就完成了主從複製