• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • MySQL服务器系统架构

    MySQL数据目录

    MySQL服务器管理的信息存储在称为数据目录的目录下。下表简要描述了通常在数据目录中找到的项目,并提供了交叉引用以获取更多信息:

    • 数据目录子目录。数据目录的每个子目录都是一个数据库目录,并且对应于服务器管理的数据库。所有MySQL安装都具有某些标准数据库:

      • mysql目录对应于mysql系统架构,其中包含MySQL服务器运行时所需的信息。该数据库包含数据字典表和系统表。请参见“ mysql系统模式”。
      • performance_schem 目录对应于性能架构,该架构提供了用于在运行时检查服务器内部执行的信息。请参阅MySQL性能模式
      • sys目录与sys模式相对应,该模式提供了一组对象,以帮助更轻松地解释性能模式信息。请参阅MySQL sys Schem
      • ndbinfo目录对应于ndbinfo存储特定于NDB Cluster的信息的数据库(仅对于包含NDB Cluster的安装才存在)。请参见“ ndbinfo:NDB群集信息数据库”。

      其他子目录对应于用户或应用程序创建的数据库。

      注意

      INFORMATION_SCHEMA是标准数据库,但其实现不使用相应的数据库目录。

    • 服务器写入的日志文件。请参见“ MySQL服务器日志”。
    • InnoDB表空间和日志文件。请参阅InnoDB存储引擎
    • 默认/自动生成的SSL和RSA证书和密钥文件。请参见“创建SSL和RSA证书和密钥”。
    • 服务器进程ID文件(服务器正在运行时)。
    • mysqld-auto.cnf存储持久性全局系统变量设置的文件。请参见“变量分配的SET语法”。

    通过重新配置服务器,可以将上述列表中的某些项目重新放置在其他位置。此外,该--datadir选项还可以更改数据目录本身的位置。对于给定的MySQL安装,请检查服务器配置以确定是否已移动项目。

    mysql系统架构

    mysql架构是系统架构。它包含存储MySQL服务器运行时所需信息的表。广义的分类是,该mysql架构包含存储数据库对象元数据的数据字典表以及用于其他操作目的的系统表。以下讨论将系统表的集合进一步细分为较小的类别。

    • 数据字典表
    • 赠款系统表
    • 对象信息系统表
    • 日志系统表
    • 服务器端帮助系统表
    • 时区系统表
    • 复制系统表
    • 优化器系统表
    • 杂项系统表

    本节的其余部分列举了每个类别中的表,并提供了交叉引用以获取更多信息。InnoDB除非另有说明,否则数据字典表和系统表将使用存储引擎。

    mysql系统表和数据字典表位于MySQL数据目录中InnoDB命名的单个表空间文件mysql.ibd中。以前,这些表是在mysql数据库目录中的单个表空间文件中创建的。

    可以为mysql系统架构表空间启用静态数据加密。有关更多信息,请参见“ InnoDB静态数据加密”。

    数据字典表

    这些表包含数据字典,其中包含有关数据库对象的元数据。有关更多信息,请参见MySQL数据字典

    重要

    数据字典是MySQL 8.0中的新增功能。与以前的MySQL版本相比,启用了数据字典的服务器在操作上存在一些常规差异。有关详细信息,另外,对于从MySQL 5.7升级到MySQL 8.0的情况,升级过程与以前的MySQL版本有所不同,并且要求您通过检查特定的先决条件来验证安装的升级准备情况。有关更多信息,请参见“升级MySQL”,尤其是“为升级准备安装”。

    • catalogs:目录信息。
    • character_sets:有关可用字符集的信息。
    • check_constraints:有关CHECK在表上定义的约束的信息。请参见“检查约束”。
    • collations:有关每个字符集的排序规则的信息。
    • column_statistics:列值的直方图统计信息。请参见“优化器统计”。
    • column_type_elements:有关列使用的类型的信息。
    • columns:有关表中列的信息。
    • dd_properties:用于标识数据字典属性(例如其版本)的表。服务器使用它来确定是否必须将数据字典升级到较新的版本。
    • events:有关事件计划程序事件的信息。服务器将在其启动顺序期间加载此表中列出的事件,除非使用该--skip-grant-tables选项启动。
    • foreign_keysforeign_key_column_usage:有关外键的信息。
    • index_column_usage:有关索引使用的列的信息。
    • index_partitions:有关索引使用的分区的信息。
    • index_stats:用于存储ANALYZE TABLE执行时生成的动态索引统计信息。
    • indexes:有关表索引的信息。
    • innodb_ddl_log:存储DDL日志以进行崩溃安全的DDL操作。
    • parameter_type_elements:有关存储过程和函数参数以及有关存储函数的返回值的信息。
    • parameters:有关存储过程和功能的信息。请参见“MySQL存储例程”。
    • resource_groups:有关资源组的信息。请参见“资源组
    • routines:有关存储过程和功能的信息。请参见“MySQL存储例程”。
    • schemat :有关模式的信息。在MySQL中,模式是数据库,因此此表提供有关数据库的信息。
    • st_spatial_reference_systems:有关空间数据的可用空间参考系统的信息。
    • table_partition_values:有关表分区使用的值的信息。
    • table_partitions:有关表使用的分区的信息。
    • table_stats:有关在ANALYZE TABLE执行时生成的动态表统计信息。
    • tables:有关数据库中表的信息。
    • tablespace_files:有关表空间使用的文件的信息。
    • tablespaces:有关活动表空间的信息。
    • triggers:有关触发器的信息。
    • view_routine_usage:有关视图和视图使用的存储函数之间的依赖关系的信息。
    • view_table_usage:用于跟踪视图及其基础表之间的依赖关系。

    数据字典表是不可见的。它们不能用读取SELECT,不出现在输出中SHOW TABLES,也未在INFORMATION_SCHEMA.TABLES表中列出,依此类推。但是,在大多数情况下INFORMATION_SCHEMA,可以查询相应的表。从概念上讲,INFORMATION_SCHEMA可以提供一个视图,MySQL通过该视图公开数据字典元数据。例如,您不能mysql.schemat 直接从表中选择:

    mysql> SELECT * FROM mysql.schemat ;
    ERROR 3554 (HY000): Access to data dictionary table 'mysql.schemata' is rejected.
    

    而是从相应的INFORMATION_SCHEMA表中选择该信息:

    mysql> SELECT * FROM INFORMATION_SCHEMA.SCHEMATA\G
    *************************** 1. row  ***************************
    CATALOG_NAME : def
    SCHEMA_NAME : mysql
    DEFAULT_CHARACTER_SET_NAME : utf8mb4
    DEFAULT_COLLATION_NAME : utf8mb4_0900_ai_ci
    SQL_PATH : NULL
    DEFAULT_ENCRYPTION : NO
    *************************** 2. row  ***************************
    CATALOG_NAME : def
    SCHEMA_NAME : information_schema
    DEFAULT_CHARACTER_SET_NAME : utf8
    DEFAULT_COLLATION_NAME : utf8_general_ci
    SQL_PATH : NULL
    DEFAULT_ENCRYPTION : NO
    ...
    

    没有INFORMATION_SCHEMA与完全对应的表mysql.indexes,但INFORMATION_SCHEMA.STATISTICS包含许多相同的信息。

    到目前为止,还没有INFORMATION_SCHEMA说完全对应表mysql.foreign_keysmysql.foreign_key_column_usage。获取外键信息的标准SQL方法是使用INFORMATION_SCHEMAREFERENTIAL_CONSTRAINTSKEY_COLUMN_USAGE表。这些表现在实现为在意见foreign_keysforeign_key_column_usage和其它数据字典的表。

    MySQL 8.0之前的某些系统表已被数据字典表取代,并且不再存在于mysql系统架构中:

    • events数据字典表取代了event从MySQL 8.0之前的表。
    • parametersroutines数据字典表一起取代的proc从MySQL 8.0前表。

    赠款系统表

    这些系统表包含有关用户帐户及其所拥有特权的授权信息。有关这些表的结构,内容和用途的更多信息,请参见“授权表”。

    从MySQL 8.0开始,授权表是InnoDB(事务性)表。以前,这些是MyISAM(非事务性)表。授予表存储引擎的更改是MySQL 8.0中帐户管理语句(例如CREATE USER和)行为的伴随更改GRANT。以前,命名多个用户的帐户管理语句可能对某些用户成功而对其他用户失败。这些语句现在是事务性的,并且对于所有命名的用户都成功,或者回滚,并且在发生任何错误时不起作用。

    注意

    如果MySQL是从旧版本升级的,但授权表尚未从升级MyISAMInnoDB,则服务器会将其视为只读,并且帐户管理语句会产生错误。有关升级说明,请参见“升级MySQL”。

    • user:用户帐户,全局特权和其他非特权列。
    • global_grants:向用户分配动态全局特权;请参阅静态权限与动态权限。
    • db:数据库级特权。
    • tables_priv:表级特权。
    • columns_priv:列级特权。
    • procs_priv:存储过程和函数特权。
    • proxies_priv:代理用户权限。
    • default_roles:此表列出了用户连接和认证或执行后要激活的默认角色SET ROLE DEFAULT
    • role_edges:此表列出了角色子图的边。

      给定的user表行可能引用用户帐户或角色。服务器可以通过查询role_edges表以获取有关身份验证ID之间关系的信息来区分行是代表用户帐户,角色还是同时代表两者。

    • password_history:有关密码更改的信息。

    对象信息系统表

    这些系统表包含有关存储的程序,组件,用户定义的函数和服务器端插件的信息:

    • component:服务器组件的注册表。在服务器启动过程中,此表中列出的所有组件均由加载程序服务安装。请参见“ MySQL服务器组件”。
    • func:有关用户定义函数(UDF)的信息。请参见“MySQL服务器支持用户自定义函数”。服务器将在其启动顺序期间加载此表中列出的UDF,除非使用该--skip-grant-tables选项启动。
    • plugin:有关服务器端插件的信息。请参见“MySQL服务器插件”和“ MySQL插件API”。服务器将在启动过程中加载此表中列出的插件,除非使用该--skip-grant-tables选项启动。

    日志系统表

    服务器使用以下系统表进行日志记录:

    • general_log:一般查询日志表。
    • slow_log:慢查询日志表。

    日志表使用CSV存储引擎。

    有关更多信息,请参见“ MySQL服务器日志”。

    服务器端帮助系统表

    这些系统表包含服务器端帮助信息:

    • help_category:有关帮助类别的信息。
    • help_keyword:与帮助主题相关的关键字。
    • help_relation:帮助关键字和主题之间的映射。
    • help_topic:帮助主题内容。

    有关更多信息,请参见“服务器端帮助支持”。

    时区系统表

    这些系统表包含时区信息:

    • time_zone:时区ID以及它们是否使用leap秒。
    • time_zone_leap_second:发生leap秒时。
    • time_zone_name:时区ID和名称之间的映射。
    • time_zone_transitiontime_zone_transition_type:时区说明。

    有关更多信息,请参见“ MySQL服务器时区支持”。

    复制系统表

    服务器使用以下系统表来支持复制:

    • gtid_executed:用于存储GTID值的表。参见 mysql.gtid_executed表。
    • ndb_binlog_index:NDB群集复制的二进制日志信息。仅当服务器是在NDBCLUSTER支持的情况下构建的,才创建此表。请参见“ NDB群集复制架构和表”。
    • slave_master_infoslave_relay_log_infoslave_worker_info:用来存放复制的信息从服务器上。请参见“复制中继和状态日志”。

    刚刚列出的所有表都使用InnoDB存储引擎。

    优化器系统表

    这些系统表供优化器使用:

    • innodb_index_statsinnodb_table_stats:用于InnoDB持久性优化器统计信息。请参见“配置持久性优化器统计参数”。
    • server_costengine_cost:优化程序成本模型使用的表包含有关查询执行期间发生的操作的成本估算信息。server_cost包含用于一般服务器操作的优化程序成本估算。engine_cost包含特定于特定存储引擎的操作的估计。请参见“优化器成本模型”。

    杂项系统表

    其他系统表不符合上述类别:

    • udit_log_filter udit_log_user::如果安装了MySQL企业审核,则这些表提供审核日志过滤器定义和用户帐户的持久存储。请参阅审核日志表。
    • firewall_usersfirewall_whitelist如果安装了MySQL企业级防火墙,这些表格提供了防火墙使用的信息永久存储。请参见“ MySQL企业防火墙”。
    • servers:由FEDERATED存储引擎使用。请参见“使用CREATE SERVER创建联合表”。
    • innodb_dynamic_metadat :由InnoDB存储引擎用来存储快速变化的表元数据,例如自动增量计数器值和索引树损坏标志。替换驻留在InnoDB系统表空间中的数据字典缓冲区表。