本文主要介紹在單機單數據庫多實例的環境下,實現MySQL主從複製功能mysql
基本流程:linux
1.MySQL主從複製介紹sql
2.主從複製數據庫實戰環境準備
數據庫
3.在主庫Master上執行操做配置服務器
4.在MySQL從庫上執行的操做過程異步
5.啓動從庫同步開關,測試主動複製配置狀況tcp
6.MySQL主從複製配置步驟總結ide
流程一:MySQL主從複製介紹
工具
Mysql數據庫的主從複製方案,與使用scp/rsync等命令進行的文件級別複製相似,都是數據的遠程傳輸,只不過Mysql的主從複製是其自帶的功能,無需藉助第三方工具,並且,Mysql的主從複製並非數據庫磁盤上的文件直接拷貝,而是經過邏輯的binlog日誌複製到要同步的服務器本地,而後由本地的線程讀取日誌裏面的SQL語句,從新應用到Mysql數據庫中。測試
Mysql的主從複製是一個異步的過程(雖然通常狀況下感受是實時的),數據將從一個Mysql數據庫(咱們稱之爲Master)複製到另外一個Mysql數據庫(咱們稱之爲Slave),在Master和Slave之間實現整個主從複製的過程是由三個線程參與完成的。其中有兩個線程(SQL線程和I/O線程)在Slave端,另一個線程(I/O線程)在Master端。要實現Mysql的主從複製,首先必須打開Master端的binlog記錄功能,不然就沒法實現,要打開MySQL的binlog記錄功能,可經過在MySQL的配置文件my.cnf中mysqld模塊([mysqld]標識後的參數部分)增長「log-bin」參數選項來實現。由於整個複製過程實際上就是Slave端從Master端獲取binlog日誌,而後再在Slave上以相同順序執行獲取的binlog日誌中所記錄的各類SQL操做。
MySQL主從複製原理的重點總結:
#主從複製是異步的邏輯的SQL語句級的複製。
#複製時,主庫有一個I/O線程,從庫有兩個線程,即I/O和SQL線程。
#實現主從複製的必要條件是主庫要開啓記錄binlog功能。
#做爲複製的全部MySQL節點的server_id都不能相同。
#binlog文件只記錄對數據庫有更改的SQL語句(來自主數據庫內容的變動),不記錄任何查詢(如select,show)語句。
流程二:主從複製數據庫實戰環境準備
1)主從複製實踐準備
本文以單機數據庫多實例的環境爲例講解。配置MySQL多實例可參考http://www.javashuo.com/article/p-otnxrulm-ba.html
實例端口信息以下:
[root@localhost 3308]# netstat -tnlp | grep 330
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 8675/mysqld
tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 8271/mysqld
tcp 0 0 0.0.0.0:3308 0.0.0.0:* LISTEN 9256/mysqld
2)定義主從複製的服務器角色
主庫(mysql master): 【ip爲192.168.1.72 port 爲 3306】
從庫(mysql slave) : 【ip爲192.168.1.72 port 爲 3307】
從庫(mysql slave) : 【ip爲192.168.1.72 port 爲 3308】
流程三:在主庫Master上執行操做配置
1)設置server_id值並開啓binlog功能參數
[root@localhost 3306]# egrep "server_id|log_bin" /data/3306/my.cnf
log_bin=/data/3306/mysql-bin
server_id=3306 #用於同步的每臺機器或實例server_id都不能相同
上面這個兩個參數必定在放在mysqld模塊下,不然會出錯。
2)重啓主庫MySQL服務,命令以下:
[root@localhost 3306]# /data/3306/mysqld restart
mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'root'@'localhost' (using password: NO)'
這裏報錯說要密碼,修改下啓動腳本文件
[root@localhost 3306]# grep Stop= /data/3306/mysqld
Stop='mysqladmin -uroot -pywxi123 -S /data/3306/mysql.sock shutdown'
[root@localhost 3306]# /data/3306/mysqld restart
MySQL already Stoped [ OK ]
MySQL 3306 Starting [ OK ]
3)登陸數據庫,檢查參數的更改狀況,以下:
[root@localhost 3306]# mysql -uroot -pywxi123 -S /data/3306/mysql.sock
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.32-log MySQL Community Server (GPL)
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 3306 |
+---------------+-------+
1 row in set (0.01 sec)
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)
#這樣binlog功能就正常開啓了。
4)在主庫上創建用於主從複製的帳號
mysql -uroot -pywxi123 -S /data/3306/mysql.sock
grant replication slave on *.* to 'rep'@'192.168.1.%' identified by 'ywxi123'; #rep爲同步帳號,*.*爲全部庫全部表,192.168.1.%爲受權的主機網段。使用%表示容許整個網段
flush privileges; #刷新權限,是受權的權限生效
檢查主庫建立的rep複製帳號命令及結果以下:
mysql> select user,host from mysql.user where user='rep';
+------+-------------+
| user | host |
+------+-------------+
| rep | 192.168.1.% |
+------+-------------+
1 row in set (0.00 sec)
mysql> show grants for rep@'192.168.1.%';
+--------------------------------------------------------------------------------------------------------------------------+
| Grants for rep@192.168.1.% |
+--------------------------------------------------------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'rep'@'192.168.1.%' IDENTIFIED BY PASSWORD '*1CDCFBE8F2B7FACC6BF289A82F072AB9A2D90844' |
+--------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
5)實現對主數據庫鎖表只讀
mysql> flush table with read lock;
Query OK, 0 rows affected (0.00 sec)
鎖表後查看主庫狀態:
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000006 | 334 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
#鎖表這個操做就是爲了更好的導出和備份數據
[root@localhost 3307]# mkdir -p /server/backup
[root@localhost 3307]# mysqldump -uroot -p'ywxi123' -S /data/3306/mysql.sock --events -A -B |gzip > /server/backup/mysql_bak.$(date +%F).sql.gz
#導出數據完畢後,解鎖主庫,恢復可寫,命令以下:
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
流程四:在MySQL從庫上執行的操做過程
1)設置server_id值並關閉binlog功能參數
若是從庫不作級聯複製,而且不作複製用,就不要開啓binlog,開啓了反而會增長從庫磁盤I/O等的壓力。
[root@localhost 3306]# egrep "server_id|log_bin" /data/3307/my.cnf
#log_bin=/data/3307/mysql-bin
server_id=3307 #ID是惟一的
2)重啓3307的從數據庫
[root@localhost 3307]# /data/3307/mysqld stop
[root@localhost 3307]# /data/3307/mysqld start
3)登陸數據庫檢查參數的改變狀況
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | OFF |
+---------------+-------+
1 row in set (0.00 sec)
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 3307 |
+---------------+-------+
1 row in set (0.00 sec)
4)把從主庫mysqldump導出的數據恢復到從庫
操做命令以下:
cd /server/backup/
mysqldump -uroot -p'ywxi123' -S /data/3307/mysql.sock --events -A -B |gzip > /server/backup/mysql_bak.$(date +%F).sql.gz
5)在3307從庫上配置複製參數
[root@localhost backup]# mysql -uroot -pywxi123 -S /data/3306/mysql.sock -e "show master status"
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000006 | 334 | | |
+------------------+----------+--------------+------------------+
[root@localhost backup]# mysql -uroot -pywxi123 -S /data/3307/mysql.sock <<EOF
CHANGE MASTER TO
MASTER_HOST='192.168.1.72',
MASTER_PORT=3306,
MASTER_USER='rep',
MASTER_PASSWORD='ywxi123',
MASTER_LOG_FILE='mysql-bin.000006',
MASTER_LOG_POS=334;
EOF
#這個步驟的參數必定不能錯,不然,數據庫複製配置會失敗
流程五:啓動從庫同步開關,測試主動複製配置狀況
1)啓動從庫主從複製開關,並查看複製狀態
[root@localhost data]# mysql -uroot -pywxi123 -S /data/3307/mysql.sock -e "start slave;"
[root@localhost data]# mysql -uroot -pywxi123 -S /data/3307/mysql.sock -e "show slave status\G;"|egrep "IO_Running|SQL_Running|_Behind_Master"
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
#這是最關鍵的三個狀態參數,必定要跟上面一致,否則測試就會出錯
2)測試主從複製結果,再加一臺3308從庫
在主庫上寫入數據,而後觀察從庫的數據情況。
[root@localhost data]# mysql -uroot -p'ywxi123' -S /data/3306/mysql.sock -e "create database ywxi;"
[root@localhost data]# mysql -uroot -p'ywxi123' -S /data/3307/mysql.sock -e "show databases like 'ywxi'"
+-----------------+
| Database (ywxi) |
+-----------------+
| ywxi |
+-----------------+
[root@localhost data]# mysql -uroot -pywxi123 -S /data/3306/mysql.sock -e "drop database ywxi;"
[root@localhost data]# mysql -uroot -pywxi123 -S /data/3307/mysql.sock -e "show databases like 'ywxi';"
[root@localhost data]#
#根據測試能夠判斷,主從庫是同步的。
快速加一臺從庫3308命令集以下:
sed /log_bin/'s/.*/#&1/g' /data/3308/my.cnf -i
mysql -uroot -S /data/3308/mysql.sock -e "show variables like 'log_bin';"
mysql -uroot -S /data/3308/mysql.sock -e "show variables like 'server_id';"
cd /server/backup/
mysqldump -uroot -S /data/3308/mysql.sock --events -A -B |gzip > /server/backup/mysql_bak.$(date +%F).sql.gz
mysql -uroot -S /data/3308/mysql.sock <<EOF
> CHANGE MASTER TO
> MASTER_HOST='192.168.1.72',
> MASTER_PORT=3306,
> MASTER_USER='rep',
> MASTER_PASSWORD='ywxi123',
> MASTER_LOG_FILE='mysql-bin.000006',
> MASTER_LOG_POS=334;
> EOF
mysql -uroot -S /data/3308/mysql.sock -e "start slave;"
mysql -uroot -S /data/3308/mysql.sock -e "show slave status\G;"|egrep "IO_Running|SQL_Running|_Behind_Master"
流程六:MySQL主從複製配置步驟總結
MySQL主從複製配置完整步驟以下:
1)準備兩臺數據庫或者單臺多實例環境,肯定能正常啓動和登陸便可
2)配置my.cnf文件:主庫配置log_bin和server_id參數;從庫配置server_id,這個值不能與主庫同樣是惟一的,通常不建議開啓log-bin功能。配置參數後必定要重啓服務生效
3)登陸主庫,增長從庫鏈接主庫同步的帳戶,例如:rep,並受權replication slave同步的權限
4)登陸主庫,整庫鎖表flush table with read lock (窗口關閉後即失效,超時參數設置的時間到了,鎖表也失效),而後show master status 查看binlog的位置狀態
5)新開窗口,在linux命令行備份導出原有的數據庫數據,並拷貝到從庫所在的服務器目錄。若是數據庫數據量很大,而且容許停機,能夠停機打包,而不用mysqldump
6)導出主數據後,執行unlock tables解鎖主庫
7)把主庫導出的數據恢復到從庫
8)根據主庫的show master status 查看到的binlog的位置狀態,在從庫執行change master to.....語句。
9)從庫開啓複製開關,即執行start slave;(要在change語句以後執行,否則插入不了語句)
10)從庫show slave status\G,檢查同步狀態,並在主庫進行更新測試。