二进制安装MySQL 8.0指南:跨平台、自定义数据路径、安全远程访问配置

发布于:2025-09-11 ⋅ 阅读:(34) ⋅ 点赞:(0)

二进制安装 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 分区有足够空间

  • 用户权限:具备 rootsudo 权限


三、安装步骤

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;

📌 说明:

  • 用户名改为 admindba 更安全,避免暴露 root
  • 登录来源限定为 公司出口IP,防止其他 IP 尝试连接
  • 密码需包含大小写+数字+特殊字符,长度 ≥ 12

确保 /etc/my.cnfbind-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

之后可直接使用 mysqlmysqldump 等命令。


四、如何卸载?

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

五、最佳实践建议

  1. 定期备份 /data/mysql
    数据目录集中,便于使用 xtrabackupmysqldump 备份。

  2. 监控磁盘空间
    /data 分区应有足够的扩展能力。

  3. 使用专用备份用户

    CREATE USER 'backup'@'localhost' IDENTIFIED BY 'BackupPass!789';
    GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'backup'@'localhost';
    
  4. 定期更新 MySQL 版本
    二进制包方式便于快速升级:只需替换 /usr/local/mysql 并保留 /data/mysql


网站公告

今日签到

点亮在社区的每一天
去签到