zoukankan      html  css  js  c++  java
  • Linux搭建MySQL主从

    实现目标
    搭建两台MySQL服务器(一主一从),一台作为主服务器,一台作为从服务器,主服务器进行写操作,从服务器进行读操作。

    工作流程概述

    • 主服务器:
      • 开启二进制日志
      • 配置唯一的server-id
      • 获得master二进制日志文件名及位置
      • 创建一个用于slave和master通信的用户账号
    • 从服务器:
      • 配置唯一的server-id
      • 使用master分配的用户账号读取master二进制日志
      • 启用slave服务

    准备工作

    • 主从数据库版本最好一样
    • 主从数据库内数据保持一致
    • 主数据库:192.168.244.201 : 3306
    • 从数据库:192.168.244.202 : 3306

    开始配置

    1. 配置 Master 主服务器
    • 找到主数据库的配置文件my.cnf(Windows中是my.ini),我的在/etc/my.cnf
      在[mysqld]部分插入如下两行:
    [mysqld]
    log-bin=mysql-bin #开启二进制日志
    server-id=201 #设置server-id,唯一值,标识主机
    
    • 重启mysql服务
      systemctl restart mysqld
    • 创建用于主从同步的账号/密码
      进入MySQL : mysql -u root -p 回车输入密码。
      我创建的用户名叫“master_root”密码是“MySql@6688”
      【注意:由于之前把密码改成支持简单密码123456的了,导致这里新建用户出现一些问题,说密码不符合策略等,后来干脆我重装mysql,使用默认复杂密码了,就没有这么多问题了。习惯就好其实。】
      下面我都用的%,没有写具体ip,你可以自行决定。
    #创建用户(IP为可访问该master的IP,任意IP就写'%')
    mysql> CREATE USER 'master_root'@'192.168.244.202' IDENTIFIED BY 'MySql@6688';
    #分配权限(IP为可访问该 master的IP,任意IP就写'%')
    mysql> GRANT REPLICATION SLAVE ON *.* TO 'master_root'@'192.168.244.202';
     #刷新权限
    mysql>flush privileges;  
    
    • 查看master状态,记录二进制文件名(mysql-bin.000001)和位置(154).后面配从库要用。
      show master status;
    1. 配置 Slave 主服务器
    • 修改my.cnf 文件。
      vim /etc/my.cnf
    [mysqld]
    server-id=202 #设置server-id,唯一值,唯一标识从库
    
    • 重启mysql服务 systemctl restart mysqld
    • 登录进入mysql,执行同步sql语句(主服务器名,用于主从的用户名,密码,二进制文件名,位置)
    mysql> CHANGE MASTER TO
        -> MASTER_HOST='192.168.244.201',
        -> MASTER_USER='master_root',
        -> MASTER_PASSWORD='MySql@6688',
        -> MASTER_LOG_FILE='mysql-bin.000001',
        -> MASTER_LOG_POS=154;
    
    • 启动slave同步进程
      mysql>start slave;
    • 查看slave状态 show slave statusG
      注意后面不要分号;否则最后一行显示报错如下:
      ERROR: No query specified
    mysql> show slave statusG
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.244.201
                      Master_User: master_root
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000002
              Read_Master_Log_Pos: 154
                   Relay_Log_File: localhost-relay-bin.000007
                    Relay_Log_Pos: 320
            Relay_Master_Log_File: mysql-bin.000002
                 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: 154
                  Relay_Log_Space: 531
                  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: 201
                      Master_UUID: 7dd766bb-f005-11e9-81ba-000c29a69f1b
                 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 more updates
               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: 
    1 row in set (0.01 sec)
    

    我也不知道为啥我这里这么长一段,网上的教程都是好短一段。管他呢,反正到这也对了。
    当Slave_IO_Running和Slave_SQL_Running都为YES的时候就表示主从同步设置成功了。
    特别注意:

    • 可能遇坑:Slave_IO_Running :no ,并不是yes,为什么呢??
      打开mysql的错误日志,不出意外在最后几行(看时间最新的记录),最后有这么一行:
      2019-10-16T12:59:09.987976Z 1 [ERROR] Slave I/O for channel '': Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Error_code: 1593
      意思master和slave的UUID相同了,应该不同才对的【如果你也是克隆的主机生成从机,就会出现这个问题】
      解决办法:去mysql的data目录中,找到auto.cnf文件(不知道data目录的去my.cnf文件中看‘datadir=/var/lib/mysql’),然后删除该文件,接着重启mysql服务,就会自动重新生成一个新的auto.cnf文件(注意,此时操作的都是slaver,不是master。)

    接下来就可以进行一些验证了,比如在主master数据库的test数据库的一张表中插入一条数据,在slave的test库的相同数据表中查看是否有新增的数据即可验证主从复制功能是否有效,还可以关闭slave(mysql>stop slave;),然后再修改master,看slave是否也相应修改(停止slave后,master的修改不会同步到slave),就可以完成主从复制功能的验证了。

    还可以用到的其他相关参数:

    master开启二进制日志后默认记录所有库所有表的操作,可以通过配置来指定只记录指定的数据库甚至指定的表的操作,具体在mysql配置文件的[mysqld]可添加修改如下选项:

    不同步哪些数据库

    binlog-ignore-db = mysql
    binlog-ignore-db = test
    binlog-ignore-db = information_schema

    只同步哪些数据库,除此之外,其他不同步

    binlog-do-db = game
    如之前查看master状态时就可以看到只记录了test库,忽略了manual和mysql库。

  • 相关阅读:
    Overloaded的方法是否可以改变返回值的类型
    parseXXX的用法
    java的类型转换问题。int a = 123456;short b = (short)a;System.out.println(b);为什么结果是-7616?
    UVA 10405 Longest Common Subsequence(简单DP)
    POJ 1001 Exponentiation(大数处理)
    POJ 2318 TOYS(计算几何)(二分)
    POJ 1265 Area (计算几何)(Pick定理)
    POJ 3371 Flesch Reading Ease (模拟题)
    POJ 3687 Labeling Balls(拓扑序列)
    POJ 1094 Sorting It All Out(拓扑序列)
  • 原文地址:https://www.cnblogs.com/wzc6688/p/11689357.html
Copyright © 2011-2022 走看看