CentOS7中MySQL主从同步实验记录

China☆狼群 提交于 2019-12-10 23:24:04

1.环境介绍

确保俩虚拟机centos7时间是同步的;一台虚拟机是另一台拷贝过来后、修改的固定IP;
IP:192.168.255.133
IP:192.168.255.134

2.MySQL数据库准备

安装MySQL5.7.28,配置文件/etc/my.cnf配置四位简单密码;(记得彻底删除其他版本)

安装mysql并修改简单密码,开启3306 22端口

wget [http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm](http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm)

rpm -ivh mysql57-community-release-el7-8.noarch.rpm

yum install mysql-server

# 等,看网速

service mysqld start

grep "password" /var/log/mysqld.log

mysql -uroot -p				# 此处输入从log中查询到的复杂密码

# 输入密码,准备修改密码,下面三步骤,是将验证级别降低,密码长度改成4,然后设置密码为asdf

set global validate_password_policy=0;

set global validate_password_length=4;

set PASSWORD = PASSWORD("asdf");

# 以下查看并开启端口操作(3306、22同理)

firewall-cmd --query-port=3306/tcp

firewall-cmd --zone=public --add-port=3306/tcp --permanent

firewall-cmd --reload

/etc/my.cnf配置:

[mysqld]
plugin-load=validate_password.so	# 加载插件
validate_password_policy=0        # 强度检查级别为LOW
validate_password_length=4        # 密码长度设置为至少为4
validate-password=FORCE_PLUS_PERMANENT # 永久强制使用插件,以防插件在运行时被删除

直接在配置中写好,这样就不会因为每次重启数据库服务而重新设置简单密码规则;也为之后主从复制中的密码能写成四位简单的做好准备,否则后面创建master用户的密码还要遵循复杂的规则。

3.主从同步——异步同步(默认方式)

主库my.cnf 开启Binlog功能

[mysqld]
server-id=1 		# 必须比从库小
log-bin=mysql-bin

从库my.cnf

[mysqld]
server-id=2 
log_bin=mysql-bin
replicate_do_table=test.user			# 这个是需要同步的表
binlog-ignore-db=mysql   				# 这个是忽略的不需要同步的库,可以不设置

主库先创建库test表user,主库要建立账号
如果前面主库my.cnf配置好简单密码规则,这里就不要这几句确认了。

set global validate_password_policy=0;
select @@validate_password_policy;
set global validate_password_length=4;
select @@validate_password_length;
grant replication slave on *.* to 'back'@'192.168.255.134' identified by 'asdf';	# 创建一个用户back,密码asdf用来从库对接
show master status;
exit

主库所在虚拟机,备份库,向从库虚拟机传输sql,用来同步数据库

mysqldump -uroot -p test > /root/test.sql
ls /root/test.sql
scp /root/test.sql 192.168.255.134:/root			# 密码asdf

从库同步数据

use test;	# 从库进mysql的库test
source /root/test.sql		# 用sql同步数据

配置master.info(CHANGE MASTER to…相当于配置密码文件和Master的相关信息)

change master to master_host='192.168.255.133',master_user='back',master_password='asdf',master_port=3306,MASTER_LOG_FILE='mysql-bin.000013',MASTER_LOG_POS=695;			# 文件名字和log位置是主库show master status看到的
start slave;					# 开启复制功能d
show slave status \G;

发现问题

从库写一条,主库写一条,这时候就不同步了:
错误原因里面写的很清楚

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.255.133
                  Master_User: back
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000006
          Read_Master_Log_Pos: 3670
               Relay_Log_File: localhost-relay-bin.000002
                Relay_Log_Pos: 2723
        Relay_Master_Log_File: mysql-bin.000006
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: test.user
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 1062
                   Last_Error: Could not execute Write_rows event on table test.user; Duplicate entry '8' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000006, end_log_pos 3100
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 2854
              Relay_Log_Space: 3750
              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: 1062
               Last_SQL_Error: Could not execute Write_rows event on table test.user; Duplicate entry '8' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000006, end_log_pos 3100
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: 4b5e1b3a-1af8-11ea-ac00-000c29b986f2
             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: 191210 14:22:39
               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.00 sec)

ERROR: 
No query specified

4.主从同步——半同步

主从的配置在之前的基础上添加开启半同步即可
主库:
进入mysql设置以下两句,当然重启数据库会消失,所以推荐下面修改配置文件的方法,记得重启数据库。
INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;
SET GLOBAL rpl_semi_sync_master_enabled = 1;
推荐这种:

[mysqld]
plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1

查看半同步插件是否有 rpl_semi_sync_master这一行即可

mysql> show plugins;
+----------------------------+----------+--------------------+----------------------+---------+
| Name                       | Status   | Type               | Library              | License |
+----------------------------+----------+--------------------+----------------------+---------+
| binlog                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| mysql_native_password      | ACTIVE   | AUTHENTICATION     | NULL                 | GPL     |
| sha256_password            | ACTIVE   | AUTHENTICATION     | NULL                 | GPL     |
| CSV                        | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| MEMORY                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| InnoDB                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
......
| validate_password          | ACTIVE   | VALIDATE PASSWORD  | validate_password.so | GPL     |
| rpl_semi_sync_master       | ACTIVE   | REPLICATION        | semisync_master.so   | GPL     |
+----------------------------+----------+--------------------+----------------------+---------+
46 rows in set (0.00 sec)

查看主库半同步是否运行,ON状态即可

mysql> show status like 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON    |
+-----------------------------+-------+
1 row in set (0.01 sec)

从库:
INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
或推荐:

[mysqld]
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1

重启从库线程
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
查看是半同步否在运行
show status like ‘Rpl_semi_sync_slave_status’;

mysql> show status like 'Rpl_semi_sync_slave_status';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+
1 row in set (0.01 sec)

然后主库重新查下master的status,让从库根据信息去连接
以下只给一个跑正确的示范:
可以看到
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
这两行,有时候是connecting也可以的

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.255.133
                  Master_User: back
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000013
          Read_Master_Log_Pos: 695
               Relay_Log_File: localhost-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000013
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: test.user
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 695
              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: 1
                  Master_UUID: 4b5e1b3a-1af8-11ea-ac00-000c29b986f2
             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.00 sec)

ERROR: 
No query specified

5.centos7 Failed to start LSB: Bring up/down networking错误

错误原因:关机问题

systemctl stop NetworkManager
systemctl disable NetworkManager
service network start

即可

6.总结

可能因为后面了解了基础多一些之后再来记录的,有些记得不详细,之后会不断添加修改的。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!