mysql安装学习

6 阅读28分钟

mysql安装

在线安装

dev.mysql.com/downloads/r…

# 下载mysql的rpm源
wget https://repo.mysql.com//mysql80-community-release-el7-11.noarch.rpm
# 安装rpm源
rpm -Uvh mysql80-community-release-el7-11.noarch.rpm
# 查看yum源中,关于mysql的内容
yum repolist all | grep mysql
mysql-cluster-7.5-community/x86_64                  MySQL Cluste disabled
mysql-cluster-7.5-community-source                  MySQL Cluste disabled
mysql-cluster-7.6-community/x86_64                  MySQL Cluste disabled
mysql-cluster-7.6-community-source                  MySQL Cluste disabled
mysql-cluster-8.0-community/x86_64                  MySQL Cluste disabled
mysql-cluster-8.0-community-debuginfo/x86_64        MySQL Cluste disabled
mysql-cluster-8.0-community-source                  MySQL Cluste disabled
mysql-cluster-innovation-community/x86_64           MySQL Cluste disabled
mysql-cluster-innovation-community-debuginfo/x86_64 MySQL Cluste disabled
mysql-cluster-innovation-community-source           MySQL Cluste disabled
mysql-connectors-community/x86_64                   MySQL Connec enabled:    242
mysql-connectors-community-debuginfo/x86_64         MySQL Connec disabled
mysql-connectors-community-source                   MySQL Connec disabled
mysql-innovation-community/x86_64                   MySQL Innova disabled
mysql-innovation-community-debuginfo/x86_64         MySQL Innova disabled
mysql-innovation-community-source                   MySQL Innova disabled
mysql-tools-community/x86_64                        MySQL Tools  enabled:    104
mysql-tools-community-debuginfo/x86_64              MySQL Tools  disabled
mysql-tools-community-source                        MySQL Tools  disabled
mysql-tools-innovation-community/x86_64             MySQL Tools  disabled
mysql-tools-innovation-community-debuginfo/x86_64   MySQL Tools  disabled
mysql-tools-innovation-community-source             MySQL Tools  disabled
mysql-tools-preview/x86_64                          MySQL Tools  disabled
mysql-tools-preview-source                          MySQL Tools  disabled
mysql57-community/x86_64                            MySQL 5.7 Co disabled
mysql57-community-source                            MySQL 5.7 Co disabled
mysql80-community/x86_64                            MySQL 8.0 Co enabled:    465
mysql80-community-debuginfo/x86_64                  MySQL 8.0 Co disabled
mysql80-community-source                            MySQL 8.0 Co disabled
# 发现默认安装的版本是8.0,这里修改为5.7
# 需要将5.7的enabled设置为1,将8.0的enabled设置为0
vim /etc/yum.repos.d/mysql-community.repo
# Enable to use MySQL 5.7
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch
enabled=1 # 原来为0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2023
       file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022
       file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

[mysql80-community]
name=MySQL 8.0 Community Server
baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/7/$basearch
enabled=0 # 原来为1
gpgcheck=1
...
# 再次执行yum命令,查看当前安装的mysql版本,已经修改为5.7
yum repolist all | grep mysql | grep enabled
mysql-connectors-community/x86_64                   MySQL Connec enabled:    242
mysql-tools-community/x86_64                        MySQL Tools  enabled:    104
mysql57-community/x86_64                            MySQL 5.7 Co enabled:    696

# 直接安装mysql社区版服务即可,安装之后会生成配置文件/etc/my.cnf
yum -y install mysql-community-server
# 默认mysql服务是关闭的,需要启动mysql服务并设置开机自启
systemctl start mysqld && systemctl enable mysqld
# 登录mysql服务前,需要找到yum方式安装后,生成的随机密码
grep 'temporary password' /var/log/mysqld.log
2024-03-13T05:47:46.920940Z 1 [Note] A temporary password is generated for root@localhost: 6k+2vaOW+mPA

# 登陆mysql
mysql -uroot -p"6k+2vaOW+mPA"

# 登录之后,第一件事情,一定是修改密码;密码有强度校验,至少8位,需要有小写字母,大写字母,数字和特殊符号
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Abc@1234';
use mysql;
truncate user;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Abc@1234' WITH GRANT OPTION;

# 基于grant命令,构建一个远程连接用户
GRANT ALL PRIVILEGES ON *.* TO 'zhang'@'%' IDENTIFIED BY 'Abc@1234' WITH GRANT OPTION;
# mysql8中这个要分两步执行
CREATE USER 'zhang'@'%' IDENTIFIED BY 'Abc@1234';
GRANT ALL PRIVILEGES ON *.* TO 'zhang'@'%' WITH GRANT OPTION;

# 刷新权限
FLUSH PRIVILEGES;
# 退出mysql
exit;

# 修改MySQL服务端编码为utf8
echo 'character-set-server=utf8' >> /etc/my.cnf
# 修改配置之后,需要重启服务
systemctl restart mysqld

# 开放mysql的3306端口或关闭防火墙,这里关闭防火墙并禁用开机自启
systemctl stop firewalld && systemctl disable firewalld

离线安装

downloads.mysql.com/archives/co…

# mysql5.7安装
# 下载离线包并解压
wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar
tar xf mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar
# 使用rpm安装mysql,rpm包有依赖关系,安装的顺序如下(--force:强制安装 --nodeps:不检查环境依赖)
rpm -ivh mysql-community-common-5.7.44-1.el7.x86_64.rpm --force --nodeps
rpm -ivh mysql-community-libs-5.7.44-1.el7.x86_64.rpm --force --nodeps
rpm -ivh mysql-community-client-5.7.44-1.el7.x86_64.rpm --force --nodeps
rpm -ivh mysql-community-server-5.7.44-1.el7.x86_64.rpm --force --nodeps
# 默认mysqlL服务是关闭,需要启动mysql服务并设置开机自启
systemctl start mysqld && systemctl enable mysqld
# 其它的步骤与上面的在线安装一致

# mysql8安装
# 下载离线包并解压
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.2.0-1.el7.x86_64.rpm-bundle.tar
tar xf mysql-8.2.0-1.el7.x86_64.rpm-bundle.tar
# 使用rpm安装mysql,rpm包有依赖关系,安装的顺序如下(--force:强制安装 --nodeps:不检查环境依赖)
rpm -ivh mysql-community-common-8.2.0-1.el7.x86_64.rpm --force --nodeps
rpm -ivh mysql-community-libs-8.2.0-1.el7.x86_64.rpm --force --nodeps
rpm -ivh mysql-community-client-8.2.0-1.el7.x86_64.rpm --force --nodeps
rpm -ivh mysql-community-server-8.2.0-1.el7.x86_64.rpm --force --nodeps
# 默认mysql服务是关闭的,需要启动mysql服务并设置开机自启
systemctl start mysqld && systemctl enable mysqld
# 其它的步骤与上面的在线安装一致

mysql密码忘记处理

# 修改/etc/my.conf文件,在mysqld标签下加入以下参数
echo 'skip-grant-tables' >> /etc/my.cnf

# 重启mysql服务
service mysqld restart

# 登录mysql
mysql

# 修改密码
use mysql;
update user set authentication_string = password('Abc@1234') where user = 'root';
# 在mysql8中没有password函数,应该将密码设置为空字符串
update user set authentication_string = '' where user = 'root';
# 退出mysql
exit;

# 删除skip-grant-tables配置,然后重启mysql
sed -i '/skip-grant-tables/d' /etc/my.cnf
# 重启mysql服务
service mysqld restart

# mysql8中,再次登录mysql修改密码
mysql -uroot
# 有--skip-grant-tables这个选项不可以执行这个sql,所以需要在--skip-grant-tables选项下,将密码置空,然后去掉这个选项登录mysql修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Abc@1234';
exit;

mysql卸载

systemctl stop mysqld && systemctl disable mysqld
# 查看安装了哪些mysql组件
rpm -qa | grep mysql

# 卸载mysql
rpm -e mysql-community-server-5.7.44-1.el7.x86_64.rpm
rpm -e mysql-community-client-5.7.44-1.el7.x86_64.rpm
rpm -e mysql-community-libs-5.7.44-1.el7.x86_64.rpm
rpm -e mysql-community-common-5.7.44-1.el7.x86_64.rpm

# 彻底移除mysql相关目录
rm -rf /var/lib/mysql
rm -rf /var/run/mysqld
rm -f /var/log/mysqld.log
rm -f /etc/my.cnf*

mysql学习

准备配置文件

[mysqld]
# 默认为1,在复制场景中,不同的mysql节点设置不同的值
server_id=1
datadir=/data/mysql/data
socket=/data/mysql/data/mysql.sock

log_error=/data/mysql/log/mysql_error.log
pid_file=/data/mysql/data/mysql.pid

user=mysql
port=3306

# RSA公钥和私钥,创建用户默认使用caching_sha2_password校验密码,在组复制分布式恢复时需要
#caching_sha2_password_public_key_path=/data/mysql/etc/public_key.pem
#caching_sha2_password_private_key_path=/data/mysql/etc/private_key.pem

# binlog配置
#log_bin=ON
#binlog_format=ROW
#log_bin_basename=/data/mysql/data/binlog
#log_bin_index=/data/mysql/data/binlog.index
#log_bin_trust_function_creators=OFF
# 源,额外的设置
#innodb_flush_log_at_trx_commit=1
#sync_binlog=1
# 从,额外配置,用于控制从库是否将接收到的更新记录到其自己的二进制日志,这个配置项可用于实现多级复制
#log_replica_updates=ON
# 从库,如果不想保存二进制日志,可以指定两个配置 --skip-log-bin 和 --log-replica-updates=OFF

# relay log配置,默认会包含当前主机名,设置成固定值,方便通过副本启动另一个副本
relay_log=relay_log_bin

# 启用基于GTID复制的配置,下面两个配置默认都为OFF
#gtid_mode=ON
#enforce_gtid_consistency=ON

# 配置时区,第一次启动不要启用,否则会报错
#default_time_zone='Asia/Shanghai'
# 配置日志的时区,跟随系统,如果不配置会使用UTC时区,可能通过设置TZ环境变量也可以解决这个问题
log_timestamps=SYSTEM

# 启用慢查询日志
slow_query_log=ON
# 指定慢查询日志文件路径
slow_query_log_file=/data/mysql/log/mysql_slow.log

character_set_server=UTF8MB4

# 设置大小写不敏感
lower_case_table_names=1

# 副本启动时不开启同步(该配置默认为OFF),修改副本同步时可能需要这个配置
#skip_replica_start=ON

# 组复制配置(需要启用基于GTID复制)
# 组复制只能使用innodb存储引擎
#disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
# 将 Group Replication 插件添加到服务器启动时加载的插件列表中
#plugin_load_add='group_replication.so'
# 组名必须是一个有效的 UUID,可以使用 SELECT UUID() 来生成一个
#group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
# 这个参数设置为 OFF,指示插件不在服务器启动时自动开始操作。这对于设置 Group Replication 非常重要,因为它确保你可以在手动启动插件之前先配置服务器。一旦成员配置完成,应该将这个参数设置为 ON,以便 Group Replication 在服务器启动时自动启动
#group_replication_start_on_boot=off
# 定义成员用于与其他组内成员进行内部通信的网络地址和端口。组复制本地地址必须不同于用于 SQL 客户端连接的主机名和端口,它不应被客户应用程序使用,而应仅用于组成员之间的内部通信
#group_replication_local_address= "192.168.91.71:33061"
# 这个参数设置了新成员用于建立与组连接的组成员的主机名和端口(仅用于内部通信)。这些成员被称为种子成员。一旦建立了连接,组成员信息将列在性能模式表 replication_group_members 中。通常,group_replication_group_seeds 列表包含每个组成员的 group_replication_local_address 的主机名:端口,但这不是强制性的,可以选择一部分组成员作为种子
#group_replication_group_seeds= "192.168.91.71:33061,192.168.91.72:33061,192.168.91.73:33061"
# 这个参数插件是否引导组,这个参数应该始终配制为off,在实例运行时通过命令配置这个参数为on,以确保只有一个成员实际上引导了组,组引导成功之后通过命令配置这个参数为off,因为组只能引导一次
#group_replication_bootstrap_group=off
# 分布式恢复时,使用的RSA公钥
#group_replication_recovery_public_key_path=/data/mysql/etc/public_key.pem

[client]
socket=/data/mysql/data/mysql.sock
port=3306

复制

配置复制

基于二进制日志
准备

准备192.168.91.71-192.168.91.733个节点,内存2G,CPU2C,硬盘20GB,主机名称mysql01-mysql03

# 所有节点

# hosts 配置
cat >> /etc/hosts << "EOF"
192.168.91.71  mysql01
192.168.91.72  mysql02
192.168.91.73  mysql03
EOF

# 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld

# 关闭selinux
sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0

# 时间同步配置,最小化安装系统需要安装ntpdate软件
yum -y install ntpdate
echo "0 */1 * * * ntpdate time1.aliyun.com" >> /var/spool/cron/root
systemctl enable ntpdate && systemctl start ntpdate

# 创建linux中mysql用户
groupadd mysql
mkdir /data
useradd --system --create-home --home-dir /data/mysql --gid mysql --shell /bin/false mysql
# 设置最大文件描述符
echo "mysql soft nofile 65535" >> /etc/security/limits.conf
echo "mysql hard nofile 65535" >> /etc/security/limits.conf
# 创建mysql数据目录和日志目录
mkdir -p /data/mysql/{data,log,etc}
chown -R mysql:mysql /data/mysql

# 准备离线安装mysql文件
cd /data/mysql
# 下载mysql离线安装包,并安装
# https://cdn.mysql.com//Downloads/MySQL-8.4/mysql-8.4.4-1.el7.x86_64.rpm-bundle.tar
tar xf mysql-8.4.4-1.el7.x86_64.rpm-bundle.tar
rpm -ivh mysql-community-common-8.4.4-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-plugins-8.4.4-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-8.4.4-1.el7.x86_64.rpm

# 可能会报错 mariadb-libs is obsoleted by mysql-community-libs-8.4.4-1.el7.x86_64
# mariadb-libs 被 mysql-community-libs 替代,这意味着您的系统中可能已经安装了 mariadb-libs,而新的 mysql-community-libs 包要求移除它
yum -y remove mariadb-libs
# 重新安装
rpm -ivh mysql-community-libs-8.4.4-1.el7.x86_64.rpm

rpm -ivh mysql-community-client-8.4.4-1.el7.x86_64.rpm
rpm -ivh mysql-community-icu-data-files-8.4.4-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.4.4-1.el7.x86_64.rpm
rm -f mysql-community-*.rpm
rm -f mysql-8.4.4-1.el7.x86_64.rpm-bundle.tar

# 备份原始的mysql配制文件
mv /etc/my.cnf /etc/my.cnf.back
# 将上面准备的配置文件,复制到 /etc/my.cnf
# 分别将配置文件中的server_id修改为1,2,3

# mysql01

# RSA公钥和私钥数据库会自动生成,先在其中一个节点生成,然后复制到其它节点
systemctl start mysqld
# 生成的RSA公钥和私钥默认在data目录
mv /data/mysql/data/*_key.pem /data/mysql/etc
# 停止mysql并删除数据目录和日志目录
systemctl stop mysqld
rm -rf /data/mysql/data/*
rm -rf /data/mysql/log/*
# 将RSA公钥和私钥拷贝到其它节点
scp /data/mysql/etc/* mysql02:/data/mysql/etc/
scp /data/mysql/etc/* mysql03:/data/mysql/etc/
# 所有节点

# 修改RSA公钥和私钥所属的用户和组
chown -R mysql:mysql /data/mysql/etc

# 修改配置文件,配置RSA公钥和私钥
sed -i -e 's/^#caching_sha2_password_public_key_path/caching_sha2_password_public_key_path/' \
-e 's/^#caching_sha2_password_private_key_path/caching_sha2_password_private_key_path/' /etc/my.cnf

# 启动mysql,并设置开机自启
systemctl start mysqld
systemctl enable mysqld

# 查看mysql密码
cat /data/mysql/log/mysql_error.log | grep password
2025-01-23T08:41:23.881399+08:00 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: lh24i&q:jgiM

# 分别登录3个mysql服务,修改root密码,并创建复制用户

# 登录报错
mysql -uroot -p
mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory

# 解决办法
yum install ncurses-compat-libs

# 修改root密码
# 输入密码登录mysql
mysql -uroot -p

# 登录之后,第一件事情,一定是修改密码;密码有强度校验,至少8位,需要有小写字母,大写字母,数字和特殊符号
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Abc@1234';
# 创建复制用户
CREATE USER 'repl'@'192.168.91.%' IDENTIFIED BY 'Abc@1234';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.91.%';
# 刷新权限
FLUSH PRIVILEGES;
exit

# 加载时区,需要输入root密码
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -uroot -p mysql

# 将 /etc/my.cnf 配置文件中的 default-time-zone 配置启用,然后重启mysql服务
sed -i 's/^#default_time_zone/default_time_zone/' /etc/my.cnf
systemctl restart mysqld
-- mysql01
-- 登录mysql,创建数据库,表,插入数据
create database `my_test` default character set utf8mb4 collate utf8mb4_general_ci;
use `my_test`;
create table `my_user`(
    `id` bigint not null auto_increment comment '主键id',
    `name` varchar(32) not null comment '名字',
    `age` int  not null comment '年龄',
    `create_time` datetime default current_timestamp comment '创建时间',
    primary key (`id`) using btree
) engine = innodb auto_increment = 1 default charset = utf8mb4 collate = utf8mb4_unicode_ci comment = '用户信息';
insert into `my_user` (`name`, `age`) values ('张三', 18), ('李四', 19), ('王五', 20), ('赵六', 21);
获取复制源二进制日志坐标

如果数据库中没有数据,或者计划关闭源以创建数据快照,可以选择跳过此过程

-- mysql01
-- 会阻止 COMMIT对 InnoDB表的操作
FLUSH TABLES WITH READ LOCK;
-- 确定当前二进制日志文件名和位置
SHOW BINARY LOG STATUS;
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000002 |     1393 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+
选择数据快照的方法

如果源数据库包含现有数据,则有必要将此数据复制到每个副本

# mysql01
# 如果不使用 --source-data,则需要手动锁定单独会话中的所有表
mysqldump -uroot -p --all-databases --source-data > dbdump.db

可以使用mysqldump工具从转储中排除某些数据库。如果要选择要包含在转储中的数据库,请不要使用--all-databases选择以下选项之一

  • --ignore-table 排除数据库中的所有表
  • --databases命名要转储的那些数据库
配置副本
# mysql02
# 导入原始数据
mysql -uroot -p < dbdump.db
# 将源数据库解锁 UNLOCK TABLES
# 修改server_id为2
sed -i 's/server_id=1/server_id=2/' /etc/my.cnf
# 重启mysql
systemctl restart mysqld
-- mysql02
-- 连接到源
CHANGE REPLICATION SOURCE TO \
    SOURCE_HOST='192.168.91.71', \
    SOURCE_USER='repl', \
    SOURCE_PASSWORD='Abc@1234', \
    SOURCE_PUBLIC_KEY_PATH='/data/mysql/etc/public_key.pem', \
    SOURCE_LOG_FILE='binlog.000002', \
    SOURCE_LOG_POS=1393;
-- 开启副本
start replica;
-- 查看 replica 状态
show replica status\G

-- mysql01
use `my_test`;
begin;
insert into `my_user` (`name`, `age`) values ('kobe', 30), ('james', 19);
update `my_user` set `age` = 33 where `id` = 1;
commit;

-- mysql02,可以看到数据已经同步成功
use `my_test`;
select * from `my_user`;
将副本添加到复制环境

可以在不停止源服务器的情况下将另一个副本添加到现有的复制配置中。为此,可以通过复制现有副本的数据目录并为新副本提供不同的服务器 ID(用户指定)和服务器 UUID(在启动时生成)来设置新副本

-- mysql02
-- 停止现有副本并记录副本状态信息,特别是源二进制日志文件和中继日志文件位置
STOP REPLICA;
SHOW REPLICA STATUS\G
# mysql02
# 关闭现有副本
mysqladmin -uroot -p shutdown

# 打包数据文件并发送到mysql03
tar -zcvf mysql_data.tar.gz /data/mysql/data/
scp mysql_data.tar.gz mysql03:/data/mysql
rm -f mysql_data.tar.gz

#启动副本
systemctl start mysqld
# mysql03
cd /data/mysql
# 备份原有/data/mysql/data/目录
tar -zcvf back_data.tar.gz /data/mysql/data/

# 停止mysql
systemctl stop mysqld

rm -rf data/*
tar xf mysql_data.tar.gz -C /
# 从新副本上数据目录的副本中删除该 auto.cnf文件,以便新副本以不同的生成服务器 UUID 启动。服务器 UUID 必须是唯一的
rm -f data/auto.cnf

# 修改server_id为2
sed -i 's/server_id=1/server_id=3/' /etc/my.cnf

# 修改配置文件 /etc/my.cnf 修改配置skip_replica_start=ON,启动时不开启同步
sed -i 's/^#skip_replica_start=ON/skip_replica_start=ON/' /etc/my.cnf

# 启动mysql
systemctl start mysqld

# 查看mysql01和mysql02中的/data/mysql/data/auto.cnf文件,可以看到server-uuid不一样

# 登录mysql
mysql -uroot -p
# 查看 replica 状态,与mysql02中对比,状态正常
show replica status \G
# 开启副本
start replica;
# 再次查看 replica 状态
show replica status \G
# 退出mysql
exit

# 修改配置文件 /etc/my.cnf 注掉配置skip_replica_start=ON
sed -i 's/^skip_replica_start=ON/#skip_replica_start=ON/' /etc/my.cnf
-- mysql01
use `my_test`;
begin;
update `my_user` set `age` = 35 where `id` = 1;
commit;

-- mysql02,可以看到数据已经同步成功
use `my_test`;
select * from `my_user` where `id` = 1;

-- mysql03,可以看到数据已经同步成功
use `my_test`;
select * from `my_user` where `id` = 1;
基于GTID

使用上面的,基于二进制日志的3个mysql节点,下面在mysql01和mysql02上操作,操作完成之后mysql03直接复制mysql02,首先关闭mysql03上的mysqld服务(systemctl stop mysqld)

  1. 同步服务器

此步骤仅在处理尚未使用 GTID 进行复制的现有服务器时需要。对于新服务器,请跳至步骤 3。通过在每个服务器上设置 read_only 系统变量为 ON 来使服务器进入只读模式

-- mysql01,mysql02
-- 等待mysql02与mysql01完全同步
SET @@GLOBAL.read_only = ON;

-- mysql02
-- Replica_SQL_Running_State: Replica has read all relay log; waiting for more updates 表示副本完全同步
show replica status \G

等待所有正在进行的事务提交或回滚。然后,让副本赶上源。非常重要的是,在继续之前必须确保副本已经处理了所有的更新。如果你使用二进制日志做其他用途,例如进行基于时间点的备份和恢复,那么请等待直到你不再需要包含没有 GTID 的事务的旧二进制日志。理想情况下,等待服务器清除所有二进制日志,并等待任何现存的备份过期

理解包含没有 GTID 的事务的日志不能用于启用了 GTID 的服务器这一点很重要。在继续之前,你必须确保拓扑结构中的任何地方都不存在没有 GTID 的事务

  1. 停止两台服务器
# mysql01,mysql02
mysqladmin -uroot -p shutdown
  1. 以启用 GTID 的方式启动两台服务器

为了启用基于 GTID 的复制,每台服务器都必须通过将 gtid_mode 变量设置为 ON 并启用 enforce_gtid_consistency 变量来确保只有对基于 GTID 的复制安全的语句被记录,以此方式启动

[mysqld]
# 在mysqld中添加下面的配置

# 启用基于GTID复制的配置
gtid_mode=ON
enforce_gtid_consistency=ON

# 副本中加上这个配置,等会再移除
skip_replica_start=ON

需要注意的是,当使用 mysql.gtid_executed 表时,不需要启用二进制日志记录即可使用 GTID。但是,源服务器必须始终启用二进制日志记录才能进行复制。然而,副本服务器可以使用 GTID 而不启用二进制日志记录。如果你需要在一个副本服务器上禁用二进制日志记录,可以通过指定 --skip-log-bin 和 --log-replica-updates=OFF 选项来实现

# mysql01,mysql02
sed -i -e 's/^#gtid_mode=ON/gtid_mode=ON/' -e 's/^#enforce_gtid_consistency=ON/enforce_gtid_consistency=ON/'  /etc/my.cnf

# mysql02
sed -i 's/^#skip_replica_start=ON/skip_replica_start=ON/' /etc/my.cnf

# mysql01,mysql02
# 修改配置之后,启动mysql
systemctl start mysqld
  1. 配置副本使用基于 GTID 的自动定位

告诉副本使用带有基于 GTID 的事务的源作为复制数据源,并使用基于 GTID 的自动定位而不是基于文件的定位。在副本上发出 CHANGE REPLICATION SOURCE TO,包括 SOURCE_AUTO_POSITION 选项以告知副本源的事务由 GTID 标识

-- mysql02
-- 连接到源
CHANGE REPLICATION SOURCE TO \
    SOURCE_HOST='192.168.91.71', \
    SOURCE_USER='repl', \
    SOURCE_PASSWORD='Abc@1234', \
    SOURCE_PUBLIC_KEY_PATH='/data/mysql/etc/public_key.pem', \
    SOURCE_AUTO_POSITION=1;
  1. 创建新的备份

现在你已经在服务器上启用了 GTID,之前的备份将无法再在这台服务器上使用。此时应创建一个新的备份,以确保你不会没有可用的备份。例如,你可以在要进行备份的服务器上执行 FLUSH LOGS。然后要么显式地进行备份,要么等待你设置的任何定期备份例行程序的下一个迭代

  1. 启动副本并禁用只读模式
-- mysql02

-- 开启副本
start replica;
-- 查看 replica 状态
show replica status\G

-- mysql01,mysql02

-- 下面的步骤仅在你在步骤 1 中将服务器配置为只读时才必要。为了让服务器重新开始接受更新
SET @@GLOBAL.read_only = OFF;
-- 验证
-- mysql01
use `my_test`;
begin;
update `my_user` set `age` = 45 where `id` = 1;
commit;

-- mysql02,可以看到数据已经同步成功
use `my_test`;
select * from `my_user` where `id` = 1;
# mysql02
# 修改配置文件 /etc/my.cnf 注掉配置skip_replica_start=ON
sed -i 's/^skip_replica_start=ON/#skip_replica_start=ON/' /etc/my.cnf
  1. 添加新的副本节点

参考"基于二进制日志"中"将副本添加到复制环境"

# mysql03
# 需要先修改配置,启用GTID复制
sed -i -e 's/^#gtid_mode=ON/gtid_mode=ON/' -e 's/^#enforce_gtid_consistency=ON/enforce_gtid_consistency=ON/'  /etc/my.cnf

复制看到 19.1.3.6

组复制

准备

在上面复制的基础上配置组复制

-- 所有节点
stop replica;
reset replica all;
# mysql01
# 修改配置文件,支持组复制
sed -i \
-e 's/^#disabled_storage_engines/disabled_storage_engines/' \
-e 's/^#gtid_mode/gtid_mode/' \
-e 's/^#enforce_gtid_consistency/enforce_gtid_consistency/' \
-e 's/^#plugin_load_add/plugin_load_add/' \
-e 's/^#group_replication_group_name/group_replication_group_name/' \
-e 's/^#group_replication_start_on_boot/group_replication_start_on_boot/' \
-e 's/^#group_replication_local_address/group_replication_local_address/' \
-e 's/^#group_replication_group_seeds/group_replication_group_seeds/' \
-e 's/^#group_replication_bootstrap_group/group_replication_bootstrap_group/' \
-e 's/^#group_replication_recovery_public_key_path/group_replication_recovery_public_key_path/' \
/etc/my.cnf

# 重启mysql
systemctl restart mysqld
-- mysql01
-- 查看group_replication插件是否安装
SHOW PLUGINS;
+----------------------------------+----------+--------------------+----------------------+---------+
| Name                             | Status   | Type               | Library              | License |
+----------------------------------+----------+--------------------+----------------------+---------+
| binlog                           | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
(...)
| group_replication                | ACTIVE   | GROUP REPLICATION  | group_replication.so | GPL     |
+----------------------------------+----------+--------------------+----------------------+---------+

-- 创建复制用户

-- 临时关闭binlog日志,下面的操作就不会被复制(这里创建复制用户可以不关闭,这样在其它节点就不用重复创建复制用户)
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED BY 'Abc@1234';
-- 注意下面的用户host限制一定要是%,因为复制时会使用主机名(mysql01-mysql03),但是配置文件中配置的是ip,所以这里使用%
-- 为了能够通过分布式恢复连接到源以获取数据
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
-- 确保当涉及的任一服务器被置于离线模式时,Group Replication 连接不会被终止
GRANT CONNECTION_ADMIN ON *.* TO rpl_user@'%';
-- 如果复制组中的服务器已设置为支持克隆操作,此权限是成员作为源参与分布式恢复克隆操作所必需的
GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';
-- 如果 MySQL 通信栈用于复制组,此权限是用户账户使用 MySQL 通信栈建立和维护 Group Replication 连接所必需的
GRANT GROUP_REPLICATION_STREAM ON *.* TO rpl_user@'%';

FLUSH PRIVILEGES;
# 启用binlog日志
SET SQL_LOG_BIN=1;

引导组

使用 group_replication_bootstrap_group 系统变量来引导一个组。引导应该只由一台服务器执行,即启动组的服务器,并且只能执行一次。这就是为什么 group_replication_bootstrap_group 选项的值没有存储在实例的选项文件中。如果保存在选项文件中,在服务器重启时它会自动引导一个具有相同名称的第二个组,这将导致存在两个不同但同名的组。同样的逻辑适用于在设置此选项为 ON 的情况下停止和重新启动插件

-- mysql01
-- 引导组
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION USER='rpl_user', PASSWORD='Abc@1234';
SET GLOBAL group_replication_bootstrap_group=OFF;
-- 一旦 START GROUP_REPLICATION 语句返回,组就已经启动。你可以检查组是否已经创建并且有一个成员
-- 这张表中的信息确认组中有一个成员,其唯一标识符为 c0c86495-d926-11ef-afd1-000c296f0e50,状态为 ONLINE,并且位于 mysql01 上监听客户端连接的端口为 3306,角色是 PRIMARY
SELECT * FROM performance_schema.replication_group_members\G
*************************** 1. row ***************************
              CHANNEL_NAME: group_replication_applier
                 MEMBER_ID: c0c86495-d926-11ef-afd1-000c296f0e50
               MEMBER_HOST: mysql01
               MEMBER_PORT: 3306
              MEMBER_STATE: ONLINE
               MEMBER_ROLE: PRIMARY
            MEMBER_VERSION: 8.4.4
MEMBER_COMMUNICATION_STACK: XCom

-- 为了演示服务器确实处于组中并能够处理负载,可以创建一个表并向其中添加一些内容
CREATE DATABASE test;
USE test;
CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
INSERT INTO t1 VALUES (1, 'Luis');
SELECT * FROM t1;

-- 查询最新的日志
SHOW BINARY LOG STATUS\G
*************************** 1. row ***************************
             File: binlog.000004
         Position: 909
     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set: aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-3,
c0c86495-d926-11ef-afd1-000c296f0e50:1

-- 可以看到,数据库和表对象已被创建,并且相应的 DDL(数据定义语言)语句已被写入二进制日志。此外,数据被插入到表中,并且这些插入操作也被记录到了二进制日志中。因此,这些日志可以用于通过状态传输从源的二进制日志进行分布式恢复
SHOW BINLOG EVENTS IN 'binlog.000004';
+...+----------------+...+---------------------------------------------------------------------------------+
|...| Event_type     |...| Info                                                                            |
+...+----------------+...+---------------------------------------------------------------------------------+
|...| Format_desc    |...| Server ver: 8.4.4, Binlog ver: 4                                                |
|...| Previous_gtids |...| c0c86495-d926-11ef-afd1-000c296f0e50:1                                          |
|...| Gtid           |...| SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1'               |
|...| Query          |...| CREATE DATABASE test /* xid=18 */                                               |
|...| Gtid           |...| SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:2'               |
|...| Query          |...| use `test`; CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL) /* xid=23 */ |
|...| Gtid           |...| SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:3'               |
|...| Query          |...| BEGIN                                                                           |
|...| Table_map      |...| table_id: 97 (test.t1)                                                          |
|...| Write_rows     |...| table_id: 97 flags: STMT_END_F                                                  |
|...| Xid            |...| COMMIT /* xid=24 */                                                             |
+...+----------------+...+---------------------------------------------------------------------------------+

向组中添加实例

# mysql02
# 修改配置文件,支持组复制
sed -i \
-e 's/^server_id=1/server_id=2/' \
-e 's/^#disabled_storage_engines/disabled_storage_engines/' \
-e 's/^#gtid_mode/gtid_mode/' \
-e 's/^#enforce_gtid_consistency/enforce_gtid_consistency/' \
-e 's/^#plugin_load_add/plugin_load_add/' \
-e 's/^#group_replication_group_name/group_replication_group_name/' \
-e 's/^#group_replication_start_on_boot/group_replication_start_on_boot/' \
-e 's/^#group_replication_local_address=.*/group_replication_local_address= "192.168.91.72:33061"/' \
-e 's/^#group_replication_group_seeds/group_replication_group_seeds/' \
-e 's/^#group_replication_bootstrap_group/group_replication_bootstrap_group/' \
-e 's/^#group_replication_recovery_public_key_path/group_replication_recovery_public_key_path/' \
/etc/my.cnf

# 重启mysql
systemctl restart mysqld
-- mysql02
-- 创建复制用户,与mysql01上的操作一样
SET SQL_LOG_BIN=0;

CREATE USER rpl_user@'%' IDENTIFIED BY 'Abc@1234';
GRANT REPLICATION SLAVE,CONNECTION_ADMIN,BACKUP_ADMIN,GROUP_REPLICATION_STREAM ON *.* TO rpl_user@'%';

FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;

-- 加入组
CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user', SOURCE_PASSWORD='Abc@1234' FOR CHANNEL 'group_replication_recovery';
START GROUP_REPLICATION USER='rpl_user', PASSWORD='Abc@1234';
# mysql03
# 修改配置文件,支持组复制
sed -i \
-e 's/^server_id=1/server_id=3/' \
-e 's/^#disabled_storage_engines/disabled_storage_engines/' \
-e 's/^#gtid_mode/gtid_mode/' \
-e 's/^#enforce_gtid_consistency/enforce_gtid_consistency/' \
-e 's/^#plugin_load_add/plugin_load_add/' \
-e 's/^#group_replication_group_name/group_replication_group_name/' \
-e 's/^#group_replication_start_on_boot/group_replication_start_on_boot/' \
-e 's/^#group_replication_local_address=.*/group_replication_local_address= "192.168.91.73:33061"/' \
-e 's/^#group_replication_group_seeds/group_replication_group_seeds/' \
-e 's/^#group_replication_bootstrap_group/group_replication_bootstrap_group/' \
-e 's/^#group_replication_recovery_public_key_path/group_replication_recovery_public_key_path/' \
/etc/my.cnf

# 重启mysql
systemctl restart mysqld
-- mysql03
-- 创建复制用户,与mysql01上的操作一样
SET SQL_LOG_BIN=0;

CREATE USER rpl_user@'%' IDENTIFIED BY 'Abc@1234';
GRANT REPLICATION SLAVE,CONNECTION_ADMIN,BACKUP_ADMIN,GROUP_REPLICATION_STREAM ON *.* TO rpl_user@'%';

FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;

-- 加入组
CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user', SOURCE_PASSWORD='Abc@1234' FOR CHANNEL 'group_replication_recovery';
START GROUP_REPLICATION USER='rpl_user', PASSWORD='Abc@1234';

-- 查看组成员
SELECT MEMBER_HOST,MEMBER_PORT,MEMBER_STATE,MEMBER_ROLE,MEMBER_VERSION FROM performance_schema.replication_group_members;
+-------------+-------------+--------------+-------------+----------------+
| MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+-------------+-------------+--------------+-------------+----------------+
| mysql03     |        3306 | ONLINE       | SECONDARY   | 8.4.4          |
| mysql01     |        3306 | ONLINE       | PRIMARY     | 8.4.4          |
| mysql02     |        3306 | ONLINE       | SECONDARY   | 8.4.4          |
+-------------+-------------+--------------+-------------+----------------+
# 所有节点,修改配置,组复制自启动
sed -i 's/group_replication_start_on_boot=off/group_replication_start_on_boot=on/' /etc/my.cnf
# 验证组复制
-- mysql01
use `my_test`;
update `my_user` set `age` = 100 where `id` = 1;

-- mysql02,mysql03,可以看到数据已经同步成功
use `my_test`;
select * from `my_user` where `id` = 1;

20.5.1.1 Changing the Primary

mysql shell

基于上面的mysql组复制服务器

# mysql01

# 下载mysql shell
# https://cdn.mysql.com//Downloads/MySQL-Shell/mysql-shell-8.4.4-1.el7.x86_64.rpm
rpm -ivh mysql-shell-8.4.4-1.el7.x86_64.rpm

# 如果报错,则安装依赖包,libyaml-0.so.2()(64bit) is needed by mysql-shell-8.4.4-1.el7.x86_64
yum -y install libyaml
# 再次重新安装即可
rpm -ivh mysql-shell-8.4.4-1.el7.x86_64.rpm

# 删除安装包
rm -f mysql-shell-8.4.4-1.el7.x86_64.rpm

# 进入mysql shell
mysqlsh

mysql router

# mysql01
# 创建用户和组
groupadd mysqlrouter
useradd --system --create-home --home-dir /data/mysqlrouter --gid mysqlrouter --shell /bin/false mysqlrouter
# 下载mysql router
# https://cdn.mysql.com//Downloads/MySQL-Router/mysql-router-community-8.4.4-1.el7.x86_64.rpm
rpm -ivh mysql-router-community-8.4.4-1.el7.x86_64.rpm

InnoDB Cluster

准备配置文件

[mysqld]
# 默认为1,在复制场景中,不同的mysql节点设置不同的值
server_id=1
datadir=/data/mysql/data
socket=/data/mysql/data/mysql.sock

log_error=/data/mysql/log/mysql_error.log
pid_file=/data/mysql/data/mysql.pid

user=mysql
port=3306

# 启用基于GTID复制的配置,下面两个配置默认都为OFF
gtid_mode=ON
enforce_gtid_consistency=ON

# 配置时区,第一次启动不要启用,否则会报错
#default_time_zone='Asia/Shanghai'
# 配置日志的时区,跟随系统,如果不配置会使用UTC时区,可能通过设置TZ环境变量也可以解决这个问题
log_timestamps=SYSTEM

# 启用慢查询日志
slow_query_log=ON
# 指定慢查询日志文件路径
slow_query_log_file=/data/mysql/log/mysql_slow.log

character_set_server=UTF8MB4

# 设置大小写不敏感
lower_case_table_names=1

[client]
socket=/data/mysql/data/mysql.sock
port=3306

部署

准备单机环境

准备192.168.91.71-192.168.91.733个节点,内存2G,CPU2C,硬盘20GB,主机名称mysql01-mysql03

# 所有节点

# hosts 配置
cat >> /etc/hosts << "EOF"
192.168.91.71  mysql01
192.168.91.72  mysql02
192.168.91.73  mysql03
EOF

# 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld

# 关闭selinux
sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0

# 时间同步配置,最小化安装系统需要安装ntpdate软件
yum -y install ntpdate
echo "0 */1 * * * ntpdate time1.aliyun.com" >> /var/spool/cron/root
systemctl enable ntpdate && systemctl start ntpdate

# 创建linux中mysql用户
groupadd mysql
mkdir /data
useradd --system --create-home --home-dir /data/mysql --gid mysql --shell /bin/false mysql
# 设置最大文件描述符
echo "mysql soft nofile 65535" >> /etc/security/limits.conf
echo "mysql hard nofile 65535" >> /etc/security/limits.conf
# 创建mysql数据目录和日志目录
mkdir -p /data/mysql/{data,log}
chown -R mysql:mysql /data/mysql

# 准备离线安装mysql文件
cd /data/mysql
# 下载mysql离线安装包,并安装
# https://cdn.mysql.com//Downloads/MySQL-8.4/mysql-8.4.4-1.el7.x86_64.rpm-bundle.tar
tar xf mysql-8.4.4-1.el7.x86_64.rpm-bundle.tar
rpm -ivh mysql-community-common-8.4.4-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-plugins-8.4.4-1.el7.x86_64.rpm
yum -y remove mariadb-libs
rpm -ivh mysql-community-libs-8.4.4-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-8.4.4-1.el7.x86_64.rpm
rpm -ivh mysql-community-icu-data-files-8.4.4-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.4.4-1.el7.x86_64.rpm
rm -f mysql-community-*.rpm
rm -f mysql-8.4.4-1.el7.x86_64.rpm-bundle.tar

# 备份原始的mysql配制文件
mv /etc/my.cnf /etc/my.cnf.back
# 将上面准备的配置文件,复制到 /etc/my.cnf
# 分别将配置文件中的server_id修改为1,2,3

# 启动mysql,并设置开机自启
systemctl enable mysqld --now

# 查看mysql密码
cat /data/mysql/log/mysql_error.log | grep password
2025-01-26T13:52:47.366699+08:00 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: L1Yx,lg&#qAi

# 分别登录3个mysql服务,修改root密码,并创建复制用户

# 输入密码登录mysql
mysql -uroot -p

# 修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Abc@1234';
# 刷新权限
FLUSH PRIVILEGES;
exit

# 加载时区,需要输入root密码
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -uroot -p mysql

# 将 /etc/my.cnf 配置文件中的 default-time-zone 配置启用,然后重启mysql服务
sed -i 's/^#default_time_zone/default_time_zone/' /etc/my.cnf
systemctl restart mysqld

# 下载mysql shell
# https://cdn.mysql.com//Downloads/MySQL-Shell/mysql-shell-8.4.4-1.el7.x86_64.rpm

# 安装
yum -y install libyaml
rpm -ivh mysql-shell-8.4.4-1.el7.x86_64.rpm

# 删除安装包
rm -f mysql-shell-8.4.4-1.el7.x86_64.rpm

# 进入mysql shell
mysqlsh

# 下面在mysql shell中操作

\js

# InnoDB Cluster 服务器配置账户
# configureInstance会禁用二进制日志,需要在所有节点创建用户
# 需要输入密码,密码需要记住
dba.configureInstance('root@localhost:3306',{'clusterAdmin':'clusterAdmin'})

# 退出mysqlsh
\q
部署集群
# mysql01

# 进入mysql shell
mysqlsh clusterAdmin@mysql01:3306

# 下面在mysql shell中操作

\js

# 校验所有实例,需要输入密码,出现"status": "ok"表示校验成功
dba.checkInstanceConfiguration('clusterAdmin@mysql01:3306')
dba.checkInstanceConfiguration('clusterAdmin@mysql02:3306')
dba.checkInstanceConfiguration('clusterAdmin@mysql03:3306')

# 创建集群
var cluster = dba.createCluster('testCluster')
# 查看集群状态
cluster.status()

# 创建InnoDB Cluster 管理员账户,会提示输入密码,密码需要记住
cluster.setupAdminAccount("icadmin")

# 向集群中添加新实例
# 按照提示输入c,进行克隆
cluster.addInstance('clusterAdmin@mysql02:3306')
cluster.addInstance('clusterAdmin@mysql03:3306')
# mysql01
# 如果所有节点都重启了,需要通过命令重启
# 进入mysql shell
mysqlsh clusterAdmin@mysql01:3306

\js
dba.rebootClusterFromCompleteOutage()
# mysql01

# 安装mysql router
# 创建用户和组
groupadd mysqlrouter
useradd --system --create-home --home-dir /data/mysqlrouter --gid mysqlrouter --shell /bin/false mysqlrouter
# 下载mysql router
# https://cdn.mysql.com//Downloads/MySQL-Router/mysql-router-community-8.4.4-1.el7.x86_64.rpm
rpm -ivh mysql-router-community-8.4.4-1.el7.x86_64.rpm

# 引导mysqlrouter
# --account指定mysql用户(可以先把用户创建好,如果没有这里会自动创建,会提示输入密码,密码需要记住),--user 指定linux中什么用户启动
mysqlrouter --bootstrap clusterAdmin@mysql01:3306 --account mysqlrouter --user mysqlrouter --conf-bind-address 192.168.91.71

# 启动并设置开机自启
systemctl enable mysqlrouter --now

# 登录mysql
mysqlsh
# 创建业务账户和数据库
CREATE USER 'my_test'@'%' IDENTIFIED BY 'Abc@1234';
GRANT ALL PRIVILEGES ON my_test.* TO 'my_test'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
# 创建数据库
create database `my_test` default character set utf8mb4 collate utf8mb4_general_ci;
\q

# 使用业务账号登录mysqlrouter端口,验证集群
mysql -u my_test -h algorithm01 -P 6446 -p

use `my_test`;
create table `my_user`(
    `id` bigint not null auto_increment comment '主键id',
    `name` varchar(32) not null comment '名字',
    `age` int  not null comment '年龄',
    `create_time` datetime default current_timestamp comment '创建时间',
    primary key (`id`) using btree
) engine = innodb auto_increment = 1 default charset = utf8mb4 collate = utf8mb4_unicode_ci comment = '用户信息';
insert into `my_user` (`name`, `age`) values ('张三', 18), ('李四', 19), ('王五', 20), ('赵六', 21);