提高MySQL数据可靠性的必备技能:基于MySQL8实现主从同步
迪丽瓦拉
2025-05-28 23:25:27
0

前言

本文收录于csdn 我是沐风晓月的博客专栏《数据库入门到精通》,该专栏主要收录MySQL基础语句及MySQL架构相关的内容。

如果你也正在学习数据库,可以关注我,一起学习,共同进步!

文章目录

  • 前言
  • 一. 实验环境
  • 二. 使用rpm包的形式安装MySQL8
    • 2.1 配置MySQL8的安装环境
    • 2.2 开始安装MySQL
    • 2.3 安装完成后的配置
  • 三. 配置MySQL主从架构
    • 3.1 设置master节点
    • 3.2 设置slave从库
    • 3.3 测试主从同步
  • 总结

一. 实验环境

本次实验所用软件及系统版本如下:

软件版本
linux操作系统CentOS 7.9
master 节点IP192.168.1.41
node节点IP192.168.1.42
MySQL版本MySQL8

在这里插入图片描述

二. 使用rpm包的形式安装MySQL8

这里需要注意,每台服务器都需要安装MySQL8, 用到几个节点,就需要安装几台MySQL。

2.1 配置MySQL8的安装环境

  • 下载rpm包,安装MySQL8的源

先从官网下载需要安装的MySQL8的yum源所需要的rpm包。

[root@mufeng42 ~]# wget https://repo.mysql.com//mysql80-community-release-el7-7.noarch.rpm--2023-03-15 14:59:39--  https://repo.mysql.com//mysql80-community-release-el7-7.noarch.rpm
正在解析主机 repo.mysql.com (repo.mysql.com)... 23.36.48.238
正在连接 repo.mysql.com (repo.mysql.com)|23.36.48.238|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:11196 (11K) [application/x-redhat-package-manager]
正在保存至: “mysql80-community-release-el7-7.noarch.rpm”100%[============================================================================>] 11,196      --.-K/s 用时 0s      2023-03-15 14:59:39 (396 MB/s) - 已保存 “mysql80-community-release-el7-7.noarch.rpm” [11196/11196])[root@mufeng42 ~]# ls
anaconda-ks.cfg  mysql80-community-release-el7-7.noarch.rpm#使用rpm -ivh命令进行安装
[root@mufeng42 ~]# rpm -ivh mysql80-community-release-el7-7.noarch.rpm 
警告:mysql80-community-release-el7-7.noarch.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 3a79bd29: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...1:mysql80-community-release-el7-7  ################################# [100
  • 查看MySQL源是否配置好

安装完成后,在本地可以查看到MySQL的rpm包

[root@mufeng42 ~]# yum list |grep mysql

在这里也能查看到MySQL的repo文件

2.2 开始安装MySQL

  • 直接使用yum进行安装
 [root@mufeng41 ~]# yum -y install mysql-community-server
  • 启动测试
[root@mufeng41 ~]# systemctl start mysqld
[root@mufeng41 ~]# systemctl status 设置开机自启
[root@mufeng41 ~]# systemctl enable mysqld

2.3 安装完成后的配置

  • 修改密码:
[root@mufeng41 ~]# cat /var/log/mysqld.log |grep password
2023-03-15T07:06:55.934416Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: m2&u!g*rB065

登录数据库进行密码修改:

[root@mufeng41 ~]# mysql -uroot -p'm2&u!g*rB065'

注意: 这里的m2&u!g*rB065就是初始密码

重设密码:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Root!2#admin';
Query OK, 0 rows affected (0.00 sec)

设置密码完成后,就配置完了

MySQL8默认的密码策略要求比较高,如果你想了解MySQL8的密码策略,可以参考以下方法:

  • 查看MySQL8中的密码策略:

如果想要修改密码策略可以使用如下命令(这里不建议修改):

  • 修改密码策略
mysql> set global validate_password.length=6;    # 修改密码长度
Query OK, 0 rows affected (0.00 sec)mysql> set global validate_password.policy='LOW'; # 修改密码严重级别:符合一个条件即可
Query OK, 0 rows affected (0.00 sec)

三. 配置MySQL主从架构

3.1 设置master节点

  1. 创建用户并授权

这里我们mengfeng41 作为master服务器

mysql -uroot -p’Root!2#admin’

mysql> create user 'slave21'@'%' identified with mysql_native_password by '123456';
Query OK, 0 rows affected (0.00 sec)
注:这里可以用修改密码命令更新一下密码,一样的密码也可以,否则有可能会报主从设置的时候可能会报密码相关错误。
  1. 授权并刷新
mysql>  grant replication slave on *.* to 'slave21'@'%';
Query OK, 0 rows affected (0.00 sec)mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)mysql> show grants for 'slave21'@'%';
+-------------------------------------------------+
| Grants for slave21@%                            |
+-------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO `slave21`@`%` |
+-------------------------------------------------+
1 row in set (0.00 sec)mysql> 
  1. 修改配置文件

mysql 的配置文件默认在/etc/my.cnf下,在配置文件中默认添加以下内容:

打开文件 vim /etc/my.cnf

  [mysqld]
server-id=21            
log-bin=mysql-bin       
binlog-do-db=test       
binlog-ignore-db=mysql

注释:

  • server-id=21 # 设置唯一id
  • log-bin=mysql-bin # 二进制文件存放路径,非必须,mysql8后默认存放/var/lib/mysql这里
  • binlog-do-db=test # 要同步的数据库(这个是要同步的数据库名字)
  • binlog-ignore-db=mysql # 不同步的数据库

修改完成后,要重启数据库:

[root@mufeng41 ~]# systemctl restart mysqld
  1. 登录查看master状态

此时root的密码是: Root!2#admin, 别输错了哦。


mysql -uroot -p'Root!2#admin'# 检查binlog日志是否开启
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)# 查看主库状态,获取从库必要的配置参数mysql>  show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      157 | test         | mysql            |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)mysql>

show master status;中出现的参数:

  • File: 要同步的二进制文件
  • Position: 同步开始位置
  • Binlog_Do_DB: 同步的数据库,配置文件内说明
  • Binlog_Ignore_DB: 不同步的数据库,配置文件内说明
  • Executed_Gtid_Set: 已经执行的事务编号(从库的执行sql线程已经执行了的sql)

3.2 设置slave从库

  1. 设置配置文件
[root@mysql-slave ~]# vi /etc/my.cnf
[mysqld]
server-id=22            # 设置唯一id
  1. 重启MySQL服务器
[root@mufeng42 ~]# systemctl  restart mysqld
  1. 登录数据库设置同步信息
  • 登录数据库
[root@mufeng42 ~]# mysql -p'Root!2#admin'
  • 设置同步信息
 change master to master_host='192.168.1.41',master_user='slave21',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=157;

注意,由于 MySQL8 密码插件的问题,这个问题同样会给主从配置带来问题,所以在 MySQL8 配置主从上,上面这行命令需要添加 get_master_public_key=1,完整命令如下:

mysql> change master to master_host='192.168.1.41',master_user='slave21',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=157,get_master_public_key=1;Query OK, 0 rows affected, 8 warnings (0.01 sec)

在这条命令中:

  • master_host: 主节点ip地址
  • master_user: 主节点授权的同步复制用户
  • master_password: 用户对应的密码
  • master_log_file: 同步二进制文件,对应主节点File
  • master_log_pos: 同步位置,对应主节点Position
  1. 启动slave同步,并查看slave节点状态

mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)mysql> 
mysql> show slave status \G
*************************** 1. row ***************************Slave_IO_State: Master_Host: 192.168.1.41Master_User: slave21Master_Port: 3306Connect_Retry: 60Master_Log_File: binlog.000001Read_Master_Log_Pos: 157Relay_Log_File: mufeng42-relay-bin.000001Relay_Log_Pos: 4Relay_Master_Log_File: binlog.000001Slave_IO_Running: NoSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 157Relay_Log_Space: 157Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_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: NoLast_IO_Errno: 13114Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 21Master_UUID: f7db0fb5-c2ff-11ed-b01c-000c290739ccMaster_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Replica has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: 230315 18:09:41Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0Network_Namespace: 
1 row in set, 1 warning (0.00 sec)

Slave_IO_Running、Slave_SQL_Running都为yes,说明启动成功。

如果出现 Slave_IO_Running: No的情况:

root@mufeng42 ~]# find / -iname "auto.cnf"
/var/lib/mysql/auto.cnf
[root@mufeng42 ~]# rm -rf /var/lib/mysql/auto.cnf mysql> stop slave; 
Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> reset slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.00 sec

按照上面的方式解决即可。

如果 Slave_SQL_Running: no

1、先停掉slave
mysql> stop slave;

2、跳过错误步数,后面步数可变
mysql> set global sql_slave_skip_counter=1;

3、再启动slave
mysql> start slave;
4、查看同步状态

mysql> show slave status\G;

3.3 测试主从同步

  1. 在主master中插入数据并查看
mysql> create database aa;
Query OK, 1 row affected (0.00 sec)mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| aa                 |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)mysql> 
  1. 在从服务器查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| aa                 |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

总结

💕 好啦,这就是今天要分享给大家的全部内容了,我们下期再见!
💕 博客主页:mufeng.blog.csdn.net
💕 本文由沐风晓月原创,首发于CSDN博客
💕 全力以赴,持续学习,不负如来不负卿
💕 喜欢的话记得点赞收藏哦

相关内容