操作步骤
一、安装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)
核心状态字段解析
复制连接状态
SQL 线程正在运行,负责将中继日志应用到从库。 IO 线程正在运行,负责从主库读取二进制日志。 表示从库正在等待主库发送二进制日志事件,这是正常运行状态。 Replica_IO_State: Waiting for source to send eventReplica_IO_Running: YesReplica_SQL_Running: Yes主库连接信息
主库的端口号。 用于复制的用户名。 主库的 IP 地址。 Source_Host: xxxxxxSource_User: repl_userSource_Port: 3306日志位置信息
从库已执行到主库二进制日志的位置。 中继日志对应的主库二进制日志文件名。 从库已写入中继日志的位置。 从库当前正在使用的中继日志文件名。 从库已读取到主库二进制日志的位置。 主库当前正在使用的二进制日志文件名。 Source_Log_File: mysql-bin.000007Read_Source_Log_Pos: 673Relay_Log_File: relay-log.000002Relay_Log_Pos: 516Relay_Source_Log_File: mysql-bin.000007Exec_Source_Log_Pos: 673延迟与错误信息
SQL 线程已处理完所有中继日志,正在等待新事件。 无复制错误发生。 从库落后主库的时间(秒), 0
表示无延迟。Seconds_Behind_Source: 0Last_Errno/Last_Error: 0
/ 空Replica_SQL_Running_State: Replica has read all relay log; waiting for more updatesGTID 信息
从库已执行的 GTID 集合,包含两个 UUID 的事务范围。 从库已获取的 GTID 集合。 Retrieved_Gtid_Set: 3288c6ac-4ff5-11f0-b0ea-00220ee6d135:13Executed_Gtid_Set: 316079ef-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




