MySQL主從復制有異步模式、半同步模式、GTID模式以及多源復制模式,MySQL默認模式是異步模式。所謂異步模式,只MySQL 主服務器上I/O thread 線程將二進制日志寫入binlog文件之后就返回客戶端結果,不會考慮二進制日志是否完整傳輸到從服務器以及是否完整存放到從服務器上的relay日志中,這種模式一旦主服務(器)宕機,數據就會發生丟失。
基於偏移量的主從復制
主庫開啟binlog功能並授權從庫連接主庫,從庫通過change master得到主庫的相關同步信息然后連接主庫進行驗證,主庫IO線程根據從庫slave線程的請求,從master.info開始記錄的位置點向下開始取信息,同時把取到的位置點和最新的位置與binlog信息一同發給從庫IO線程,從庫將相關的sql語句存放在relay-log里面,最終從庫的sql線程將relay-log里的sql語句應用到從庫上,至此整個同步過程完成,之后將是無限重復上述過程
1.設置MySQL主從同步 (1)主數據庫實例設置server-id和開啟bin-log; (2)主數據庫實例創建用於同步的賬號; (3)從數據庫實例設置server-id; (4)從數據庫實例配置同步參數; (5)從數據庫實例啟動同步開關。
一:利用mysqldump搭建傳統主從復制
1.1主數據庫實例設置server-id和開啟bin-log 在my.cnf文件的[mysqld]節點處:
[mysqld]
server-id = 1
log-bin= /usr/local/mysql-5.7.18/data/3306/mysql-bin
#另外還需要注意的是這個參數replicate-ignore-db = mysql 它的意思是在進行主從同步時忽略mysql這個庫,因為mysql庫主要存放賬號及授權信息的,不同數據庫實例賬號和授#權信息不同的可能性極大,因此沒有必要同步這個庫。 通過如下命令可以快速查看是否已經正確配置:
[root@localhost ~]# egrep "server-id|log-bin" /usr/local/mysql-5.7.18/data/3306/my.cnf
查看一下主數據庫的狀態:
mysql> show master status \G;
搭建對sakila數據庫進行復制的環境
主庫:
對庫sakila做備份
[root@vhost1 ~]# mysqldump -uroot -p --socket=/u01/tmp/mysql.sock --master-data=2 --single-transaction -q -B sakila |gzip > /tmp/sakila.sql.gz
############################################
全庫導出
# mysqldump -uroot -p --master-data=2 --single-transaction -R --triggers -A > mysql_all.sql
其中
–master-data=2代表備份時刻記錄master的Binlog位置和Position,
–single-transaction意思是獲取一致性快照,
-R意思是備份存儲過程和函數,
–triggres的意思是備份觸發器,
-A代表備份所有的庫。
############################################
從庫:
創建數據庫mysql> create database sakila;
[root@vhost1 ~]# gunzip < /tmp/sakila.sql.gz | mysql -uroot -p --socket=/u02/33061/tmp/mysql.sock sakila 1.2主數據庫實例創建用於同步的賬號 在主數據庫創建一個replication賬號用於從主庫同步數據到從庫,創建replication賬號的語句如下: Mysql>grant replication slave on *.* to 'rep'@'%' identified by 'rep';
Mysql>flush privileges;
1.3從數據庫實例設置server-id 同樣,其實在上面的3307的配置文件里已經配置了server-id和bin-log,就在/usr/local/mysql-5.7.18/data/3307/my.cnf文件的[mysqld]節點處:
[mysqld]
server-id = 2
注意:在一個主從關系群中server-id是唯一的,另外在由於從數據庫不向其它庫同步數據,因此沒有開啟bin-log。這里也通過egrep查看一下: egrep "server-id|log-bin" /usr/local/mysql-5.7.18/data/3307/my.cnf
1.4從數據庫實例配置同步參數 登錄3307端口對應的實例:
確定binlog及偏移量:當主庫備份時候,加master-data=2,備份文件中有這兩項信息
然后執行以下語句:
CHANGE MASTER TO \
MASTER_HOST='127.0.0.1', \
MASTER_PORT=3306, \
MASTER_USER='replication', \
MASTER_PASSWORD='your_password', \
MASTER_LOG_FILE='mysql-bin.000003', \
MASTER_LOG_POS=154;
說明: MASTER_HOST為主服務器IP或主機名; MASTER_PORT為主服務器端口; MASTER_USER為主服務器上用於同步的數據庫賬戶名; MASTER_PASSWORD為主服務器上用於同步的數據庫賬戶對應的密碼; MASTER_LOG_FILE為當前bin-log日志文件名; MASTER_LOG_POS為當前偏移量; 其中MASTER_LOG_FILE和MASTER_LOG_POS可以在主數據庫上執行” show master status \G;”SQL語句來獲得
二:利用innobackupex搭建傳統主從復制
1:主庫:利用innobackupex做備份,拷貝至從庫
innobackupex --user=root --socket=/u02/33061/tmp/mysql.sock --port=33061 /tmp/
2:主庫創建從庫的同步復制用戶
mysql> grant replication slave on *.* to 'rep1'@'%' identified by 'rep1';
3:從庫:停掉從庫MySQL服務,刪除MySQL數據目錄datadir
rm -rf /data/mysql/data
應用日志,追平備份過程中的事務
innobackupex --defaults-file=/etc/my.cnf --user=dba --password=xxx --apply-log /data/backup
根據my.cnf將備份復制到MySQL數據目錄下:
innobackupex --defaults-file=/etc/my.cnf --user=dba --password=xxx --copy-back /data/backup
修改數據目錄權限
chown mysql.mysql -R /data/mysql/data
4:啟動從庫MySQL服務.並執行change master
cat xtrabackup_info,確定binlog和pos位置,start slave;