无互联网的正式 CentOS 7.6环境中安装 mysql-8.0.36-1

版本号 : 1.0,0
作者 : @老王要学习
日期 : 2026.01.21
适用环境: Centos7.6

环境准备

硬件要求

  • 服务器: 2核CPU、2GB内存,20GB硬盘空间
  • 网络: 确保服务器具有固定的IP地址,并且防火墙允许FTP端口(默认22端口)的通信

软件要求

  • 操作系统:Centos7.6
  • FTP软件:Xshell8
  • 软件包:mysql-8.0.36-1.el7.x86_64.rpm-bundle.tar

核心前提(必做)

  1. 准备一台和目标正式机同版本的 CentOS 7 联网机器(用于下载离线依赖包);
  2. 正式机需确保:
    • 已挂载数据盘(推荐 /data/mysql 存放数据,避免系统盘占满);
    • 操作前做好系统备份(正式环境谨慎操作);
    • 仅使用 root 或授权的管理员账号操作。
  3. 下载mysql-8.0.36-1.el7.x86_64.rpm-bundle.tar地址
    https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.36-1.el7.x86_64.rpm-bundle.tar

一、在联网机器(自己服务器或虚拟机)下载离线依赖包

正式环境无网,需先在联网的 CentOS 7 机器上下载 MySQL 安装所需的所有依赖包,打包后传输到离线正式机。

1.1 新建依赖包下载目录

bash 复制代码
# 联网机器操作
mkdir -p /usr/local/src/mysql_deps
cd /usr/local/src/mysql_deps

1.2 下载离线依赖包(仅下载不安装)

bash 复制代码
# 下载 MySQL 依赖的核心包(包含所有依赖链)
yum install --downloadonly --downloaddir=/usr/local/src/mysql_deps \
perl net-tools libaio-devel libstdc++-devel

下载完成后,/root/mysql_deps 目录会生成如下 RPM 包:

复制代码
perl-5.16.3-299.el7_9.x86_64.rpm
net-tools-2.0-0.25.20131004git.el7.x86_64.rpm
libaio-devel-0.3.109-13.el7.x86_64.rpm
libstdc++-devel-4.8.5-44.el7.x86_64.rpm
# 可能包含其他依赖子包(如 perl-libs、perl-devel 等)

1.3 打包依赖包并传输到离线正式机

bash 复制代码
# 联网机器打包
tar -czf mysql_deps.tar.gz /usr/local/src/mysql_deps/*

通过 SFTP/U盘/内网传输工具,将以下两个文件传到正式机的 /usr/local/src 目录:

  1. mysql_deps.tar.gz(依赖包)
  2. mysql-8.0.36-1.el7.x86_64.rpm-bundle.tar(MySQL 安装包)

二、正式机离线操作(核心)

2.1 切换到 root 用户并进入目录

bash 复制代码
su root
cd /usr/local/src

2.2 解压依赖包并离线安装

bash 复制代码
# 解压依赖包
mkdir -p mysql_deps
tar -xzf mysql_deps.tar.gz -C mysql_deps --strip-components=2

# 离线安装所有依赖包(--force --nodeps 确保离线安装完整)
rpm -ivh mysql_deps/*.rpm --force --nodeps

2.3 正式环境安全预处理(替代"关闭SELinux/防火墙")

正式环境禁止直接关闭 SELinux/防火墙,需配置合规规则:

bash 复制代码
# 1. 卸载系统自带 MariaDB(避免冲突,正式机需确认无业务依赖)
rpm -qa | grep mariadb | xargs rpm -e --nodeps

# 2. SELinux 配置(允许 MySQL 相关操作,不关闭SELinux)
# 安装 policycoreutils-python(已包含在依赖包中)
setsebool -P mysqld_can_network_connect on  
# 允许 MySQL 网络连接
semanage port -a -t mysqld_port_t -p tcp 3306

# 3. 防火墙开放 3306 端口(正式环境仅开放必要IP段)
firewall-cmd --permanent --add-port=3306/tcp
# 更安全:仅允许指定业务IP访问(替换为实际IP/网段,如 192.168.1.0/24)
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3306" accept'
firewall-cmd --reload  # 重载防火墙规则

2.4 解压并安装 MySQL RPM 包(同之前,但适配正式环境)

bash 复制代码
# 解压 MySQL 捆绑包
tar -xvf mysql-8.0.36-1.el7.x86_64.rpm-bundle.tar

# 按顺序安装(正式环境建议检查包完整性)
rpm -ivh mysql-community-common-8.0.36-1.el7.x86_64.rpm

# 1. 安装缺失的依赖包
rpm -ivh mysql-community-client-plugins-8.0.36-1.el7.x86_64.rpm
# 2. 再安装 libs 包
rpm -ivh mysql-community-libs-8.0.36-1.el7.x86_64.rpm
# 3. 后续安装核心组件
rpm -ivh mysql-community-client-8.0.36-1.el7.x86_64.rpm
# 4. 安装 ICU 数据依赖包
rpm -ivh mysql-community-icu-data-files-8.0.36-1.el7.x86_64.rpm
# 5. 再安装 MySQL 服务端包
rpm -ivh mysql-community-server-8.0.36-1.el7.x86_64.rpm

三、正式环境 MySQL 初始化与安全配置

3.1 调整 MySQL 数据目录(正式环境核心优化)

正式环境建议将数据目录放在独立挂载的磁盘(如 /data/mysql),避免系统盘占满:

bash 复制代码
# 1. 创建数据目录并设置权限(mysql 用户由安装包自动创建)
mkdir -p /data/mysql
chown -R mysql:mysql /data/mysql
chmod 700 /data/mysql

# 2. 修改 my.cnf 配置数据目录(先备份原配置)
cp /etc/my.cnf /etc/my.cnf.bak
echo -e "\n[mysqld]\ndatadir=/data/mysql\nsocket=/data/mysql/mysql.sock\n[client]\nsocket=/data/mysql/mysql.sock" >> /etc/my.cnf

3.2 初始化 MySQL(正式环境指定字符集/日志)

bash 复制代码
# 初始化(指定 utf8mb4 字符集,适配生产环境)
mysqld --initialize --user=mysql --datadir=/data/mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

# 启动 MySQL 并设置开机自启(正式环境必须)
systemctl start mysqld
systemctl enable mysqld
systemctl status mysqld  # 确认状态为 active (running)

3.3 获取临时密码并修改强密码(正式环境合规要求)

bash 复制代码
# 提取临时密码
TEMP_PWD=$(grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')

grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}'

echo $TEMP_PWD

# 登录并修改密码(正式环境密码需符合企业策略:长度≥12,包含大小写/数字/特殊符号)
mysql -uroot -p"$TEMP_PWD" -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'MySQL\!@34'; FLUSH PRIVILEGES;"

分析错误:

现在的输出是 MySQL 的安全警告 + 初始密码过期处理提示,并非执行错误。

  • Using a password on the command line interface can be insecure:这是安全提示,因为在命令行传递密码会被 ps 等工具捕获,存在风险。
  • Please use --connect-expired-password option or invoke mysql in interactive mode:这是核心提示 ------MySQL 初始临时密码处于 "过期" 状态,必须用指定方式登录并修改密码。
方案1:交互式修改(最安全、最可靠)

进入 MySQL 交互式终端,避免命令行传递密码的风险,且无需处理 Bash 转义问题:

bash 复制代码
# 用临时密码登录(--connect-expired-password 允许过期密码登录)
mysql -uroot -p"$TEMP_PWD" --connect-expired-password

登录后在 MySQL 终端内执行:

sql 复制代码
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的MySQL密码';
FLUSH PRIVILEGES;
EXIT;
方案2:非交互式脚本方式(适合自动化)

用 Here-Document 传递 SQL,避免命令行密码暴露,同时支持过期密码登录:

bash 复制代码
mysql -uroot -p"$TEMP_PWD" --connect-expired-password <<EOF
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的MySQL密码';
FLUSH PRIVILEGES;
EOF

注意事项

  1. --connect-expired-password 必须加:这是处理初始过期密码的必要选项,否则会被拒绝登录。
  2. 避免命令行明文密码 :生产环境中,尽量不用 -p"密码" 的方式传递密码,改用交互式输入或配置文件(~/.my.cnf)。
  3. 密码复杂度验证你的MySQL密码 符合 MySQL 8.0 的复杂度要求(包含大小写、数字、特殊字符),可以正常使用。

3.4 正式环境远程访问安全配置(禁止 root% 全量访问)

正式环境严禁开放 root 从任意IP访问,需指定业务IP段:

sql 复制代码
# 登录 MySQL
mysql -uroot -p"MySql@Prod8888_2026"

# 创建专用业务账号(替换为实际IP/账号/密码)
CREATE USER 'mysql_prod'@'192.168.1.%' IDENTIFIED BY 'Biz@Mysql888_2026';
# 仅授予必要权限(如仅允许操作 prod_db 库)
GRANT SELECT,INSERT,UPDATE,DELETE ON prod_db.* TO 'mysql_prod'@'192.168.1.%';
FLUSH PRIVILEGES;
exit;

四、正式环境验证与后续

bash 复制代码
# 1. 验证 MySQL 运行状态
systemctl status mysqld

# 2. 验证数据目录权限
ls -ld /data/mysql  # 确保属主是 mysql:mysql,权限 700

# 3. 验证远程连接(从业务机器测试)
mysql -umysql_prod -p"你的MySQL密码" -h 正式机IP -P 3306

# 4. 配置日志轮转(正式环境避免日志过大)
cat > /etc/logrotate.d/mysqld << EOF
/var/log/mysqld.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    create 640 mysql mysql
}
EOF

五、navicat等软件连接

  • 登录MySQL服务器端(关键操作)
    通过SSH连接到目标服务器(192.168.xxx.xxx),打开命令行并登录MySQL:
bash 复制代码
mysql -u root -p
# 输入root密码后进入MySQL交互界面
  • 创建用户(如果 root@% 不存在)

    sql 复制代码
    CREATE USER 'root'@'%' IDENTIFIED BY '你的MySQL密码';

    若提示用户已存在,可跳过此步,直接执行授权。

  • 为用户授权

    sql 复制代码
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
  • 刷新权限使修改生效

    sql 复制代码
    FLUSH PRIVILEGES;

  • 额外排查点
  • 服务器防火墙 :确保目标服务器的防火墙(如Linux的iptables/ufw、Windows防火墙)已开放3306端口。
  • MySQL配置 :检查MySQL的配置文件(如my.cnf/my.ini),确认bind-address设置为0.0.0.0(允许所有IP访问),而非127.0.0.1(仅本地访问)。
  • 端口监听 :在服务器端执行netstat -an | grep 3306,确认MySQL正在监听0.0.0.0:3306
相关推荐
松涛和鸣1 小时前
75、 IMX6ULL LM75温度传感器I2C驱动开发
java·linux·数据库·驱动开发·python
之歆2 小时前
Linux命令完全指南
linux·运维·服务器
Kendra9192 小时前
服务器上架流程
运维·服务器·网络·ip·磁盘
Flash.kkl2 小时前
MySQL访问
数据库·mysql
Lsir10110_2 小时前
【Linux】线程初步——线程概念以及接口认识
linux·运维·服务器
cuber膜拜2 小时前
Tenacity 原理与基本使用
服务器·网络·python·装饰器模式·tenacity
cuber膜拜2 小时前
PyBreaker 原理与基本使用
服务器·网络·python·pybreaker
zhougl9962 小时前
mysql数据库存储引擎
数据库·mysql·oracle
Albert Edison2 小时前
【Python】文件
android·服务器·python