MySQL主從複製
一,binlog(二進制日誌)
binlog 記錄了所用的DDL語句(數據定義語言)和DML語句(數據操作語言),但是不包括數據查詢語句,此日誌對於災難恢復起着及其重要的作用,MySQL的主從複製就是通過binlog實現的。
binlog默認是沒有開啓的,需要MySQL的配置文件中開啓,並配置MySQL日誌的格式。
配置文件位置;/etc/my.cnf
日誌存放位置 : 配置時,給定了文件名但是沒有指定路徑,日誌默認寫入Mysql的數據目錄。
#配置開啓binlog日誌, 日誌的文件前綴爲 mysqlbin
#生成的文件名如 :mysqlbin.000001,mysqlbin.000001
log_bin=mysqlbin
#配置二進制日誌的格式
binlog_format=MIXED
日誌格式:
STATEMENT
該日誌格式在日誌文件中記錄的都是SQL語句(statement),每一條對數據進行修改的SQL都會記錄在日誌文件中,通過Mysql提供的mysqlbinlog工具,可以清晰的查看到每條語句的文本。主從複製的時候,從庫(slave)會將日誌解析爲原文本,並在從庫重新執行一次。
ROW
該日誌格式在日誌文件中記錄的是每一行的數據變更,而不是記錄SQL語句。比如,執行SQL語句 : update tb_book set status=‘1’ , 如果是STATEMENT 日誌格式,在日誌中會記錄一行SQL文件; 如果是ROW,由於是對全表進行更新,也就是每一行記錄都會發生變更,ROW 格式的日誌中會記錄每一行的數據變更。
MIXED
這是目前MySQL默認的日誌格式,即混合了STATEMENT 和 ROW兩種格式。MySQL默認情況下采用STATEMENT,MIXED 格式能儘量利用兩種模式的優點
日誌的讀取:
由於日誌以二進制方式存儲,不能直接讀取,需要用mysqlbinlog工具來查看
mysqlbinlog log-file;
日誌的刪除:
1, 通過 Reset Master
指令刪除全部 binlog 日誌,刪除之後,日誌編號,將從 xxxx.000001重新開始 。
2, 執行指令 purge master logs to 'mysqlbin.******'
,該命令將刪除 ******
編號之前的所有日誌
3, 執行指令 purge master logs before 'yyyy-mm-dd hh24:mi:ss'
,該命令將刪除日誌爲 “yyyy-mm-dd hh24:mi:ss” 之前產生的所有日誌 。
4, 設置參數 --expire_logs_days=#
,此參數的含義是設置日誌的過期天數, 過了指定的天數後日志將會被自動刪除
log_bin=mysqlbin
binlog_format=MIXED
--expire_logs_days=#
二,環境準備:
主機 master:192.168.137.26
從機 slave:192.168.137.27
三,主從複製過程:
master接受到寫請求
1,第一種情況是寫請求到master上後,master執行完寫請求後,在事務提交時,會把數據變更作爲時間 Events 記錄在二進制日誌文件 Binlog 中。第二種情況是Slave上面的IO進程連接上Master,並請求從指定日誌文件的指定位置(或者從最開始的日誌)之後的日誌內容
2,Master負責複製的IO進程根據請求信息讀取指定日誌指定位置之後的日誌信息,發給Slave的IO進程。發送信息中除了日誌所包含的信息之外,還包括Master端的bin-log文件的名稱以及bin-log的pos位置;
3,Slave的IO進程接收到信息後,將接收到的日誌內容依次添加到Slave端的中繼日誌(relay-log)文件的最末端,並將讀取到的Master端的bin-log的文件名和位置記錄到master.info文件中,這樣slaver便知道下次從哪裏繼續同步日誌;
4,Slave的sql進程檢測到relay-log中新增加了內容後,會馬上解析relay-log的內容成爲在Master端真實執行時候的那些可執行的內容,並在自身執行。
四,主從複製的優點
1,主庫出現問題可以切換到從庫提供服務
2,寫操作在主庫上執行,查詢操作在從庫上執行,實現讀寫分離,降低主庫的訪問壓力
3,可以在從庫執行備份操作,可以避免備份期間影響主庫的服務
五,搭建環境
1,master
1)在master的配置文件my.cng中
#mysql 服務ID,保證整個集羣環境中唯一
server-id=1
#mysql binlog 日誌的存儲路徑和文件名
log-bin=/var/lib/mysql/mysqlbin
#錯誤日誌,默認已經開啓
#log-err
#mysql的安裝目錄
#basedir
#mysql的臨時目錄
#tmpdir
#mysql的數據存放目錄
#datadir
#是否只讀,1 代表只讀, 0 代表讀寫
read-only=0
#忽略的數據, 指不需要同步的數據庫
binlog-ignore-db=mysql
#指定同步的數據庫
#binlog-do-db=db01
2)執行完後重啓mysql服務
service mysql restart
3)向master添加遠程登錄的授權用戶
1,授權:
#第一種:可遠程登錄Master,僅用於主從複製沒有其它任何select insert update等權限
grant replication slave on *.* to 'slave'@'192.168.137.27' identified by '123';
#第二種:對用戶不但可遠程登錄Master,還可擁有對Master包括主從複製的其它所有select insert update等權限
grant all on *.* to 'slave'@'192.168.137.27' identified by '123';
2,刷新授權列表
flush privileges;
3,查看授權結果
show grants for 'slave'@'192.168.137.27';
4,測試在slave端登錄master
5,在master上查看所有連接登錄本機的客戶端情況
show processlist \G
4)查看master狀態
show master status;
2,slave
1) 在 slave 端配置文件中,配置如下內容:
#mysql服務端ID,唯一
server-id=2
# 確認binlog日誌格式爲mixd混合類型
binlog_format=mixed
#指定binlog日誌
log-bin=/var/lib/mysql/mysqlbin
【可選配置】
1.只想複製某(些)個庫:
replicate_do_db=test1 # 追加複製test1庫
replicate_do_db=test2 # 追加只複製test2庫
2.只想複製某(些)個庫(的所有表)
replicate_wild_do_table=test1.% # 追加複製test1庫的所有表
replicate_wild_do_table=test2.% # 追加複製test2庫的所有表
3.只想複製某(些)個庫(的部分表)
replicate_wild_do_table=test1.user # 追加test1.user表
replicate_wild_do_table=test2.role # 追加test2.role表
4.想忽略對mysql和test數據庫的複製
replicate_ignore_db=mysql # 追加mysql庫爲忽略
replicate_ignore_db=test # 追加test庫爲忽略
5.想忽略對某些庫的某些表的複製
replicate_wild_ignore_table=test1.user # 追加test1.user表爲忽略
6.“主-->從-->從”的鏈式架構,因爲在默認情況下,from主(Master)機copy過來的數據不會寫入從(Slave)機的binlog日誌裏,而是寫入中繼日誌(localhost-relay-bin.00000x)裏,所以本機如果還需要充當其它機器的主機,就將從主機複製來的數據寫入從庫時同時也顯式地寫入本地binlog日誌,添加如下配置:
log-slave-updates =1
2) 執行完畢之後,需要重啓Mysql:
service mysql restart;
3) 執行如下指令 :
change master to master_host= '192.168.137.26', master_user='master', master_password='123', master_log_file='mysqlbin.000001', master_log_pos=413;
指定當前從庫對應的主庫的IP地址,用戶名,密碼,從哪個日誌文件開始的那個位置開始同步推送日誌。
常用選項:
master_host='192.168.137.26' 遠程主(Master)機IP
master_user='master', 登錄遠程主(Master)機 用戶名
master_password='123', 登錄遠程主(Master)機 密碼
不常用選項:
MASTER_LOG_FILE='mysql-bin.000001' 指定從哪個binlog文件複製(如果不加此參數默認是最早的binlog日誌)
MASTER_LOG_POS=107 指定從哪個binlog文件的哪個pos點開始複製(如果不加此參數默認是最早的pos點)
MASTER_PORT=3306, 遠程主(Master)機端口
MASTER_HEARTBEAT_PERIOD=60 多長時間探測一次主服務器是否在線 單位:秒
MASTER_CONNECT_RETRY=10; 無法連接主服務器的時候重試連接的間隔時間 單位:秒
4) 開啓同步操作
start slave;
show slave status \G;
如果看到如下狀態說明同步成功:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
5) 停止同步操作
stop slave;
開啓同步操作
start slave;
show slave status \G;
如果看到如下狀態說明同步成功:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
5) 停止同步操作
stop slave;