mysql 5.7 主從複製

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

 

六.這時候就完成了主從複製

相關文章
相關標籤/搜索