MySQL 8.0.42 手动部署全过程(CentOS 7 虚拟机 Linux)
本文档严格按照实操顺序记录,所有命令、报错、修正、原理均按“原始记录 → 正确示范 → 原理说明”三段式呈现。
方便以后一键复现或排错。
1 前期准备:确认系统版本、下载正确安装包
1.1 查看系统版本(原始记录)
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
1.2 确认 glibc 版本(原始记录)
[root@localhost ~]# grep -i glibc # 错误命令,从标准输入里面查找关键字,而不是查找文件
123^H^H^H^H^H^H^H^H^[[D^[[D^[[D^[[D^[[D^[[C^[[C
^[^H^C
[root@localhost ~]# rpm -q glibc #正确命令
glibc-2.17-317.el7.x86_64
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@localhost ~]# ^C
[root@localhost ~]# ldd --version | head -1
ldd (GNU libc) 2.17
#ldd (GNU libc) 2.17
只要这里显示 2.12 及以上(CentOS 7 自带 2.17),就能直接用官网的 mysql-8.0.42-linux-glibc2.12-x86_64.tar.xz。
1.3 官网下载对应包(原始记录)
官网地址:https://downloads.mysql.com/archives/community/
页面关键信息:
Windows (x86, 64-bit), MSI Installer Apr 1, 2025 169.5M mysql-9.3.0-winx64.msi
Windows (x86, 64-bit), ZIP Archive Mar 31, 2025 291.0M mysql-9.3.0-winx64.zip
...
注:此为归档页,Linux 用户应下载
mysql-8.0.42-linux-glibc2.12-x86_64.tar.xz(或更高 glibc 兼容版)。
实操时我已提前把mysql-8.0.42-linux-glibc2.17-x86_64.tar.xz放到/root目录。添加 MySQL 官方 YUM 仓库(系统推荐方式,但没用)
sudo rpm -Uvh https://repo.mysql.com/mysql80-community-release-el7-7.noarch.rpm如果你用的是 CentOS 8 / Rocky 8 / Alma 8,把
el7换成el8:sudo rpm -Uvh https://repo.mysql.com/mysql80-community-release-el8-7.noarch.rpm安装 MySQL Server
sudo yum install -y mysql-community-server
解压前清除系统自带的mariadb
[root@localhost ~]# sudo yum remove -y mariadb-libs
已加载插件:fastestmirror
正在解决依赖关系
--> 正在检查事务
---> 软件包 mariadb-libs.x86_64.1.5.5.68-1.el7 将被 删除
--> 正在处理依赖关系 libmysqlclient.so.18()(64bit),它被软件包 2:postfix-2.10.1-9.el7.x86_64 需要
--> 正在处理依赖关系 libmysqlclient.so.18(libmysqlclient_18)(64bit),它被软件包 2:postfix-2.10.1-9.el7.x86_64 需要
--> 正在检查事务
---> 软件包 postfix.x86_64.2.2.10.1-9.el7 将被 删除
--> 解决依赖关系完成
依赖关系解决
=======================================================================================================
Package 架构 版本 源 大小
=======================================================================================================
正在删除:
mariadb-libs x86_64 1:5.5.68-1.el7 @anaconda 4.4 M
为依赖而移除:
postfix x86_64 2:2.10.1-9.el7 @anaconda 12 M
事务概要
=======================================================================================================
移除 1 软件包 (+1 依赖软件包)
安装大小:17 M
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
正在删除 : 2:postfix-2.10.1-9.el7.x86_64 1/2
正在删除 : 1:mariadb-libs-5.5.68-1.el7.x86_64 2/2
验证中 : 1:mariadb-libs-5.5.68-1.el7.x86_64 1/2
验证中 : 2:postfix-2.10.1-9.el7.x86_64 2/2
删除:
mariadb-libs.x86_64 1:5.5.68-1.el7
作为依赖被删除:
postfix.x86_64 2:2.10.1-9.el7
完毕!
[root@localhost ~]# sudo rpm -Uvh https://repo.mysql.com/mysql80-community-release-el7-7.noarch.rpm
2 解压与目录规划
清楚本地
2.1 解压(原始记录)
[root@localhost ~]# tar -xvf mysql-8.0.42-linux-glibc2.17-x86_64.tar.xz
完成后得到:
mysql-8.0.42-linux-glibc2.17-x86_64
mysql-8.0.42-linux-glibc2.17-x86_64.tar.xz
3 用户、权限、目录迁移
3.1 创建专用用户(原始记录)
[root@localhost mysql8.0.42]# ls
mysql-8.0.42-linux-glibc2.17-x86_64 mysql-8.0.42-linux-glibc2.17-x86_64.tar.xz
[root@localhost mysql8.0.42]# groupadd mysql
[root@localhost mysql8.0.42]# useradd -r -g mysql root
useradd:用户“root”已存在
#这里开始创建
[root@localhost mysql8.0.42]# groupadd mysql
[root@localhost mysql8.0.42]# useradd -r -g mysql mysql
3.2 目录迁移(原始记录)
# 从 /root 搬到 /usr/local/mysql8.0.42
sudo mkdir -p /usr/local/mysql8.0.42
sudo mv /root/mysql8.0.42/mysql-8.0.42-linux-glibc2.17-x86_64 /usr/local/mysql8.0.42/mysql
sudo mv /root/mysql8.0.42/mysql-data /usr/local/mysql8.0.42/data
sudo chown -R mysql:mysql /usr/local/mysql8.0.42
sudo chmod 750 /usr/local/mysql8.0.42/data
3.3 原理说明
- 为什么要搬?
/root默认 700,mysql 用户无权进入;/usr/local固定路径方便 systemd、脚本、教程通用。 - 路径固定:
官方脚本、systemd 服务、社区教程都默认二进制在/usr/local/mysql。留在/root/…里,以后每次写路径都要带一长串,极易打错。 - 权限 750 让 mysql 用户可读写,其他用户不可写,安全。
- root 家目录权限:
/root默认 700,其他用户(包括 mysql 用户)根本进不去,会导致mysqld_safe、mysqld启动失败或日志写不进去。 - SELinux/AppArmor:
非标准路径会被安全模块拒绝访问,排错更麻烦。
如果你坚持不搬,只要 保证 mysql 用户对整棵树可读可执行,且数据目录可写,也能跑,但属于“给自己挖坑”。
4 配置文件 /etc/my.cnf
4.1 手动新建(原始记录)
修改编写新的配置文件
root@localhost mysql8.0.42]# vi /etc/my.cnf
[root@localhost mysql8.0.42]# vi /etc/my.cnf
[root@localhost mysql8.0.42]# ^C
[root@localhost mysql8.0.42]# ls -ld /data/mysql
drwxr-xr-x. 2 mysql mysql 6 8月 11 10:50 /data/mysql
[root@localhost mysql8.0.42]# sudo mv /root/mysql8.0.42/mysql-8.0.42-linux-glibc2.17-x86_64 /usr/local/mysql
[root@localhost mysql8.0.42]# sudo chown -R mysql:mysql /usr/local/mysql
[root@localhost mysql8.0.42]# ^C
[root@localhost mysql8.0.42]# # 先停掉可能已启动的 mysqld(如果之前启动过)
[root@localhost mysql8.0.42]# sudo pkill -f mysqld
[root@localhost mysql8.0.42]#
[root@localhost mysql8.0.42]# # 把当前数据目录搬到你想要的位置
[root@localhost mysql8.0.42]# sudo mv /data/mysql /root/mysql8.0.42/mysql-data
[root@localhost mysql8.0.42]# sudo mv /usr/local/mysql /root/mysql8.0.42/mysql-8.0.42-linux-glibc2.17-x86_64
[root@localhost mysql8.0.42]# sudo chown -R mysql:mysql /root/mysql8.0.42/mysql-8.0.42-linux-glibc2.17-x86_64
[root@localhost mysql8.0.42]# sudo chown -R mysql:mysql /root/mysql8.0.42/mysql-data
[root@localhost mysql8.0.42]# vi /etc/my.cnf
[root@localhost mysql8.0.42]# # 确保路径正确
[root@localhost mysql8.0.42]# cp /root/mysql8.0.42/mysql-8.0.42-linux-glibc2.17-x86_64/support-files/my-default.cnf /etc/my.cnf
cp: 无法获取"/root/mysql8.0.42/mysql-8.0.42-linux-glibc2.17-x86_64/support-files/my-default.cnf" 的文件状态(stat): 没有那个文件或目录
[root@localhost mysql8.0.42]# vi /etc/my.cnf
[root@localhost mysql8.0.42]# vi /etc/my.cnf
[root@localhost mysql8.0.42]# chown root:root /etc/my.cnf
[root@localhost mysql8.0.42]# chmod 644 /etc/my.cnf
[root@localhost mysql8.0.42]#
编辑其中没有配置文件,搭建并插入模板:
对,既然模板文件 my-default.cnf 不存在,就直接 手动新建 /etc/my.cnf 即可。
操作步骤:
-
打开(或新建)配置文件
vi /etc/my.cnf -
把下面最小配置 整段复制粘贴 进去(按
i进入插入模式,粘贴,按Esc→:wq→Enter保存退出):[mysqld] basedir = /root/mysql8.0.42/mysql-8.0.42-linux-glibc2.17-x86_64 datadir = /root/mysql8.0.42/mysql-data socket = /tmp/mysql.sock port = 3306 user = mysql [mysqld_safe] log-error = /root/mysql8.0.42/mysql-data/mysqld.log pid-file = /root/mysql8.0.42/mysql-data/mysqld.pid [client] socket = /tmp/mysql.sock -
赋权(一次性即可)
chown root:root /etc/my.cnf chmod 644 /etc/my.cnf #sudo chown root:root /etc/my.cnf #sudo chmod 644 /etc/my.cnf
5 初始化数据目录
5.1 初始化(原始记录)
sudo /usr/local/mysql8.0.42/mysql/bin/mysqld \
--defaults-file=/etc/my.cnf \
--initialize \
--user=mysql
输出关键信息:
A temporary password is generated for root@localhost: #Qj1/*leij<g
报错点:
路径错误分析(可能是因为没有迁移之前的文件)
[root@localhost mysql8.0.42]# ls
mysql-8.0.42-linux-glibc2.17-x86_64 mysql-data
mysql-8.0.42-linux-glibc2.17-x86_64.tar.xz
[root@localhost mysql8.0.42]# ./bin/mysqld --defaults-file-/etc/my.cnf --basedir-/user/local/mysql8.0.42 --datadir-/data/mysql --user-mysql --initialize
-bash: ./bin/mysqld: 没有那个文件或目录
[root@localhost mysql8.0.42]#
两个问题:
-
当前目录不对
你现在在/root/mysql8.0.42,而真正的二进制目录是
/root/mysql8.0.42/mysql-8.0.42-linux-glibc2.17-x86_64,所以./bin/mysqld找不到。 -
参数写错
每个参数都应该是 两个横线 + 等号,例如--basedir=...,而不是--basedir-...。 -
报错信息一句话总结:
mysql 用户对/root/mysql8.0.42/mysql-data目录没有权限,导致初始化失败。
解决办法:
解决办法(两种,二选一)
✅ 方案 A:把数据目录搬到 mysql 用户能访问的路径(最简单)
sudo mv /root/mysql8.0.42/mysql-data /data/mysql # 或 /opt/mysql-data
sudo chown -R mysql:mysql /data/mysql
sudo chmod 750 /data/mysql
然后修改 /etc/my.cnf 里的 datadir 指向新路径:
datadir = /data/mysql
再执行初始化即可。
✅ 方案 B:强行给 /root 加权限(不推荐)
sudo chmod 755 /root
这样 mysql 用户可以进入 /root,但会把 root 用户家目录暴露给系统所有用户,有安全隐患。
6 启动 MySQL
配置重启:
[root@localhost mysql]# vi /etc/my.cnf
[root@localhost mysql]# sudo chown root:root /etc/my.cnf
[root@localhost mysql]# sudo chmod 644 /etc/my.cnf
[root@localhost mysql]# sudo /usr/local/mysql8.0.42/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &
[2] 2998
[root@localhost mysql]# 2025-08-11T04:16:26.288575Z mysqld_safe Logging to '/usr/local/mysql8.0.42/data/mysqld.log'.
2025-08-11T04:16:26.328910Z mysqld_safe A mysqld process already exists
[2]+ 退出 1 sudo /usr/local/mysql8.0.42/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql
[root@localhost mysql]# ^C
创建mysql服务,创建开机自启动的形式(最顺利的一步)
[root@localhost mysql]# cp /user/local/mysql8.0.42/support-files/mysql.server /stc/init.d/mysqld
cp: 无法获取"/user/local/mysql8.0.42/support-files/mysql.server" 的文件状态(stat): 没有那个文件或目录
[root@localhost mysql]# cp /usr/local/mysql8.0.42/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@localhost mysql]# chkconfig --add mysqld
[root@localhost mysql]# --list mysql
-bash: --list: 未找到命令
[root@localhost mysql]# chkconfig --list mysqld
注:该输出结果只显示 SysV 服务,并不包含
原生 systemd 服务。SysV 配置数据
可能被原生 systemd 配置覆盖。
要列出 systemd 服务,请执行 'systemctl list-unit-files'。
查看在具体 target 启用的服务请执行
'systemctl list-dependencies [target]'。
mysqld 0:关 1:关 2:开 3:开 4:开 5:开 6:关
[root@localhost mysql]# service mysql start
Redirecting to /bin/systemctl start mysql.service
[root@localhost mysql]# service mysql status
Redirecting to /bin/systemctl status mysql.service
● mysqld.service - LSB: start and stop MySQL
Loaded: loaded (/etc/rc.d/init.d/mysqld; bad; vendor preset: disabled)
Active: active (exited) since 一 2025-08-11 12:25:59 CST; 32s ago
Docs: man:systemd-sysv-generator(8)
Process: 3284 ExecStart=/etc/rc.d/init.d/mysqld start (code=exited, status=0/SUCCESS)
8月 11 12:25:58 localhost.localdomain systemd[1]: Starting LSB: start and stop MySQL...
8月 11 12:25:59 localhost.localdomain mysqld[3284]: Starting MySQL SUCCESS!
8月 11 12:25:59 localhost.localdomain systemd[1]: Started LSB: start and stop MySQL.
8月 11 12:25:59 localhost.localdomain mysqld[3284]: 2025-08-11T04:25:59.206963Z mysql...s
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost mysql]#
6.1 使用 mysqld_safe(原始记录)
sudo /usr/local/mysql8.0.42/mysql/bin/mysqld_safe \
--defaults-file=/etc/my.cnf \
--user=mysql &
6.2 注册为系统服务(原始记录)
cp /usr/local/mysql8.0.42/mysql/support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig --list mysqld
# 输出:2、3、4、5 为 on
service mysqld start
systemctl status mysqld
注意:CentOS 7 同时支持 SysV 与 systemd,这里保留 SysV 脚本。
7 配置环境变量
配置环境变量
把 MySQL 的 bin 目录永久加到 PATH 里,只需在 /etc/profile.d/ 下面新建一个脚本即可,所有登录用户都会自动生效。步骤如下:
- 新建一个脚本,名字随意,如 mysql.sh
sudo vim /etc/profile.d/mysql.sh
- 填入以下内容(路径以你实际安装目录为准)
export PATH=$PATH:/usr/local/mysql8.0.42/mysql/bin
- 保存退出后让当前终端立即生效
source /etc/profile.d/mysql.sh
- 验证
which mysql
# 输出:/usr/local/mysql8.0.42/mysql/bin/mysql
mysql -V
# 输出:Ver 8.0.42 ...
- 完成!以后无论哪个用户登录,都可以直接敲
mysql命令,无需再写全路径。
[root@localhost mysql]# vi /etc/profile
[root@localhost mysql]# source /etc/profile
[root@localhost mysql]# env
XDG_SESSION_ID=3
HOSTNAME=localhost.localdomain
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.231.1 52750 22
SELINUX_USE_CURRENT_RANGE=
OLDPWD=/root/mysql8.0.42
SSH_TTY=/dev/pts/0
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql8.0.42/mysql/bin:/usr/local/mysql8.0.42/mysql/lib
PWD=/usr/local/mysql8.0.42/mysql
LANG=zh_CN.UTF-8
SELINUX_LEVEL_REQUESTED=
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
SSH_CONNECTION=192.168.231.1 52750 192.168.231.128 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env
[root@localhost mysql]#
7.1 原始记录
sudo vim /etc/profile.d/mysql.sh
内容:
export PATH=$PATH:/usr/local/mysql8.0.42/mysql/bin
生效:
source /etc/profile.d/mysql.sh
8 重置 root 密码
8.1 跳过权限表登录(原始记录)
# 先停掉正常实例
systemctl stop mysqld
# 以跳过权限模式启动
/usr/local/mysql8.0.42/mysql/bin/mysqld_safe \
--defaults-file=/etc/my.cnf \
--skip-grant-tables &
# 登录
/usr/local/mysql8.0.42/mysql/bin/mysql -uroot
8.2 修改密码(原始记录)
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
EXIT;
重启正常实例:
pkill -f mysqld_safe
systemctl start mysqld
mysql -uroot -p
重置密码过程:
# 步骤 1:确认已处于 --skip-grant-tables 模式
# 解释:跳过权限验证,便于重设 root 密码
/usr/local/mysql8.0.42/mysql/bin/mysql -uroot
# 步骤 2:刷新权限表
# 解释:重新载入系统表,防止 ALTER USER 报错
FLUSH PRIVILEGES;
# 步骤 3:重置 root 密码
# 解释:把 root 密码改成 root
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
# 步骤 4:验证当前身份
SELECT USER(), CURRENT_USER();
# 步骤 5:查看系统自带数据库
SHOW DATABASES;
# 步骤 6:查看当前所有账号
SELECT User, Host FROM mysql.user;
# 步骤 7:退出 MySQL
EXIT;
# 步骤 8:杀掉临时 mysqld_safe 进程
pkill -f mysqld_safe
# 步骤 9:用 systemd 正常启动
systemctl start mysqld
# 步骤 10:用新密码正式登录
/usr/local/mysql8.0.42/mysql/bin/mysql -uroot -p
# 提示 Enter password: 时输入 root
使用命令报错(第一次是因为需要修改随机密码,已经改掉了):
mysql> SHOW DATABASE;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DATABASE' at line 1
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
错误原因;database使用复数形式
9 授权远程连接
9.1 修改 user 表(原始记录)
USE mysql;
UPDATE user SET host='%' WHERE user='root';
FLUSH PRIVILEGES;
授权远程用户连接->修改user表->改host,允许所有的用户访问
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql> show tables;
+------------------------------------------------------+
| Tables_in_mysql |
+------------------------------------------------------+
| columns_priv |
| component |
| db |
| default_roles |
| engine_cost |
| func |
| general_log |
| global_grants |
| gtid_executed |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| innodb_index_stats |
| innodb_table_stats |
| ndb_binlog_index |
| password_history |
| plugin |
| procs_priv |
| proxies_priv |
| replication_asynchronous_connection_failover |
| replication_asynchronous_connection_failover_managed |
| replication_group_configuration_version |
| replication_group_member_actions |
| role_edges |
| server_cost |
| servers |
| slave_master_info |
| slave_relay_log_info |
| slave_worker_info |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+------------------------------------------------------+
38 rows in set (0.00 sec)
mysql> update user set host='%' where= 'root'
-> update user set host='%' where= 'root';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= 'root'
update user set host='%' where= 'root'' at line 1
mysql> UPDATE mysql.user SET host='%' WHERE user='root';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
10 防火墙放通 3306
10.1 原始记录(含报错)
[root@localhost mysql]# firewalld -cmd --zone=public --add-port=3306/tcp --permanent
# 报错:firewalld: error: unrecognized arguments: -cmd ...
[root@localhost mysql]# sudo firewall-cmd --permanent --zone=public --add-port=3306/tcp
success
[root@localhost mysql]# sudo firewall-cmd --reload
success
[root@localhost mysql]# firewall-cmd --query-port=3306/tcp
yes
报错操作实例:主机navicat连接虚拟机(ping,检查防火墙,发现防火墙之后开通端口,仍有报错)
[root@localhost mysql]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since 一 2025-08-11 09:42:33 CST; 3h 40min ago
Docs: man:firewalld(1)
Main PID: 700 (firewalld)
CGroup: /system.slice/firewalld.service
└─700 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
8月 11 09:42:33 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewa....
8月 11 09:42:33 localhost.localdomain systemd[1]: Started firewalld - dynamic firewal....
8月 11 09:42:33 localhost.localdomain firewalld[700]: WARNING: AllowZoneDrifting is e....
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost mysql]# firewalld -cmd --zone=public --add-port=3306/tcp --permanent
usage: firewalld [-h] [--debug [level]] [--debug-gc] [--nofork] [--nopid]
[--system-config path] [--default-config path]
[--log-file path]
firewalld: error: unrecognized arguments: -cmd --zone=public --add-port=3306/tcp --permanent
[root@localhost mysql]# sudo firewalld-cmd --permanent --zone=public --add-port=3306/tcp
sudo: firewalld-cmd:找不到命令
[root@localhost mysql]# sudo firewall-cmd --permanent --zone=public --add-port=3306/tcp
success
[root@localhost mysql]# sudo firewall-cmd --reload
success
[root@localhost mysql]# sudo firewall-cmd --list-ports --zone=public
3306/tcp
[root@localhost mysql]# firewall-cmd --query-port-3306/tcp
usage: see firewall-cmd man page
firewall-cmd: error: unrecognized arguments: --query-port-3306/tcp
[root@localhost mysql]# firewall-cmd --query-port=3306/tcp
yes
[root@localhost mysql]# netstat -lntp | grep 3306
-bash: netstat: 未找到命令
[root@localhost mysql]# ss -lntp | grep 3306
查找问题并解决:
一句话结论
MySQL 8.0 已经正常启动并同时在 IPv6 的 3306 和 33060 端口上监听,你之前连不上只是因为“旧 mysqld 进程没杀干净”导致新实例起不来,并不是配置出错。
下面按时间线把整个过程“翻译”给你听:
-
最开始
- 你执行
systemctl status mysqld看到active (exited),又去ss查 3306 没结果,于是以为服务没启动。 - 实际上那时 有一个残留的 mysqld 进程在跑,只是它没把 3306 暴露出来(可能上一次启动参数异常或崩溃)。systemd 的 SysV 脚本检测到“进程已存在”就直接返回 “SUCCESS”,结果 systemd 标成
active (exited),你就误以为启动成功。
- 你执行
-
错误日志里的线索
mysqld_safe A mysqld process already exists这句告诉你:新的 mysqld_safe 发现旧进程还在,于是自己退出,3306 当然监听不到。
-
我的操作
-
让你杀掉所有旧进程:
pkill -9 mysqld pkill -9 mysqld_safe -
再
systemctl restart mysqld—— 这下 真正全新启动 了。
-
-
结果
ss -lntp | grep 3306 LISTEN 0 128 [::]:3306 ...IPv6 的 3306 端口已经在监听(IPv4 也能连,Linux 双栈),证明服务完全正常。
你现在只需要用客户端连接 服务器IP:3306 即可;如果客户端只认 IPv4,把地址写成 127.0.0.1 或实际 IPv4 地址也没问题。
11 验证监听与 Navicat 连接
11.1 查看端口监听(原始记录)
ss -lntp | grep 3306
输出:
LISTEN 0 128 [::]:3306 [::]:* users:(("mysqld",pid=...,fd=...))
IPv6 同时兼容 IPv4,Navicat 直接连服务器 IP:3306 即可。
12 附录:vi 快速退出技巧(原始记录)
用 vi(或 vim)打开配置文件后,任何时候想直接退出而不保存,按下面 3 步即可:
- 按
Esc回到命令模式 - 输入
:q!(冒号 + q + 感叹号) - 回车
解释
:进入命令行q代表 quit(退出)!强制,忽略未保存的修改
这样就能“干净”地退出,不会留下任何改动。
13 一键脚本(正确示范汇总)
以下脚本与上文完全等价,可直接复制执行:
#!/bin/bash
# 0. 安装依赖
yum install -y libaio numactl
# 1. 创建用户
groupadd mysql && useradd -r -g mysql mysql
# 2. 目录规划
mkdir -p /usr/local/mysql8.0.42
mv /root/mysql-8.0.42-linux-glibc2.17-x86_64 /usr/local/mysql8.0.42/mysql
mv /root/mysql-data /usr/local/mysql8.0.42/data
chown -R mysql:mysql /usr/local/mysql8.0.42
chmod 750 /usr/local/mysql8.0.42/data
# 3. 写入配置文件
cat >/etc/my.cnf <<'EOF'
[mysqld]
basedir=/usr/local/mysql8.0.42/mysql
datadir=/usr/local/mysql8.0.42/data
socket=/tmp/mysql.sock
port=3306
user=mysql
[mysqld_safe]
log-error=/usr/local/mysql8.0.42/data/mysqld.log
pid-file=/usr/local/mysql8.0.42/data/mysqld.pid
[client]
socket=/tmp/mysql.sock
EOF
chown root:root /etc/my.cnf && chmod 644 /etc/my.cnf
# 4. 初始化
/usr/local/mysql8.0.42/mysql/bin/mysqld \
--defaults-file=/etc/my.cnf \
--initialize --user=mysql
# 5. 启动并设置开机自启
cp /usr/local/mysql8.0.42/mysql/support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
service mysqld start
# 6. 环境变量
echo 'export PATH=$PATH:/usr/local/mysql8.0.42/mysql/bin' > /etc/profile.d/mysql.sh
source /etc/profile.d/mysql.sh
# 7. 防火墙
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
echo "MySQL 8.0.42 安装完成,临时密码见 /usr/local/mysql8.0.42/data/mysqld.log"
至此,一份“原汁原味”又“完全可用”的 MySQL 8 手动部署文档整理完毕。

浙公网安备 33010602011771号