再见 mysql_upgrade

在数据库管理的世界里,随着技术的不断进步和业务的不断发展,数据库的版本升级成为了一个不可避免的过程。

MySQL 作为业界领先的开源关系型数据库管理系统,其版本迭代与功能优化同样不容忽视。

而在这个过程中,升级工具就显得尤为重要,比如 mysql_upgrade

但是,mysql_upgrade 已经成为过去式,且来往下看。

mysql_upgrade 介绍

mysql_upgrade 是 MySQL 提供的一个用于升级 MySQL 服务器的实用程序。

它检查服务器上的所有数据库,查看是否需要任何更改以利用新版本的 MySQL 服务器提供的特性。

mysql_upgrade 还会升级系统表,以使用当前 MySQL 版本提供的任何新特性。

简而言之,mysql_upgrade 就是一个帮助用户平滑过渡到新版本 MySQL 的桥梁。

使用 mysql_upgrade 的过程相对简单。

首先,停止旧版本的 MySQL 服务,建议用户备份整个数据库,以防万一升级过程中出现问题。

然后,安装新版本的 MySQL 服务器软件,并启动新版本的 MySQL 服务。

最后,运行 mysql_upgrade 命令,它会检查数据库中的表,并根据需要进行升级。

通常只需向几个表添加新字段,或者修改字段长度,或者补充修订数据。

也可能会出现罕见的情况,比如系统表的存储引擎发生变更,比如由 MyISAM 变更为 InnoDB。

mysql_upgrade 使用示例

举个栗子,

从 MySQL 5.7.18 升级到 MySQL 5.7.19,会增加一个 'mysql.session'@'localhost' 保留账户。

该帐户由插件在内部使用来访问服务器。 它被锁定,因此不能用于客户端连接。

具体案例如下:

现在,我们有一个 MySQL 5.7.18 服务器正在运行。

复制代码
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.18    |
+-----------+
1 row in set (0.00 sec)

查看用户列表。

复制代码
mysql> select user from mysql.user;
+-----------+
| user      |
+-----------+
| mysql.sys |
| root      |
+-----------+
2 rows in set (0.00 sec)

我们来停止旧版本的 MySQL 服务。

复制代码
systemctl stop mysqld

接下来,准备升级到 MySQL 5.7.19,RPM 包已经准备好。

复制代码
$ ls m*rpm
mysql-community-client-5.7.19-1.el7.x86_64.rpm
mysql-community-common-5.7.19-1.el7.x86_64.rpm
mysql-community-devel-5.7.19-1.el7.x86_64.rpm
mysql-community-embedded-5.7.19-1.el7.x86_64.rpm
mysql-community-embedded-compat-5.7.19-1.el7.x86_64.rpm
mysql-community-embedded-devel-5.7.19-1.el7.x86_64.rpm
mysql-community-libs-5.7.19-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.19-1.el7.x86_64.rpm
mysql-community-server-5.7.19-1.el7.x86_64.rpm

使用 yum 命令进行升级。

复制代码
yum update mysql-community-*

Updated:
  mysql-community-client.x86_64 0:5.7.19-1.el7                             
  mysql-community-common.x86_64 0:5.7.19-1.el7                             
  mysql-community-devel.x86_64 0:5.7.19-1.el7                              
  mysql-community-embedded.x86_64 0:5.7.19-1.el7                           
  mysql-community-embedded-compat.x86_64 0:5.7.19-1.el7                    
  mysql-community-embedded-devel.x86_64 0:5.7.19-1.el7                     
  mysql-community-libs.x86_64 0:5.7.19-1.el7                               
  mysql-community-libs-compat.x86_64 0:5.7.19-1.el7                        
  mysql-community-server.x86_64 0:5.7.19-1.el7                             

Complete!

安装完成,启动新版本的 MySQL 服务。

复制代码
systemctl start mysqld

登陆数据库,查看用户列表。

复制代码
mysql> select user from mysql.user;
+-----------+
| user      |
+-----------+
| mysql.sys |
| root      |
+-----------+
2 rows in set (0.00 sec)

可以看到,mysql.session 用户尚未被添加到数据库中。

这里我们开启 general 日志,来观察升级命令都执行了哪些 SQL。

复制代码
mysql> show variables like '%gen%';
+------------------+-----------------------------+
| Variable_name    | Value                       |
+------------------+-----------------------------+
| general_log      | ON                          |
| general_log_file | /var/lib/mysql/shawnyan.log |
+------------------+-----------------------------+
2 rows in set (0.00 sec)

下一步,运行 mysql_upgrade 命令。

复制代码
mysql_upgrade

[root@shawnyan ~ 07:42:50]$ mysql_upgrade -uroot -p
Checking if update is needed.
Checking server version.
Running queries to upgrade MySQL server.
Checking system database.
mysql.columns_priv                                 OK
mysql.db                                           OK
mysql.engine_cost                                  OK
mysql.event                                        OK
mysql.func                                         OK
mysql.general_log                                  OK
mysql.gtid_executed                                OK
mysql.help_category                                OK
mysql.help_keyword                                 OK
mysql.help_relation                                OK
mysql.help_topic                                   OK
mysql.innodb_index_stats                           OK
mysql.innodb_table_stats                           OK
mysql.ndb_binlog_index                             OK
mysql.plugin                                       OK
mysql.proc                                         OK
mysql.procs_priv                                   OK
mysql.proxies_priv                                 OK
mysql.server_cost                                  OK
mysql.servers                                      OK
mysql.slave_master_info                            OK
mysql.slave_relay_log_info                         OK
mysql.slave_worker_info                            OK
mysql.slow_log                                     OK
mysql.tables_priv                                  OK
mysql.time_zone                                    OK
mysql.time_zone_leap_second                        OK
mysql.time_zone_name                               OK
mysql.time_zone_transition                         OK
mysql.time_zone_transition_type                    OK
mysql.user                                         OK
The sys schema is already up to date (version 1.5.1).
Checking databases.
sys.sys_config                                     OK
Upgrade process completed successfully.
Checking if update is needed.

通过 general 日志,可以看到 mysql.session 用户被写入用户表。

复制代码
[root@shawnyan ~ 07:43:42]$ grep 'mysql.session' /var/lib/mysql/shawnyan.log
2024-03-15T23:43:09.277088Z     6 Query SELECT COUNT(*) FROM mysql.user WHERE user = 'mysql.session'
2024-03-15T23:43:10.888664Z     6 Query INSERT IGNORE INTO mysql.user VALUES ('localhost','mysql.session','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','Y','N','N','N','N','N','N','N','N','N','N','N','N','N','','','','',0,0,0,0,'mysql_native_password','*THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE','N',CURRENT_TIMESTAMP,NULL,'Y')
2024-03-15T23:43:10.889540Z     6 Query INSERT IGNORE INTO mysql.tables_priv VALUES ('localhost', 'mysql', 'mysql.session', 'user', 'root\@localhost', CURRENT_TIMESTAMP, 'Select', '')
2024-03-15T23:43:10.890429Z     6 Query INSERT IGNORE INTO mysql.db VALUES ('localhost', 'performance_schema', 'mysql.session','Y','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N')
[root@shawnyan ~ 07:44:02]$ 

再次登陆数据库,查看用户列表,确认新用户已经添加成功。

复制代码
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.19    |
+-----------+
1 row in set (0.00 sec)

mysql> select user from mysql.user;
+---------------+
| user          |
+---------------+
| mysql.session |
| mysql.sys     |
| root          |
+---------------+
3 rows in set (0.00 sec)

mysql_upgrade 废弃

不过,从 MySQL 8.0.16 开始, mysql_upgrade 被废弃,并将从未来的版本中移除。

DBA 不再需要额外地手动调用 mysql_upgrade 来进行升级操作。

取而代之的是,服务器新增了 --upgrade 选项,默认值为 AUTO

服务器会自行判断是否需要升级,如需要会在启动时自动执行升级操作。

如果执行 mysql_upgrade 命令,会输出下面一段信息:

The mysql_upgrade client is now deprecated. The actions executed by the upgrade client are now done by the server. To upgrade, please start the new MySQL binary with the older data directory. Repairing user tables is done automatically. Restart is not required after upgrade. The upgrade process automatically starts on running a new MySQL binary with an older data directory. To avoid accidental upgrades, please use the --upgrade=NONE option with the MySQL binary. The option --upgrade=FORCE is also provided to run the server upgrade sequence on demand. It may be possible that the server upgrade fails due to a number of reasons. In that case, the upgrade sequence will run again during the next MySQL server start. If the server upgrade fails repeatedly, the server can be started with the --upgrade=MINIMAL option to start the server without executing the upgrade sequence, thus allowing users to manually rectify the problem.

总结

总的来说,在 MySQL 8.0.16 之前,mysql_upgrade 是一个功能强大且实用的工具,它能够帮助用户平滑地过渡到新版本的 MySQL。

随着 MySQL 版本的不断更新和升级,mysql_upgrade 的功能已经内嵌到 MySQL 服务器,其也将伴随 MySQL 5.7 逐步退出历史舞台。

-- END --

如果这篇文章为你带来了灵感或启发,就帮忙点『赞』or『在看』or『转发』吧,这对我非常重要,感谢!(๑˃̵ᴗ˂̵)

本文由mdnice多平台发布

相关推荐
zyt05023 小时前
四、计算机网络与分布式系统(中)
linux·计算机网络·程序人生
郝学胜-神的一滴4 小时前
深入探索 Python 元组:从基础到高级应用
运维·服务器·开发语言·python·程序人生
贝塔实验室5 小时前
两种常用的抗单粒子翻转动态刷新方法
论文阅读·经验分享·笔记·科技·学习·程序人生·fpga开发
H10017 小时前
拉帮结派下的制造麻烦
程序人生
郝学胜-神的一滴21 小时前
Linux命令行的核心理念与实用指南
linux·运维·服务器·开发语言·程序人生
孤廖1 天前
【算法磨剑:用 C++ 思考的艺术・Dijkstra 实战】弱化版 vs 标准版模板,洛谷 P3371/P4779 双题精讲
java·开发语言·c++·程序人生·算法·贪心算法·启发式算法
郝学胜-神的一滴2 天前
深入浅出 C++20:新特性与实践
开发语言·c++·程序人生·算法·c++20
孤廖2 天前
从 “模板” 到 “场景”,用 C++ 磨透拓扑排序的实战逻辑
开发语言·c++·程序人生·算法·贪心算法·动态规划·学习方法
武子康3 天前
AI-调查研究-74-具身智能 机器人学习新突破:元学习与仿真到现实迁移的挑战与机遇
人工智能·程序人生·ai·职场和发展·系统架构·机器人·具身智能
刀客1233 天前
测试之道:从新手到专家实战(四)
python·功能测试·程序人生·测试用例·集成测试·学习方法·安全性测试