关于 MySQL 服务器(以下简称 MySQL)在 Linux 系统上的安装及初始化设置,均可在 MySQL 官方文档的“安装及升级 MySQL”章节中找到详细介绍。如果你的时间有限,急需在短时间内安装使用 MySQL,可参考本文提供的最佳实践快速进行安装配置。
本文以 MySQL Community Server 8.0.29 为例,详细介绍了如何在 CenOS 上下载、安装、初始化以及启动 MySQL。本文提供的安装步骤在 CentOS 7、CentOS 8 以及 CentOS Stream 8 中均实际测试过。
本文假设你登录的账户已取得管理员账户(root)权限,因为文中出现的命令大部分都需要用到 root 账户权限。如果你登录的是普通账户,可运行 sudo -s
命令切换到带有 root 权限的 Shell,否则需要在每条命令前添加 sudo
命令。
本文在用到包管理器时,会统一使用 yum
命令,但是要知道在 CenOS 8、CentOS Stream 8 及更新版本的 CentOS 中,yum
命令已被 dnf
命令替代(以符号链接的形式存在),运行 yum
命令实际上是运行 dnf
命令。
一、选择安装方式
MySQL 提供了多种安装最新版本方式,包括但不限于利用包管理器(如 YUM 或 DNF)从自定义软件库自动下载安装,下载通用二进制分发文件手动安装,以及通过编译源代码手动安装。
这些安装方式各有优缺点。用包管理器安装非常快捷,但是如果用原生软件库安装,往往不是最新版本,如果用 MySQL 提供的软件库,又容易与系统原生软件库的安装文件混在一起,存在潜在的冲突问题,并且还无法定制额外的功能。通过编译源代码安装有很大的定制空间,但是需要自己管理相关依赖,并且需要服务器有较高的配置。
因此,这里选择一种折衷方案,使用通用二进制分发文件来安装 MySQL(即官方文档中“在 Unix/Linux 上用通用二进制文件安装 MySQL”所介绍的方式),这样既可以安装最新版本,又能独立于系统原生软件库的安装文件,还不必花费太多时间编译源代码。
二、下载 MySQL
这里要下载的 MySQL 二进制文件是最小安装分发版(Minimal Install),由于它不包含与调试相关的文件,所以体积比普通二进制分发版小得多。
使用此版本需要确保当前系统环境满足两个条件:glibc(GNU C Library)版本大于等于 2.17 以及操作系统位数是 x86_64。
在终端运行以下命令检查 glibc 版本:
ldd --version
在终端运行以下命令检查操作系统位数:
uname -m
条件满足就可以从 MySQL 官方下载页面下载二进制文件了:
MySQL 官方下载页面:https://dev.mysql.com/downloads/mysql/
选择版本时,选择操作系统(Select Operating System)需要选“Linux – Generic”。选择操作系统版本(Select OS Version)时需要选择“Linux – Generic (glibc 2.17) (x86, 64-bit)”。
接下来在列表中找到“Compressed TAR Archive, Minimal Install”并点击后面的【 Download 】按钮进入下载页面,接着通过链接“No thanks, just start my download.”获取文件的直接下载链接。
切换到系统存放源代码的目录,用 curl
命令通过该链接将 MySQL 的二进制分发压缩包下载下来:
cd /usr/local/src
curl -LO https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.29-linux-glibc2.17-x86_64-minimal.tar.xz
三、安装 MySQL
MySQL 二进制分发压缩包下载完毕后,运行一下两条命令将压缩包解压缩,并将得到的文件夹移动到系统的本地程序目录,同时将文件夹重命名为 mysql(即 /usr/local/mysql
):
tar -xvf mysql-8.0.29-linux-glibc2.17-x86_64-minimal.tar.xz
mv mysql-8.0.29-linux-glibc2.17-x86_64-minimal /usr/local/mysql
CentOS 7 需要运行以下命令安装启动 MySQL 所依赖的库文件:
yum install -y libaio numactl-libs
CentOS 8 或 CentOS Stream 8 需要运行以下命令安装启动 MySQL 所依赖的库文件:
dnf install -y libaio ncurses-compat-libs
至此 MySQL 就安装完成了。如果你是第一次按照本文步骤安装 MySQL,为方便之后运行 MySQL 的相关命令,请运行以下两条命令将 MySQL 的可执行文件目录添加到系统环境变量 PATH
中:
echo 'export PATH="/usr/local/mysql/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
现在运行以下命令,应该能够看到所安装 MySQL 的版本号:
mysql --version
四、配置 MySQL
这里配置 MySQL 主要为了实现三个目的,创建 MySQL 专用的系统账户,指定 MySQL 数据的存放位置,添加可供远程 MySQL 客户端使用的数据库用户。
1、创建专用账户
首先需要创建一个 MySQL 专用账户(这里以 mysql 为例),用于运行 MySQL 服务器,以及存放数据库文件。
创建专用账户可以用任意用户名,本文示例使用 mysql。你可以运行以下命令检查系统中是否存在该用户:
id mysql
如果出现类似“no such user”的提示就表示不存在此账户,可以运行以下命令创建一个名为 mysql 的无登陆权限系统账户:
useradd mysql -s /sbin/nologin
2、初始化数据库
默认情况下,数据库初始化的位置是 MySQL 的程序目录,但是将数据文件和程序文件混放在一起不是一个好习惯,因此这里通过命令选项 --datadir
将数据库的初始化位置指定到了 mysql 用户的家目录(/home/mysql
)下。
运行以下两条命令即可将数据库初始化到 mysql 家目录:
sudo -u mysql mkdir /home/mysql/data
mysqld --initialize --user=mysql --datadir=/home/mysql/data
命令运行成功之后,程序会自动生成一个名为 root 的数据库管理员账户及其临时密码,请记录此密码,之后登录 MySQL 时会用到。
如果嫌记录密码麻烦,也可以将命令中的 --initialize
替换成 --initialize-insecure
,这样程序就会为 root 用户生成一个空密码。
安全起见,切记要在后面的步骤中修改 root 账户的密码。
3、试运行数据库
数据库初始化成功后就可以尝试启动运行数据库了。在继续下面的步骤之前务必清理一下可能存在的与 MySQL 有关的旧的遗留文件(如果不太确定这些文件后续是否有用,也可备份到其它地方):
rm -rf /etc/my.cnf*
MySQL 自带一个名为 mysql.server 的启动脚本,这里主要用它来启动 MySQL。首先切换到 MySQL 程序目录的 support-files 文件夹:
cd /usr/local/mysql/support-files
根据之前的配置信息,按照如下所示,修改脚本 mysql.server 中 basedir 和 datadir 这两项参数的值:
basedir=/usr/local/mysql
datadir=/home/mysql/data
你可以直接运行下面这两条命令,快速更改:
sed -i 's/^\(basedir=\)$/\1\/usr\/local\/mysql/' mysql.server
sed -i 's/^\(datadir=\)$/\1\/home\/mysql\/data/' mysql.server
接着就可以运行以下命令以用户 mysql 的身份启动 MySQL:
sudo -u mysql ./mysql.server start
如果你能看到下面这条信息且没有任何其它错误的话,就表示 MySQL 的启动和运行一切正常。
Starting MySQL. SUCCESS!
4、修改账户密码
在初始化 MySQL 数据库时,程序自动生成了一个名为 root 的数据库用户,这也是数据库的管理员账户,是数据库中最高权限,因此必须为其修改密码。
运行以下命令,以用户名 root 的身份登录 MySQL 数据库:
mysql -u root -p
再出现提示文字“Enter password:”后,输入之前生成的临时密码登录(如果之前为 root 生成的是空密码则直接按回车键登录)。如看到如下所示的提示信息,就表示登录成功:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.27 MySQL Community Server - GPL
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
接着在提示符 mysql>
后运行如下所示的 SQL 命令修改 root 用户的密码(请将命令中的 yourpassword
改成你要设置的密码):
ALTER USER 'root'@'localhost' IDENTIFIED BY 'yourpassword';
命令执行后如看到如下所示的提示信息,就表示修改成功:
Query OK, 0 rows affected (0.01 sec)
你可以通过输入 QUIT 命令退出数据库然后重新登录 root 以测试新密码。
5、添加本地账户
你可以通过管理员账户 root 为数据库添加任意账户,并控制所添加账户的权限。关于数据库账户的 SQL 命令可以参考 MySQL 官方文档“SQL 语句”中的“账户管理语句”章节。
这里所说的“本地账户”是指用于本机应用程序上的数据库账户。虽然你可以直接使用 root 账户,但是为了安全起见不建议这样做。
建议为每一个数据库创建一个专用账户。假设某应用使用的数据库名为 myapp,那么就可以通过运行如下两条 SQL 命令为其创建专用账户(请将命令中的 yourpassword
改成你要设置的密码):
CREATE USER 'myapp'@'localhost' IDENTIFIED BY 'yourpassword';
GRANT ALL ON myapp.* TO 'myapp'@'localhost';
这里假设应用是在本机访问数据库的,如果是非本机应用访问本机数据库,则需要为数据库添加允许远程访问的账户。
6、添加远程账户
这里所说的“远程账户”是指可以在任意网络位置通过 MySQL 服务器所在主机的 IP 登录数据库的账户。如果没有需要远程使用数据库的应用,也没有用 MySQL 客户端远程管理数据库的需求,则可以忽略此步骤。
下面的示例创建的是一个可以用任意 MySQL 客户端远程管理所有数据库的用户,如果远程账户是用在应用上的,可以像第 5 步那样,在为账户赋权时将其限定在某个数据库上。
首先用管理员账户 root 登录 MySQL,并输入如下所示的两条命令创建一个可在 MySQL 客户端远程登录的数据库用户(请将命令中的 yourpassword
改成你要设置的密码):
CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'yourpassword';
GRANT ALL ON *.* TO 'root'@'%';
创建普通账户和远程账户的主要区别是 @ 后的主机名,这里使用了通配符 %,即允许任意主机名或 IP 登录。关于通配符的更多用法可参考官方文档。
注意不要把新创建的这个 root 账户和管理员账户 root 相混淆,它和管理员账户并非同一个用户。MySQL 会通过登录的主机名或 IP 自动识别是哪个 root,如果是登录的主机名为 localhost 或 IP 为 127.0.0.1,则会认为是管理员账户,否则是新创建的这个 root 账户。
当然,这是一个故意为之的示例,用以说明 ‘root’@’localhost’ 和 ‘root’@’%’ 并非同一个账户。如果你感到混淆,完全可以使用其它任意名称,如 myapp、zhangsan、lisi。
注意,MySQL 自 8.0 开始采用 caching_sha2_password 作为默认的身份验证插件,这在本机是没有问题的,但是如果你使用的 MySQL 客户端不支持该验证机制,则最好在创建远程账户时在 SQL 命令中额外声明使用 mysql_native_password 身份验证插件。
如果你的云服务器 VPC 安全组规则和 CentOS 系统防火墙均已放行 3306 端口入站,那么就可以通过任一 MySQL 客户端登录 MySQL 数据库了。
五、启动 MySQL
到目前为止 MySQL 还是在试运行时启动的。为预防主机宕机或维护性重启导致 MySQL 停止运行,有必要将其作为服务托管给操作系统,这样不论身原因导致的系统重启,MySQL 都能随机启动。
在开始之前,运行以下两条命令停止运行之前手动启动的 MySQL :
cd /usr/local/mysql/support-files
sudo -u mysql ./mysql.server stop
在 CenOS 中,可以使用系统服务管理器 systemd 来管理各种服务。要将 MySQL 托管给 systemd,需要为其创建一个配置文件,以便让其管理。
使用你喜欢的编辑器创建一个名为 mysql.service 的配置文件到如下所示路径(这里使用的是 vi 编辑器):
vi /etc/systemd/system/mysql.service
然后将如下所示的内容复制粘贴到该文件中并保存退出(vi 编辑器先按 ESC 再输入 :wq
并回车):
[Unit]
Description=MySQL database server
After=syslog.target
After=network.target
[Service]
Type=forking
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/support-files/mysql.server start
ExecStop=/usr/local/mysql/support-files/mysql.server stop
ExecReload=/usr/local/mysql/support-files/mysql.server reload
[Install]
WantedBy=multi-user.target
接着运行以下命令,让 systemd 读取新创建的配置文件:
systemctl daemon-reload
现在即可通过运行以下命令启动 MySQL 服务:
systemctl start mysql
运行以下命令查看 MySQL 服务的状态:
systemctl status mysql
如果服务的状态为 Active: active (running) 且没有显示任何错误或警告信息的话,就表示一切正常。
最后,将 MySQL 作为服务添加到随机启动:
systemctl enable mysql
至此,就完成了在 CentOS 上安装配置 MySQL 的全部流程。
六、升级 MySQL
如果想要升级到 MySQL 今后发布的新版本,只需要按照以上步骤重新操作一到三步即可。因为我们已经把 MySQL 的数据文件和安装文件分离了,所以可以直接用新的二进制文件覆盖旧的二进制文件。
七、总结
完成以上流程后,应该能够得到如下所示的这些可用文件或信息。这些信息可能会在维护 MySQL 时用到,也可能会被其它软件用到。
MySQL 数据库文件存放路径:
/home/mysql/data
MySQL 的本地 IP 地址和端口:
127.0.0.1:3306
MySQL 的 Socket 文件路径:
/tmp/mysql.sock
MySQL 的系统服务配置文件路径:
/etc/systemd/system/mysql.service
如果你在操作的过程中遇到了任何问题,可留言提出。
[root@localhost]# sudo groupadd mysql # 建立用户组mysql
[root@localhost]# sudo useradd -aG mysql # mysql用户组内增加用户mysql
[root@localhost]# sudo chown -R mysql:mysql /usr/local/mysql/*.* # 对mysql用户授予MySQL所在文件夹拥有权
[root@localhost]# sudo chmod 755 /usr/local/mysql/mysql5.7/support-files/mysql.server # 将mysql服务器启动文件授予权限
[root@localhost]# sudo chmod +x /usr/local/mysql/mysql5.7/support-files/mysql.server # 将mysql服务器启动文件授予可执行
[root@localhost]# usr/local/mysql/mysql5.7/support-files/mysql.server start # 启动MySQL服务器
Starting MySQL. SUCCESS! # 提示启动成功
/usr/local/mysql/mysql5.7/support-files/mysql.server status # 查看进程状态
SUCCESS! MySQL running (5104)
[root@localhost]# usr/local/mysql/mysql5.7/support-files/mysql.server stop # 关闭MySQL服务器
Shutting down MySQL.. SUCCESS! # 提示关闭成功
[root@localhost]# sudo vim /usr/lib/systemd/system/mysql57.service
# 建立mysql57.service服务
-----mysql57.service-----
[Unit]
Description=MySQL Server 5.7 Service
Documentation=mysql.server
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Service]
Type=forking
User=mysql
Group=mysql
# PIDFile=/usr/local/mysql/mysql5.7/data/mysqld5.7.pid #PID注释掉
TimeoutStartSec=60
ExecStart=/usr/local/mysql/mysql5.7/support-files/mysql.server start
ExecStop=/usr/local/mysql/mysql5.7/support-files/mysql.server stop
ExecReload=/usr/local/mysql/mysql5.7/support-files/mysql.server reload
[Install]
WantedBy=multi-user.target
-------------------------
[root@localhost]# sudo systemctl daemon-reload #重新加载进程
[root@localhost]# sudo systemctl start mysql57.service # 启动mysql57.service服务
[root@localhost]# sudo systemctl status mysql57.service # 查看mysql57.service服务进程
× mysql57.service - MySQL Server 5.7 Service
Loaded: loaded (/usr/lib/systemd/system/mysql57.service; disabled; preset: disabled)
Active: failed (Result: exit-code) since Tue 2024-10-22 15:12:53 CST; 14min ago
Docs: http://dev.mysql.com/doc/refman/en/using-systemd.html
Process: 4139 ExecStart=/usr/local/mysql/mysql5.7/support-files/mysql.server start (code=exited, status=203/EXEC)
CPU: 1ms
Oct 22 15:12:53 localhost systemd[1]: Starting MySQL Server 5.7 Service...
Oct 22 15:12:53 localhost systemd[4139]: mysql57.service: Failed to locate executable /usr/local/mysql/mysql5.7/support-files/mysql.server: Permission denied
Oct 22 15:12:53 localhost systemd[4139]: mysql57.service: Failed at step EXEC spawning /usr/local/mysql/mysql5.7/support-files/mysql.server: Permission denied
Oct 22 15:12:53 localhost systemd[1]: mysql57.service: Control process exited, code=exited, status=203/EXEC
Oct 22 15:12:53 localhost systemd[1]: mysql57.service: Failed with result 'exit-code'.
Oct 22 15:12:53 localhost systemd[1]: Failed to start MySQL Server 5.7 Service.
# "mysql.server: Permission denied".
# systemd提示mysql.server没有权限,直接用mysql.server start可以启动,为什么加载服务无论用户是mysql还是root都无法通过systemd启动
看起来错误是用户 mysql:mysql 没有权限访问 mysql.server 脚本导致的。有没有检查一下 mysql.server 的用户和用户组,确认是无误的?因为我发现你提供的命令执行记录中
sudo useradd -aG mysql
这条命令是错误的,可能并没有成功创建 mysql 用户。如果想要将新创建的 mysql 用户添加到已存在的 mysql 用户组中,应该用sudo useradd -g mysql mysql
这条命令。