•MySQL主從又叫作Replication、AB複製。簡單講就是A和B兩臺機器作主從後,在A上寫數據,另一臺B也會跟着寫數據,二者數據實時同步的mysql
• MySQL主從是基於binlog的,主上須開啓binlog才能進行主從。linux
• 主從過程大體有3個步驟web
1)主將更改操做記錄到binlog裏sql
2)從將主的binlog事件(sql語句)同步到從本機上並記錄在relaylog裏數據庫
3)從根據relaylog裏面的sql語句按順序執行vim
• 主上有一個log dump線程,用來和從的I/O線程傳遞binlog服務器
• 從上有兩個線程,其中I/O線程用來同步主的binlog並生成relaylog,另一個SQL線程用來把relaylog裏面的sql語句落地ide
其中binlog 二進制日誌測試
relaylog 中繼日誌spa
MySQL主從原理圖以下:
MySQL主從配置使用場景
1)將從用於作數據備份
2)從不只用於數據備份,並且還用於web客戶端讀取從上的數據,減輕主讀的壓力
準備兩臺機器,每臺機器都要搭建好並啓動MySQL服務 ,下面咱們來將IP爲136機器作成主庫、130的機器作成從庫,當前136機器mysql服務已經搭建好,下面咱們來將130的mysql服務搭建起來
一、安裝mysql
1)下載
下載MySQL5.6 64位MySQL二進制免編譯包
# wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz
2 )解壓
# tar xzvf mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz
3)移動目錄
將解壓後的文件包移動到目錄/usr/local/下並改名爲mysql
# mv mysql-5.6.36-linux-glibc2.5-x86_64 /usr/local/mysql
4)建立使用MySQL的系統用戶及數據存儲目錄
# useradd mysql
# mkdir /data/
5)初始化
# cd /usr/local/mysql
# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
當出現兩個OK則說明初始化OK
6)修改配置文件
# vim /etc/my.cnf
修改這個文件中以下位置
7)拷貝並編輯啓動腳本
# cp support-files/mysql.server /etc/init.d/mysqld
# vim /etc/init.d/mysqld
# chkconfig mysqld on //配置mysqld開機啓動
將啓動腳本修改下面位置以下圖
8)啓動mysqld
# /etc/init.d/mysqld start //啓動mysqld
# ps aux |grep mysqld //查看mysqld是否成功啓動
將前面的準備工做作好以後,咱們再來配置主庫
一、修改配置文件
# vim /etc/my.cnf
在配置文件中增長如下內容
server-id=136 //後面的id號能夠隨便定義
log_bin=lijie1 //這裏定義的是binlog的前綴,這個前綴名能夠隨便定義
二、重啓mysql服務
# /etc/init.d/mysqld restart //重啓mysqld
# ls -lt /data/mysql/ //配置完重啓後能夠看到這個目錄下多了兩個文件
上圖中的lijie1.000001是第一個二進制日誌文件,後面還會生成不少個
lijie1.index是必需有的索引文件
沒有這些文件主從就沒有辦法完成
三、準備測試用的數據
咱們須要將以前的庫備份並恢復成lijie庫,做爲測試數據
# mysqldump -uroot -p112233 zrlog > /tmp/zrlog.sql //備份庫
# mysql -uroot -p112233 -e "create database lijie" //建立測試庫
# mysql -uroot -p112233 lijie < /tmp/zrlog.sql //恢復數據到測試庫
四、建立用做同步數據的用戶
# mysql -uroot -p112233
> grant replication slave on *.* to 'repl'@192.168.31.149 identified by '112233'; //建立數據庫用戶repl並將其綁定到固定從機192.168.31.149上,且只授予其同步數據的權限
五、鎖表
鎖表的目的是將表固定在當前狀態,不能再寫入數據,後面咱們還要將備份的數據同步到從機上,以保證主從數據的一致性
> flush tables with read lock;
六、查看主庫狀態
> show master status;
一、編輯配置文件
# vim /etc/my.cnf
在這個配置文件中加入server-id,要求和主不同,在這裏咱們不須要添加log_bin日誌的值了,只有主上才須要二進制日誌文件
二、重啓mysql服務
# /etc/init.d/mysqld restart //重啓mysqld
# ls -lt /data/mysql/ //配置完重啓後能夠看到這個目錄下沒有什麼變化
三、同步主上的數據文件到本機
# scp 192.168.31.157:/tmp/*.sql /tmp
四、建立庫
因爲咱們尚未將mysql的路徑加入到PATH中,所以咱們能夠先作一個alias
# alias 'mysql=/usr/local/mysql/bin/mysql'
# alias 'mysqldump=/usr/local/mysql/bin/mysqldump'
# mysql -uroot -p123123
> create database lijie;
> create database zrlog;
五、恢復數據
# mysqldump -uroot -p123123 lijie < /tmp/lijie.sql
# mysqldump -uroot -p123123 zrlog < /tmp/zrlog.sql
六、實現主從
# mysql -uroot -p123123
> stop slave;
> change master to master_host='192.168.31.157', master_user='repl', master_password='123123', master_log_file='lijie1.000001',master_log_pos=10555;
上面命令中包含的主庫信息有:IP 登陸主數據庫的用戶名、密碼、日誌文件名,日誌路徑,咱們還能夠在命令中加入端口信息,默認3306端口能夠不用寫
> start slave;
七、判斷主從是否配置成功
從上執行
• mysql -uroot
• show slave stauts\G
看是否有
• 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:
咱們使用下面這個命令來查看
# show slave status\G //若是出現下圖中兩個YES則表示主從配置成功
若是show slave status中Slave_IO_Running=connecting則須要查查有沒有iptables規則,或者是否開啓了selinux ,還要保證用戶名密碼是對的
八、取消鎖定
主從配置好後,還要到主上去取消對錶寫入的鎖定
> unlock tables;
一、幾個配置參數
下面的參數是在mysql配置文件my.cnf中去定義的,能夠在主上配置,也能夠在從上配置
若是是在主服務器上,
• 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=
二、測試同步
主上
• mysql -uroot aming
• select count(*) from db;
• truncate table db;
到從上
• mysql -uroot aming
• select count(*) from db;
主上繼續drop table db;
從上查看db表
1)首先咱們分別在主從上查看下lijie.user表的行數
主 > use lijie; 從 > use lijie;
> select count(*) user; > select count(*) user;
能夠看到兩邊的結果是一致的
2)咱們在主上清空表lijie.user
> truncate table user; //清空表user的數據
> select * from user; // 查詢表中內容,能夠看到表是空的
再到從上查詢表user中的數據,也爲空
3)咱們在主上刪除表lijie.user
> drop table user;
若是在上述操做中咱們不當心在從上作了刪除等操做使主從的數據不一致時,咱們能夠嘗試重啓slave來恢復,若是仍是不行的話,就須要從新作主從了,若是此刻主從數據修改成一致後,能夠直接從change master這一步開始走。