暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

linux Rocky 9.x安装mysql8.4版主从实例

286

操作步骤

一、安装mysql-server master

1.安装mysql_server


1. 安装mysql-server
# 移除旧的 MySQL 源
rm -f etc/yum.repos.d/mysql-community.repo

# 添加 MySQL 8.0 官方源(选择最新 GA 版本)
wget https://repo.mysql.com//mysql84-community-release-el9-1.noarch.rpm
sudo dnf install mysql84-community-release-el9-1.noarch.rpm

# 安装 MySQL 8.0(自动选择兼容 OpenSSL 3 的版本)
dnf install -y mysql-community-server

2. 修改mysql默认配置

1.设置mysql启动用户,创建目录&权限设置

# 设置mysql启动用户 
sudo mkdir -p data/mysql/mysqldata
sudo mkdir -p data/mysql/log
sudo mkdir -p data/mysql/run
sudo chown -R mysql:mysql data/mysql
sudo chmod 750 data/mysql/mysqldata data/mysql/log /data/mysql/run

2.修改默认配置:

[mysqld]
# 基本设置
user=mysql
basedir=/usr
datadir=/data/mysql/mysqldata
socket=/data/mysql/run/mysql.sock
pid-file=/data/mysql/run/mysqld.pid

# 网络设置
port=3306
bind-address=0.0.0.0
skip-name-resolve

# 日志路径
log-error=/data/mysql/log/mysqld.log
slow_query_log=ON
slow_query_log_file=/data/mysql/log/slow.log
long_query_time=2

# 二进制日志与主从
server-id=1                          # 主从唯一
log-bin=/data/mysql/log/mysql-bin
binlog_format=ROW
gtid_mode=ON
enforce-gtid-consistency=ON
log_slave_updates=ON
relay_log=/data/mysql/log/relay-log
relay_log_recovery=ON

# 资源调优(8C16G)
innodb_buffer_pool_size=10G
innodb_log_file_size=1G
innodb_log_buffer_size=64M
innodb_flush_log_at_trx_commit=1
sync_binlog=1
max_connections=5000
max_allowed_packet=64M
thread_cache_size=64
table_open_cache=4096

# 安全性
symbolic-links=0


3.初始化数据库

mysqld --initialize --datadir=/data/mysql/mysqldata --user=mysql

4.启动并设置开机自启mysql服务

sudo systemctl start mysqld
sudo systemctl enable mysqld

5.查看部署mysql服务的默认密码

grep 'temporary password' /data/mysql/log/mysqld.log

2025-06-23T05:44:59.193373Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: YKxy&ud7sht+
密码:YKxy&ud7sht.

6. 安全设置

mysql_secure_installation --socket=/data/mysql/run/mysql.socket

7.登录mysql

修改root账号允许所有主机登录

UPDATE mysql.user SET Host='%' WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;

二、创建从库

1. 创建复制账号

CREATE USER 'repl_user'@'%' IDENTIFIED BY 'avwoVX.M1uWCDgUvk';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;

2. 配置从库

安装操作与主库安装一致,与主库不同的是,从库要设置与主库不同的server_id,并且以只读启动。

与主库不同的是:
server-id=2                     # 主从唯一
read_only=ON

完整配置如下:

[mysqld]
# 基本设置
user=mysql
basedir=/usr
datadir=/data/mysql/mysqldata
socket=/data/mysql/run/mysql.sock
pid-file=/data/mysql/run/mysqld.pid

# 网络设置
port=3306
bind-address=0.0.0.0
skip-name-resolve

# 日志路径
log-error=/data/mysql/log/mysqld.log
slow_query_log=ON
slow_query_log_file=/data/mysql/log/slow.log
long_query_time=2

# 二进制日志与主从
server-id=2                     # 主从唯一
read_only=ON
#super_read_only=ON
log-bin=/data/mysql/log/mysql-bin
binlog_format=ROW
gtid_mode=ON
enforce-gtid-consistency=ON
log_slave_updates=ON
relay_log=/data/mysql/log/relay-log
relay_log_recovery=ON

# 资源调优(8C16G)
innodb_buffer_pool_size=10G
innodb_log_file_size=1G
innodb_log_buffer_size=64M
innodb_flush_log_at_trx_commit=1
sync_binlog=1
max_connections=5000
max_allowed_packet=64M
thread_cache_size=64
table_open_cache=4096

# 安全性
symbolic-links=0

2. 修改root用户密码

grep 'temporary password' /data/mysql/log/mysqld.log
2025-06-23T06:49:22.817938Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: P*kr+6s;&Ryp

ALTER USER 'root'@'%' IDENTIFIED BY 'avwoVX+M1uWCDgUvk';

3.设置从库链接到主库

# 链接到主库
CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='xxxxx',
  SOURCE_USER='repl_user',
  SOURCE_PASSWORD='avwoVX.M1uWCDgUvk',
  SOURCE_PORT=3306,
  SOURCE_LOG_FILE='mysql-bin.000007'
  SOURCE_LOG_POS=485,
  SOURCE_CONNECT_RETRY=10;

# `SOURCE_LOG_FILE` 和 `SOURCE_LOG_POS` 指定了**复制起点**,**之前的数据不会复制**,所以从库数据必须在这之前手动导入完成,否则数据会不一致。

# 开启复制
START replica;
# 查看复制状态
SHOW replica STATUS\G

8.4版本以前,使用change master to,8.4版本后使用CHANGE REPLICATION SOURCE TO 。

4.可能遇到的错误

Last_IO_Error: Error connecting to source 'repl_user@xxxx:3306'. This was attempt 2/10, with a delay of 10 seconds between attempts. Message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.

说明:

从库在连接主库时,主库使用了 caching_sha2_password
 认证插件,而这个认证方式在非加密连接中要求使用 SSL 或 RSA 加密,而连接是 明文未加密的 TCP,所以失败了。

背景解释:caching_sha2_password

  • 是 MySQL 8.0 默认的认证插件(代替了旧的 mysql_native_password
  • 更安全,但 在无 SSL 连接时必须启用 RSA 公钥交换
  • 默认配置下从库不支持这种交换(尤其在无 SSL 的 MySQL 复制场景)

解决方案:

复制用户改为 mysql_native_password
(推荐)

在 主库上执行

ALTER USER 'repl_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'
FLUSH PRIVILEGES;

这样从库就可以用传统认证方式连接主库,不需要 SSL,也不需要额外配置

这个过程中可能遇到的问题是,服务器未启用mysql_native_password,可以通过show plugins查看。

1) 安装mysql_native_password插件 install plugin mysql_native_password SONAME 'mysql_native_password';

2) 启用插件 修改my.cnf,增加一行

[mysqld]
mysql_native_password=ON

3)重启mysqld服务

5. 重置复制状态

# 暂停同步
stop replica;

# 重置同步
reset replica all;

# 重新配置链接
# 链接到主库
CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='xxxxx',
  SOURCE_USER='repl_user',
  SOURCE_PASSWORD='avwoVX.M1uWCDgUvk',
  SOURCE_PORT=3306,
  SOURCE_LOG_FILE='mysql-bin.000007'
  SOURCE_LOG_POS=485,
  SOURCE_CONNECT_RETRY=10;
# 开启复制
START replica;
# 查看复制状态
SHOW replica STATUS\G

6. show replica status的解析

mysql> show replica status\G;
*************************** 1. row ***************************
             Replica_IO_State: Waiting forsource to send event
                  Source_Host: xxxxxx
                  Source_User: repl_user
                  Source_Port: 3306
                Connect_Retry: 10
              Source_Log_File: mysql-bin.000007
          Read_Source_Log_Pos: 673
               Relay_Log_File: relay-log.000002
                Relay_Log_Pos: 516
        Relay_Source_Log_File: mysql-bin.000007
           Replica_IO_Running: Yes
          Replica_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_Source_Log_Pos: 673
              Relay_Log_Space: 721
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Source_SSL_Allowed: No
           Source_SSL_CA_File:
           Source_SSL_CA_Path:
              Source_SSL_Cert:
            Source_SSL_Cipher:
               Source_SSL_Key:
        Seconds_Behind_Source: 0
Source_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Source_Server_Id: 1
                  Source_UUID: 3288c6ac-4ff5-11f0-b0ea-00220ee6d135
             Source_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
    Replica_SQL_Running_State: Replica has read all relay log; waiting for more updates
           Source_Retry_Count: 10
                  Source_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Source_SSL_Crl:
           Source_SSL_Crlpath:
           Retrieved_Gtid_Set: 3288c6ac-4ff5-11f0-b0ea-00220ee6d135:13
            Executed_Gtid_Set: 316079ef-4ffe-11f0-999f-0022a593688b:1,
3288c6ac-4ff5-11f0-b0ea-00220ee6d135:1-11:13
                Auto_Position: 0
         Replicate_Rewrite_DB:
                 Channel_Name:
           Source_TLS_Version:
       Source_public_key_path:
        Get_Source_public_key: 0
            Network_Namespace:
1 row inset (0.01 sec)


核心状态字段解析

  1. 复制连接状态

    • SQL 线程正在运行,负责将中继日志应用到从库。
    • IO 线程正在运行,负责从主库读取二进制日志。
    • 表示从库正在等待主库发送二进制日志事件,这是正常运行状态。
    • Replica_IO_StateWaiting for source to send event
    • Replica_IO_RunningYes
    • Replica_SQL_RunningYes
  2. 主库连接信息

    • 主库的端口号。
    • 用于复制的用户名。
    • 主库的 IP 地址。
    • Source_Hostxxxxxx
    • Source_Userrepl_user
    • Source_Port3306
  3. 日志位置信息

    • 从库已执行到主库二进制日志的位置。
    • 中继日志对应的主库二进制日志文件名。
    • 从库已写入中继日志的位置。
    • 从库当前正在使用的中继日志文件名。
    • 从库已读取到主库二进制日志的位置。
    • 主库当前正在使用的二进制日志文件名。
    • Source_Log_Filemysql-bin.000007
    • Read_Source_Log_Pos673
    • Relay_Log_Filerelay-log.000002
    • Relay_Log_Pos516
    • Relay_Source_Log_Filemysql-bin.000007
    • Exec_Source_Log_Pos673
  4. 延迟与错误信息

    • SQL 线程已处理完所有中继日志,正在等待新事件。
    • 无复制错误发生。
    • 从库落后主库的时间(秒),0
       表示无延迟。
    • Seconds_Behind_Source0
    • Last_Errno/Last_Error0
       / 空
    • Replica_SQL_Running_StateReplica has read all relay log; waiting for more updates
  5. GTID 信息

    • 从库已执行的 GTID 集合,包含两个 UUID 的事务范围。
    • 从库已获取的 GTID 集合。
    • Retrieved_Gtid_Set3288c6ac-4ff5-11f0-b0ea-00220ee6d135:13
    • Executed_Gtid_Set316079ef-4ffe-11f0-999f-0022a593688b:1, 3288c6ac-4ff5-11f0-b0ea-00220ee6d135:1-11:13


参考文件:

https://dev.mysql.com/doc/refman/8.4/en/change-replication-source-to.html
https://blog.csdn.net/weixin_41866717/article/details/128482446
https://www.jb51.net/database/32651707p.htm


文章转载自PostgreSQL运维技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论