二进制包安装 MySQL 是灵活度最高 的方式(支持自定义程序目录、数据目录等所有路径),以下是分步骤、带详细解释 的完整流程(适配aarch64/x86_64架构,以 MySQL 8.0.44 为例):
一、前置准备(必做:环境检查 + 依赖 + 用户组)
1. 确认系统架构(选对应二进制包)
# 查看系统架构(aarch64/x86_64)
uname -m
- 若输出
aarch64:选aarch64版本的二进制包; - 若输出
x86_64:选x86_64版本的二进制包。
2. 安装依赖包(避免初始化 / 启动失败)
# CentOS/RHEL系
yum install -y libaio-devel numactl-devel perl net-tools openssl-devel
# Debian/Ubuntu系
apt-get install -y libaio-dev numactl perl net-tools libssl-dev
- 依赖作用:
libaio是 InnoDB 引擎的异步 IO 依赖;numactl优化多 CPU 架构性能。
3. 创建 MySQL 专用用户 / 组(安全规范)
MySQL 服务需以非 root 用户运行,避免权限过大:
# 创建系统组(-r:系统组,ID<1000)
groupadd -r mysql
# 创建系统用户(-r:系统用户;-g:关联mysql组;-s:禁止登录;-M:不创建家目录)
useradd -r -g mysql -s /sbin/nologin -M mysql
# 验证创建结果
id mysql
二、下载并解压二进制包
1. 下载对应架构的二进制包
从 MySQL 官网获取包(或用 wget 直接下载):
# 进入临时目录(避免污染系统目录)
cd /tmp
# ① aarch64架构下载链接
wget https://cdn.mysql.com/Downloads/MySQL-8.0/mysql-8.0.44-linux-glibc2.28-aarch64.tar.xz
# ② x86_64架构下载链接
# wget https://cdn.mysql.com/Downloads/MySQL-8.0/mysql-8.0.44-linux-glibc2.28-x86_64.tar.xz
2. 解压到自定义程序目录 (示例:/opt/mysql)
二进制包可解压到任意目录(如/opt//usr/local),这里以/opt/mysql为例:
# 解压包(替换为实际包名)
tar -xvf mysql-8.0.44-linux-glibc2.28-aarch64.tar.xz -C /opt/
# 重命名(或创建软链接,方便后续升级)
# 方式1:重命名(简单直接)
mv /opt/mysql-8.0.44-linux-glibc2.28-aarch64 /opt/mysql
# 方式2:软链接(升级时只需替换软链接指向)
# ln -s /opt/mysql-8.0.44-linux-glibc2.28-aarch64 /opt/mysql
三、配置环境变量(简化命令调用)
若不配置环境变量,需用/opt/mysql/bin/mysql这类完整路径调用命令,配置后可直接用mysql:
# 将MySQL的bin目录加入系统环境变量
echo "export PATH=/opt/mysql/bin:\$PATH" >> /etc/profile
# 立即生效环境变量
source /etc/profile
# 验证(输出MySQL版本则成功)
mysql --version
四、准备自定义目录(数据 / 日志 / PID)
二进制包的所有目录都需手动创建,核心目录包括:
| 目录 | 作用 |
|---|---|
/data/mysql |
数据存储目录(存放数据库、表、InnoDB 文件等核心数据) |
/data/mysql/log |
日志目录(存放错误日志、慢查询日志等) |
/var/run/mysqld |
PID 文件目录(记录 MySQL 服务的进程 ID) |
1. 创建目录并设置权限
# 1. 数据目录
mkdir -p /data/mysql
# 2. 日志目录
mkdir -p /data/mysql/log
# 3. PID目录
mkdir -p /var/run/mysqld
# 给所有目录赋予mysql用户权限(必须!否则MySQL无读写权限)
chown -R mysql:mysql /data/mysql
chown -R mysql:mysql /var/run/mysqld
# 设置目录权限(755:用户可读可写可执行,组/其他可读可执行)
chmod -R 755 /data/mysql
五、编写 MySQL 主配置文件(/etc/my.cnf)
my.cnf是 MySQL 的核心配置文件,所有目录、参数都在这里定义,直接复制以下内容(需根据你的目录调整):
vi /etc/my.cnf
写入配置:
[mysqld]
# 1. 程序目录(二进制包解压路径)
basedir=/opt/mysql
# 2. 数据目录(自定义的/data/mysql)
datadir=/data/mysql
# 3. Socket文件路径(本地连接的通信文件,需和数据目录同权限)
socket=/data/mysql/mysql.sock
# 4. 运行用户
user=mysql
# 5. 端口(默认3306)
port=3306
# 6. 错误日志路径(自定义到日志目录)
log-error=/data/mysql/log/mysqld.log
# 7. PID文件路径
pid-file=/var/run/mysqld/mysqld.pid
# 8. 禁用符号链接(安全选项)
symbolic-links=0
# 9. 字符集(避免乱码)
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
# 10. 打开文件数限制(避免高并发时文件数不足)
open_files_limit=65535
[client]
# 客户端连接的Socket路径(必须和mysqld的socket一致)
socket=/data/mysql/mysql.sock
# 客户端字符集
default-character-set=utf8mb4
六、初始化 MySQL(生成系统表 + 临时密码)
初始化是创建 MySQL 系统库(如mysql库,存储用户权限)、生成临时密码的关键步骤:
# 执行初始化(--user:指定运行用户;--datadir:指定数据目录)
mysqld --initialize --user=mysql --datadir=/data/mysql
1. 获取临时密码
初始化成功后,临时密码会写入错误日志 (/data/mysql/log/mysqld.log):
# 从日志中提取临时密码(最后一行的"root@localhost:"后即为密码)
TEMP_PWD=$(grep "temporary password" /data/mysql/log/mysqld.log | awk '{print $NF}')
echo "MySQL临时密码:$TEMP_PWD"
- 示例输出:
MySQL临时密码:abc123!@#
七、配置 Systemd 服务(用systemctl管理 MySQL)
手动创建 Systemd 服务文件,实现systemctl start/stop等便捷管理:
vi /usr/lib/systemd/system/mysqld.service
写入配置:
[Unit]
# 服务描述
Description=MySQL Server
# 启动依赖(网络就绪后再启动)
After=network.target remote-fs.target nss-lookup.target
[Service]
# 进程类型(notify:MySQL启动后主动通知Systemd)
Type=notify
# 运行用户/组
User=mysql
Group=mysql
# 启动命令(指定配置文件路径)
ExecStart=/opt/mysql/bin/mysqld --defaults-file=/etc/my.cnf
# 打开文件数限制(和my.cnf保持一致)
LimitNOFILE=65535
# 进程数限制
LimitNPROC=65535
# 失败后自动重启
Restart=on-failure
# 禁止重启的退出状态码
RestartPreventExitStatus=1
# 超时时间(0:无超时)
TimeoutSec=0
[Install]
# 多用户模式下启动
WantedBy=multi-user.target
八、启动 MySQL 并配置
1. 启动服务并设置开机自启
# 1. 重新加载Systemd配置(识别新的mysqld.service)
systemctl daemon-reload
# 2. 启动MySQL
systemctl start mysqld
# 3. 设置开机自启
systemctl enable mysqld
# 4. 检查服务状态(显示Active: running则成功)
systemctl status mysqld
2. 重置初始密码(临时密码已过期)
MySQL 初始化的临时密码仅用于首次登录,必须重置后才能使用:
# 用临时密码登录并重置密码(替换为你的临时密码和新密码)
mysql -uroot -p"$TEMP_PWD" --connect-expired-password << EOF
# 新密码需符合策略(至少8位,含大小写+数字+特殊字符)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MySQL@8888';
# 刷新权限(确保修改生效)
FLUSH PRIVILEGES;
EOF
九、配置远程访问(可选,如 Navicat 连接)
1. 允许 root 远程连接
mysql -uroot -p"MySQL@8888" << EOF
# 将root的访问主机改为"%"(任意远程主机)
USE mysql;
UPDATE user SET host='%' WHERE user='root';
FLUSH PRIVILEGES;
EOF
2. 解决 Navicat 兼容问题(MySQL 8.0 专属)
MySQL 8.0 默认用caching_sha2_password认证插件,旧版 Navicat 不兼容,需改为传统插件:
mysql -uroot -p"MySQL@8888" << EOF
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'MySQL@8888';
FLUSH PRIVILEGES;
EOF
3. 开放防火墙端口
# 开放3306端口(永久生效)
firewall-cmd --add-port=3306/tcp --permanent
# 重启防火墙
firewall-cmd --reload
十、验证安装成功
# 1. 验证MySQL版本
mysql --version
# 2. 验证数据目录(输出/data/mysql则正确)
mysql -uroot -p"MySQL@8888" -e "show variables like 'datadir';"
# 3. 创建测试库(验证数据写入)
mysql -uroot -p"MySQL@8888" -e "CREATE DATABASE test_db;"
# 查看/data/mysql下是否生成test_db目录
ls -l /data/mysql | grep test_db
常见问题排查
-
初始化失败:Permission denied
- 原因:目录权限未给
mysql用户; - 解决:重新执行
chown -R mysql:mysql /data/mysql。
- 原因:目录权限未给
-
启动失败:Can't read PID file
- 原因:
/var/run/mysqld权限不足; - 解决:
chown -R mysql:mysql /var/run/mysqld。
- 原因:
-
远程连接超时
- 原因:防火墙未开放 3306 端口;
- 解决:执行
firewall-cmd --add-port=3306/tcp --permanent。