zoukankan      html  css  js  c++  java
  • Mysql主从复制

    一、主从复制原理过程

    1、Slave 服务器上执行 start slave,开启主从复制开关。

    2、此时,Slave服务器的IO线程会通过在Master上授权的复制用户权限请求连接Master服务器,并请求从指定Binlog 日志文件的指定位置(日志文件名和位置就是在配置主从复制服务时执行 change master 命令时指定的)之后发送 Binlog 日志内容。

    3、Master 服务器接收到来自 Slave 服务器的 IO 线程的请求后,Master 服务器上负责复制的IO线程根据 Slave服务器的IO 线程请求的信息读取指定Binlog日志文件指定位置之后的Binlog日志信息,然后返回给Slave端的IO线程。返回的信息中除了 Binlog 日志内容外,还有本次返回日志内容后在 Master 服务器端的新的 Binlog 文件名称以及在 Binlog中的下一个指定更新位置。

    4、当 Slave 服务器的IO 线程获取到来自 Master 服务器上 10 线程发送日志内容及日志文件及位置点后,将Binlog日志内容依次写入到 Slave 端自身的 Relay Log(即中继日志)文件(MySQL-relay-bin.xxxxxx)的最末端,并将新的 Binlog 文件名和位置记录到master-info文件中,以便下一次读取Master端新Binlog日志时能够告诉 Master服务器需要从新 Binlog日志的哪个文件哪个位置开始请求新的Binlog 日志内容。。

    5、Slave 服务器端的SQL线程会实时的检测本地RelayLog中新增加的日志内容,然后及时的把Log文件中的内容解析成在 Master 端曾经执行的 SQL 语句的内容,并在自身 Slave服务器上按语句的顺序执行应用这些SQL语句,应用完毕后清理应用过的日志。

    6、经过了上面的过程,就可以确保在 Master 端和 Slave 端执行了同样的 SQL 语句。当复制状态正常的情况下,Master端和Slave端的数据是完全一样的,MySQL 的同步机制是有一些特殊的情况的,具体请参考官方的说明。

    二、主从环境搭建

    1、准备两台服务器:

    主服务器:192.168.1.70;从服务器:192.168.1.71

    分别安装mysql版本5.6

    2、修改主从配置文件

    主库:

    #vi /etc/my.cnf
    [mysqld]
    log-bin=mysql-bin   #[必须]启用二进制日志
    server-id=70        #[必须]服务器唯一ID,默认是1,一般取IP最后一段

    从库:

    #vi /etc/my.cnf
    [mysqld]
    log-bin=mysql-bin        # [不是必须]启用二进制日志
    server-id=71             # [必须]服务器唯一ID,默认是1,一般取IP最后一段
    read_only=1              # 设置只读
    relay-log=relay-log      # 启用中继日志

    3、重启主从库

    /etc/init.d/mysql restart

    4、在主库上建立帐户并授权slave

    mysql> GRANT REPLICATION SLAVE ON *.* to 'tesunet'@'%' identified by 'tesunet123' # tesunet:用户 tesunet123:密码

    5 、查询主库状态

    mysql> show master status;

    查看主库二进制文件是否开启:

    mysql> show global variables like '%log%';

     查看主库二进制日志列表:

    mysql> show master logs;

     查看主库的server id:

    mysql> show global variables like '%server%';

    7、配置从库Slave

    mysql> change master to master_host='192.168.106.70',master_user='tesunet',master_password='tesunet123',master_log_file='mysql-bin.000001',master_log_pos=321;
    # 注意:master_log_file与master_log_pos的数值是主库上查询master状态的数据

    8、启动从库复制

    mysql >start slave;

    9、检查从服务器复制功能状态

    mysql> show slave statusG

    参数解释:

    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event  # 这里显示了当前slave I/O线程的状态(slave连接到master的状态)。
                      Master_Host: 192.168.106.70                    # mysql主库的ip地址
                      Master_User: tesunet                           # 这个是master上面的一个用户。用来负责主从复制的用户,创建主从复制的时候建立的(具有reolication slave权限)。
                      Master_Port: 3306                              # master服务器的端口  一般是3306
                    Connect_Retry: 60                                # 连接中断后,重新尝试连接的时间间隔。默认值是60秒。
                  Master_Log_File: mysql-bin.000002                  # 当前I/O线程正在读取的主服务器二进制日志文件的名称。
              Read_Master_Log_Pos: 1925                              # 当前I/O线程正在读取的二进制日志的位置。
                   Relay_Log_File: relay-log.000005                  # 当前slave SQL线程正在读取并执行的relay log的文件名。
                    Relay_Log_Pos: 633                               # 当前slave SQL线程正在读取并执行的relay log文件中的位置;
            Relay_Master_Log_File: mysql-bin.000002                  # 当前slave SQL线程读取并执行的relay log的文件中多数近期事件,对应的主服务器二进制日志文件的名称。(说白点就是我SQL线程从relay日志中读取的正在执行的sql语句,对应主库的sql语句记录在主库的哪个binlog日志中)
                 Slave_IO_Running: Yes    # I/O线程是否被启动并成功地连接到主服务器上。
                Slave_SQL_Running: Yes    # 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:        # slave的SQL线程读取日志参数的的错误数量和错误消息。错误数量为0并且消息为空字符串表示没有错误。
                     Skip_Counter: 0      # SQL_SLAVE_SKIP_COUNTER的值,用于设置跳过sql执行步数。
              Exec_Master_Log_Pos: 1925   # slave SQL线程当前执行的事件,对应在master相应的二进制日志中的position。
                  Relay_Log_Space: 800    # 所有原有的中继日志结合起来的总大小。
                  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       # 这个值是时间戳的差值。是slave当前的时间戳和master记录该事件时的时间戳的差值。
    Master_SSL_Verify_Server_Cert: No
                    Last_IO_Errno: 0    
                    Last_IO_Error:         # 最后一次I/O线程的错误号和错误消息。
                   Last_SQL_Errno: 0
                   Last_SQL_Error:         # 最后一次SQL线程的错误号和错误消息。
      Replicate_Ignore_Server_Ids: 
                 Master_Server_Id: 70      # 主库服务器id号
                      Master_UUID: 04025823-b390-11eb-806c-000c29856060     # 主库服务器的UUID
                 Master_Info_File: /usr/local/mysql/data/master.info        # 从库中保存主库服务器相关的目录位置。
                        SQL_Delay: 0                                        # 一个非负整数,表示秒数,Slave滞后多少秒于master。
              SQL_Remaining_Delay: NULL         # 当 Slave_SQL_Running_State 等待,直到MASTER_DELAY秒后,Master执行的事件,此字段包含一个整数,表示有多少秒左右的延迟。在其他时候,这个字段是NULL。
          Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it   # SQL线程运行状态:线程已经处理了中继日志文件中的所有事件,现在正等待I/O线程将新事件写入中继日志。
               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.00 sec)

    注意:

    Slave_IO_Running: Yes 
    Slave_SQL_Running: Yes 
    
    以上两者都为Yes,表示主从环境搭建成功,那下边建表测试是否实现主从同步

    三、主从测试(root权限登录)

    现在在主库新建数据库:test_ms

    然后刷新备库:

    四、测试从库read_only

    1、从库创建普通用户,设置权限

    mysql> create user 'test'@'%' identified by '123456';                   # 创建普通用户,可以远程连接
    mysql> grant select  on *.* to test@'%'identified by '123456';          # 授权所有库,只能查询操作
    mysql> grant all privileges on *.* to test@'%'identified by '123456';   # 这是授予所有权限
    mysql> flush privileges;                      # 刷新权限
    mysql> select user,host from mysql.user;      # 查询用户

    2、用此普通账号登录数据库进行修改操作

  • 相关阅读:
    Android-TabLayout设置内容宽度以及下划线宽度
    RecyclerView 上拉加载下拉刷新
    Android自定义View实现仿QQ实现运动步数效果
    Android开发中常见的内存泄露案例以及解决方法总结
    Android封装TitleBar基本适用所有常规开发
    Activity设置背景透明之开发坑
    Android表情开发
    订制EditText光标
    Android:java.lang.OutOfMemoryError:GC overhead limit exceeded
    Android之自定义View学习(一)
  • 原文地址:https://www.cnblogs.com/zhangguosheng1121/p/14866415.html
Copyright © 2011-2022 走看看