1043 字
5 分钟
生产环境部署 MySQL 8.0:基于官方二进制包的安装

系统环境说明#

项目
操作系统Linux 发行版系统(CentOS 7 / Rocky Linux / RHEL / Debian / Ubuntu)
MySQL 版本8.0.44
安装方式官方二进制包.tar.xz
安装路径/usr/local/mysql
数据目录/data/mysql(多实例时如/data/mysql3307
用户权限独立用户mysql
启动方式systemd 服务,非脚本启动
监听端口3306
运行用户mysql

一、创建系统用户和目录结构#

Terminal window
# 创建 mysql 组,如果提示已存在可忽略,继续后续步骤
sudo groupadd mysql
# 创建 mysql 用户,并加入 mysql 组,不允许登录系统,不创建 home 目录,如果提示已存在可忽略
sudo useradd -r -g mysql -s /sbin/nologin -M mysql
# 创建安装目录和数据目录
sudo mkdir -p /usr/local/mysql
sudo mkdir -p /data/mysql
sudo mkdir -p /data/mysql/log
sudo mkdir -p /data/mysql/tmp
# 设置用户和用户组权限
chown -R mysql:mysql /usr/local/mysql
chown -R mysql:mysql /data/mysql

二、下载并解压官方 MySQL 二进制包#

Terminal window
cd /usr/local/src
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.44-linux-glibc2.28-x86_64.tar.xz
sudo tar -xJf mysql-8.0.44-linux-glibc2.28-x86_64.tar.xz -C /usr/local
sudo chown -R mysql:mysql /usr/local/mysql-8.0.44-linux-glibc2.28-x86_64
# 软连接统一入口(升级只需要切换软链)
sudo ln -sfn /usr/local/mysql-8.0.44-linux-glibc2.28-x86_64 /usr/local/mysql

可选:使用SElinux

Terminal window
# 赋予 SELinux 标签
semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?"
semanage fcontext -a -t mysqld_var_run_t "/data/mysql/mysqld.pid"
semanage fcontext -a -t mysqld_var_run_t "/data/mysql/mysql.sock"
# 应用生效
restorecon -Rv /data/mysql

三、设置环境变量并初始化数据库文件#

初始化前确认数据目录为空(否则会失败)

3.1 设置环境变量#

Terminal window
echo 'export PATH=/usr/local/mysql/bin:$PATH' | sudo tee /etc/profile.d/mysql.sh
sudo chmod 644 /etc/profile.d/mysql.sh
source /etc/profile.d/mysql.sh
NOTE

通过 /usr/local/mysql 软连接统一管理 MySQL 版本 并将其加入 PATH,后续命令默认指向当前激活版本

3.2 初始化数据目录#

初始化前确认数据目录为空(否则会失败)

使用 --log-error 指定日志文件输出位置,用于后续获取 Root 密码(需要 保证日志目录存在且 mysqld 用户有写权限)

Terminal window
/usr/local/mysql/bin/mysqld --initialize --basedir=/usr/local/mysql --datadir=/data/mysql --log-error=/data/mysql/log/mysql-error.log --user=mysql

四、配置 /etc/my.cnf 配置文件#

根据生产环境实际情况自定义:

[client]
port=3306
socket=/data/mysql/mysql.sock
default-character-set=utf8mb4
[mysqld]
########################################
# 基础路径与进程
########################################
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/data/mysql/mysql.sock
pid-file=/data/mysql/mysqld.pid
port=3306
user=mysql
tmpdir=/data/mysql/tmp
# 建议仅本机管理默认绑定本地;如需对外提供服务再改 0.0.0.0 并配安全组/防火墙
bind-address=127.0.0.1
# 避免 DNS 反查导致连接慢与线程堆积
skip-name-resolve=1
# 显式字符集(避免客户端/服务器不一致)
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
########################################
# 日志
########################################
log-error=/data/mysql/log/mysql-error.log
# 慢查询:生产建议开启,但阈值别太激进;1 秒在高并发场景会产生大量日志
slow_query_log=1
slow_query_log_file=/data/mysql/log/mysql-slow.log
long_query_time=2
log_queries_not_using_indexes=0
########################################
# 连接与资源
########################################
max_connections=500
# 防止连接洪峰把实例拖死;建议配合应用连接池
max_connect_errors=100
# 文件句柄限制(需系统 ulimit 配合)
open_files_limit=65535
# 大 SQL/批量导入时可适当调大
max_allowed_packet=64M
########################################
# InnoDB(核心)
########################################
default_storage_engine=InnoDB
innodb_file_per_table=1
# 下面两个值强依赖内存与写入量:
# - buffer_pool 建议为物理内存的 60%~70%(专用 MySQL 机器)
innodb_buffer_pool_size=1G
# - redo log 256M~2G 视写入量而定;写入越高可适当增大
innodb_log_file_size=256M
# 保守的刷盘策略:强一致(性能换可靠性)
innodb_flush_log_at_trx_commit=1
sync_binlog=1
# SSD 建议开启 O_DIRECT,避免双缓存;HDD/虚拟化环境可按实际验证
innodb_flush_method=O_DIRECT
########################################
# 安全
########################################
symbolic-links=0
# 建议限制导入导出目录;如不需要导出可设置为空字符串禁用
secure_file_priv=/tmp

五、配置 systemd 启动文件#

创建:/etc/systemd/system/mysqld.service

[Unit]
Description=MySQL Server (8.0)
Documentation=man:mysqld(8)
After=network-online.target
Wants=network-online.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
Type=notify
TimeoutStartSec=0
OOMScoreAdjust=-1000
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE=65536
Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=false

加载配置变动、设置自启,并立即启动

Terminal window
systemctl daemon-reload
systemctl enable mysqld --now

六、首次登录并修改 root 密码#

Terminal window
# 从日志文件中查找初始密码
grep 'temporary password' /data/mysql/log/mysql-error.log
# 登录 mysql 控制台
mysql -uroot -p
# 修改密码(必须包含大小写字母+数字+特殊字符)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewP@ssw0rd!';

七、安全初始化与优化(可选)#

Terminal window
# 禁用匿名账户
DELETE FROM mysql.user WHERE user='';
# 禁用远程 root 登录
UPDATE mysql.user SET host='localhost' WHERE user='root';
# 删除测试库
DROP DATABASE test;
# 刷新权限
FLUSH PRIVILEGES;

八、其他建议(根据场景选用)#

  • 若使用多实例,可分别配置 /data/mysql3307/ 等数据目录和多个 my3307.cnf 文件
  • 定期备份:使用 mysqldumpxtrabackup
  • 配合 fail2baniptables 做安全防护
  • 开启慢查询日志,监控 SQL 性能
  • 禁用 skip-grant-tables,避免漏洞
生产环境部署 MySQL 8.0:基于官方二进制包的安装
https://www.self4m.com/posts/production-deploy-mysql-8-0-binary-on-linux/
✍️作者
Self4m
📅发布于
2025-09-10
©️许可协议
CC BY-NC-SA 4.0

商业用途必须事先获得作者授权;
非商业用途可以使用,但必须注明出处;
若有改编需采用相同许可协议发布。