如何在无网络环境下快速完成MySQL环境搭建 离线数据库环境搭建及安装包部署方法

1次阅读

mysql离线安装需匹配系统架构与glibc版本、手动初始化数据目录、显式配置my.cnf路径权限。必须用uname -m和ldd –version核对,下载对应linux-Generic包,创建mysql用户,执行–initialize生成临时密码,配置绝对路径的basedir/datadir,启动时指定–defaults-file,首次登录后立即改密并禁用密码过期。

如何在无网络环境下快速完成MySQL环境搭建 离线数据库环境搭建及安装包部署方法

MySQL 离线安装不是“复制粘贴就能用”,核心在于提前准备好与目标系统完全匹配的二进制包 + 手动初始化数据目录 + 正确设置 my.cnf 路径和权限。

确认操作系统架构与 MySQL 版本兼容性

离线环境最常踩的坑是下载了 x86_64 包却装在 ARM 服务器上,或用了 glibc 2.28 编译的包却部署在 centos 7(glibc 2.17)机器上。必须严格核对:

  • uname -m 查 CPU 架构(x86_64 / aarch64
  • ldd --version 查 glibc 版本,去 MySQL 官网下载页找对应 Linux - Generic 包(如 mysql-8.0.33-linux-glibc2.17-x86_64.tar.xz
  • 避免使用 mysql-community-server RPM 包——它依赖网络源安装依赖(systemd-sysvlibaio 等),离线易失败

解压后必须手动执行 mysqld --initialize

二进制包不带预初始化数据目录,直接启动会报错 Can't find Error-message fileFailed to open log file。关键步骤:

  • 创建独立用户运行(非 root):useradd -r -s /bin/false mysql
  • 设置数据目录权限:chown -R mysql:mysql /opt/mysql/data
  • 初始化(生成 root@localhost 临时密码):/opt/mysql/bin/mysqld --initialize --user=mysql --datadir=/opt/mysql/data --basedir=/opt/mysql
  • 注意:--initialize 会生成临时密码,输出在终端末尾(形如 A temporary password is generated for root@localhost: aB3#xQ9!mLp),务必记录

my.cnf 必须显式指定 basedirdatadir

离线环境下,MySQL 不会自动识别解压路径,若配置文件缺失或路径错误,启动时静默失败或报 unknown variable 'log-error'。最小可用配置示例:

[mysqld] basedir = /opt/mysql datadir = /opt/mysql/data socket = /opt/mysql/mysql.sock log-error = /opt/mysql/logs/error.log pid-file = /opt/mysql/mysqld.pid <p>[client] socket = /opt/mysql/mysql.sock

重点:

  • 所有路径必须绝对路径,且目录需提前 mkdir -pchown mysql:mysql
  • 不要省略 [client] 段——否则 mysql -u root -p 连接时找不到 socket
  • 启动命令必须加 --defaults-file/opt/mysql/bin/mysqld --defaults-file=/opt/mysql/my.cnf --user=mysql &

首次登录后立即修改密码并关闭密码过期策略

临时密码仅能用于首次登录,且默认开启密码过期(password_expired=1),不处理会导致后续连接直接被拒绝:

  • 用临时密码登录:/opt/mysql/bin/mysql -u root -p -S /opt/mysql/mysql.sock
  • 执行:ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPass123!';
  • 禁用强制改密:ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;
  • 刷新权限:FLUSH PRIVILEGES;

没做这步,下次用新密码连就会卡在 access denied for user 'root'@'localhost' ——不是密码输错,是账户被锁定了。

text=ZqhQzanResources