Linux 离线 tar 包手动安装 MySQL8.0 完整教程(VM 虚拟机环境)

前言

很多企业内网服务器无法联网,不能使用 yum / apt 在线安装 MySQL,此时官方压缩包离线部署是最优方案。本文基于 CentOS / RHEL 系列虚拟机,完整记录从环境清理、MySQL 部署初始化、systemd 服务配置、各类报错排错全流程,包含权限、SELinux、socket 连接失败等高频问题解决方案,新手可直接跟着操作落地。

一、前置准备:VM 环境清理

1.1 资源准备

  1. 搭建 VMware 虚拟机,导入 CentOS 镜像,提前规划放行 3306 端口;
  2. 下载 MySQL 离线包:mysql-8.0.46-linux-glibc2.28-x86_64.tar.xz,上传至服务器。

1.2 清理旧环境残留

若宿主机/虚拟机曾经装过 VM、MySQL,残留配置、注册表、旧文件会引发端口冲突、启动失败,必须彻底清理:

  1. Windows 宿主机:卸载 VMware,删除安装目录、用户目录隐藏 .vmware 文件夹,清理注册表 VMware 相关项;
  2. Linux 虚拟机清理旧 MySQL:
sudo systemctl stop mysqld
sudo rm -rf /usr/local/mysql /etc/my.cnf

二、MySQL 解压与基础目录部署

2.1 解压并迁移至标准目录

# 解压 xz 压缩包
tar -xJf mysql-8.0.46-linux-glibc2.28-x86_64.tar.xz

# 移动到系统标准安装目录 /usr/local/mysql
sudo mv mysql-8.0.46-linux-glibc2.28-x86_64 /usr/local/mysql

2.2 创建全局软链接

方便任意终端直接使用 mysql 命令,后续升级只需替换安装目录,无需修改环境变量:

sudo ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql
sudo ln -s /usr/local/mysql/bin/mysqld /usr/local/bin/mysqld

2.3 创建专用运行用户(安全规范)

禁止 root 运行数据库,创建无登录权限的独立 mysql 用户:

# 创建用户组
sudo groupadd mysql
# 创建系统用户,归属 mysql 组,禁止登录服务器
sudo useradd -r -g mysql -s /bin/false mysql

2.4 创建数据目录并授权

# 创建数据存储目录
sudo mkdir -p /usr/local/mysql/data
# 赋予 mysql 用户完整目录权限
sudo chown -R mysql:mysql /usr/local/mysql

三、数据库初始化(重点:保存临时密码)

执行初始化命令,终端会输出 root 临时密码,务必复制保存,丢失需重置密码

sudo /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

输出示例:

[Note] A temporary password is generated for root@localhost: Abc9#xyz!def

四、编写 MySQL 配置文件 /etc/my.cnf

sudo tee /etc/my.cnf << 'EOF'
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
port=3306

[client]
socket=/tmp/mysql.sock
EOF

五、配置 systemd 服务,实现开机自启

5.1 创建 mysql.service 服务文件

sudo tee /etc/systemd/system/mysql.service << 'EOF'
[Unit]
Description=MySQL Server
After=network.target

[Service]
Type=forking
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data
ExecStop=/usr/local/mysql/bin/mysqladmin shutdown
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

5.2 重载服务并启动 MySQL

# 重载 systemd 识别新服务
sudo systemctl daemon-reload
# 设置开机自启
sudo systemctl enable mysql
# 启动服务
sudo systemctl start mysql
# 查看运行状态
sudo systemctl status mysql

六、登录数据库修改 root 密码

6.1 使用临时密码登录

mysql -u root -p

粘贴初始化生成的临时密码进入数据库。

6.2 修改本地 root 密码

ALTER USER 'root'@'localhost' IDENTIFIED BY '你的自定义强密码';

6.3 忘记临时密码重置方案

# 停止 MySQL 服务
sudo systemctl stop mysql
# 跳过权限表后台启动
sudo /usr/local/mysql/bin/mysqld_safe --skip-grant-tables &
# 免密登录
mysql -u root

执行重置 SQL:

ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
FLUSH PRIVILEGES;
EXIT;

关闭临时进程,正常启动服务:

sudo pkill mysqld
sudo systemctl start mysql

七、安装完成验证命令

# 查看 MySQL 版本
mysql --version
# 查看服务运行状态
sudo systemctl status mysql
# 登录查看默认库
mysql -u root -p -e "SHOW DATABASES;"

八、常见报错完整排错指南

8.1 服务启动失败:查看日志定位根源

  1. MySQL 自身错误日志(最有效)
sudo tail -n 50 /usr/local/mysql/data/$(hostname).err
  1. systemd 服务运行日志
sudo journalctl -xeu mysql.service --no-pager

8.2 报错1:目录权限不足(最高频问题)

# 一键修复目录归属与权限
sudo chown -R mysql:mysql /usr/local/mysql
sudo chmod 755 /usr/local/mysql
sudo chmod 750 /usr/local/mysql/data

8.3 报错2:SELinux 拦截(CentOS/RHEL 专属)

执行 getenforce,输出 Enforcing 即代表 SELinux 开启拦截。

方案1:给目录添加 SELinux 标签(推荐,不关闭安全机制)
# 数据目录标签
sudo semanage fcontext -a -t mysqld_db_t "/usr/local/mysql/data(/.*)?" 2>/dev/null || true
sudo restorecon -Rv /usr/local/mysql/data

# 二进制程序标签
sudo semanage fcontext -a -t mysqld_exec_t "/usr/local/mysql/bin/mysqld" 2>/dev/null || true
sudo restorecon -v /usr/local/mysql/bin/mysqld

# 整体安装目录标签
sudo semanage fcontext -a -t usr_t "/usr/local/mysql(/.*)?" 2>/dev/null || true
sudo restorecon -Rv /usr/local/mysql

# 重启服务
sudo systemctl restart mysql
优化 service 启动方式

替换 mysql.service 文件适配 SELinux:

sudo tee /etc/systemd/system/mysql.service << 'EOF'
[Unit]
Description=MySQL Server
After=network.target

[Service]
Type=simple
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl start mysql

8.4 报错3:2002 socket 路径不匹配

报错信息:Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock'
原因:服务端 socket 为 /tmp/mysql.sock,客户端默认读取 /run/mysqld/mysqld.sock,路径不一致。

方法1:统一 socket 路径(推荐)
# 重写配置文件
sudo tee /etc/my.cnf << 'EOF'
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/run/mysqld/mysqld.sock
port=3306

[client]
socket=/run/mysqld/mysqld.sock
EOF

# 创建目录并授权
sudo mkdir -p /run/mysqld
sudo chown mysql:mysql /run/mysqld

# 重启 MySQL
sudo systemctl restart mysql
方法2:创建软链接映射 socket
sudo mkdir -p /run/mysqld
sudo ln -s /tmp/mysql.sock /run/mysqld/mysqld.sock
方法3:登录时手动指定 socket
mysql -u root -p --socket=/tmp/mysql.sock
socket 问题校验命令
# 查看服务状态
sudo systemctl status mysql
# 全局查找 socket 文件
sudo find / -name "mysql.sock" -o -name "mysqld.sock" 2>/dev/null
# 查看目录权限
ls -la /run/mysqld/
# 核对配置文件
cat /etc/my.cnf

九、部署完成后必做优化操作

  1. 设置高强度 root 登录密码,避免弱密码;
  2. 确认 MySQL 开机自启:sudo systemctl enable mysql
  3. 防火墙放行 3306 端口(如需外部远程连接);
  4. 定期备份 /usr/local/mysql/data 数据目录;
  5. 删除匿名用户,限制 root 仅本地访问,提升数据库安全。

结语

离线压缩包部署 MySQL8.0 自由度更高,适合无外网内网服务器。整套流程踩坑点集中在目录权限、SELinux 拦截、socket 路径不匹配,遇到启动失败优先查看 .err 错误日志,基本可以快速定位问题。本文适配 CentOS7/8/9 全系列,VM 虚拟机环境可直接复刻操作。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐