1. 程式人生 > >2018.4.2 15周1次課

2018.4.2 15周1次課

Linux學習

十五周一次課(4月2日)

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次課