MySQL主從複製之ROW+GTID
一、基礎:
1.複製主要有3點好處
1)實現在不同伺服器上的資料分佈,可以將資料讀取進行負載均衡;
2)增強了資料安全性,減少主庫的connections,可以實現資料高可用和故障切換;
3)實現資料庫線上升級
2.二進位制日誌3種格式
1)STATEMENT格式
優點:日誌記錄量相對較小,節約磁碟及網路I/0;
缺點:對UUID(),USER(),這樣的函式存在BUG
2)ROW格式
優點:使MySQL主從複製更加安全
缺點:記錄日誌量較大
3)MIXED格式
根據SQL語句由系統決定是基於段還是基於行來進行復制
推薦使用:binlog_format=row
3.MySQL複製原理(直接上圖)
1)主將變更寫入二進位制日誌;
2)從讀取主的二進位制日誌變更,並寫入到relay_log中;
3)在從上重放relay_log中的日誌,如果基於段的複製,則在從上重新執行記錄的SQL。如果基於行的複製,則在從庫上直接對資料庫進行修改;
4.基於GTID複製的優缺點
1)什麼是GTID
GTID即全域性事務ID,其保證為每一個在主上提交的事務在複製叢集中可以生成一個唯一的ID
GTID=source_id:transaction_id
2)優點:可以很方便的進行故障轉移,從庫不會丟失主庫上的任何修改
3)缺點:故障處理比較複雜,對執行的SQL有一定的限制
二、部署
環境:一主一從
主IP:192.168.20.206
從IP:192.168.20.212
需要3個步驟:
1.修改主庫的my.cnf引數,並建立複製賬戶,備份出資料庫資料,匯入到從庫中;
2.修改從庫的my.cnf引數,匯入備份資料;
3.在從庫中執行使用change master 、start slave命令搞定
1.1)修改主庫my.cnf檔案
vim /etc/my.cnf
[mysqld] server_id = 1 #: for binlog binlog_format = row log_bin = /data/mysql/mysql3306/logs/mysql-bin binlog_rows_query_log_events = on log_slave_updates = on expire_logs_days = 7 binlog_cache_size = 65536 sync_binlog =1 slave-preserve-commit-order =ON #: for gtid gtid_mode = on enforce_gtid_consistency = on 1.2)重啟MySQL服務 service mysqld restart 1.3)建立複製使用者 create user 'repl'@'192.168.20.%'; grant replication slave on *.* to 'repl'@'192.168.20.%' identified by '666666'; flush privileges; 1.4)備份資料,匯入到從庫中 mysqldump -uroot -p --master-data=2 --events --single-transaction --routines --triggers -A -B >/opt/all.sql scp all.sql 192.168.20.212:/opt/ 2.1)修改從庫my.cnf檔案 [mysqld] server_id = 2 #: for binlog binlog_format = row log_bin = /data/mysql/mysql3306/logs/mysql-bin binlog_rows_query_log_events = on log_slave_updates = on expire_logs_days = 7 binlog_cache_size = 65536 sync_binlog =1 slave-preserve-commit-order =ON #: for gtid gtid_mode = on enforce_gtid_consistency = on 2.2)重啟MySQL服務 service mysqld restart2.3)在從庫清空二進位制日誌,記住是在從庫執行,需要反覆確認,慎用!
reset master
2.4)將備份資料匯入到從庫中
mysql -uroot -p -S /tmp/mysql.sock </opt/all.sql
3.1)在從庫中執行change master語句
change master to master_host='192.168.20.206',master_user='repl',master_password='666666',master_auto_position=1;
3.2)在從庫中執行start slave;
start slave;
如果執行show slave status \G
出現這樣的兩個Yes
搞定!