Mysql主从构架实列

  1. 实列环境详情

  2. 环境配置与搭建

    实列环境详情

    主机(Master)
    操作系统: Windows7 64位
    Mysql版本:Mysql 5.6.17 32位
    IP地址:192.168.1.198
    
    从机(Slave)
    操作系统: Centos 6.8 (2.6.32-642.6.2.e16.i686)
    Mysql版本:Mysql 5.6.34 32位
    IP地址:192.168.1.252
    

    环境配置与搭建

    Windows 下直接安装 Wamp 集成了 5.6.17 版的Mysql 没什么可说的.
    Centos 下直接到官方下载:
    下载地址: https://dev.mysql.com/downloads/mysql/5.6.html#downloads
    由于官方没有 5.6.17 版,因此,选择了 5.6.34
    下载的时候一定要根据自己的系统版本以及位数选择正确的版本,否则会导致安装失败,这里我选择了

    MySQL-5.6.34-1.el6.i686.rpm-bundle.tar
    

    下载下来以后,解包:

    #tar -xvf MySQL-5.6.34-1.el6.i686.rpm-bundle.tar
    ...
    #ls
    MySQL-server-5.6.34-1.el6.i686.rpm  #Mysql主程序
    MySQL-client-5.6.34-1.el6.i686.rpm  #客户端连接程序
    MySQL-devel-5.6.34-1.el6.i686.rpm   #所需的库和包含文件
    ...
    

    出于需求,仅安装了以上三个rpm
    安装过程

    rpm -ivh  MySQL-server-5.6.34-1.el6.i686.rpm
    ...
    

    安装完成,启动:

    service mysql start
    

    启用成功,没有设置补始密码,可参考>>Mysql设置初始密码篇

主机(Master)配置

my.ini文件配置, 这里为了便于显示,去掉备注及其它不相关配置.

[mysqld]

log-bin=mysql-bin
server-id=198
binlog-ignore-db=mysql # 忽略mysql表
binlog-do-db=yii_cart  # 指定数据库
binlog_format=statement# statement row | mixed

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

statement | row | mixed 的区别,请参照>>MySQL之binlog_format详解

接下来重启Mysql,登录并进入Mysql客户端,创建一个允许在从机登录,并拥有File、REPLICATION、SLAVE权限的用户。

GRANT File,REPLICATION SLAVE ON *.* TO 'slave1'@'192.168.1.252' IDENTIFIED BY '123456';

创建完成,查看一下主机(Master)状态:

mysql> show master status\G;
*************************** 1. row ***************************
             File: mysql-bin.000001
         Position: 120
     Binlog_Do_DB: myshop
 Binlog_Ignore_DB: information_schema,mysql
Executed_Gtid_Set:
1 row in set (0.00 sec)

ERROR:
No query specified

如果查询不到数据,请尝试重启Mysql或者,检测my.ini文件配置是否正确。

获取主机(Slave)的备份 在主机(Master)配置完成后,需要获得主机(Master)的一个快照备份,这个备份将用于恢复到从机(Slave),而从机(Slave)则通过这个快照的时间点开始进行对主机(Master)的复制工作。
由于日志文件与日志定位文件,以就是上面的:

File: mysql-bin.000001
Position: 120

并不是一成不变的,因此需要获得一个精准的快照备份信息,因此进行备份请,需要对数据库进行全局锁操作,以防止数据在备份过程产生新数据而导致备份数据不全面问题.

mysql>FLUSH TABLES WITH READ LOCK;
mysql>SHOW PROCESSLIST;

由于FLUSH TABLES WITH READ LOCK命令执行后,将无法对表进行增、删、改,仅允许读,但FLUSH TABLES WITH READ LOCK会等待所有的读写完后再执行,因此某些慢查询或者 带事务锁的语句,可能会让FLUSH TABLES WITH READ LOCK延迟一段时间,但正是因为这样才保证了备份过程的精准性。

从机(Slave)配置

[mysqld]

server-id=252
replicate-do-db=myshop
replicate-ignore-db=mysql
replicate-do-table=prestashop #需要同步的数据库名,请保持master与salve表名一致.
#replicate-rewrite-db = yoon->hank #如果主表名与从表名不一致时,需要添加此项。
#replicate-do-table=prestashop.ps_employee #库名.表名 [同步指定的表.]
log-slave-updates
slave-skip-errors=all
slave-net-timeout=60

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

配置完成后重新启动Mysql,并登录从机(Slave)的客户端,执行以下语句:

mysql>STOP SLAVE;
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.1.198',
-> MASTER_USER='slave1',
-> MASTER_PASSWORD='123456',
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=120;
mysql>START SLAVE;

关于CHANGE MASTER TO的详细语法,可以参考>>CHANGE MASTER TO 语法详解
更改完成后,则可查看从机运行状态

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.198
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000007
          Read_Master_Log_Pos: 120
               Relay_Log_File: localhost-relay-bin.000014
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000007
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: myshop
          Replicate_Ignore_DB: mysql
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 120
              Relay_Log_Space: 460
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 198
                  Master_UUID: ad125682-4578-11e6-97de-00ffb04c738d
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
1 row in set (0.02 sec)

ERROR:
No query specified

如果一切正常,可以看到

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

如果状态为No,可以通过可以尝试以启动slave

mysql>start slave; #启动
mysql>stop slave;  #停止

此时可以尝试,在主机(Master)下新增或者修改数据,然后查看从机.