2255 字
11 分钟
Linux 安装 MySQL 5.7.44 并升级到 8.0.44 全流程

一、创建 mysql 用户和组#

不推荐使用 root 用户运行,避免数据库漏洞造成提权

Terminal window
# 创建 mysql 组,如果提示已存在可忽略,继续后续步骤
sudo groupadd mysql
# 创建 mysql 用户,并加入 mysql 组,不允许登录系统,不创建 home 目录,如果提示已存在可忽略
sudo useradd -r -g mysql -s /sbin/nologin -M mysql

二、MySQL 5.7.44 安装#

2.1 下载 MySQL 安装包#

前往 MySQL 社区版下载页面 下载安装包

下载链接:

2.2 解压 MySQL 5.7.44 安装压缩包#

Terminal window
# 解压安装压缩包
tar -zxvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz -C /usr/local
# 建立软连接便于多版本的切换
ln -s /usr/local/mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql

若建立软连接失败或需要更改 MySQL 版本可以取消软连接后重新连接
如果 /usr/local/mysql 已存在(目录或软链),先删除/改名再创建软链

Terminal window
# 取消软连接
unlink /usr/local/mysql

2.3 创建数据库文件存放目录#

Terminal window
# 创建数据库文件存放目录
mkdir -p /var/lib/mysql
# 为文件夹设置用户和用户组权限
chown -R mysql:mysql /var/lib/mysql
# 设置目录的读写权限
chmod 750 /var/lib/mysql

2.4 设置环境变量并初始化数据库文件#

2.4.1 设置环境变量#

Terminal window
echo 'export PATH=/usr/local/mysql/bin:$PATH' | sudo tee /etc/profile.d/mysql.sh
sudo chmod 644 /etc/profile.d/mysql.sh
source /etc/profile.d/mysql.sh
NOTE

通过 /usr/local/mysql 软连接统一管理 MySQL 版本
并将其加入 PATH,后续命令默认指向当前激活版本

2.4.2 初始化数据目录#

初始化前确认数据目录为空(否则会失败)

Terminal window
mysqld --initialize --basedir=/usr/local/mysql --datadir=/var/lib/mysql --user=mysql

初始化完成后查看控制台输出的信息,查找temporary password 获取 root 临时密码
或使用 --log-error 指定日志文件输出位置(需要 保证日志目录存在且 mysqld 用户有写权限)

2.5 配置 /etc/my.cnf 配置文件#

MySQL 在启动时会优先加载 /etc/my.cnf 文件的配置,使用 tar 包安装需要自行创建配置文件

########################################
# 客户端配置(适用于 mysql / mysqldump 等命令行工具)
########################################
[client]
# 远程连接主机地址(本机)
host=127.0.0.1
# 远程连接端口(需与服务端保持一致)
port=3306
# 使用的本地 Unix Socket 文件路径(需要与服务端 [mysqld] 的 socket 一致)
# 仅当使用本地 socket 方式连接(例如 localhost/不指定 host)时生效
# 远程连接无需配置,且不生效
socket=/var/lib/mysql/mysql.sock
# 客户端默认字符集
default-character-set=utf8mb4
# 客户端连接超时时间(秒)
connect-timeout=10
########################################
# 服务端配置(MySQL 守护进程 mysqld)
########################################
[mysqld]
# MySQL 安装路径(basedir)
basedir=/usr/local/mysql
# 数据目录路径(存放数据文件)
datadir=/var/lib/mysql
# 本地 socket 文件路径(必须与客户端 [client] 的 socket 一致)
socket=/var/lib/mysql/mysql.sock
# 进程 ID 文件路径
pid-file=/var/lib/mysql/mysql.pid
# 运行服务的系统用户(通常为 mysql)
user=mysql
# 错误日志路径(记录 MySQL 启动/错误信息)
log-error=/var/lib/mysql/mysqld.log
# 开启慢查询日志
slow_query_log=ON
# 慢查询日志文件路径
slow_query_log_file=/var/lib/mysql/slow.log
# 慢查询定义的时间(单位:秒)
long_query_time=1
# 服务监听端口(必须与 [client] 保持一致)
port=3306
# 绑定地址(127.0.0.1 表示只允许本地访问)
# 如果需要任意 IP 连接则设置为 0.0.0.0
# 云服务器/公网环境下,等于“对全世界开放 3306”
bind-address=127.0.0.1
# 最大连接数
max_connections=200
# 跳过 DNS 解析,提高连接速度
skip-name-resolve=1
# 默认存储引擎
default_storage_engine=InnoDB
# InnoDB 缓冲池大小(建议设置为物理内存的 50%-70%)
innodb_buffer_pool_size=1G
# InnoDB 日志文件大小(越大写入越高效,但重启恢复稍慢)
innodb_log_file_size=256M
# 每个表使用独立的 .ibd 文件
innodb_file_per_table=1
# 禁止符号链接(提升安全性)
symbolic-links=0

2.6 创建 mysqld.service 守护进程#

创建 /usr/lib/systemd/system/mysqld.service 文件,并输入以下内容

[Unit]
Description=MySQL Server (5.7)
Documentation=man:mysqld(8)
After=network-online.target
Wants=network-online.target
[Service]
User=mysql
Group=mysql
Type=simple
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE=65536
Restart=on-failure
RestartPreventExitStatus=1
TimeoutStartSec=0
PrivateTmp=false
[Install]
WantedBy=multi-user.target

加载配置变动、设置自启,并立即启动

Terminal window
sudo systemctl daemon-reload
sudo systemctl enable mysqld --now

查阅启动情况

Terminal window
sudo systemctl status mysqld

三、MySQL 基本操作命令#

3.1 启动#

如果未通过 systemd 启动,或在调试场景下需要临时指定参数,可以直接使用 mysqld 启动(仅用于调试,不推荐长期使用)
以下方式均为前台运行,终端不会自动退出

Terminal window
mysqld --basedir=<mysql程序路径> --datadir=<datebase存放路径> --user=<用户名>

若需要使用 my.cnf 配置文件(用于验证配置是否正确)

Terminal window
mysqld --defaults-file=<配置文件路径> --user=<用户名>

3.2 停止#

  • 使用 mysqladmin 管理工具退出

    Terminal window
    mysqladmin -u <用户名> shutdown
  • mysql 客户端中执行 SHUTDOWN;(需要相应权限)

    Terminal window
    mysql -u <用户名>
    SHUTDOWN;
  • 任务管理器退出

    仅在无法通过 mysqladminSHUTDOWN 正常关闭时使用

    Terminal window
    ps aux | grep mysqld
    kill -15 pid(mysqld)

3.3 修改密码#

  • 使用 mysqladmin 管理工具修改密码

    Terminal window
    mysqladmin -u <用户名> password -p

    按提示输入新密码

  • 进入 mysql 修改密码

    Terminal window
    mysql -u <用户名> -p
    ALTER USER USER() IDENTIFIED BY 'new password';

3.4 使用 mysql_config_editor 保存身份信息#

mysql_config_editor 用于将 MySQL 客户端登录凭据加密保存到本地文件
避免在命令行、脚本或 unit 文件中明文写密码

NOTE

凭据默认保存于 当前系统用户的 ~/.mylogin.cnf 文件中

  • ~/.mylogin.cnf 是系统用户私有文件

    • 仅对当前执行 mysql_config_editor 的系统用户有效
    • 不同系统用户(如 rootmysql、普通用户)之间 互不共享
  • mysql_config_editor 仅作用于客户端工具

    • 适用于:mysqlmysqladminmysqldump 等客户端命令
    • 不影响 mysqld 服务进程本身
    • systemd 中的 ExecStart=mysqld 不会读取该文件

3.4.1 保存或修改登录信息#

Terminal window
mysql_config_editor set --login-path=<配置名称> --host=<ip地址> --port=<端口> --user=<用户名> -p
  • 执行后会提示输入密码,密码将被加密保存
  • login-path 用于区分不同连接配置(可自定义名称)

3.4.2 删除指定登录信息#

Terminal window
mysql_config_editor remove --login-path=<配置名称>

3.4.3 删除所有已保存的登录信息#

Terminal window
mysql_config_editor reset

3.4.4 打印指定登录信息(不显示密码)#

Terminal window
mysql_config_editor print --login-path=<配置名称>

3.4.5 打印全部登录信息(不显示密码)#

Terminal window
mysql_config_editor print --all

四、安装 MySQL 8.0.44#

4.1 下载 MySQL 安装包#

前往 MySQL 社区版下载页面 下载安装包

下载链接:

4.2 解压 MySQL 8.0.44 安装压缩包#

Terminal window
# 解压安装压缩包
tar -xJvf mysql-8.0.44-linux-glibc2.28-x86_64.tar.xz -C /usr/local

4.3 检查数据库版本是否存在冲突#

使用 MySQL 8.0.44 自带的 mysqlsh 工具 (目标版本) 连接 当前正在运行的 MySQL 5.7 实例(源版本)
用于评估从 MySQL 5.7.44 升级到 MySQL 8.0.44 的兼容性问题 该检查需在 MySQL 5.7.44 实例仍在运行时 执行

Terminal window
/usr/local/mysql-8.0.44-linux-glibc2.28-x86_64/bin/mysqlsh root@localhost:3306 -e "util.checkForServerUpgrade()"

4.4 进行数据备份并更新#

4.4.1 逻辑备份(停库前,作为额外保险)#

Terminal window
# 需要在 5.7 仍然运行时执行
/usr/local/mysql/bin/mysqldump -u root -p --single-transaction --routines --triggers --events --all-databases > /root/all.sql

4.4.2 物理备份(停库后)#

Terminal window
# 如果已通过 `mysqld.service` 启动 MySQL 5.7.44,则先停止服务:
sudo systemctl stop mysqld
# 物理备份数据目录(推荐用 rsync 或 tar)
sudo mkdir -p /var/lib/mysql.bak_5.7.44
sudo rsync -aH /var/lib/mysql/ /var/lib/mysql.bak_5.7.44/
# 备份配置文件
sudo cp -a /etc/my.cnf /etc/my.cnf.bak_5.7.44

关闭完成后,切换 MySQL 软连接至 8.0.44:

Terminal window
# 取消 MySQL 5.7.44 软连接
unlink /usr/local/mysql
# 建立 MySQL 8.0.44 软连接
ln -s /usr/local/mysql-8.0.44-linux-glibc2.28-x86_64 /usr/local/mysql

4.5 修改 mysqld.service 守护进程#

因为 MySQL 5.7.44 与MySQL 8.0.44 之间的守护方式存在差异,因此需要修改

[Unit]
Description=MySQL Server (8.0)
Documentation=man:mysqld(8)
After=network-online.target
Wants=network-online.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
Type=notify
TimeoutStartSec=0
OOMScoreAdjust=-1000
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE=65536
Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=false

加载配置变动、设置自启,并立即启动

Terminal window
sudo systemctl daemon-reload
sudo systemctl enable mysqld --now

4.6 验证升级完成#

使用一下命令进行验证,输出版本为 8.0.44 则表示完整升级

Terminal window
sudo systemctl status mysqld --no-pager
/usr/local/mysql/bin/mysql -uroot -p -e "SELECT VERSION();"

如果连接失败,查阅配置的错误日志

Terminal window
tail -n 200 /var/lib/mysql/mysqld.log

4.7 数据回滚(升级失败时)#

当 MySQL 8.0.44 启动失败、数据不一致或升级结果不符合预期时,可按以下流程回滚至 MySQL 5.7.44

回滚前提:

  • 已完成 4.4 中的逻辑备份与物理备份
  • 原 MySQL 5.7.44 程序目录仍然存在
  • 数据目录 /var/lib/mysql.bak_5.7.44 可用

4.7.1 停止 MySQL 8.0 服务#

Terminal window
sudo systemctl stop mysqld

确认服务已停止:

Terminal window
sudo systemctl status mysqld --no-pager

4.7.2 切换 MySQL 程序软连接回 5.7.44#

Terminal window
# 删除当前指向 8.0.44 的软连接
unlink /usr/local/mysql
# 恢复指向 MySQL 5.7.44
ln -s /usr/local/mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql

4.7.3 恢复 MySQL 5.7.44 的 systemd 配置#

/usr/lib/systemd/system/mysqld.service 恢复为 MySQL 5.7.44 对应版本:

[Unit]
Description=MySQL Server (5.7)
Documentation=man:mysqld(8)
After=network-online.target
Wants=network-online.target
[Service]
User=mysql
Group=mysql
Type=simple
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE=65536
Restart=on-failure
RestartPreventExitStatus=1
TimeoutStartSec=0
PrivateTmp=false
[Install]
WantedBy=multi-user.target

重新加载 systemd 配置:

Terminal window
sudo systemctl daemon-reload

4.7.4 恢复数据目录(物理回滚)#

确保当前 /var/lib/mysql 不再被使用,然后执行:

Terminal window
# 清空当前数据目录
sudo rm -rf /var/lib/mysql/*
# 恢复 5.7.44 数据
sudo rsync -aH /var/lib/mysql.bak_5.7.44/ /var/lib/mysql/
# 修正目录权限
sudo chown -R mysql:mysql /var/lib/mysql

4.7.5 启动 MySQL 5.7.44 并验证#

Terminal window
sudo systemctl start mysqld

验证服务状态:

Terminal window
sudo systemctl status mysqld --no-pager

验证版本:

Terminal window
/usr/local/mysql/bin/mysql -u root -p -e "SELECT VERSION();"

确认输出版本为 5.7.44 即表示回滚成功。

4.7.6 (可选)通过逻辑备份恢复数据#

如果物理回滚失败或需要跨环境恢复,可使用逻辑备份:

Terminal window
/usr/local/mysql/bin/mysql -u root -p < /root/all.sql
Linux 安装 MySQL 5.7.44 并升级到 8.0.44 全流程
https://www.self4m.com/posts/linux-install-mysql-5-7-44-and-upgrade-8-0-44/
✍️作者
Self4m
📅发布于
2025-09-10
©️许可协议
CC BY-NC-SA 4.0

商业用途必须事先获得作者授权;
非商业用途可以使用,但必须注明出处;
若有改编需采用相同许可协议发布。