MySQL主從複製實踐與部署

本文主要介紹在單機單數據庫多實例的環境下,實現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,檢查同步狀態,並在主庫進行更新測試。

相關文章
相關標籤/搜索