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

[ACDU 翻译] MySQL14.7 数据字典使用差异

原创 由迪 2022-01-20
263

与没有数据字典的服务器相比,使用启用数据字典的 MySQL 服务器需要一些操作差异:

  • 以前,启用 系统变量会阻止仅为存储引擎innodb_read_only创建和删除表 。InnoDB从 MySQL 8.0 开始,启用会 innodb_read_only阻止所有存储引擎的这些操作。任何存储引擎的表创建和删除操作都会修改mysql系统数据库中的数据字典表,但这些表使用存储引擎并且在启用InnoDB时无法修改 。innodb_read_only同样的原则也适用于其他需要修改数据字典表的表操作。例子:

    笔记

    启用对系统数据库innodb_read_only 中的非数据字典表也有重要影响。mysql有关详细信息,请参阅 第 15.14 节,“InnoDB 启动选项和系统变量”innodb_read_only中 的描述

  • 以前,mysql系统数据库中的表对 DML 和 DDL 语句可见。从 MySQL 8.0 开始,数据字典表是不可见的,不能直接修改或查询。但是,在大多数情况下INFORMATION_SCHEMA ,可以查询相应的表。这使得底层数据字典表可以随着服务器开发的进行而改变,同时保持一个稳定的 INFORMATION_SCHEMA接口供应用程序使用。

  • INFORMATION_SCHEMA MySQL 8.0 中的表与数据字典密切相关,导致使用上的一些差异:

    • 以前,INFORMATION_SCHEMA查询 STATISTICS和 表中的TABLES表统计信息直接从存储引擎检索统计信息。从 MySQL 8.0 开始,默认使用缓存表统计信息。系统变量定义缓存表统计信息过期之前的 information_schema_stats_expiry 时间段。默认值为 86400 秒(24 小时)。(要随时更新给定表的缓存值,请使用ANALYZE TABLE.) 如果没有缓存统计信息或统计信息已过期,则在查询表统计信息列时从存储引擎中检索统计信息。要始终直接从存储引擎检索最新统计信息,请设置 information_schema_stats_expiry0. 有关更多信息,请参阅 第 8.2.3 节,“优化 INFORMATION_SCHEMA 查询”

    • 有几个INFORMATION_SCHEMA表是数据字典表的视图,它使优化器能够在这些基础表上使用索引。因此,根据优化器的选择,INFORMATION_SCHEMA 查询结果的行顺序可能与之前的结果不同。如果查询结果必须具有特定的行排序特征,请包含一个ORDER BY子句。

    • INFORMATION_SCHEMA表的查询可能会以与早期 MySQL 系列不同的字母大小写返回列名。应用程序应该以不区分大小写的方式测试结果集列名。如果这不可行,一种解决方法是在选择列表中使用列别名,以所需的字母大小写返回列名。例如:

      SELECT TABLE_SCHEMA AS table_schema, TABLE_NAME AS table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'users';
      复制
    • mysqldumpmysqlpump不再转储 INFORMATION_SCHEMA数据库,即使在命令行上明确命名。

    • CREATE TABLE *dst_tbl* LIKE *src_tbl*要求它 *src_tbl*是一个基表,如果它是一个INFORMATION_SCHEMA 表是数据字典表的视图,则失败。

    • 以前,从 INFORMATION_SCHEMA表中选择的列的结果集标题使用查询中指定的大小写。此查询生成一个带有标题的结果集 table_name

      SELECT table_name FROM INFORMATION_SCHEMA.TABLES;
      复制

      从 MySQL 8.0 开始,这些标头都是大写的;前面的查询产生一个带有 .header 的结果集TABLE_NAME。如有必要,可以使用列别名来实现不同的字母大小写。例如:

      SELECT table_name AS 'table_name' FROM INFORMATION_SCHEMA.TABLES;
      复制
  • 数据目录影响mysqldumpmysqlpump如何从 mysql系统数据库中转储信息:

    • 以前,可以转储 mysql系统数据库中的所有表。从 MySQL 8.0 开始,mysqldumpmysqlpump仅转储该数据库中的非数据字典表。
    • 以前, --routinesand --events选项在使用该选项时不需要包括存储的例程和事件 --all-databases:转储包括mysql系统数据库,因此也包括包含存储的例程和事件定义的proc and表。event从 MySQL 8.0 开始,不使用eventand 表。proc相应对象的定义存储在数据字典表中,但不会转储这些表。要在使用 制作的转储中包含存储的例程和事件 --all-databases,请使用 --routines--events明确的选项。
    • 以前,该 --routines选项需要表的SELECT 权限proc。从 MySQL 8.0 开始,不使用该表; --routines而是需要全局SELECT权限。
    • 以前,可以通过转储 procevent 表来转储存储的例程和事件定义以及它们的创建和修改时间戳。从 MySQL 8.0 开始,这些表未使用,因此无法转储时间戳。
  • 以前,创建包含非法字符的存储例程会产生警告。从 MySQL 8.0 开始,这是一个错误。

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

评论