MySQL8.0实现主从集群的配置以及常见错误的处理方法

         MySQL8.0实现主从集群的配置以及常见错误的处理方法

MySQL主从的配置,需要两台主机,现假设主机一 的IP地址为192.168.0.12,主机二的IP地址为192.168.0.13,12的主机设置为MySQL主机,13的主机设置为MySQL从属机。由于是需要从12这台机器拉取日志到13这台,必须需要网络间通信,因此,请在开始配置前将防火墙配置好或者关闭防火墙。

首先,在两台机器上安装同一版本的MySQL或者mariadb,初始化以及初始密码和 /etc/my.cnf这个配置文件内所写的配置有关系,在8.0版本之后,需要在my.cnf这个配置文件的mysqld标签下添加字段default_authentication_plugin=mysql_native_password,如果是刚安装完的MySQL8.0,发现my.cnf 文件内没有这项,请务必添加,该字段的来历如下:

MySQL8.0实现主从集群的配置以及常见错误的处理方法

在8.0版本前的查询MySQL库的user表的内容,是这样的两个命令,use mysql;&&select user,host,password from user;

在8.0后版本,查询mysql这个数据库的user表的内容,是这样的命令:user mysql;

&& select user,host,authentication_string,plugin from user;

plugin意思为插件,老旧版本是使用mysql_native_password,新的8.0版本是默认使用caching_sha2_password,那么配置文件my.cnf内配置了,以后所有操作都是使用旧版的mysql_native_password。旧版的mysql_native_password修改密码等验证操作相对简单点,并且由于习惯会更容易使用。下面开始正式的配置、

第一,主服务器的配置(192.168.0.12)

1,vim /etc/my.cnf 在mysqld标签下添加如下字段:

log-bin=mysql-bin

server-id=12

保存退出,执行命令,service mysql restart

使用原始密码进入数据库,

2,USE mysql; &&ALTER USER [email protected]'localhost' IDENTIFIED BY 'shiguang32';

这一步和原来的8.0前版本是一样的,修改root密码。

3.UPDATE USER SET HOST='%' WHERE USER='root';

这一步和原来的8.0前版本是一样的,修改root密码。

4,CREATE USER 'slave'@'192.168.0.13' IDENTIFIED WITH mysql_native_password BY '123456';

创建一个名字为slave的用户,密码是123456,该用户只可以在192.168.0.13登录

5,GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.0.13';

赋予slave用户读取日志的权限

6,show master status;

输出的结果为(这些很重要哦,这样操作后,该机器不要重启mysql服务,否则数值会改变):

+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000007 |      533 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

 

二,从服务器,slave服务器的配置(192.168.0.13):

 

1,vim /etc/my.cnf 在mysqld标签下添加如下字段:

log-bin=mysql-bin

server-id=12

保存退出,执行命令,service mysql restart

使用原始密码进入数据库,

2,USE mysql; &&ALTER USER [email protected]'localhost' IDENTIFIED BY 'shiguang32';

这一步和原来的8.0前版本是一样的,修改root密码。

3.UPDATE USER SET HOST='%' WHERE USER='root';

这一步和原来的8.0前版本是一样的,修改root密码。

4,stop slave; &&CHANGE MASTER TO MASTER_HOST='192.168.0.12',MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000007',MASTER_LOG_POS=533;

保存服务器所给的授权在本地,这一步极为重要,密码在服务器设置过,不要写错,第七步所查询的两个值分别填写进去,

5,START SLAVE; &&  SHOW SLAVE STATUS \G;

输出的结果为:

 

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.0.12
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000007
          Read_Master_Log_Pos: 533
               Relay_Log_File: centos4-relay-bin.000002
                Relay_Log_Pos: 700
        Relay_Master_Log_File: mysql-bin.000007
             Slave_IO_Running: Yes ###这里必须是yes,如果有错,可能会为no或者connecting
            Slave_SQL_Running: Yes  ###这里也必须是yes,别的不好使,这两项必须同时为yes ,算配置成功
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0#有多少错误就显示几,0当然最好了。
                   Last_Error: #如果有什么错误,会在这显示,没有显示是好事情。
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 533
              Relay_Log_Space: 910
              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: 12
                  Master_UUID: ba0d9f03-c8cb-11ea-a636-000c29e17c58
             Master_Info_File: mysql.slave_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: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
1 row in set (0.00 sec)

ERROR: 
No query specified

 

关于那两个yes的问题,如果第一个不是yes,那么排查网络,看通不通。检查ip是否写对。

如果是第二个不是yes,那么重新执行第四步,检查用户名,密码,file,log_pos 这四项,是否和 在master主机上执行show master status;这个的结果都一致么?