原理
(master 主服務(wù)器 slave 從服務(wù)器)
master開啟bin-log功能撤师,日志文件用于記錄數(shù)據(jù)庫的讀寫增刪叶眉,需要開啟3個線程,master IO線程,slave開啟 IO線程 SQL線程,Slave 通過IO線程連接master袁稽,并且請求某個bin-log,position之后的內(nèi)容擒抛。
MASTER服務(wù)器收到slave IO線程發(fā)來的日志請求信息,io線程去將bin-log內(nèi)容补疑,position返回給slave IO線程歧沪。
slave服務(wù)器收到bin-log日志內(nèi)容,將bin-log日志內(nèi)容寫入relay-log中繼日志莲组,創(chuàng)建一個master.info的文件诊胞,該文件記錄了master ip 用戶名 密碼 master bin-log名稱,bin-log position锹杈。
slave端開啟SQL線程撵孤,實時監(jiān)控relay-log日志內(nèi)容是否有更新,解析文件中的SQL語句竭望,在slave數(shù)據(jù)庫中去執(zhí)行邪码。
準(zhǔn)備兩臺虛擬機(jī)安裝MySQL5.7版本作為主服務(wù)器和從服務(wù)器
配置主服務(wù)器
1.主服務(wù)器啟用二進(jìn)制日志記錄并配置唯一的服務(wù)器ID(重啟服務(wù))
修改 /etc/my.cnf 配置文件
[mysqld]
log-bin=/var/log/mysql/mysql-bin
server-id=1
創(chuàng)建日志目錄并賦予權(quán)限
[root@localhost ~]# mkdir /var/log/mysql/
[root@localhost ~]# chown -R mysql.mysql /var/log/mysql/
[root@localhost ~]# systemctl restart mysqld
注意:
如果省略server-id(或?qū)⑵滹@式設(shè)置為默認(rèn)值0),則主服務(wù)器拒絕來自從服務(wù)器的任何連接咬清。
為了在使用帶事務(wù)的InnoDB進(jìn)行復(fù)制設(shè)置時盡可能提高持久性和一致性闭专,
您應(yīng)該在master my.cnf文件中使用以下配置項:
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
確保未在復(fù)制主服務(wù)器上啟用skip-networking選項。
如果已禁用網(wǎng)絡(luò)旧烧,則從站無法與主站通信影钉,并且復(fù)制失敗。
2.進(jìn)入數(shù)據(jù)庫掘剪,建用戶賦予權(quán)限
mysql> grant replication slave on *.* to 'repl'@'%' identified by 'Www.2.com';
mysql> flush privileges;
3.在從服務(wù)器上測試能否登錄
[root@localhost ~]# mysql -urepl -pWww.2.com -h192.168.157.151
主服務(wù)器中有數(shù)據(jù)
1.導(dǎo)出數(shù)據(jù)
[root@localhost ~]# mysqldump -uroot -pWww.2.com --all-databases --mastert-data=1 > qbdump.db
2.從主服務(wù)器中使用 scp 或 rsync 等工具平委,把備份出來的數(shù)據(jù)傳輸?shù)綇姆?wù)器中
scp qbdump.db root@192.168.157.152:/root/
配置從服務(wù)器
1.修改 /etc/my.cnf 配置文件
[mysqld]
server-id=2
[root@localhost ~]# systemctl restart mysqld
2.導(dǎo)入數(shù)據(jù)
[root@localhost ~]# mysql -uroot -pWww.2.com < qbdump.db
3.在從服務(wù)器查看導(dǎo)入的數(shù)據(jù)
[root@localhost ~]# vim qbdump.db
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=154;
4.在從服務(wù)器上配置連接到主服務(wù)器的相關(guān)信息
[root@localhost ~]# mysql -uroot -pWww.2.com
mysql> change master to
-> master_host='192.168.157.151',
-> master_user='repl',
-> master_password='Www.2.com',
-> master_log_file='mysql-bin.000002',
-> master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
5.啟動從服務(wù)器的復(fù)制線程以開始復(fù)制
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
6.查看是否成功
mysql> show slave status\G
輸出結(jié)果中看到i/o線程和sql線程都是 yes, 就表示成功