主從複製簡介mysql
一、能作什麼?
一、預防數據庫的物理損壞故障
二、實時備份二進制日誌,輔助備份
三、高可用架構和高性能架構sql
二、基於什麼來作的? 二進制日誌 數據庫
三、二進制日誌在哪?如何設置位置和命名?
log_bin=/data/mysql/mysql-bin
四、二進制日誌記錄什麼?
events形式記錄
DDL DCL 使用語句記錄模式
DML 已提交的事務,row方式記錄
五、二進制日誌格式是怎樣的?
binlog_format=row
六、二進制日誌如何滾動?
flush logs
七、二進制日誌用來幹嗎?
能夠作即時點恢復
主從複製的必要條件
八、二進制日誌的操做命令?
show master status;
show binary logs;
show binlog events in "mysql-bin.000001";
其它一些 參數:
mysqlbinlog --base64-output=decode-rows -vvv --start-position --stop-position -dvim
------------------------
主從複製原理緩存
一、主從複製構建前提
(1)至少兩個mysql實例
(2)主庫要開啓二進制日誌
(3)主庫要提供一個專門用做複製用戶
(4)從庫須要「補課」,經過備份工具實現從庫追上主庫的數據狀態,從這一刻開始由主從複製自動進行實現
(5)從庫須要咱們告訴它,從「何時」開始自動複製(二進制日誌文件號+position)
(6)從庫還須要咱們告訴他,主庫IP、port、user、password網絡
二、工做原理(classic replication)架構
(1)主從複製構建過程當中,已經告訴從庫關於主庫的一些信息,主從複製的起始位置
change master to (IP、prot、user、password、二進制日誌文件名、位置號)
從庫會自動存放在master.info中。
(2)從IO線程,讀取master.info信息,鏈接到master,問master,有沒有比master.info中記錄的還要新的(7號文件,340號).
(3)master說:你等一下,我看一下(show master status,7號文件,1040),你要不要。
(4)slave說:我要啊,你給我吧
(5)master,經過dump Thread截取binlog當中新的事件,傳送給Slave IO線程。
(6)Slave,io線程接收到主庫發過來的新的二進制日誌,存儲到TCP/IP緩存,當即返回ACK給主庫。
(7)將TCP/IP 緩存中數據,最終會被寫入到relaylog中,而且更新master.info,將位置號更新到最後一次獲取位置(1040)
(8)SQL Thread 讀取relay-log.info,找到上次運行過的relaylog的位置點,向後接着運行。
(9)運行完成後,會再次更新relay-log.info信息,以運行過的relay-log會被自動清理。app
一次主從複製就完成了。ide
-------------------------------------------------------------------------------工具
主從複製搭建過程(Classic Replication 傳統的主從複製)
一、準備兩個以上的MySQL實例(這裏用的多實例)
(1)準備多實例
清除以前多實例的數據
rm -rf /data/3307/data/*
rm -rf /data/3307/mysql*
rm -rf /data/3308/data/*
rm -rf /data/3308/mysql*
rm -rf /data/3309/data/*
rm -rf /data/3309/mysql*
(2)從新初始化數據
mv /etc/my.cnf /etc/my.cnf.bak
初始化數據:
/application/mysql/scripts/mysql_install_db --user=mysql --basedir=/application/mysql --datadir=/data/3307/data/
/application/mysql/scripts/mysql_install_db --user=mysql --basedir=/application/mysql --datadir=/data/3308/data/
/application/mysql/scripts/mysql_install_db --user=mysql --basedir=/application/mysql --datadir=/data/3309/data/
修改目錄權限
[root@db01 3307]# touch /data/330{7..9}/mysql.log
[root@db01 3307]# chown -R mysql.mysql /data/330*
啓動多實例
mysqld_safe --defaults-file=/data/3307/my.cnf &
mysqld_safe --defaults-file=/data/3308/my.cnf &
mysqld_safe --defaults-file=/data/3309/my.cnf &
[root@db01 3307]# netstat -lnp|grep 330
二、全備主庫數據
規劃:
3307:master
3308:slave
3307全備:
mysqldump -S /data/3307/mysql.sock -A -R --triggers --master-data=2 --single-transaction >/backup/full3307.sql
三、主庫建立複製用戶
mysql -S /data/3307/mysql.sock
grant replication slave on *.* to repl@'10.0.0.%' identified by '123';
四、從庫恢復數據
mysql -S /data/3308/mysql.sock
set sql_log_bin=0;
source /backup/full3307.sql;
set sql_log_bin=1;
五、從庫開啓主從複製
(1)找到複製起點
/backup/full3307.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=120;
(2)開始本身複製
mysql -S /data/3308/mysql.sock
help change master to
CHANGE MASTER TO
MASTER_HOST='10.0.0.181',
MASTER_USER='repl',
MASTER_PASSWORD='123',
MASTER_PORT=3307,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=120,
MASTER_CONNECT_RETRY=10;
以上信息會被存儲到master.info信息中
[root@mysql181 data]# ls
auto.cnf mysql performance_schema test xxxxxxxxxx
ibdata1 mysql181.pid relay-log.info XUJIN xxxxxxxxxxsadsadsad
ib_logfile0 mysql181-relay-bin.000004 shiwutest xujintest
ib_logfile1 mysql181-relay-bin.000005 shiwutest12222 xujintest111
master.info mysql181-relay-bin.index shiwutestasdsad xujintest111sadsad
[root@mysql181 data]# cat master.info
23
mysql-bin.000003
621
192.168.6.181
repl
123
3306
10
0
...... ........
[root@mysql181 data]#
開啓從庫複製線程:
start slave ;
排錯思路:
show slave status\G
Last_IO_Error: error connecting to master 'repl@10.0.0.181:3307' - retry-time: 10 retries: 6
報錯了:
排查過程:
一、驗證用戶可用性
mysql -urepl -p123 -h 10.0.0.51 -P3307
Warning: Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'repl'@'db01' (using password: YES)
說明mysql作了自動別名解析。須要在mysql配置文件中加入如下一行:
vim /data/3307/my.cnf
skip_name_resolve
vim /data/3308/my.cnf
skip_name_resolve
vim /data/3309/my.cnf
skip_name_resolve
重啓數據庫節點
mysqladmin -S /data/3307/mysql.sock shutdown
mysqladmin -S /data/3308/mysql.sock shutdown
mysqladmin -S /data/3309/mysql.sock shutdown
mysqld_safe --defaults-file=/data/3307/my.cnf &
mysqld_safe --defaults-file=/data/3308/my.cnf &
mysqld_safe --defaults-file=/data/3309/my.cnf &
----
處理完成後,檢查3308主從狀態
mysql -S /data/3308/mysql.sock
出現兩個yes,就說明主從複製成功了:
show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
------------------------------
主從複製故障:
一、判斷故障的第一標準
兩個線程是否爲yes,不是yes,確定是有問題的,若是都是yes也不必定徹底沒問題的。
show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
二、分析故障緣由
IO線程故障:
IO線程負責什麼?
(1)讀取master.info信息
(2)鏈接主庫
(3)請求的二進制日誌
故障緣由
(1)ip port user password 錯誤或不正常,解析錯誤,主庫沒有用戶,網絡,防火牆
(2)請求的二進制日誌不存在,或信息錯誤
出現以上解決方案:
一、用戶名密碼錯誤,,ip port
stop slave; ----中止從庫線程
reset slave all; ----清除從庫複製信息
從新change master to
從新開啓主從複製線程
start slave;
二、主庫二進制日誌故障
stop slave; ----中止從庫線程
reset slave all; ----清除從庫複製信息
將數據從新備份恢復到從庫
從新change master to
從新開啓主從複製線程
start slave;
SQL線程故障:
最核心的功能是執行relay-log中的SQL語句
研究SQL線程故障,說白了就是研究SQL語句爲何執行失敗。
爲何主庫執行成功,從庫爲啥執行不成功?
主庫:
drop database oldboy; create database oldboy; update delete insert
從庫:
未執行成功
緣由是什麼?
(1)由於沒作初始化從庫,初始化有問題(備份主庫,恢復從庫沒有作好)
(2)從庫被寫入增刪改查了。破壞了和主庫的一致性
有風險的處理方法:
跳過錯誤操做:
stop slave;
set global sql_slave_skip_counter = 1 ;
start slave;
靠譜的方法:
從新搭建主從。
從根上解決問題:
從庫只讀。
命令行設置:
set global read_only=1;
配置文件設置:
read_only=1
注意:read_only參數對root權限的帳號不起做用。