版本号 : 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
核心前提(必做)
- 准备一台和目标正式机同版本的 CentOS 7 联网机器(用于下载离线依赖包);
- 正式机需确保:
- 已挂载数据盘(推荐
/data/mysql存放数据,避免系统盘占满); - 操作前做好系统备份(正式环境谨慎操作);
- 仅使用
root或授权的管理员账号操作。
- 已挂载数据盘(推荐
- 下载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 目录:
- mysql_deps.tar.gz(依赖包)
- 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
注意事项
--connect-expired-password必须加:这是处理初始过期密码的必要选项,否则会被拒绝登录。- 避免命令行明文密码 :生产环境中,尽量不用
-p"密码"的方式传递密码,改用交互式输入或配置文件(~/.my.cnf)。 - 密码复杂度验证 :
你的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@%不存在)sqlCREATE USER 'root'@'%' IDENTIFIED BY '你的MySQL密码';若提示用户已存在,可跳过此步,直接执行授权。
-
为用户授权
sqlGRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; -
刷新权限使修改生效
sqlFLUSH 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。