mysql怎么实现主从复制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql怎么实现主从复制相关的知识,希望对你有一定的参考价值。

参考技术A

mysql主从复制的配置

1. 准备工作

有两台MySQL数据库服务器Master和slave,Master为主服务器,slave为从服务器。

初始状态时,Master和slave中的数据信息相同,当Master中的数据发生变化时,slave也跟着发生相应的变化,使得master和slave的数据信息同步,达到备份的目的。

要点:

负责在主、从服务器传输各种修改动作的媒介是主服务器的二进制变更日志,这个日志记载着需要传输给从服务器的各种修改动作。

因此,主服务器必须激活二进制日志功能。从服务器必须具备足以让它连接主服务器并请求主服务器把二进制变更日志传输给它的权限。

环境:

Master和slave的MySQL数据库版本同为5.6.28

操作系统:CentOS release 6.5 (Final)

IP地址:master:120.77.153.204 slave:120.77.148.74

2. master的配置

(1) 创建复制帐号

mysql> CREATE USER'masterslave'@'120.77.148.74' IDENTIFIED BY '123456';Query OK, 0 rows affected (0.00 sec)

(2) 主从复制授权

GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO 'masterslave'@'120.77.148.74' IDENTIFIED BY '123456';

(3) 拷贝数据

(假如是你完全新安装mysql主从服务器,这一步就不需要。因为新安装的master和slave有相同的数据)

关停Master服务器,将Master中的数据拷贝到B服务器中,使得Master和slave中的数据同步,并且确保在全部设置操作结束前,

禁止在Master和slave服务器中进行写操作,使得两数据库中的数据一定要相同!

3. 修改配置文件

对master进行配置,包括打开二进制日志,指定唯一的servr ID

[root@myserver ~]# find / -type f -name my.cnf/usr/my.cnf[root@myserver ~]# vim /usr/my.cnfserver_id=1log-bin=mysql-bin

4. 重启master,运行SHOW MASTER STATUS,输出如下:

[root@myserver ~]# service mysql stopShutting down MySQL.... SUCCESS! [root@myserver ~]# service mysql startStarting MySQL. SUCCESS! [root@myserver ~]# mysql -uroot -pEnter password: Welcome to the MySQL monitor. Commands end with ; or g.Your MySQL connection id is 3Server version: 5.6.28-log MySQL Community Server (GPL)Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.mysql> mysql> show master status; mysql> show master status;+------------------+----------+--------------+------------------+-------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+------------------+-------------------+| mysql-bin.000001 | 120 | | | |+------------------+----------+--------------+------------------+-------------------+1 row in set (0.00 sec)mysql>

配置slave

1. 修改my.cnf文件

[root@wenhaijin mysql-5.6.28]# find / -type f -name my.cnf/usr/my.cnf[root@wenhaijin mysql-5.6.28]# vim /usr/my.cnf log_bin = mysql-binserver_id = 2relay_log = mysql-relay-binlog_slave_updates = 1read_only = 1

server_id是必须的,而且唯一。

slave没有必要开启二进制日志,但是在一些情况下,必须设置。

例如,如果slave为其他slave的master,必须设置bin_log。

在这里,我们开启了二进制日志,而且显示了命名(默认名称为hostname,但是,如果hostname改变则会出现问题)。

relay_log配置中继日志,log_slave_updates表示slave将复制事件写进自己的二进制日志(后面会看到它的用处)。

有些人开启了slave的二进制日志,却没有设置log_slave_updates,然后查看slave的数据是否改变,这是一种错误的配置。

所以,尽量使用read_only,它防止改变数据(除了特殊的线程)。但是,read_only并是很实用,特别是那些需要在slave上创建表的应用。

2. 启动slave

接下来就是让slave连接master,并开始重做master二进制日志中的事件。

你不应该用配置文件进行该操作,而应该使用CHANGE MASTER TO语句,该语句可以完全取代对配置文件的修改,而且它可以为slave指定不同的master,而不需要停止服务器。如下:

mysql> CHANGE MASTER TO MASTER_HOST='120.77.153.204', -> MASTER_USER='masterslave', -> MASTER_PASSWORD='123456', -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=0;Query OK, 0 rows affected, 2 warnings (0.01 sec)

MASTER_LOG_POS的值为0,因为它是日志的开始位置。

你可以用SHOW SLAVE STATUS语句查看slave的设置是否正确:

mysql> SHOW SLAVE STATUSG*************************** 1. row *************************** Slave_IO_State: Master_Host: 120.77.153.204 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 4 Relay_Log_File: mysql-relay-bin.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: No Slave_SQL_Running: No Replicate_Do_DB: Replicate_Ignore_DB: 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: 4 Relay_Log_Space: 120 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: NULLMaster_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: 0 Master_UUID: Master_Info_File: /var/lib/mysql/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: 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: 01 row in set (0.00 sec)

Slave_IO_State, Slave_IO_Running, 和Slave_SQL_Running是No

表明slave还没有开始复制过程。日志的位置为4而不是0,这是因为0只是日志文件的开始位置,并不是日志位置。

实际上,MySQL知道的第一个事件的位置是4。

为了开始复制,你可以运行START SLAVE;

mysql> START SLAVE; mysql> SHOW SLAVE STATUSG;*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 120.77.153.204 Master_User: masterslave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 1762 Relay_Log_File: mysql-relay-bin.000001 Relay_Log_Pos: 1925 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: 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: 1762 Relay_Log_Space: 2098 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: 0Master_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: 1 Master_UUID: 4df9a165-03fd-11e7-b234-00163e0243e8 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: 01 row in set (0.00 sec)

在这里主要是看:

Slave_IO_Running=Yes

Slave_SQL_Running=Yes

slave的I/O和SQL线程都已经开始运行,而且Seconds_Behind_Master不再是NULL。

日志的位置增加了,意味着一些事件被获取并执行了。

如果你在master上进行修改,你可以在slave上看到各种日志文件的位置的变化,同样,你也可以看到数据库中数据的变化。

你可通过show processlistG;查看master和slave上线程的状态。在master上,你可以看到slave的I/O线程创建的连接。

3. 授权masterslave用户远程登入,然后使用navicat远程连接

在master的test数据库中创建user表。

然后在slave中进行刷新发现user表已经同步过来。

刷新前:

刷新后:

在master的test库中user表添加一条数据。

然后打开slave中test库的user表,发现该数据也被同步过来了。

说明已经成功实现mysql的主从复制。

mysql主从复制概述以及配置mysql5.7.10实现简单主从复制

  1. 什么是主从复制:

    通过将Mysql的某一台主机的 数据复制到其它主机,复制过程中一个服务器充当主服务器(master),而一个或多个其它服务器充当从服务器(slave)。进行复制时,所有对数据表的写操作必须在主服务器上进行。否则,因为主服务器不会同步从服务器的数据,会导致主从数据不一致的问题。mysql的主从复制功能是构建高性能大型应用服务器的基础


  2. 主从复制的作用:

    1.辅助实现数据的备份

    2.实现数据服务的高可用和异地容灾

    3.实现多个服务器分摊负载


  3. 主从复制的实现原理:

    实现整个复制过程主要由三个线程来完成,其中slave端两个线程(Sql线程和IO线程) ,master端一个线程(IO线程)

    1.master将数据库改变的记录到二进制日志(binary log)中

    2.slave的IO线程向master请求二进制日志中的事件

    3.master服务器的IO线程将slave服务器的IO线程请求的数据相应给对方

    4.slave的IO线程接收到数据并依次写入到中继日志里面

    5.slave的SQL线程检测到中继日志发生改变,解析出master发生改变执行的sql语句并在自身执行一遍


  4. 主从复制类别:

    1.基于语句的复制:每一条会修改数据的语句都会记录到master的二进制中。slave在复制的时候SQL线程会解析成和原来master端执行过的相同的语句来再次执行

     优点:不需要记录每一行数据的变化,减少二进制日志量,节约了IO成本,提高了性能。

     缺点:由于他是记录的执行语句,所以,为了让这些语句在slave端也能正确执行,那么他还必须记录每条语句在执行的时候的一些相关信息,也就是上下文信息,以保证所有语句在slave端杯执行的时候能够得到和在master端执行时候相同的结果。当master的某个SQL语句中执行了一些特殊函数,再复制到slave来执行可能会导致值不一样。例如:master表中的某个字段了插入一条select now();的执行结果,当这条语句再复制到slave上去执行的时候,结果数据就无法被正确复制。


    2.基于行的复制:二进制日志中会记录成每一行数据被修改的形式,然后在slave端再对相同的数据进行修改。

      优点:二进制日志中可以不记录执行的sql语句的上下文相关的信息,仅仅只需要记录那一条记录被修改了,修改成什么样了。所以RowLevel的日志内容会非常清楚的记录下每一行数据修改的细节,非常容易理解。而且不会出现某些特定情况下的存储过程,或函数,以及触发器的调用和触发无法被正确复制的问题

      缺点:所有的执行的语句当记录到BinaryLog中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容,比如有这样一条update语句:update user_info set sal=15000 where user_id >= 3,执行之后,日志中记录的不是这条update语句所对应的事件(MySQL以事件的形式来记录BinaryLog日志),而是这条语句所更新的每一条记录的变化情况,这样就记录成很多条记录被更新的很多个事件,增加了IO负担。


    3.混合方式:基于语句+基于行的混合方式 中和了前两种方式的优缺点,是一种相对比较理想的复制方式

    mysql的这个复制级别也就是通过配置二进制日志的记录格式来决定的。


  5. mysql主从复制配置:

    环境说明:

     master和slave数据初始都是没有数据的

     master:

      操作系统:centos6.7

      mysql版本:mysql5.7.10

      主机地址:192.168.1.223

     slave:

      操作系统:centos6.7

        mysql版本:mysql5.7.10

        主机地址:192.168.1.222


     1.master端配置工作

       启动二进制日志
       选择一个唯一的server-id

          vi /etc/my.cnf
           log-bin=/mydata/binlogs/master-bin  
           binlog_format=mixed
            server-id = 2

       重启mysql服务    

          service mysqld restart

       登录mysql创建具有复制权限的用户

         mysql -uroot -p ‘password’
         grant replication slave on *.* to [email protected]‘192.168.1.222‘ identified by ‘password‘; 
         flush privileges;

      2.slave端配置工作

        修改server-id
        启用中继日志

            vi /etc/my.cnf
           server-id = 11
            relay-log = /mydata/relaylogs/relay-bin
             log-bin=OFF

        重启mysql服务 

         service mysqld restart

        登录mysql连接主服务器

         mysql -uroot -p ‘password’
         change master to master_host=‘192.168.1.223‘,master_user=‘repuser‘,master_password=‘password‘

        查看slave工作状态     

         show slave status \G;

 *************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: 192.168.1.223
                  Master_User: repuser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File:
          Read_Master_Log_Pos: 4
               Relay_Log_File: relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File:
             Slave_IO_Running: No            #现在io线程处于关闭状态
            Slave_SQL_Running: No           #sql线程也处于关闭状态
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           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: 0
              Relay_Log_Space: 154
              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: NULL
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: 0
                  Master_UUID:
             Master_Info_File: /mydata/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State:
           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
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:


      启动复制:

        start slave;


 6.验证主从配置结果:

    登录主服务器创建一个数据库

       mysql -uroot -p‘password‘
       create database two_db;
       show databases;

    技术分享


  登录slave服务器查看是否已同步

    技术分享

至此mysql简单主从复制基本完成



本文出自 “左手右手” 博客,请务必保留此出处http://mofeihu.blog.51cto.com/1825994/1749732

以上是关于mysql怎么实现主从复制的主要内容,如果未能解决你的问题,请参考以下文章

mysql实现主从复制/主从同步

MySQL中主从复制不同步?

mysql实现主从复制

mysql实现主从复制

MyCat教程mysql主从复制实现

Mysql 主从复制 当主库挂掉,从库还有复制延迟时,应该怎么样恢复完整