MySQL8主备

前言

都说MySql8.x5.7快两倍,可以参考一下。
但不支持从 MySQL 8.0 降级到 MySQL 5.7(或从某个 MySQL 8.0 版本降级到任意一个更早的 MySQL 8.0 版本)。数据备份方式还是可以的。

  • 注意MySql8 的用户安全策略的改变
  • 注意MySql8 编码格式
  • 支撑内网服务器安装

准备

架构设计

主从

服务器配置

  • 192.168.2.31 master server_id=31
  • 192.168.2.32 slave server_id=32

安装

MySQL

Centos7 RPM安装MYSQL8
Centos7 解压安装MYSQL8

关闭防火墙

1
2
systemctl stop firewalld
systemctl disable firewalld

配置

1、MySQL

1
vim /etc/my.cnf

2、主备配置

  • master :server_id=31 `log-bin=mysql-bin`
  • slave:server_id=32 `log-bin=mysql-bin`
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
socket=/opt/db/mysql_data/mysql.sock
[mysqld]
skip-name-resolve
#设置3306端口
port=3306
datadir=/opt/db/mysql_data
socket=/opt/db/mysql_data/mysql.sock
log-error=/opt/db/mysql_log/mysqld.log
pid-file=/opt/db/mysqld/mysqld.pid
# 服务ID,集群中唯一
server-id=31
# 二进制日志
log-bin=mysql-bin
# 密码认证插件
default_authentication_plugin=mysql_native_password
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8mb4
#排序规则
collation-server=utf8mb4_0900_ai_ci
#utf8mb4_0900_ai_ci 排序规则:ai 口音不敏感 ci 不区分大小写 ,默认支持表情符号
#utf8mb4_0900_ai_ci 属于 utf8mb4_unicode_ci 中的一种
#utf8mb4_general_ci 没有实现utf8mb4_unicode_ci 的排序规则。没有utf8mb4_unicode_ci 准备。但是比较和排序的时候更快
# 创建新表时将使用的默认存储引擎,innodb支持事物
default-storage-engine=INNODB
# 数据库不区分大小写
lower_case_table_names=1
max_allowed_packet=16M
lc-messages-dir=/usr/share/mysql-8.0

重启 masterslave

1
2
3
4
systemctl restart mysqld
systemctl status mysqld
# 查看日志
cat /opt/db/mysql_log/mysqld.log

SQL命令:

1
2
3
4
5
6
7
8
# 查询默认认证插件
show variables like 'default_authentication_plugin';
# 查询master slave 保证不重复
show variables like '%server_id%';
# 查询master slave,如果是复制的数据库data,则 uuid有可能一样
show variables like '%server_uuid%';
# 查询账号认证模式
select host,user,plugin from mysql.user;

3、master库配置

master配置同步账号

SQL命令:

1
2
3
4
5
6
7
8
# 这里创建账号不指定地址,一般情况下,需要指定 slave 账号的 IP
create user sync@'192.168.2.32' identified by 'sync';
grant replication slave on *.* to sync@'192.168.2.32';
# 使用 mysql_native_password 认证码模式
alter user sync@'192.168.2.32' identified with mysql_native_password by 'sync';
flush privileges;
# 查询账号认证模式
select host,user,plugin from mysql.user;

4、slave库配置

查看master

master SQL命令:

1
show master status;

image-20210826090146083

slave写入 master的配置

slave SQL命令:

1
2
3
4
5
6
7
8
-- 停止slave 库
stop slave;
-- 写入配置
CHANGE MASTER TO MASTER_HOST='192.168.2.31',MASTER_USER='sync',MASTER_PASSWORD='sync',MASTER_LOG_FILE='mysql-bin.000006',MASTER_LOG_POS=156;
-- 启动从库
start slave;
-- 查看从库状态
SHOW SLAVE STATUS\G;

启动

启动MySQL

1
systemctl start mysqld

slave 启动

SQL命令:

1
2
3
4
-- 启动从库
start slave;
-- 查看从库状态
SHOW SLAVE STATUS\G;

测试

登录

1
mysql -uroot -p

master

SQL命令:

1
show processlist\G

Command: Binlog Dump状态为成功。

slave

SQL命令:

1
2
-- 查看从库状态
SHOW SLAVE STATUS\G;

image-20210826085655710

这两项都为 Yes则为成功,否则看错误日志,有错误。

查看错误日志

1
cat /opt/db/mysql_log/mysqld.log

这是因为的 mysql_data 是复制的,只要修改 auto.cnf 中的

1
2
[auto]
server-uuid=f2c4ab17-01ce-11ec-9d35-000c29d3bb32

重启服务

1
systemctl restart mysqld

正确的 slave结果

数据测试

master插入数据

SQL命令:

1
2
3
4
5
6
7
8
show databases;
create database test_db;
use test_db;
create table test_table(
id int
);
insert into test_table values(1);
select * from test_table;

slave查询数据

SQL命令:

1
2
3
show databases;
use test_db;
select * from test_table;

slave插入数据

1
insert into test_table values(2);

主库是不会增加数据的。

操作

同步

  1. master锁表

    1
    2
    FLUSH TABLES WITH READ LOCK;
    show master status;
  2. slave从库

    1
    2
    3
    4
    5
    6
    -- 写入配置
    CHANGE MASTER TO MASTER_HOST='192.168.2.31',MASTER_USER='sync',MASTER_PASSWORD='sync',MASTER_LOG_FILE='mysql-bin.000006',MASTER_LOG_POS=156;
    -- 启动从库
    start slave;
    -- 查看从库状态
    SHOW SLAVE STATUS\G;
  3. master解锁

    1
    unlock tables;

推荐

MySQL8.0创建用户及其配置
MySQL8.0新特性-新的索引方式
MySQL8.0新特性-通用表表达式(CTE)
MySQL8.0新特性-窗口函数
MySQL8.0新特性-InnoDB增强
MySQL8.0新特性-JSON增强
[官方介绍]([https://dev.mysql.com/doc/refman/8.0/en/create-index.html#create-index-functional-key-parts

本文地址: https://github.com/maxzhao-it/blog/post/f34de611/