Re:Mysql数据库基础篇(一):CentOS/Linux 环境下的完整安装/运行/登录Mysql流程与首次登录异常处理


◆ 博主名称: 小此方-CSDN博客 大家好,欢迎来到小此方的博客。
⭐️Linux系列个人专栏: 【主题曲】Mysql
⭐️此方的GitHub: github_此方
⭐️ Re系列专栏:我们思考 (Rethink) · 我们重建 (Rebuild) · 我们记录 (Record)


文章目录


概要&序論

  本文详细介绍在 Linux 系统上完整部署、配置与调试 MySQL 数据库的全流程。

  • 详解旧版本 MySQL 的运行状态检查、服务关闭与残留配置文件卸载方法;
  • 演示 MySQL 一键安装包部署及密钥过期问题的解决方案;
  • 剖析首次登录引发的权限问题,并提供临时密码、直接登录及绕过权限认证三种核心调整方法;
  • 解答修改配置文件端口号失败与设置开机自启等边缘运维问题。

  好的,我们开始吧。

一、下载准备工作

1.1 查看和卸载你的机器上原有的Mysql

  在在 Linux 系统上安装全新的 MySQL 之前,首先需要彻底检查系统中是否已经存在正在运行的 MySQL 或其开源分支 MariaDB 进程。 如果存在旧的版本或者残余的安装包,必须先将其安全关闭并进行彻底卸载,以防止后续安装新版本时发生端口冲突、依赖冲突或配置覆盖等问题。

1.1.1 检查旧版本运行状态

1. 检查 MySQL 进程:

  使用 ps axj | grep mysql 命令可以筛选出所有与 MySQL 相关的进程。

bash 复制代码
[root@VM-0-9-opencloudos ~]# ps axj | grep mysql
1371073 1371358 1371357 1371073 pts/0    1371357 S+        0   0:00 grep --color=auto mysql

  结果分析: 输出中仅有一条包含 grep --color=auto mysql 的记录,这说明当前系统上并没有真正运行的 MySQL 服务的后台进程。

2. 检查 MariaDB 进程:

  MariaDB 是 MySQL 的一个开源分支,在许多主流 Linux 发行版中常被作为默认数据库内置安装。因此也需要专门对其进行检查:

bash 复制代码
[root@VM-0-9-opencloudos ~]# ps axj | grep mariadb
1371073 1371525 1371524 1371073 pts/0    1371524 S+        0   0:00 grep --color=auto mariadb

  结果分析: 同样,输出仅显示了 grep 过滤命令自身,表明系统中也没有正在运行的 MariaDB 进程。

1.1.2 关闭正在运行的旧服务

  重要提示: 卸载原有的 MySQL 或 MariaDB 之前,必须先手动关闭它,且该操作对权限要求较高,需要切换至 root 用户或使用 sudo 提升权限。

  如果你的系统在第一步中查出了正在运行的数据库进程,请执行以下命令停止服务:

bash 复制代码
[root@VM-0-9-opencloudos ~]# systemctl stop mysqld
Failed to stop mysqld.service: Unit mysqld.service not loaded.

  结果分析: 系统提示 Unit mysqld.service not loaded(服务未加载),再次印证了当前系统此前并未安装或未启动 mysqld 服务。

1.1.3 查看并卸载已有安装包

  即使服务没有运行,系统里也可能残留有通过包管理器安装的静态安装包。 我们需要通过 RPM 机制将其检索并一并清除。

1. 检索系统内已安装的 MySQL 关联包:

bash 复制代码
[root@VM-0-9-opencloudos ~]# rpm -qa | grep mysql

  结果分析: 命令执行后没有任何回显,说明当前系统没有通过 rpm 安装任何带有 "mysql" 关键字的软件包。

标准环境下的卸载补充说明:

  如果在您的机器上运行 rpm -qa | grep mysql 后列出了具体的安装包,则需要将其送入后面的卸载程序。

  推荐使用以下高效的一键式卸载组合命令(该命令会利用 xargs 将查找到的每一个安装包名称作为参数传给卸载程序,且 yum -y remove 会在卸载过程中不再询问确认):

rpm -qa | grep mysql | xargs yum -y remove

1.1.4 检查配置文件及数据残留

  为了确保"干净"的全新安装环境,除了卸载软件包外,还要重点检查历史遗留的全局配置文件以及数据存放目录。

1. 检查全局配置文件路径 /etc/my.cnf

  通常,MySQL 的核心配置都保存在该文件中。

bash 复制代码
[root@VM-0-9-opencloudos ~]# ls /etc/my.cnf
ls: cannot access '/etc/my.cnf': No such file or directory

2. 检查数据存储目录 /var/lib/mysql/

  该目录用来存放数据库的表结构、数据文件以及服务证书等。

bash 复制代码
[root@VM-0-9-opencloudos ~]# ls  /var/lib/mysql/
ls: cannot access '/var/lib/mysql/': No such file or directory

  结论: 经过全面的排查,本机器当前无任何运行中的 MySQL/MariaDB 进程,无相关的 rpm 安装包,且无历史配置与数据残留。这表明当前的系统环境非常纯净,符合直接下载和部署新源的准备要求。

(注意:若在实际机器中发现 /var/lib/mysql/ 存在残留数据文件且确实不再需要,可以使用重命名备份的方式进行处理,如 mv /var/lib/mysql /var/lib/mysql.bak,以此确保新环境不会受历史脏数据影响)

1.2 下载 yum 源

1.2.1 定位官方软件仓库与版本筛选

  下载版本必须与操作系统匹配。查看我们下系统版本:

  我们可以通过浏览器访问 MySQL 官方的源下载入口:http://repo.mysql.com/。由于网页显示限制,建议查看网页源代码。

  锁定你的系统版本 ;我们通过 hostnamectl 已经查明当前运行的系统为 OpenCloudOS 9.4,因此,我们需要在列表中找到 mysql80-community-release-el9-1.noarch.rpm 这一行并点击下载至本地 Windows 电脑中。

1.2.2 上传至 Linux 服务器

  在本地成功获取到对应的 .rpm 源安装包后,我们需要将其传递到 Linux 环境下的专属文件夹内。首先,在 root 用户家目录下为本次安装创建独立的目录。

bash 复制代码
[root@VM-0-9-opencloudos ~]# mkdir Mysql
[root@VM-0-9-opencloudos ~]# tree
.
└── Mysql

1 directory, 0 files
[root@VM-0-9-opencloudos ~]# cd Mysql

  进入新建的 Mysql 文件夹后,利用传输工具把刚才下载到 Windows 本地的安装包拖拽上传:

bash 复制代码
[root@VM-0-9-opencloudos Mysql]# rz

  文件传输完毕后,执行 ls -l 检查文件的大小与完整性:

bash 复制代码
[root@VM-0-9-opencloudos Mysql]# ls -l
total 12
-rw-r--r-- 1 root root 10534 Jun  3 11:18 mysql80-community-release-el9-1.noarch.rpm

1.2.3 部署官方 YUM 源文件

  在正式部署之前,我们可以先观察一下系统当前处于"未安装前"的初始源状态。查看系统存放源配置的全局目录 /etc/yum.repos.d/

bash 复制代码
[root@VM-0-9-opencloudos Mysql]# ls /etc/yum.repos.d/ -al
total 40
drwxr-xr-x  2 root root   115 May  5 10:57 .
drwxr-xr-x 94 root root  8192 May 27 13:32 ..
-rw-r--r--  1 root root 15822 May  5 10:57 acb56602e5db580ace217147a335f5bb.jpg
-rw-r--r--  1 root root   869 Jun 19  2025 epol.repo
-rw-r--r--  1 root root  1101 Nov 21  2025 epol.repo.rpmnew
-rw-r--r--  1 root root  2897 Jun 19  2025 OpenCloudOS.repo

  接下来,通过 rpm -ivh 命令正式把这个"官方商店"安装进系统:

bash 复制代码
[root@VM-0-9-opencloudos Mysql]# rpm -ivh mysql80-community-release-el9-1.noarch.rpm
warning: mysql80-community-release-el9-1.noarch.rpm: Header V4 RSA/SHA256 Signature, key ID 3a79bd29: NOKEY
Verifying...                                ################################# [100%]
Preparing...                                ################################# [100%]
Updating / installing...
   1:mysql80-community-release-el9-1  ################################# [100%]

  (注:安装过程中出现的 NOKEY 警告是由于尚未导入 MySQL 官方的 GPG 密钥文件,不影响软件源的正常写入,属于正常现象。)

1.2.4 验证安装后的源状态

  安装完成后,我们再次使用 ls /etc/yum.repos.d/ -al 命令查看源目录的变化:

bash 复制代码
[root@VM-0-9-opencloudos Mysql]# ls /etc/yum.repos.d/ -al
total 52
drwxr-xr-x  2 root root   216 Jun  3 11:24 .
drwxr-xr-x 94 root root  8192 May 27 13:32 ..
-rw-r--r--  1 root root 15822 May  5 10:57 acb56602e5db580ace217147a335f5bb.jpg
-rw-r--r--  1 root root   869 Jun 19  2025 epol.repo
-rw-r--r--  1 root root  1101 Nov 21  2025 epol.repo.rpmnew
-rw-r--r--  1 root root   951 Jul  6  2022 mysql-community-debuginfo.repo
-rw-r--r--  1 root root   827 Jul  6  2022 mysql-community.repo
-rw-r--r--  1 root root   871 Jul  6  2022 mysql-community-source.repo
-rw-r--r--  1 root root  2897 Jun 19  2025 OpenCloudOS.repo

  此时多了 3 个以 mysql-community 开头的全新 .repo 配置文件第一个:支持直接安装Mysql,第二个:支持安装Mysql周边内容

二、安装与登录Mysql

2.1一键安装

yum install -y mysql-community-server

2.1.1解决密钥过期问题

bash 复制代码
Import of key(s) didn't help, wrong key(s)?
Public key for mysql-community-client-8.0.46-1.el9.x86_64.rpm is not installed. Failing package is: mysql-community-client-8.0.46-1.el9.x86_64
 GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022
Public key for mysql-community-client-plugins-8.0.46-1.el9.x86_64.rpm is not installed. Failing package is: mysql-community-client-plugins-8.0.46-1.el9.x86_64
 GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022
Public key for mysql-community-common-8.0.46-1.el9.x86_64.rpm is not installed. Failing package is: mysql-community-common-8.0.46-1.el9.x86_64
 GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022
Public key for mysql-community-icu-data-files-8.0.46-1.el9.x86_64.rpm is not installed. Failing package is: mysql-community-icu-data-files-8.0.46-1.el9.x86_64
 GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022
Public key for mysql-community-libs-8.0.46-1.el9.x86_64.rpm is not installed. Failing package is: mysql-community-libs-8.0.46-1.el9.x86_64
 GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022
Public key for mysql-community-server-8.0.46-1.el9.x86_64.rpm is not installed. Failing package is: mysql-community-server-8.0.46-1.el9.x86_64
 GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022
The downloaded packages were saved in cache until the next successful transaction.
You can remove cached packages by executing 'yum clean packages'.
Error: GPG check FAILED

  oh,很不幸,出错了,什么问题?密钥过期了。解决方案: 导入最新密钥。

bash 复制代码
# 导入 2023 与 2025 的密钥
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2025

2.1.2 检查 MySQL 的状态

  在成功解决密钥过期问题并完成一键安装后,我们需要检查 MySQL 服务是否正确安装,并确认其可执行文件及配置文件的分布情况。

1. 验证配置文件与可执行程序:

  首先,我们可以通过 ls /etc/my.cnf 确认全局配置文件是否已经生成:

bash 复制代码
[root@bite-alicloud MySQL]# ls /etc/my.cnf
/etc/my.cnf

  接着,使用 which 命令查找 MySQL 服务端核心程序 mysqld 的安装路径:

bash 复制代码
[root@bite-alicloud MySQL]# which mysqld
/sbin/mysqld

2. 服务端与用户端的区别:

  为了更深入地理解 MySQL 的程序结构,我们可以分别查看服务端 mysqld 与客户端 mysql 程序的所在路径:

bash 复制代码
[root@bite-alicloud MySQL]# which mysqld
/sbin/mysqld
[root@bite-alicloud MySQL]# which mysql
/bin/mysql
  • 服务端 (/sbin/mysqld) :位于 sbin(Superuser Binaries)目录下,这意味着它是超级管理员专属的可执行程序,通常只有超级管理员(root)权限才能够直接启动和管理该系统服务。
  • 用户端 (/bin/mysql) :位于 bin 目录下,属于通用用户端工具,系统中任何普通用户都可以运行该程序来连接和访问数据库。

3. 启动并查看服务进程:

  使用 systemctl start mysqld 命令正式启动 MySQL 守护进程。启动后,利用 ps axj | grep mysqld 检查其在后台的运行状态:

bash 复制代码
[root@bite-alicloud MySQL]# systemctl start mysqld
[root@bite-alicloud MySQL]# ps axj | grep mysqld
    1  3468  3467  3467 ?           -1 Sl     27   0:00 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
 2728  3497  3496  2660 pts/0     3496 R+        0   0:00 grep --color=auto mysqld

  结果分析: 此时可以清晰地看到 /usr/sbin/mysqld 已经作为守护进程成功在后台异步启动,且关联的进程 ID(PID)为 3468

4. 查看服务端默认网络端口号:

  在确认进程启动后,我们需要进一步验证它是否正常监听了网络端口。使用 netstat -nltp 命令过滤网络状态:

bash 复制代码
[root@bite-alicloud MySQL]# ll
total 0
[root@bite-alicloud MySQL]# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:* LISTEN      824/httpd
tcp        0      0 0.0.0.0:22              0.0.0.0:* LISTEN      1038/sshd
tcp6       0      0 :::3306                 :::* LISTEN      3468/mysqld

  结果分析: 最后一行的网络监听信息显示,MySQL 服务端进程(PID 3468)正处于 LISTEN 状态,其默认的服务端口号为 3306

2.2 首次登录与配置调整

2.2.1登录引发权限问题

  在完成上述步骤后,MySQL 已经开始正常对外服务。然而,当我们直接尝试使用管理员身份进行登录时,会遇到权限拦截:

bash 复制代码
[root@bite-alicloud MySQL]# mysql -u root -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

  问题分析: 由于 MySQL 8.0 及高版本引入了更严格的安全策略,默认情况下无法直接通过无密码或不正确的密码安全登入。

  接下来的方法一、二、三跟着我的步骤来,如果前者不行就用后者,再不行就再后者。
  接下来的方法一、二、三跟着我的步骤来,如果前者不行就用后者,再不行就再后者。

2.2.2方法一:获取临时密码

  获取临时root密码

bash 复制代码
sudo grep 'temporary password' /var/log/mysqld.log

  执行后如果能看到类似下方的日志记录,其中 root@localhost: 后面的字符串就是生成的临时密码:

text 复制代码
2021-04-12T03:23:46.153263Z 1 [Note] A temporary password is generated for root@localhost: yLMaLT:v+5l*

  使用临时密码登录

bash 复制代码
mysql -uroot -p

  在提示 Enter password: 后,输入(或复制鼠标右键粘贴)上面获取到的临时密码并回车即可。

2.2.3方法二:直接登录尝试

  如果你安装的是最新的 mysql,没有所谓的临时密码,root 默认没有密码。试着直接 client 登陆一下:

bash 复制代码
mysql 

  在提示输入密码时直接敲回车,看看能否直接进入 MySQL 命令行。

2.2.4方法三:绕过权限认证

  对全局配置文件进行临时调整。使用vim打开 /etc/my.cnf

bash 复制代码
[root@bite-alicloud MySQL]# vim /etc/my.cnf

  在配置文件的 [mysqld] 模块下方,我们需要添加一条绕过权限认证的指令,同时规范服务端的编码格式和默认存储引擎。在核心配置区域追加或修改如下内容:

bash 复制代码
[mysqld]
# 核心路径与日志配置
datadir=/var/lib/mysql               # MySQL 在未来建表建库时的真实数据存放路径
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log        # 错误日志存放路径
pid-file=/var/run/mysqld/mysqld.pid  # pid文件路径

# 权限规避与核心运行配置
skip-grant-tables                    # 跳过密码权限认证表(临时用于免密登录)
port=3333                            # 在企业环境中,为了保证数据安全通常会修改默认端口号(此处示例修改为3333)
character-set-server=utf8            # 设置服务端的默认编码格式
default-storage-engine=innodb        # 设置后台的默认存储引擎为 InnoDB

注意: 在配置文件的 [mysql] 客户端模块中,可能会看到 #default-character-set=utf8 的相关注释。由于某些特定版本的 mysql 客户端存在汉字不回显的 Bug,此处我们暂不设置该项,保持默认即可。

  修改完配置文件后,必须将服务重新启动才能使这些配置生效 。我们可以使用 stop 配合 start,或者直接使用 restart 命令来快速重启服务:

bash 复制代码
[root@bite-alicloud MySQL]# systemctl stop mysqld
[root@bite-alicloud MySQL]# systemctl start mysqld
# 或者直接:systemctl restart mysqld

  重启成功后,再次通过 netstat -nltp 验证端口状态:

bash 复制代码
[root@bite-alicloud MySQL]# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:* LISTEN      824/httpd
tcp        0      0 0.0.0.0:22              0.0.0.0:* LISTEN      1038/sshd
tcp6       0      0 :::3333                 :::* LISTEN      3646/mysqld

  结果分析: 端口已由旧的 3306 变为 3333 ,这表明端口更新成功 。此时,在 skip-grant-tables 的作用下,再次执行 mysql -u root -p 并在要求输入密码时直接敲击回车,即可成功免密切入 MySQL 内部。

  登录成功后,可以使用 show databases; 命令查看系统当前存在的数据库:

sql 复制代码
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| 102_db             |
| bit_index          |
| myisam_db          |
| mysql              |
| oj                 |
| performance_schema |
| scott              |
+--------------------+
8 rows in set (0.01 sec)

  结果分析: 可以清楚地看到系统内部保留的所有数据库。即使后续进行了服务升级或重启,存放在 datadir(如 /var/lib/mysql)下的历史数据库与表数据也不会被删除或丢失

三、边缘问题解答

问题 1:当你把配置文件里面的端口号改了以后,为什么以前的网络远程客户端无法访问了,而为什么在同一台机器上的客户端却可以正常访问?

  这是因为客户端在连接 MySQL 服务端时,存在两条截然不同的访问路径

连接路径类型 第一条路:走网络(TCP/IP 协议) 第二条路:走内部秘密通道(Unix Socket)
适用场景 远程访问(如 Windows 连 Linux),或者本机通过 -h 127.0.0.1 强行指定走网络。 客户端和服务器在同一台 Linux 机器上 ,且你直接输入 mysql 登录而不指定 IP。
通信媒介 必须通过"IP + 端口号"。端口一旦修改,旧客户端必须同步修改,否则无法通信。 不看端口号 ,它看的是一个特殊的本地文件(通常叫 mysql.sock)。

问题2:如何设置开机启动?

bash 复制代码
#开启开机启动
systemctl enable mysqld
systemctl daemon-reload

问题3:如何退出

bash 复制代码
ctrl + d

好的本期内容就到这里,如果对你有帮助,还不要忘记点赞三联支持。我是此方,我们下期再见。bye!

相关推荐
再玩一会儿看代码1 小时前
Java浅拷贝和深拷贝理解笔记
java·linux·开发语言·笔记·python·学习
草莓熊Lotso1 小时前
【Linux网络】深入理解 HTTP 协议(三):静态资源服务、状态码与重定向实战
linux·运维·服务器·网络·c++·http
IvorySQL1 小时前
PostgreSQL 技术日报 (6月4日)|SQL/PGQ 新特性,逻辑复制持续优化
数据库·sql·postgresql
hj2862511 小时前
Linux + 计算机网络全套精炼整理笔记
linux·运维
IT空门:门主1 小时前
MySQL MCP Server 从零安装到使用实战,AI 直接查询数据库
数据库·人工智能·mysql
剑神一笑1 小时前
Linux chmod 命令深度解析:从权限位到符号模式的完整指南
linux·运维·chrome
流浪0011 小时前
LInux系统篇(二):深入剖析 Linux 进程:状态变迁、优先级及调度切换逻辑
linux·运维·服务器
daad7771 小时前
记录一个串口模块没有回包的问题
linux·运维·服务器
minji...1 小时前
MySQL数据库 (二) 库的操作(增删查改),库的字符集和校验集,数据库的备份与恢复
数据库·mysql数据库·字符集·库的增删查改·校验集·数据的备份·数据的恢复