• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 数据字典用法差异

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

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

      • ANALYZE TABLE失败,因为它更新了存储在数据字典中的表统计信息。
      • ALTER TABLE tbl_name ENGINE=engine_name失败,因为它更新了存储在数据字典中的存储引擎名称。
      注意

      启用innodb_read_only对于mysql系统数据库中的非数据字典表也具有重要意义。有关详细信息,请参阅的说明innodb_read_only中科15.14,“InnoDB启动选项和系统变量”

    • 以前,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。有关更多信息,请参见“优化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开始,这些标头大写;前面的查询产生的结果集的标头为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开始,不使用eventproc表。对应对象的定义存储在数据字典表中,但这些表未转储。要在使用进行的转储中包含存储的例程和事件--all-databases,请使用--routines--events选项。
      • 以前,该--routines选项需要表的SELECT特权proc。从MySQL 8.0开始,不使用该表。而是--routines需要全局SELECT特权。
      • 以前,可以通过转储procevent表来转储存储的例程和事件定义及其创建和修改时间戳。从MySQL 8.0开始,不使用这些表,因此不可能转储时间戳。
    • 以前,创建包含非法字符的存储例程会产生警告。从MySQL 8.0开始,这是一个错误。