麒麟系统V10部署MySQL8及主从复制

麒麟系统V10部署MySQL8及主从复制🫚


CPU架构是arm版,需下载对应的MySQL包。ARM 架构请用 aarch64 包。

一. 下载安装包

官网:https://dev.mysql.com/downloads/mysql/8.0.html

复制代码
[root@localhost ~]# wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.44-linux-glibc2.28-aarch64.tar.xz

二. 安装部署

安装主库,从库也是如此,在此不赘述。

如有mariadb,先卸载再安装MySQL。

复制代码
[root@localhost ~]# rpm -qa | grep -i mariadb
[root@localhost ~]# rpm -e --nodeps $(rpm -qa | grep -i mariadb)

解压安装:

复制代码
[root@localhost ~]# tar -xvf mysql-8.0.44-linux-glibc2.28-aarch64.tar.xz -C /usr/local/
[root@localhost local]# cd /usr/local/
[root@localhost local]# mv mysql-8.0.44-linux-glibc2.28-aarch64/ mysql-8.0.44

创建mysql用户及组:

复制代码
[root@localhost ~]# groupadd mysql
[root@localhost ~]# useradd -r -g mysql -s /sbin/nologin mysql

创建数据及日志目录:

复制代码
[root@localhost ~]# mkdir /var/lib/mysql
[root@localhost ~]# mkdir /var/lib/mysql/data
[root@localhost ~]# chown -R mysql:mysql /var/lib/mysql
[root@localhost ~]# mkdir /var/log/mysql
[root@localhost ~]# chown -R mysql:mysql /var/log/mysql

创建MySQL配置文件:

复制代码
cat /etc/my.cnf
[client]
# 默认连接 MySQL 时使用的字符集
default-character-set=utf8mb4
socket=/var/lib/mysql/mysql.sock


[mysqld]
user=mysql
socket=/var/lib/mysql/mysql.sock
port=3306
pid-file=/var/lib/mysql/mysql.pid
basedir=/usr/local/mysql-8.0.44
datadir=/var/lib/mysql/data

lower_case_table_names = 1


#日志配置
log-error=/var/log/mysql/error.log
slow-query-log=1
slow-query-log-file=/var/log/mysql/mysql-slow.log
long_query_time=2
binlog_expire_logs_seconds=604800

# 字符集设置及排序规则
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
default-authentication-plugin=mysql_native_password

配置MySQL环境变量:

复制代码
[root@localhost ~]# vim /etc/profile
export PATH=$PATH:/usr/local/mysql-8.0.44/bin
[root@localhost ~]# source /etc/profile

初始化MySQL:

bash 复制代码
[root@localhost ~]# /usr/local/mysql-8.0.44/bin/mysqld  --defaults-file=/etc/my.cnf --initialize-insecure --user=mysql

使用system管理MySQL(推荐):

bash 复制代码
[root@localhost ~]# vim /usr/lib/systemd/system/mysql.service
[Unit]
Description=MySQL Server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=simple
User=mysql
Group=mysql
ExecStart=/usr/local/mysql-8.0.44/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE=65535
LimitCORE=0
Restart=on-failure
RestartSec=10
PrivateTmp=true

[Install]
WantedBy=multi-user.target

开机自启MySQL:

复制代码
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl enable --now mysql

登录MySQL并修改密码:

本地首次使用sock文件登录mysql是不需要密码的。

bash 复制代码
[root@localhost ~]# mysql -S /var/lib/mysql/mysql.sock

mysql> alter user 'root'@'localhost' identified by '123456';
mysql> flush privileges;

修改密码后,就不能用sock方式登录,需要用以下方式登录:

bash 复制代码
[root@localhost ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.44 MySQL Community Server - GPL

Copyright (c) 2000, 2025, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

三. 配置主从复制

采用GTID方式配置主从复制。

GTID(Global Transaction Identifier,全局事务标识符)是 MySQL 5.6 引入,并在 8.0 版本中完善的一项核心技术。它为每一个提交的事务分配一个在全复制拓扑结构内全球唯一的编号。

1. GTID 的构成

一个 GTID 的格式通常如下: 3E11FA47-71CA-11E1-9E33-C80AA9429562:23

它分为两部分:

  • Source_ID (UUID): 产生该事务的源服务器的唯一标识(在 auto.cnf 中定义)。

  • Transaction_ID: 在该服务器上产生的事务序列号,从 1 开始自增。

2. GTID 同步的工作原理

  1. 产生标识: 当主库(Master)提交一个事务时,会自动给这个事务分配一个 GTID,并记录到 binlog 中。

  2. 传输日志: 事务传送到从库(Slave)并存储在 relay log 中。从库会读取这个 GTID 并将其设置为自己的 Retrieved_Gtid_Set

  3. 执行并排除: 从库的 SQL 线程读取事务。在执行前,它先检查这个 GTID 是否已经在自己的 Executed_Gtid_Set(已执行清单)中。

    • 如果没有:执行该事务。

    • 如果已经有:说明该事务已经同步过,直接忽略(这种幂等性保证了数据不会重复)。

192.168.10.1(主库)

192.168.10.2(从库)

3.1 配置 my.cnf(重点)

Master 节点 /etc/my.cnf

bash 复制代码
[root@localhost ~]# vim /etc/my.cnf
[client]
# 默认连接 MySQL 时使用的字符集
default-character-set=utf8mb4
socket=/var/lib/mysql/mysql.sock

[mysqld]
# ===== 基础配置 =====
user=mysql
port=3306
basedir=/usr/local/mysql-8.0.44
datadir=/var/lib/mysql/data
socket=/var/lib/mysql/mysql.sock
pid-file=/var/lib/mysql/mysql.pid


# ===== 表名大小写 =====
lower_case_table_names=1


# ===== InnoDB核心配置 =====
#innodb_data_file_path=ibdata1:12M:autoextend
#innodb_buffer_pool_size=128M
#innodb_log_file_size=48M
#innodb_file_per_table=ON


# ===== 主从配置 =====
server-id=1
log-bin=mysql-bin  # 使用相对路径,会在datadir下创建
#log-bin=/var/lib/mysql/binlog/mysql-bin


# ===== GTID 核心 =====
gtid_mode=ON
enforce_gtid_consistency=ON
log_replica_updates=ON  

# ===== 日志配置 =====
log-error=/var/log/mysql/error.log
slow-query-log=1
slow-query-log-file=/var/log/mysql/mysql-slow.log
long_query_time=2
binlog_expire_logs_seconds=604800

# ===== 字符集配置 =====
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
authentication_policy=mysql_native_password

Slave 节点 /etc/my.cnf

bash 复制代码
[root@localhost ~]# vim /etc/my.cnf
[client]
# 默认连接 MySQL 时使用的字符集
default-character-set=utf8mb4
socket=/var/lib/mysql/mysql.sock


[mysqld]
user=mysql
socket=/var/lib/mysql/mysql.sock
port=3306
pid-file=/var/lib/mysql/mysql.pid
basedir=/usr/local/mysql-8.0.44
datadir=/var/lib/mysql/data

lower_case_table_names = 1


#主从配置
server-id=2
log-bin=mysql-bin
binlog_format=ROW
relay-log=/var/lib/mysql/binlog/relay-bin

#设置只读
#read_only=1
#super_read_only=1

# ===== GTID 核心 =====
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON


#日志配置
log-error=/var/log/mysql/error.log
slow-query-log=1
slow-query-log-file=/var/log/mysql/mysql-slow.log
long_query_time=2
binlog_expire_logs_seconds=604800

# 字符集设置及排序规则
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
default-authentication-plugin=mysql_native_password

3.2 主库配置(Master)

1️⃣ 创建复制用户
sql 复制代码
mysql> CREATE USER 'repl'@'192.168.10.%' IDENTIFIED BY 'Repl@123';
       GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.10.%';
mysql> FLUSH PRIVILEGES;

3.3 从库配置(Slave)

1️⃣ 设置主库信息(不再指定 binlog)
sql 复制代码
mysql> CHANGE MASTER TO
    -> MASTER_HOST='192.168.10.1',
    -> MASTER_USER='repl',
    -> MASTER_PASSWORD='Repl@123',
    -> MASTER_PORT=3306,
    -> SOURCE_AUTO_POSITION=1;
2️⃣ 启动复制
sql 复制代码
mysql> START SLAVE;
3️⃣ 检查状态
sql 复制代码
mysql> SHOW SLAVE STATUS\G

必须看到:

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Auto_Position: 1

Retrieved_Gtid_Set: uuid:1-xxx

Executed_Gtid_Set: uuid:1-xxx

Seconds_Behind_Master: 0

sql 复制代码
mysql> SHOW SLAVE STATUS\G

*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 192.168.10.1
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 870
               Relay_Log_File: relay-bin.000003
                Relay_Log_Pos: 1086
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 870
              Relay_Log_Space: 2194
              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: bd6584ff-dfad-11f0-b121-00163e32e122
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Replica 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: bd6584ff-dfad-11f0-b121-00163e32e122:1-6
            Executed_Gtid_Set: bd6584ff-dfad-11f0-b121-00163e32e122:1-6
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
1 row in set, 1 warning (0.00 sec)
3.4 验证 GTID 主从

主库

sql 复制代码
主库

mysql> CREATE DATABASE gtid_test;
Query OK, 1 row affected (0.00 sec)

mysql> CREATE TABLE gtid_test.t1(id INT);
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO gtid_test.t1 VALUES (100);
Query OK, 1 row affected (0.01 sec)

从库

sql 复制代码
从库
mysql> SELECT * FROM gtid_test.t1;
+------+
| id   |
+------+
|  100 |
+------+
1 row in set (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| gtid_test          |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

验证成功!

相关推荐
猿小喵2 小时前
记录一次TDSQL-MySQL数据库主从延迟导致批量报错
数据库·mysql
别多香了2 小时前
MySQL 部署安装与核心板块
数据库·mysql
Wang's Blog2 小时前
Kafka: Connect 实战之MySQL 数据双向同步集成方案
mysql·kafka
大数据追光猿2 小时前
【大数据生产问题】Flink CDC 同步 MySQL 到 StarRocks 时因字段新增导致任务失败?
大数据·数据库·mysql·flink
青石路2 小时前
用了MySQL的INSERT ON DUPLICATE KEY UPDATE,怎么还报唯一索引冲突错误
后端·sql·mysql
·云扬·2 小时前
MySQL大批量数据导入性能优化:从原理到实践
数据库·mysql·性能优化
追随者永远是胜利者2 小时前
mysql中三大日志文件的写入/刷盘时机
mysql·binlog·undolog·redolog
weixin_462446233 小时前
【原创实践】使用 Docker 在 MySQL 容器中批量导出所有数据库
数据库·mysql·docker
苹果醋33 小时前
24.记录Vue项目iview组件日期获取时间少一天
java·运维·spring boot·mysql·nginx