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_safemysqld 启动失败或日志写不进去。
  • 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 即可。
操作步骤:

  1. 打开(或新建)配置文件

    vi /etc/my.cnf
    
  2. 把下面最小配置 整段复制粘贴 进去(按 i 进入插入模式,粘贴,按 Esc:wqEnter 保存退出):

    [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
    
  3. 赋权(一次性即可)

    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]# 

两个问题:

  1. 当前目录不对
    你现在在 /root/mysql8.0.42,而真正的二进制目录是
    /root/mysql8.0.42/mysql-8.0.42-linux-glibc2.17-x86_64,所以 ./bin/mysqld 找不到。

  2. 参数写错
    每个参数都应该是 两个横线 + 等号,例如 --basedir=...,而不是 --basedir-...

  3. 报错信息一句话总结:
    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 进程没杀干净”导致新实例起不来,并不是配置出错。

下面按时间线把整个过程“翻译”给你听:

  1. 最开始

    • 你执行 systemctl status mysqld 看到 active (exited),又去 ss 查 3306 没结果,于是以为服务没启动。
    • 实际上那时 有一个残留的 mysqld 进程在跑,只是它没把 3306 暴露出来(可能上一次启动参数异常或崩溃)。systemd 的 SysV 脚本检测到“进程已存在”就直接返回 “SUCCESS”,结果 systemd 标成 active (exited),你就误以为启动成功。
  2. 错误日志里的线索

    mysqld_safe A mysqld process already exists
    

    这句告诉你:新的 mysqld_safe 发现旧进程还在,于是自己退出,3306 当然监听不到。

  3. 我的操作

    • 让你杀掉所有旧进程:

      pkill -9 mysqld
      pkill -9 mysqld_safe
      
    • systemctl restart mysqld —— 这下 真正全新启动 了。

  4. 结果

    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 步即可:

  1. Esc 回到命令模式
  2. 输入 :q!(冒号 + q + 感叹号)
  3. 回车

解释

  • : 进入命令行
  • 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 手动部署文档整理完毕。

posted @ 2025-08-11 16:35  柒寒(平安)  阅读(172)  评论(0)    收藏  举报