暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

MySQL 8.4.0 LTS 变更解析:I_S 表、权限、关键字和客户端

原创 严少安 2024-05-17
541

前情回顾


MySQL 8.4.0 LTS 已经发布 ,作为发版模型变更后的第一个长期支持版本,注定要承担未来生产环境的重任,那么这个版本都有哪些新特性、变更,接下来少安将带大家一起来 get 新知识点。

相关文章

INFORMATION_SCHEMA 变更

表 INFORMATION_SCHEMA.TABLESPACES 从 MySQL 8.0.22 开始被废弃,现已移除。

  • 8.4.0
mysql> select version()\G *************************** 1. row *************************** version(): 8.4.0-ShawnYan-debug 1 row in set (0.00 sec) mysql> desc INFORMATION_SCHEMA.TABLESPACES; ERROR 1109 (42S02): Unknown table 'TABLESPACES' in information_schema
  • 8.3.0
mysql> select version()\G *************************** 1. row *************************** version(): 8.3.0 1 row in set (0.01 sec) mysql> desc INFORMATION_SCHEMA.TABLESPACES; +--------------------+-----------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------------+-----------------+------+-----+---------+-------+ | TABLESPACE_NAME | varchar(64) | NO | | | | | ENGINE | varchar(64) | NO | | | | | TABLESPACE_TYPE | varchar(64) | YES | | | | | LOGFILE_GROUP_NAME | varchar(64) | YES | | | | | EXTENT_SIZE | bigint unsigned | YES | | | | | AUTOEXTEND_SIZE | bigint unsigned | YES | | | | | MAXIMUM_SIZE | bigint unsigned | YES | | | | | NODEGROUP_ID | bigint unsigned | YES | | | | | TABLESPACE_COMMENT | varchar(2048) | YES | | | | +--------------------+-----------------+------+-----+---------+-------+ 9 rows in set (0.20 sec)

对于 InnoDB 表,Information Schema 中的表 INNODB_TABLESPACES 和 INNODB_DATAFILES 来提供表空间元信息。

mysql> table INFORMATION_SCHEMA.INNODB_TABLESPACES; +------------+------------------+-------+----------------------+-----------+---------------+------------+---------------+-----------+----------------+-----------------+----------------+---------------+------------+--------+ | SPACE | NAME | FLAG | ROW_FORMAT | PAGE_SIZE | ZIP_PAGE_SIZE | SPACE_TYPE | FS_BLOCK_SIZE | FILE_SIZE | ALLOCATED_SIZE | AUTOEXTEND_SIZE | SERVER_VERSION | SPACE_VERSION | ENCRYPTION | STATE | +------------+------------------+-------+----------------------+-----------+---------------+------------+---------------+-----------+----------------+-----------------+----------------+---------------+------------+--------+ | 4294967294 | mysql | 18432 | Any | 16384 | 0 | General | 4096 | 26214400 | 26214400 | 0 | 8.4.0 | 1 | N | normal | | 4294967293 | innodb_temporary | 4096 | Compact or Redundant | 16384 | 0 | System | 4096 | 12582912 | 12582912 | 0 | 8.4.0 | 1 | N | normal | | 4294967279 | innodb_undo_001 | 0 | Undo | 16384 | 0 | Undo | 4096 | 16777216 | 16777216 | 0 | 8.4.0 | 1 | N | active | | 4294967278 | innodb_undo_002 | 0 | Undo | 16384 | 0 | Undo | 4096 | 16777216 | 16777216 | 0 | 8.4.0 | 1 | N | active | | 1 | sys/sys_config | 16417 | Dynamic | 16384 | 0 | Single | 4096 | 114688 | 114688 | 0 | 8.4.0 | 1 | N | normal | | 2 | yandb/t | 16417 | Dynamic | 16384 | 0 | Single | 4096 | 114688 | 114688 | 0 | 8.4.0 | 1 | N | normal | +------------+------------------+-------+----------------------+-----------+---------------+------------+---------------+-----------+----------------+-----------------+----------------+---------------+------------+--------+ 6 rows in set (0.00 sec) mysql> table INFORMATION_SCHEMA.INNODB_DATAFILES; +------------------------+----------------------+ | SPACE | PATH | +------------------------+----------------------+ | 0x30 | ibdata1 | | 0x34323934393637323739 | ./undo_001 | | 0x34323934393637323738 | ./undo_002 | | 0x31 | ./sys/sys_config.ibd | | 0x32 | ./yandb/t.ibd | +------------------------+----------------------+ 5 rows in set (0.00 sec)

知识扩展

表 INNODB_TABLESPACES 和 INNODB_DATAFILES 自 MySQL 8.0.3 发生过表名变更,如果从 MySQL 5.7 升级上来,需要注意。

Old Name New Name
INNODB_SYS_TABLESPACES INNODB_TABLESPACES
INNODB_SYS_DATAFILES INNODB_DATAFILES

权限变更

1. FLUSH_PRIVILEGES

MySQL 8.4.0 LTS 添加了特定于 FLUSH PRIVILEGES 语句的使用的权限。与现有的 RELOAD 权限不同,新的 FLUSH_PRIVILEGES 权限仅适用于 FLUSH PRIVILEGES 语句。此权限的范围是全局的,并且适用于用户和角色。

示例:

  1. 创建带有 FLUSH_PRIVILEGES 权限的用户。
mysql> create user u1; Query OK, 0 rows affected (0.02 sec) mysql> grant FLUSH_PRIVILEGES on *.* to u1; Query OK, 0 rows affected (0.01 sec) mysql> show grants for u1; +-------------------------------------------+ | Grants for u1@% | +-------------------------------------------+ | GRANT USAGE ON *.* TO `u1`@`%` | | GRANT FLUSH_PRIVILEGES ON *.* TO `u1`@`%` | +-------------------------------------------+ 2 rows in set (0.00 sec)
  1. 使用 u1 用户连接数据库。
mysql> select current_user()\G *************************** 1. row *************************** current_user(): u1@% 1 row in set (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.04 sec)
  1. 回收权限后再次使用 u1 刷新权限,执行报错,提示需要 RELOAD 或 FLUSH_PRIVILEGES 权限。
mysql> flush privileges; ERROR 1227 (42000): Access denied; you need (at least one of) the RELOAD or FLUSH_PRIVILEGES privilege(s) for this operation

同时,RELOAD 权限将继续提供向后兼容性; 具有此权限的用户在升级后仍然可以执行 FLUSH PRIVILEGES 语句。作为升级到 MySQL 8.4 版本的一部分,将执行检查以查看是否有任何用户具有 FLUSH_PRIVILEGES 权限; 如果没有,则具有 RELOAD 权限的用户也会自动分配新权限。

2. OPTIMIZE_LOCAL_TABLE

MySQL 8.4.0 LTS 添加了新的 OPTIMIZE_LOCAL_TABLE 权限。

用户必须具有此权限才能执行 OPTIMIZE LOCAL TABLEOPTIMIZE NO_WRITE_TO_BINLOG TABLE 语句。

从以前的版本升级时,已具有 SYSTEM_USER 权限的用户将被自动授予 OPTIMIZE_LOCAL_TABLE 权限。

mysql> show grants; +-----------------------------------------------+ | Grants for u1@% | +-----------------------------------------------+ | GRANT USAGE ON *.* TO `u1`@`%` | | GRANT OPTIMIZE_LOCAL_TABLE ON *.* TO `u1`@`%` | | GRANT REFERENCES ON `yandb`.* TO `u1`@`%` | +-----------------------------------------------+ 3 rows in set (0.00 sec) mysql> OPTIMIZE LOCAL TABLE t; +---------+----------+----------+-------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +---------+----------+----------+-------------------------------------------------------------------+ | yandb.t | optimize | note | Table does not support optimize, doing recreate + analyze instead | | yandb.t | optimize | status | OK | +---------+----------+----------+-------------------------------------------------------------------+ 2 rows in set (0.20 sec) mysql> OPTIMIZE NO_WRITE_TO_BINLOG TABLE t; +---------+----------+----------+-------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +---------+----------+----------+-------------------------------------------------------------------+ | yandb.t | optimize | note | Table does not support optimize, doing recreate + analyze instead | | yandb.t | optimize | status | OK | +---------+----------+----------+-------------------------------------------------------------------+ 2 rows in set (0.19 sec)

关键字

从 MySQL 8.0 到 8.4,增加了几个关键字,标记为®的是保留关键字:

AUTO, BERNOULLI, GTIDS, LOG, MANUAL ®, PARALLEL ®, PARSE_TREE, QUALIFY ®, S3, and TABLESAMPLE ®.

在准备升级数据库版本时,需要确认库、表有无使用到保留关键字,如果有建议先改名。

  • 确认 SCHEMA 名称没有使用保留关键字
with t as ( select 'manual' as rk union select 'parallel' union select 'qualify' union select 'tablesample' ) select SCHEMA_NAME from information_schema.SCHEMATA where lower(SCHEMA_NAME) in (select rk from t);

示例输出:

+-------------+ | SCHEMA_NAME | +-------------+ | manual | +-------------+ 1 row in set (0.00 sec)
  • 确认 TABLE 名称没有使用保留关键字
with t as ( select 'manual' as rk union select 'parallel' union select 'qualify' union select 'tablesample' ) select table_schema, table_name, table_type from information_schema.tables where lower(table_schema) in (select rk from t) or lower(table_name) in (select rk from t);

示例输出:

+--------------+------------+------------+ | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | +--------------+------------+------------+ | yandb | manual | BASE TABLE | | yandb | manuaL | VIEW | +--------------+------------+------------+ 2 rows in set (0.00 sec)

客户端

  1. mysql_upgrade 移除

在之前的文章 MySQL 升级:使用 mysql_upgrade 注意事项(再见 mysql_upgrade) 中介绍过 mysql_upgrade 的变化。

MySQL 8.4.0 移除了该客户端。

  1. mysqlpump 移除

移除了已弃用的 mysqlpump 客户端,及其关联的 lz4_decompress 和 zlib_decompress 辅助工具。

请使用 mysqldump 或 MySQL Shell 的转储程式。

  1. mysqldump 新选项

mysqldump 新增选项 --output-as-version,用于确定与复制和时间相关的语句所使用的术语级别,从而创建兼容老版本的备份。

该选项有3个可选值,SERVER,BEFORE_8_0_23,BEFORE_8_2_0,默认为 SERVER

BEFORE_8_2_0 将输出已弃用的事件 DISABLE ON SLAVE 术语

BEFORE_8_0_23 将使用已弃用的 SLAVE/CHANGE MASTER 术语来表示复制命令

  1. 客户端注释保留

这里还有一个变更点值得注意。在之前的版本中,MySQL 客户端默认剥离注释。从 MySQL 8.1 开始,默认情况已更改为保留此类注释。

往期精彩

– END –

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

最后修改时间:2024-05-17 15:47:21
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论