再见 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多平台发布

相关推荐
立志成为大牛的小牛7 小时前
数据结构——三十六、拓扑排序(王道408)
数据结构·学习·程序人生·考研·算法
向前阿、1 天前
数据结构从基础到实战——排序
c语言·开发语言·数据结构·程序人生·算法
郝学胜-神的一滴1 天前
QAxios研发笔记(二):在Qt环境下基于Promise风格简化Http的Post请求
开发语言·c++·笔记·qt·网络协议·程序人生·http
敲代码的嘎仔1 天前
数据结构算法学习day3——二分查找
java·开发语言·数据结构·学习·程序人生·算法·职场和发展
郝学胜-神的一滴2 天前
深入解析C++命令模式:设计原理与实际应用
开发语言·c++·程序人生·软件工程·命令模式
郝学胜-神的一滴2 天前
Qt删除布局与布局切换技术详解
开发语言·数据库·c++·qt·程序人生·系统架构
小龙报2 天前
《赋能AI解锁Coze智能体搭建核心技能(2)--- 智能体开发基础》
人工智能·程序人生·面试·职场和发展·创业创新·学习方法·业界资讯
郝学胜-神的一滴3 天前
深入理解 Python 的 __init_subclass__ 方法:自定义类行为的新方式 (Effective Python 第48条)
开发语言·python·程序人生·个人开发
裸奔在上海4 天前
使用Java做URL短连接还原长链接获取参数
java·开发语言·程序人生·spring