快速筆記02-MySQL主從複製原理半同步操做步驟及原理

==========================================================
一:MySQL主從複製規劃mysql

主庫:(MySQL master) IP:10.0.0.52 PROT:3306從庫1:(MySQL slave) IP:10.0.0.52 PORT:3307從庫2:(MySQL slave) IP:10.0.0.52 PORT:3308

==========================================================
二:檢查環境
(1)檢查MySQL數據庫多實例是否啓動sql

netstat -lntup|grep 330tcp        0      0 0.0.0.0:3306         0.0.0.0:*     LISTEN      20434/mysqld        tcp        0      0 0.0.0.0:3307         0.0.0.0:*     LISTEN      15120/mysqld        tcp        0      0 0.0.0.0:3308         0.0.0.0:*     LISTEN      19578/mysqld

(2)開啓MySQL主庫的Binlog功能數據庫

 grep log-bin /data/3306/my.cnf

(3)設置server-id,此處ID不能夠相同不然最後出現IO錯誤vim

 grep server-id /data/{3306,3307,3308}/my.cnf/data/3306/my.cnf:server-id = 1/data/3307/my.cnf:server-id = 3/data/3308/my.cnf:server-id = 8

==========================================================
三:由於從庫如今尚未數據,或者數據不統一咱們須要導入數據bash

wget ftp://10.0.0.1/backup-mysql-salt.tar.gztar xf backup-mysql-salt.tar.gzzcat /root/bak_2016-07-27.sql.gz|mysql -uroot -poldboy -S /data/3306/mysql.sockmysql -uroot -poldboy -S /data/3306/mysql.sockshow databases; #檢查數據庫是否導入select user,host from mysql.user;

==========================================================
四:主庫上面的操做(3306)
(1)主庫須要受權slave訪問的用戶rep服務器

mysql -uroot -poldboy -S /data/3306/mysql.sock #登陸第一個實例的MySQL數據庫grant replication slave on *.* to 'rep'@'172.16.1.%' identified by 'oldboy123';flush privileges;show grants for rep@'172.16.1.%'; #查看用戶的權限select user,host from mysql.user;

提示:replication slave 爲mysql同步的必須權限,此處不要受權all權限
(2)鎖表、查看binlog文件及位置點,主庫導出全備,須要鎖表(-x –master-date=2)app

flush table with read lock; #鎖表,窗口不能退出,退出失效show master status; #鎖表後查看主庫狀態,臨界點,未來恢復就從0004開始| mysql-bin.000004 |   600457 |              |                  |

(3)將MySQL主庫的數據進行備份tcp

mkdir /server/backup/ -pmysqldump -uroot -poldboy123 -S /data/3306/mysql.sock -A -B --events|gzip >/server/backup/rep3307_bak$(date +%F).sql.gz #因爲以前導入的數據庫爲全量的因此之前的密碼爲oldboy123ls -lrt /server/backup/

(4)解鎖MySQL數據庫的數據表,並查看msater的狀態ide

unlock table; #解鎖MySQL數據庫的數據表show master status;

提示:若是解鎖以後仍是mysql-bin.000004 說明是正確的,若是動了說明沒有鎖住表
提示:若是mysqldump 加了-F 他就會更改刷新binlogpost

五:從庫1上面的操做(3307)
提示:必定要確保從庫的server_id與從庫的不一樣

grep server-id /data/{3306,3307}/my.cnf /data/3306/my.cnf:server-id = 1/data/3307/my.cnf:server-id = 3

(1)把主庫的備份數據導入到從庫

cd /server/backup/gzip -d rep3307_bak2016-07-29.sql.gzmysql -uroot -poldboy -S /data/3307/mysql.sock <rep3307_bak2016-07-29.sql

提示從庫的密碼爲oldboy
(2)登陸從庫檢查主庫1查看數據是否導入成功

mysql -uroot -poldboy -S /data/3307/mysql.sockshow databases;select user,host from mysql.user;

(3)刷新用戶的權限

flush privileges;

(4)查找位置點,配置master.info,如下爲主庫的位置點

show master status; (主數據庫執行此命令)| mysql-bin.000004 |   600457 |              |                  |CHANGE MASTER TO MASTER_HOST='172.16.1.52',  #這是主庫的IP(域名也能夠須要作解析)MASTER_PORT=3306,              #主庫的端口,從庫端口和主庫不能夠相同MASTER_USER='rep',            #這是主庫上建立用來複制的用戶repMASTER_PASSWORD='123456'    #rep的密碼MASTER_LOG_FILE='mysql-bin.000025', #這裏是show master status時看到的查詢二進制日誌文件名稱,這裏不能多空格MASTER_LOG_POS=9155;       #這裏是show master status時看到的二進制日誌偏移量,不能多空格

提示:3307操做此步:會在/data/3307/data下面產生master.info文件
(5)登陸3307從庫,配置複製參數,去掉上述語句中的註釋,執行以下

mysql -uroot -poldboy -S /data/3307/mysql.sockCHANGE MASTER TO MASTER_HOST='172.16.1.61',MASTER_PORT=3306,MASTER_USER='rep',MASTER_PASSWORD='oldboy123',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=600457;Query OK, 0 rows affected (0.02 sec) #出現此信息表示成功

提示:3307操做此步:會在/data/3307/data下面產生master.info文件

ll /data/3307/data/master.info

(6)上述步驟成功後,開啓從庫複製開關。

start slave;show slave status\G #G後面必定不要加封號,會報錯的

(7)主從是否成功,最關鍵的爲下面的3項狀態參數

mysql -uroot -poldboy123 -S /data/3307/mysql.sock -e "show slave status\G"|egrep "IO_Running|SQL_Running|_Behind_Master"Slave_IO_Running: Yes #這個是I/O線程狀態,狀態爲Yes表示I/O線程工做正常Slave_SQL_Running: Yes #這個是SQL線程狀態,狀態爲Yes表示I/O線程工做正常Seconds_Behind_Master: 0 #這是個複製過程當中,從庫比主庫的延遲的秒數

(8)測試主庫與從庫是否同步
1.在主庫添加一個新的數據庫chris

create database chris;

2.檢查從庫是否有chris這個數據庫

mysql> show databases;| chris              |

刪除主庫的chirs數據庫檢查從庫是否刪除

drop database chris; (主庫執行)mysql> show databases; (從庫執行)

==========================================================
六:從庫2上的操做(3308)快速配置
思路:由於咱們已經有了一個MySQL從庫,因此只需將3307的從庫複製到3308便可
(1)從主庫中導出數據庫,導入從庫

mysqldump -uroot -poldboy123 -S /data/3306/mysql.sock -B -F --master-data=1 -A --events|gzip >/server/backup/rep3308_bak$(date +%F).sql.gz 提示:--master-data=1會將備份時的位置點記錄下來CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000009', MASTER_LOG_POS=107;

(2)將數據導入從庫3308

cd /server/backup/gzip -d rep3308_bak2016-07-29.sql.gzmysql -uroot -poldboy -S /data/3308/mysql.sock < ./rep3308_bak2016-07-29.sql

(3)檢查3308數據庫是否生成master.info文件

ll /data/3308/data/master.info

(4)登陸3308從庫,配置複製參數

mysql -uroot -poldboy -S /data/3308/mysql.sockCHANGE MASTER TO MASTER_HOST='172.16.1.52',MASTER_PORT=3306,MASTER_USER='rep',MASTER_PASSWORD='oldboy123';

(5)上述步驟成功後,開啓從庫複製開關。

start slave;show slave status\G #G後面必定不要加封號,會報錯的

(6)主從是否成功,最關鍵的爲下面的3項狀態參數

mysql -uroot -poldboy123 -S /data/3307/mysql.sock -e "show slave status\G"|egrep "IO_Running|SQL_Running|_Behind_Master"Slave_IO_Running: Yes #這個是I/O線程狀態,狀態爲Yes表示I/O線程工做正常Slave_SQL_Running: Yes #這個是SQL線程狀態,狀態爲Yes表示I/O線程工做正常Seconds_Behind_Master: 0 #這是個複製過程當中,從庫比主庫的延遲的秒數

==========================================================
七:當咱們使用show slave status\G查看主從複製出現故障時,能夠看狀況跳過
(1)臨時中止同步開關

stop slave;

(2)將同步指針向下移動一個,若是屢次不一樣步能夠重複操做

set global sql_slave_skip_counter =1;

(3)開啓同步開關

start slave;

(4)查看同步信息是否正常

show slave status\G

==========================================================
八:測試主庫與從庫是否能夠實現同步

mysql -uroot -poldboy123 -S /data/3306/mysql.sockmysql -uroot -poldboy123 -S /data/3307/mysql.sockmysql -uroot -poldboy123 -S /data/3308/mysql.sock

(1)在主庫上建立一個數據庫

create database liyajin;(主庫執行)

(2)查看從庫1,從庫2是否有同步過來

show databases; (從庫1執行)| liyajin            |show databases; (從庫2執行)| liyajin            |

(3)將主庫中的liyajin數據庫刪除,

mysql> drop database liyajin; (主庫執行)

(4)查看從庫是否也會刪除

show databases; (從庫1執行)show databases; (從庫2執行)

(5)最後查看從庫的同步狀態是否有錯誤,若是沒有錯誤則MySQL主從複製配置成功

show slave status\G

提示:通常刪除數據庫都會有提示同步錯誤,咱們須要設置忽略錯誤便可

九:如今咱們來將配置好的MySQL數據庫打包成RPM包

依賴包:ncurses-devel libaio-devel cmake

將LAMP環境進行RPM打包

(1):設置打包完成後執行的腳本

mkdir /server/scripts/ -pvim /server/scripts/mysql-init.sh#!/bin/bashuseradd -u 505 mysql -s /sbin/nologin -Mchown -R mysql.mysql /data//data/3306/mysql start/data/3307/mysql start/data/3308/mysql start\cp /application/mysql/bin/* /usr/local/sbin/cat >>/etc/rc.local<<EOF#mysql multi instances/data/3306/mysql start/data/3307/mysql start/data/3308/mysql startEOF

(3):LAP一鍵RPM包打包(打包之前要關閉數據庫)

/data/3306/mysql stop/data/3307/mysql stop/data/3308/mysql stopfpm -s dir -t rpm -n mysqld -v 1.0 --description '3306,3307,3308' -d 'ncurses-devel libaio-devel cmake' --post-install /server/scripts/mysql-init.sh /application /usr/local/lib/ /usr/local/bin/ /data/

總結:
三個實例數據庫密碼都是oldboy123
(4)將製做完成的RPM上傳到服務器上安裝便可

yum -y localinstall lamp-1.0-1.x86_64.rpm

(5)安裝完成之後的檢查80與3306端口是否打開

ll /application/netstat -ltnp

(2)配置YUM客戶端-客戶端配置

cd /etc/yum.repos.d/rm -f /etc/yum.repos.d/{CentOS-Base.repo,epel.repo}mv CentOS-Base.repo CentOS-Base.repo.bakcat >/etc/yum.repos.d/etiantian.repo<<EOF[etiantian]name=Serverbaseurl=http://10.0.0.61enabled=1gpgcheck=0EOFyum clean allyum makecacheyum repolistcd
相關文章
相關標籤/搜索