2018.4.2 15周1次課
17.1 MySQL主從介紹
17.2 準備工作
17.3 配置主
17.4 配置從
17.5 測試主從同步
17.1 MySQL主從介紹
MySQL主從又叫做Replication、AB復制。簡單講就是A和B兩臺機器做主從後,在A上寫數據,另外一臺B也會跟著寫數據,兩者數據實時同步的
MySQL主從是基於binlog的,主上須開啟binlog才能進行主從。
主從過程大致有3個步驟
1)主將更改操作記錄到binlog裏
2)從將主的binlog事件(sql語句)同步到從本機上並記錄在relaylog裏
3)從根據relaylog裏面的sql語句按順序執行
主上有一個log dump線程,用來和從的I/O線程傳遞binlog
從上有兩個線程,其中I/O線程用來同步主的binlog並生成relaylog,另外一個SQL線程用來把relaylog裏面的sql語句落地
MySQL主從原理圖
17.2 準備工作
192.168.37.100從mysql,192.168.37.101主mysql
17.3 配置主
安裝mysql
修改my.cnf,增加server-id=101和log_bin=aminglinux1
修改完配置文件後,啟動或者重啟mysqld服務
service mysqld restart
查看/data/mysql/目錄下下,會多出2個已aminglinux1開頭的文件,這些aminglinux1開頭的文件非常重要,是實現主從的根本
aminglinux1.index //索引文件,必須要
aminglinux1.000001 //二進制日誌文件,以後還會生成aminglinux1.000002等,依次類推
把zrlog庫備份並恢復成aming庫,作為測試數據
備份zrlog庫:mysqldump -uroot -paminglinux zrlog > /tmp/zrlog.sql
查看/tmp/zrlog.sql大小:du -sh /tmp/zrlog.sql
新建aming數據庫:mysql -uroot -paminglinux -e "create database aming"
恢復zrlog庫到aming庫中:mysql -uroot -paminglinux aming < /tmp/zrlog.sql
對比開始時的aminglinux1.000001文件大小,可以看出文件大小也同步增加,增加的大小正好和zrlog庫大小保持一致,裏面完整的記錄了數據庫的創建過程,庫,表,內容等
創建用作同步數據的用戶
進入mysql:mysql -uroot -paminglinux
創建用戶:grant replication slave on *.* to 'repl'@slave_ip identified by 'password'; //repl是為從(slave)端設置的訪問主(master)端的用戶,也就是要完成主從復制的用戶。
grant replication slave on *.* to 'repl'@192.168.37.100 identified by 'password';
鎖定表,不讓繼續寫入:flush tables with read lock; //這個命令是全局讀鎖定,執行了命令之後所有庫所有表都被鎖定只讀。一般都是用在數據庫聯機備份,這個時候數據庫的寫操作將被阻塞,讀操作順利進行
show master status; //查看master的狀態,這是數據要記錄的,一會要在slave端用到
繼續備份其他庫
mysqldump -uroot -paminglinux mysql2 > /tmp/my2.sql
17.4 配置從
安裝mysql
查看my.cnf,配置server-id=100,要求和主不一樣
修改完配置文件後,啟動或者重啟mysqld服務:service mysqld restart
把主上aming庫同步到從上:scp 192.168.37.101:/tmp/*.sql /tmp/
做2個alias
alias 'mysql=/usr/local/mysql/bin/mysql'
alias 'mysqldump=/usr/local/mysql/bin/mysqldump'
進入mysql:mysql –uroot //沒有設置密碼
創建3個庫
create database aming;
create database zrlog;
create database mysql2;
恢復3個庫
mysql -uroot aming < /tmp/zrlog.sql
mysql -uroot zrlog < /tmp/zrlog.sql
mysql -uroot mysql2 < /tmp/my2.sql
要保證主從的數據要一致
登陸mysql:mysql –uroot
先關閉主從同步:stop slave;
實現主從同步:change master to master_host='', master_user='repl', master_password='', master_log_file='', master_log_pos=xx;
change master to master_host='192.168.37.101', master_user='repl', master_password='pa ssword', master_log_file='aminglinux1.000001', master_log_pos=12994;
master_log_file是主上使用show master status命令查詢到的File列裏的aminglinux1.000001
master_log_pos是主上使用show master status命令查詢到的Position列裏的12994
打開同步:start slave;
判斷主從是否配置成功:show slave status\G(最後可以不用分號,\G本身就是結束符)
確認以下兩項參數都為Yes
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
還需關註
Seconds_Behind_Master: 0 //為主從延遲的時間
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
還要到主上執行 unlock tables;
17.5 測試主從同步
幾個配置參數
主服務器上
binlog-do-db= //僅同步指定的庫,多個庫可以用逗號分隔
binlog-ignore-db= //忽略指定庫
從服務器上
replicate_do_db=
replicate_ignore_db=
replicate_do_table= //僅同步指定的表
replicate_ignore_table= //忽略指定表
replicate_wild_do_table= //如aming.%, 支持通配符%
replicate_wild_ignore_table=
使用時盡量使用最後兩項,因為支持 庫名.表名
主上使用aming庫:use aming;
查看表:show tables;
查看log表的行數:select count(*) log;
在從上也查看一下:
主上清空log表:truncate table log;
有報錯,我們清空的表具有外鍵約束報ERROR 1701(42000)
解決方法:在主上設置外鍵約束=0
set foreign_key_checks=0;
truncate table log;
select * from log; //表為空了
從上的表也是空了
主上刪除log表:drop table log;
從上查看log表:select * from log; //沒有了
恢復外鍵約束:set foreign_key_checks=1;
主上刪除庫:drop database aming;
從上查看:show databases; //沒有aming庫了
主從配置起來雖然很簡單,但是這種機制非常脆弱,一旦我們不小心再slave上寫了數據,那麽主從復制也就被破壞了。另外,如果重啟master,務必要先關閉slave,即在slave上執行stop slave命令,然後再去重啟master的MySQL服務。否則主從復制很有可能會中斷,重啟master後,我們還需要執行start slave命令開啟主從復制的服務。
如果主從復制破壞了,在從上執行
stop slave;
start slave;
show slave status\G命令查看
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果沒有都是yes,那只有重新做主從復制了。
2018.4.2 15周1次課