Mysql主從復制實踐手冊

jopen 11年前發布 | 30K 次閱讀 MySQL 數據庫服務器

1 Mysql cluster版本主從服務器搭建實踐


主從的作用:Mysql的主從服務器可以滿足同步數據庫,同步表,同步表內容,也可以指定僅同步某個數據庫或某個表,還可以排除不同步某個數據庫某個表。

同步原理:主從數據庫同步主要是通過二進制日志來實現同步的。

mysql官網下載最新版本:dev.mysql.com

本文環境:

mysql服務器:10.1.68.110

安裝版本:mysql-cluster-gpl-7.0.35-linux-x86_64-glibc23.tar.gz

mysql服務器:10.1.68.101

安裝版本:mysql-cluster-gpl-7.0.35-linux-x86_64-glibc23.tar.gz

注意:最好是主從服務器采用相同版本,若不行,建議從服務器版本高于主服務器版本。

另外mysql-5.6.10版本的主從配置與mysql-cluster版本不同,主要是my.cnf配置文件不同,start slave命令也不同,要注意。

本文章兩種版本的配置都有記錄。

1.1 配置主mysql服務器


1.       安裝主mysql步驟(參考tar包中的INSTALL-BINARY文件即可,很簡單)

shell> groupadd mysql

shell> useradd -r -g mysql mysql

shell> tar zxf  mysql-cluster-gpl-7.2.9-linux2.6-x86_64.tar.gz

shell> mv mysql-cluster-gpl-7.2.9-linux2.6-x86_64 /opt/mysql-master

shell> cd /opt/mysql-master

shell> chown -R mysql.mysql *

shell> scripts/mysql_install_db --user=mysql

shell> chown -R root .

shell> chown -R mysql data

# Next command is optional

shell> cp support-files/my-medium.cnf /etc/my.cnf

shell> bin/mysqld_safe &

若啟動失敗,再次嘗試一下執行scripts/mysql_install_db --user=mysql命令后在啟動。

# Next command is optional,成功啟動了mysqld之后才會生成下面的腳本文件

shell> cp support-files/mysql.server /etc/init.d/mysql.server

</td> </tr> </tbody> </table>

2.       配置主的my.cnf文件(基本上不需要任何配置,默認都有了)

# vi /etc/my.cnf

關鍵性的配置

log-bin=mysql-bin

server-id   = 1

binlog-do-db=icinga

binlog-do-db=DB2     如果備份多個數據庫,重復設置這個選項即可

binlog-do-db=DB3  //需要同步的數據庫,如果沒有本行,即表示同步所有的數據庫

binlog-ignore-db=mysql  //被忽略的數據庫

</td> </tr> </tbody> </table>

保存退出

3.       唯一要做的就是創建允許從服務器訪問的帳號backup

mysql> grant replication slave on *.* to 'backup'@'10.1.68.102' identified by'1234qwer';

Query OK, 0 rows affected (0.00 sec)

若有多臺從服務器,就將ip修改一下執行多次就可以了。

4.       重啟主機的mysql服務。

1.2 配置從mysql服務器


1.         安裝主mysql步驟(參考tar包中的INSTALL-BINARY文件即可,很簡單)

2.         配置從機的/etc/my.cnf文件

  • 關鍵性的配置

    log-bin=mysql-bin

    server-id       = 2

    master-host     =   10.1.68.110

    master-user     =   backup

    master-password =   1234qwer

    master-port     =  3306

    replicate-do-db=icinga

    replicate-do-db=DB2

    binlog-do-db=DB3  //需要同步的數據庫,如果沒有本行,即表示同步所有的數據庫

    binlog-ignore-db=mysql  //被忽略的數據庫

    </td> </tr> </tbody> </table>

    保存退出

    3.         重啟從機的mysql服務,基本的從機配置完成。

    4.         若從服務器的偏移量與主機不同,手動修改偏移量

    1)先查看主機的狀態信息

    mysql> show master status;

    2)登錄從機按照主的Position修改從機的Position

    mysql> slave stop;

    mysql> change master to master_host='10.1.68.110',master_user='backup',master_password='1234qwer',master_log_file='mysql-bin.000011',master_log_pos=62291;

    mysql> slave start;

    1.3  驗證同步


    1.         icinga數據庫中創建一個表并插入數據

    mysql> create table abc(id int,name char(10));

    Query OK, 0 rows affected (0.40 sec)

    mysql> insert into abc values(1,'shenxiaoran');

    Query OK, 1 row affected, 1 warning (0.01 sec)

    mysql> select * from abc;

    </td> </tr> </tbody> </table>

    2.         查看從mysql服務器,表及內容是否都同步過來

    mysql> show tables;

    再查看表內容,數據也都同步了,如下圖

    至此,mysql數據庫主從同步完成。

    1.4 常用主從同步的命令


    1.4.1 主服務器常用命令

    1.       查看主機狀態和Position信息,用來讓slave機與master保持一致。

    mysql> show master status;

    1.4.2 從服務器常用命令

    mysql> show slave status;

    mysql> slave stop;

    mysql> slave start;

    mysql> show processlist;

    2 Mysql-5.6.10版本主從數據庫的搭建


    部署環境:

    OS: CentOS release 6.3 (Final)

    mysql-master服務器:192.168.123.75

    安裝版本:mysql-5.6.10.tar.gz 源碼包

    mysql-slave服務器:192.168.123.105

    安裝版本:mysql-5.6.10.tar.gz 源碼包

    2.1 分別安裝主從mysql-mastermysql-slave服務器


    mysql5.6.10.tar.gz是截至2013410mysql官網的最新的源碼包版本,該版本的安裝方法與傳統的mysql安裝方法不同,安裝前必須手動安裝cmake

    cmake官網下載:http://cmake.org/cmake/resources/software.html

    ./bootstrap

    make

    make install

    接下來,安裝mysql,我這里寫了一個自動安裝的shell腳本

    2.2 配置主mysql-master服務器


    Mysql-5.6.10版本的my.cnf文件默認什么參數都沒有,需要自己配

    # vi /etc/my.cnf

  • 關鍵性的配置

    log-bin = mysql-bin

    # These are commonly set, remove the # and set as required.

    basedir = /usr/local/mysql

    datadir = /usr/local/mysql/data

    port = 3306

    server_id = 106 // 注意新版本用的是下劃線

    socket = /tmp/mysql.sock

    bind-address = 0.0.0.0 //這里綁定監聽0.0.0.0:3306,默認是:::1

    binlog-do-db = cacti  //如果備份多個數據庫,重復添加即可,若沒有表示備份所有數據庫

    binlog-do-db = db2

    binlog-ignore-db = mysql  //被忽略的數據庫,不做復制

    </td> </tr> </tbody> </table>

    保存退出

    5.       唯一要做的就是創建允許從服務器訪問的帳號mysync

    mysql> grant replication slave on *.* to 'mysync'@'192.168.123.105' identified by '123456';

    Query OK, 0 rows affected (0.00 sec)

    mysql> flush privileges;

    Query OK, 0 rows affected (0.00 sec)

    若有多臺從服務器,就將ip修改一下執行多次就可以了。

    6.       重啟主機的mysql服務。

    從機測試連接到主mysql

    # bin/mysql -h 192.168.123.75 -u mysync -p123456

    mysql>

    測試成功連接。

    2.3 配置從mysql-slave服務器


    # vi /etc/my.cnf

    log_bin = mysql-bin

    server_id = 107

    注意,下面的參數不能再使用了,否則導致mysql無法啟動

    master-host = 10.1.68.110

    master-user = backup

    master-password = 1234qwer

    master-port = 3306

    </td> </tr> </tbody> </table>

    1.       登錄主服務器的mysql,查詢master的狀態

    mysql> show master status;

    +------------------+----------+--------------+------------------+-------------------+

    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

    +------------------+----------+--------------+------------------+-------------------+

    | mysql-bin.000002 |      120 | cacti        | mysql            |                   |

    +------------------+----------+--------------+------------------+-------------------+

    1 row in set (0.00 sec)

    注:執行完此步驟后不要再操作主服務器MYSQL,防止主服務器狀態值變化

    2.       登錄從mysql服務器,配置binary log文件和Position(其實就是主的binary log文件的大小)與主一致。

    mysql> change master to master_host='192.168.123.75',master_user='mysync',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=120;

    Query OK, 0 rows affected, 2 warnings (0.02 sec)

    mysql> start slave;

    Query OK, 0 rows affected (0.01 sec)

    3.       查看從mysql服務器的狀態

    mysql> show slave status;

    重點是查看 Slave_IO_Running | Slave_SQL_Running

    如果出現的結果是Yes              | Yes

    說明mysql主從配置成功完成了。

    2.4 測試主從服務器同步


    1.  將備份后的數據庫導入到主mysql服務器中,查看從mysql服務器是否會同步。

    # bin/mysql < /root/cacti_sql_bak

    2.  查看從mysql服務器的數據庫是否有更新

    mysql> show databases;

    +--------------------+

    | Database           |

    +--------------------+

    | information_schema |

    | cacti              |

    | mysql              |

    | performance_schema |

    | test               |

    +--------------------+

    5 rows in set (0.01 sec)

    從上面看到主mysql服務器的數據庫還未全部導入完成,從mysql服務器已經開始同步了。

    3  FAQ


    3.1 show slave status命令的結果查看正常,卻依然無法看到同步的數據庫,原因在哪?


    mysql> show slave status; 執行后部分結果如下

    Slave_IO_StateWaiting for master to send event

    Slave_IO_RunningYes

    Slave_SQL_RunningYes

    查看數據庫卻依然無法同步,原因在哪里?

    解決辦法:

    1) 嘗試重啟master數據庫;

    2) 在重啟slave數據庫之前,必須先刪除data目錄下的master.info文件,因為master.info記錄了上次要連接主庫的信息,如果不刪除,即使my.cnf里進行了修改,手動修改Position(偏移量)也還是同步不了,因為讀取的還是偏移量出錯時的master.info文件信息。

    # rm -f data/master.info

    # support-files/mysql.server start

    Starting MySQL.           [  OK  ]

    再次查看slave,同步終于成功了。

    mysql> show processlist;

    id|User          |Host|db      |Command  |Time      |state

    1| system user |       | NULL   | Connect |1196 | Waiting for master to send event

    2 | system user |    | NULL   | Connect |-55692 | Slave has read all relay log; waiting for the slave I/O thread to

    3 | root   |localhost|icinga| Query|  0 |NULL | show processlist

    3.2 show slave status命令的結果出現下面的異常情況,如何解決?


    執行mysql> show slave status;命令,看到下面的顯示結果

    Slave_IO_Running:Connecting

    Slave_SQL_Running:Yes 

    看到上面的問題,說明是從服務器無法正常連接到主服務器導致。原因一般和下面幾種情況有關:

    l  Iptables防護墻阻止了3306端口

    l  mysql服務器的grant授權命令有誤

    l  mysql服務器的監聽端口不是0.0.0.0:3306,導致別的服務器無法連接到主mysql

    解決辦法:

    首先,關閉了iptables

    然后,檢查主mysql服務器的grant授權命令,正確無誤,這一點排除。

    其次,查看主mysql的監聽端口,默認是:::3306,不知道是否因為這個問題導致

    修改主服務器的my.cnf文件,添加下面語句

    bind-address = 0.0.0.0

    重啟mysq.server服務

    再次netstat –an|more 查看3306端口,出現了0.0.0.0:3306,說明修改成功。

    登錄到從mysql服務器上,遠程連接

    # bin/mysql -h 192.168.123.75 -umysync -p123456

    Your MySQL connection id is 8

    Server version: 5.6.10-log Source distribution

    mysql>

    連接成功。

    最后重新執行主從操作:

    mysql服務器:mysql> show master status;

    mysql服務器:mysql> stop slave;

    mysql服務器:mysql> change master to……;

    mysql服務器:mysql> start slave;

    mysql服務器:mysql> show slave status;

    Slave_IO_Running:Yes

    Slave_SQL_Running:Yes 

    再次測試主從同步,成功。

     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
  • sesese色