一、创建 mysql 用户和组
不推荐使用 root 用户运行,避免数据库漏洞造成提权
# 创建 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 安装压缩包
# 解压安装压缩包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 已存在(目录或软链),先删除/改名再创建软链
# 取消软连接unlink /usr/local/mysql2.3 创建数据库文件存放目录
# 创建数据库文件存放目录mkdir -p /var/lib/mysql
# 为文件夹设置用户和用户组权限chown -R mysql:mysql /var/lib/mysql
# 设置目录的读写权限chmod 750 /var/lib/mysql2.4 设置环境变量并初始化数据库文件
2.4.1 设置环境变量
echo 'export PATH=/usr/local/mysql/bin:$PATH' | sudo tee /etc/profile.d/mysql.shsudo chmod 644 /etc/profile.d/mysql.shsource /etc/profile.d/mysql.shNOTE通过
/usr/local/mysql软连接统一管理 MySQL 版本
并将其加入 PATH,后续命令默认指向当前激活版本
2.4.2 初始化数据目录
初始化前确认数据目录为空(否则会失败)
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=02.6 创建 mysqld.service 守护进程
创建 /usr/lib/systemd/system/mysqld.service 文件,并输入以下内容
[Unit]Description=MySQL Server (5.7)Documentation=man:mysqld(8)After=network-online.targetWants=network-online.target
[Service]User=mysqlGroup=mysqlType=simple
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE=65536Restart=on-failureRestartPreventExitStatus=1TimeoutStartSec=0PrivateTmp=false
[Install]WantedBy=multi-user.target加载配置变动、设置自启,并立即启动
sudo systemctl daemon-reloadsudo systemctl enable mysqld --now查阅启动情况
sudo systemctl status mysqld三、MySQL 基本操作命令
3.1 启动
如果未通过 systemd 启动,或在调试场景下需要临时指定参数,可以直接使用 mysqld 启动(仅用于调试,不推荐长期使用)
以下方式均为前台运行,终端不会自动退出
mysqld --basedir=<mysql程序路径> --datadir=<datebase存放路径> --user=<用户名>若需要使用 my.cnf 配置文件(用于验证配置是否正确)
mysqld --defaults-file=<配置文件路径> --user=<用户名>3.2 停止
-
使用
mysqladmin管理工具退出Terminal window mysqladmin -u <用户名> shutdown -
在
mysql客户端中执行SHUTDOWN;(需要相应权限)Terminal window mysql -u <用户名>SHUTDOWN; -
任务管理器退出
仅在无法通过
mysqladmin或SHUTDOWN正常关闭时使用Terminal window ps aux | grep mysqldkill -15 pid(mysqld)
3.3 修改密码
-
使用
mysqladmin管理工具修改密码Terminal window mysqladmin -u <用户名> password -p按提示输入新密码
-
进入
mysql修改密码Terminal window mysql -u <用户名> -pALTER USER USER() IDENTIFIED BY 'new password';
3.4 使用 mysql_config_editor 保存身份信息
mysql_config_editor 用于将 MySQL 客户端登录凭据加密保存到本地文件
避免在命令行、脚本或 unit 文件中明文写密码
NOTE凭据默认保存于 当前系统用户的
~/.mylogin.cnf文件中
~/.mylogin.cnf是系统用户私有文件
- 仅对当前执行
mysql_config_editor的系统用户有效- 不同系统用户(如
root、mysql、普通用户)之间 互不共享
mysql_config_editor仅作用于客户端工具
- 适用于:
mysql、mysqladmin、mysqldump等客户端命令- 不影响
mysqld服务进程本身- systemd 中的
ExecStart=mysqld不会读取该文件
3.4.1 保存或修改登录信息
mysql_config_editor set --login-path=<配置名称> --host=<ip地址> --port=<端口> --user=<用户名> -p- 执行后会提示输入密码,密码将被加密保存
login-path用于区分不同连接配置(可自定义名称)
3.4.2 删除指定登录信息
mysql_config_editor remove --login-path=<配置名称>3.4.3 删除所有已保存的登录信息
mysql_config_editor reset3.4.4 打印指定登录信息(不显示密码)
mysql_config_editor print --login-path=<配置名称>3.4.5 打印全部登录信息(不显示密码)
mysql_config_editor print --all四、安装 MySQL 8.0.44
4.1 下载 MySQL 安装包
前往 MySQL 社区版下载页面 下载安装包
下载链接:
4.2 解压 MySQL 8.0.44 安装压缩包
# 解压安装压缩包tar -xJvf mysql-8.0.44-linux-glibc2.28-x86_64.tar.xz -C /usr/local4.3 检查数据库版本是否存在冲突
使用 MySQL 8.0.44 自带的 mysqlsh 工具 (目标版本) 连接 当前正在运行的 MySQL 5.7 实例(源版本)
用于评估从 MySQL 5.7.44 升级到 MySQL 8.0.44 的兼容性问题
该检查需在 MySQL 5.7.44 实例仍在运行时 执行
/usr/local/mysql-8.0.44-linux-glibc2.28-x86_64/bin/mysqlsh root@localhost:3306 -e "util.checkForServerUpgrade()"4.4 进行数据备份并更新
4.4.1 逻辑备份(停库前,作为额外保险)
# 需要在 5.7 仍然运行时执行/usr/local/mysql/bin/mysqldump -u root -p --single-transaction --routines --triggers --events --all-databases > /root/all.sql4.4.2 物理备份(停库后)
# 如果已通过 `mysqld.service` 启动 MySQL 5.7.44,则先停止服务:sudo systemctl stop mysqld
# 物理备份数据目录(推荐用 rsync 或 tar)sudo mkdir -p /var/lib/mysql.bak_5.7.44sudo 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:
# 取消 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/mysql4.5 修改 mysqld.service 守护进程
因为 MySQL 5.7.44 与MySQL 8.0.44 之间的守护方式存在差异,因此需要修改
[Unit]Description=MySQL Server (8.0)Documentation=man:mysqld(8)After=network-online.targetWants=network-online.target
[Install]WantedBy=multi-user.target
[Service]User=mysqlGroup=mysqlType=notify
TimeoutStartSec=0OOMScoreAdjust=-1000ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnfLimitNOFILE=65536Restart=on-failureRestartPreventExitStatus=1PrivateTmp=false加载配置变动、设置自启,并立即启动
sudo systemctl daemon-reloadsudo systemctl enable mysqld --now4.6 验证升级完成
使用一下命令进行验证,输出版本为 8.0.44 则表示完整升级
sudo systemctl status mysqld --no-pager/usr/local/mysql/bin/mysql -uroot -p -e "SELECT VERSION();"如果连接失败,查阅配置的错误日志
tail -n 200 /var/lib/mysql/mysqld.log4.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 服务
sudo systemctl stop mysqld确认服务已停止:
sudo systemctl status mysqld --no-pager4.7.2 切换 MySQL 程序软连接回 5.7.44
# 删除当前指向 8.0.44 的软连接unlink /usr/local/mysql
# 恢复指向 MySQL 5.7.44ln -s /usr/local/mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql4.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.targetWants=network-online.target
[Service]User=mysqlGroup=mysqlType=simple
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE=65536Restart=on-failureRestartPreventExitStatus=1TimeoutStartSec=0PrivateTmp=false
[Install]WantedBy=multi-user.target重新加载 systemd 配置:
sudo systemctl daemon-reload4.7.4 恢复数据目录(物理回滚)
确保当前 /var/lib/mysql 不再被使用,然后执行:
# 清空当前数据目录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/mysql4.7.5 启动 MySQL 5.7.44 并验证
sudo systemctl start mysqld验证服务状态:
sudo systemctl status mysqld --no-pager验证版本:
/usr/local/mysql/bin/mysql -u root -p -e "SELECT VERSION();"确认输出版本为 5.7.44 即表示回滚成功。
4.7.6 (可选)通过逻辑备份恢复数据
如果物理回滚失败或需要跨环境恢复,可使用逻辑备份:
/usr/local/mysql/bin/mysql -u root -p < /root/all.sql非商业用途可以使用,但必须注明出处;
若有改编需采用相同许可协议发布。