二进制安装 MySQL 8.0
在生产或测试环境中,我们常常希望避免包管理器带来的依赖和交互问题,尤其是当系统自带版本过旧或安装过程频繁弹窗时。此时,使用 MySQL 官方提供的二进制压缩包(Generic Linux Binary) 进行安装,是一种高度可控、跨平台兼容、无交互、可定制化强的解决方案。
本文将详细介绍如何在任意主流 Linux 系统(如 Ubuntu、CentOS、Debian、Red Hat 等)上,通过 二进制方式静默安装 MySQL 8.0,并将数据目录指定为 /data/mysql
,适用于需要高性能、独立部署或自动化脚本集成的场景。
一、为什么选择二进制安装?
优势 | 说明 |
---|---|
完全可控,避免包管理副作用 | 绕过 apt/yum/dnf 的依赖解析与自动配置,避免因系统库版本冲突导致安装失败或配置被覆盖。 |
高度可移植,跨 Linux 发行版运行 | 使用官方预编译的 x86_64 通用二进制包,可在 CentOS、Ubuntu、Debian、Red Hat 等任意主流发行版上一致部署,环境一致性更强。 |
目录结构完全自定义 | 安装路径(basedir )、数据目录(datadir )、日志、socket 文件等均可自由指定,满足企业级部署规范(如 /data/mysql 存放数据)。 |
实例独立,便于迁移与灾备 | MySQL 实例完全独立于系统包管理器,可整体打包迁移至其他服务器,适合容器化、离线部署或快速恢复场景。 |
适合自动化与标准化交付 | 无需处理交互式配置,可通过 Shell 脚本、Ansible、Packer 等工具实现无人值守部署,适用于 CI/CD 流水线和规模化运维。 |
二、 环境准备
操作系统:任意 Linux 发行版(Ubuntu 18.04+/CentOS 7+/Debian 10+ 等)
- 架构:x86_64
指常见的 64 位服务器 CPU 架构,无论是 Intel 还是 AMD 生产的现代服务器都支持。 ❌ 不支持 ARM 架构(如华为鲲鹏、AWS Graviton、Mac M1/M2)。 验证方法:运行
uname -m
,如果显示x86_64
则符合要求。内存:建议 ≥ 2GB
磁盘:确保
/data
分区有足够空间用户权限:具备
root
或sudo
权限
三、安装步骤
1. 下载 MySQL 8.0 二进制包
前往 MySQL 官方下载页 或使用以下命令下载通用二进制包:
cd /tmp
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.36-linux-glibc2.12-x86_64.tar.xz
🔗 包名说明:
mysql-8.0.36-linux-glibc2.12-x86_64.tar.xz
这是官方为 Linux 系统编译的通用二进制版本,适用于大多数现代发行版。
2. 创建安装目录并解压
我们将 MySQL 安装到 /usr/local/mysql
,数据目录设为 /data/mysql
。
# 创建安装目录
sudo mkdir -p /usr/local/mysql
# 解压到临时目录并移动
sudo tar -xJf mysql-8.0.36-linux-glibc2.12-x86_64.tar.xz -C /tmp/
sudo mv /tmp/mysql-8.0.36-linux-glibc2.12-x86_64/* /usr/local/mysql/
3. 创建 MySQL 用户和组
为安全起见,MySQL 应以专用用户运行:
sudo groupadd mysql
sudo useradd -r -g mysql -s /bin/false mysql
# 设置安装目录权限
sudo chown -R mysql:mysql /usr/local/mysql
4. 创建数据目录(关键:使用 /data/mysql
)
sudo mkdir -p /data/mysql
sudo chown -R mysql:mysql /data/mysql
💡 将数据目录放在
/data
下,便于独立挂载大容量磁盘,提升 I/O 性能。
5. 初始化数据库
执行初始化命令,生成系统数据库和临时 root 密码:
cd /usr/local/mysql
sudo bin/mysqld --initialize \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/data/mysql
✅ 成功后会输出:
[Note] [MY-010454] [Server] A temporary password is generated for root@localhost: jj?-kM:A6xLw
⚠️ 请务必记录此临时密码! 后续首次登录需要使用。
6. 生成 SSL/RSA 证书(推荐)
sudo bin/mysql_ssl_rsa_setup \
--basedir=/usr/local/mysql \
--datadir=/data/mysql
7. 创建配置文件 /etc/my.cnf
sudo tee /etc/my.cnf > /dev/null << 'EOF'
[mysqld]
# 基本路径
basedir = /usr/local/mysql
datadir = /data/mysql
socket = /var/run/mysqld/mysqld.sock
pid-file = /var/run/mysqld/mysqld.pid
log-error = /var/log/mysql/error.log
# 网络配置
port = 3306
bind-address = 0.0.0.0
# InnoDB 设置(可选优化)
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
[client]
socket = /var/run/mysqld/mysqld.sock
[mysql]
socket = /var/run/mysqld/mysqld.sock
EOF
创建日志目录:
sudo mkdir -p /var/log/mysql
sudo chown -R mysql:mysql /var/log/mysql
# 创建目录
sudo mkdir -p /var/run/mysqld
创建 socket 目录并设置权限
# 创建目录
sudo mkdir -p /var/run/mysqld
# 设置属主为 mysql 用户
sudo chown mysql:mysql /var/run/mysqld
# 设置权限(关键)
sudo chmod 755 /var/run/mysqld
8. 创建 systemd 服务文件
sudo tee /etc/systemd/system/mysql.service > /dev/null << 'EOF'
[Unit]
Description=MySQL Server
After=network.target
[Service]
RuntimeDirectory=mysqld
RuntimeDirectoryMode=0755
Type=simple
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
Restart=on-failure
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
9. 启动 MySQL 服务
# 重载 systemd 配置
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
# 启动并设置开机自启
sudo systemctl start mysql
sudo systemctl enable mysql
# 查看状态
sudo systemctl status mysql --no-pager
10. 获取临时密码并登录修改 root 密码
[Note] [MY-010454] [Server] A temporary password is generated for root@localhost: jj?-kM:A6xLw
登录 MySQL:
/usr/local/mysql/bin/mysql -u root -p
修改 root 密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Password123!';
FLUSH PRIVILEGES;
EXIT;
在 MySQL 中创建内网 root 访问权限
-- 创建 root 用户,仅允许从内网段 192.168.0.0/16 登录
CREATE USER 'root'@'192.168.0.%' IDENTIFIED BY 'Password123!';
-- 授予所有权限(与本地 root 一致)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.0.%' WITH GRANT OPTION;
-- 刷新权限
FLUSH PRIVILEGES;
EXIT;
11. 创建专用远程管理员用户(不推荐直接开放 root 远程)
❌ 原始做法风险:
CREATE USER 'root'@'%' ...
即使设置了强密码,也极易成为暴力破解和 SQL 注入攻击的目标。
-- 创建专用远程管理员(仅限指定IP登录)
CREATE USER 'admin'@'公司出口IP' IDENTIFIED BY 'StrongPass!2025';
-- 授予全局管理权限(等同于 root 权限)
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'公司出口IP' WITH GRANT OPTION;
-- 刷新权限
FLUSH PRIVILEGES;
EXIT;
📌 说明:
- 用户名改为
admin
或dba
更安全,避免暴露root
- 登录来源限定为
公司出口IP
,防止其他 IP 尝试连接- 密码需包含大小写+数字+特殊字符,长度 ≥ 12
确保 /etc/my.cnf
中 bind-address = 0.0.0.0
,然后重启:
systemctl restart mysql
(可选)进一步最小化权限(更安全)
如果不需要完全 ALL PRIVILEGES
,可以按需授权:
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, PROCESS, RELOAD, SHUTDOWN,
SHOW DATABASES, SUPER, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT
ON *.* TO 'admin'@'公司出口IP';
12. 配置 iptables 实现精细网络访问控制
目标:
- ✅ 允许
公司出口IP
访问 3306(外网特定IP)- ✅ 允许
192.168.0.0/16
内网所有机器访问 3306- ❌ 拒绝其他所有外部主机访问 3306
方法一:直接使用 iptables
命令(临时生效)
# 允许特定公网IP访问MySQL
sudo iptables -A INPUT -p tcp --dport 3306 -s 公司出口IP -j ACCEPT
# 允许内网段访问MySQL
sudo iptables -A INPUT -p tcp --dport 3306 -s 192.168.0.0/16 -j ACCEPT
# 拒绝其他所有对3306的访问(必须放在最后)
sudo iptables -A INPUT -p tcp --dport 3306 -j DROP
⚠️ 重要:iptables 规则是按顺序匹配的,
-j DROP
必须在所有ACCEPT
规则之后,否则会被提前拦截!
方法二:持久化保存 iptables 规则(重启不失效)
不同系统保存方式略有差异:
Ubuntu / Debian
# 安装持久化工具
sudo apt-get install -y iptables-persistent
# 保存当前规则
sudo netfilter-persistent save
CentOS / RHEL / Rocky Linux
# 安装服务
sudo yum install -y iptables-services || sudo dnf install -y iptables-service
# 启用并保存
sudo systemctl enable iptables
sudo service iptables save
13. 验证安装
/usr/local/mysql/bin/mysql --version
# 输出:/usr/local/mysql/bin/mysql Ver 8.0.36 for Linux on x86_64 (MySQL Community Server - GPL)
/usr/local/mysql/bin/mysql -u root -p -e "SELECT VERSION();"
# 应返回 MySQL 版本号
+-----------+
| VERSION() |
+-----------+
| 8.0.36 |
+-----------+
14. 添加 MySQL 到环境变量(可选)
echo 'export PATH=/usr/local/mysql/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
之后可直接使用 mysql
、mysqldump
等命令。
四、如何卸载?
sudo systemctl stop mysql
sudo systemctl disable mysql
sudo rm /etc/systemd/system/mysql.service
sudo rm /etc/my.cnf
sudo rm -rf /usr/local/mysql
sudo rm -rf /data/mysql
sudo rm -rf /var/log/mysql
sudo userdel mysql 2>/dev/null || true
sudo groupdel mysql 2>/dev/null || true
五、最佳实践建议
定期备份
/data/mysql
数据目录集中,便于使用xtrabackup
或mysqldump
备份。监控磁盘空间
/data
分区应有足够的扩展能力。使用专用备份用户
CREATE USER 'backup'@'localhost' IDENTIFIED BY 'BackupPass!789'; GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'backup'@'localhost';
定期更新 MySQL 版本
二进制包方式便于快速升级:只需替换/usr/local/mysql
并保留/data/mysql
。