information_schema Introduction

information_schema介绍

information_schema数据库是MySQL自带的,里面的“表”保存着服务器当前的实时信息。它提供了访问数据库元数据的方式。元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。
在MySQL中,把information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。在INFORMATION_SCHEMA中,有数个只读表。它们实际上是视图,而不是基本表,因此,你将无法看到与之相关的任何文件。

在information_schema中“创建”和维护表

最近实现的一个patch,是要在数据库中增加一个统计,统计结果以表的形式呈现,因此必须在information_schema库中增加一个表,需要了解这些表的存在形式,以及“维护数据”的方式。

本文描述information_schema库中表的存在形式,访问时的调用方法,以及在该库中增加一个表需要的修改点。

1、特殊的库、特殊的表

稍微试验下会发现,这个库与其他的数据库不同,体现为以下几点:

a)这个库中,不能创建表,所有的DDL语句都被提示”Access denied”

b)这些“表”都是只读的。

c)对应到MySQL的data目录下,没有相应的以information_schema为名的文件夹。

不仅如此,在我们深入到代码中发现,使用内置的open_table函数(sql/sql_base.cc:2531)试图打开这些表的时候,也被提示表不存在。

跟踪select * from information_schema.processlist 这样的语句发现,在查询流程中使用的表名形如 “/tmp/#sql_5c75_0”,是一个临时表。

2、临时表

实际上,整个information_schema及里面的所有表,都可以理解为视图。在需要访问到视图中数据时,通过创建临时表(sql/sql_show.cc: create_schema_table)的方式,填充数据返回给客户端。

可以看到,在没有重启server时,所有对information_schema中的表的查询请求,在查询流程中的使用的表名都是相同的。

3、源码相关表定义

由于是临时表,也就可以理解为何在使用open_table时,会提示表不存在。要实现在information_schema库中自定义一个表的目的,就必须了解表的描述位置。

整个库的所有表定义入口为schema_tables (sql/sql_show.cc),这是一个ST_SCHEMA_TABLE的数组,每个元素用于定义一个表。在information_schema中执行show tables,即遍历该数组的所有元素得到。

如果需要新定义一个表,可以在该数组中插入一个ST_SCHEMA_TABLE的单位。注意需要同时在sql/table.h中修改enum enum_schema_tables的定义,它内部宏与schema_tables一一对应。缺少或者位置不对应将会导致MySQL运行时coredump,原因是在使用schema_tables[i]. fill_table()时,原代码中有些地方并不检验函数指针是否已定义。

ST_SCHEMA_TABLE定义了每个表的字段信息、创建形式、填充数据形式,定义在sql/table.h中。

c代码:

<span style="font-size: small;">typedef struct st_schema_table  

{  

  const char* table_name;  

  ST_FIELD_INFO *fields_info;  

  /* Create information_schema table */  

  TABLE *(*create_table)  (THD *thd, TABLE_LIST *table_list);  

  /* Fill table with data */  

  int (*fill_table) (THD *thd, TABLE_LIST *tables, COND *cond);  

……  

} ST_SCHEMA_TABLE;
</span>  

说明:

1) table_name 表名

2) fields_info 字段信息数组,结构体ST_FIELD_INFO中定义了字段名、字段类型等信息。

3) create_table 表创建函数,所有的表共享一个创建函数create_schema_table

4) fill_table 内容填充函数,每个表单独定义了一个填充表内容的函数。因为表结构不同,每个表的填充函数不相同。

你可能会疑惑为什么只有填充表内容的函数,而没有修改、删除表中行的函数?原因就是information_schema中的表,不需要更新和删除操作。每一次查询,都是重新生成临时表,将内存中的信息插入到表中。

4、源码相关表生成流程

在每次需要访问information_schema中的某个表内容时,先调用create_schema_table生成临时表,生成时需要的字段定义等信息来源于fields_info。

临时表生成后,调用fill_table指向的函数填充表内容。看一下我们常见的命令show processlist调用的fill_table函数结构。

c代码:

<span style="font-size: small;">int fill_schema_processlist(THD* thd, TABLE_LIST* tables, COND* cond)
{
…….
   I_List_iterator<THD> it(threads);
   THD* tmp;
   while ((tmp= it++))
   {
       /* ID */
       table->field[0]->store((longlong) tmp->thread_id, TRUE);
       /* USER */
       table->field[1]->store(val, strlen(val), cs);
       /* HOST */
       table->field[2]->store(host, strlen(host), cs);
       /* DB */
       table->field[3]->store(tmp->db, strlen(tmp->db), cs);
…….
       schema_table_store_record(thd, table);
……
   }
} </span> 

说明:

1) 第4行中threads是一个全局变量,记录当前的执行线程。

2) 第6行用一个循环遍历所有线程

3) 第8~16行为填充片段,略去了各种判断语句。可以清楚看到,对于每个字段,都单独进行值填充

4) 第17行的schema_table_store_record是将上面填充完成的table->field数组内容插入到临时表中

5、源码相关新增自定义表

总结

在information_schema库中新增一个表需要的步骤如下:

1)设计好定义表的结构后,在sql/sql_show.cc中新增一个ST_FIELD_INFO mytable_fields_info结构数组,存放表信息;

2)在sql/table.h enum_schema_tables中相应增加一个宏定义SCH_MYTABLE

3)定义一个填充函数fill_schema_mytable, 此函数负责向创建好的临时表中插入数据,需要访问某个全局信息。

4)在 schema_tables数组中增加一个元素 {“table_name”, mytable_fields_info, create_schema_table, fill_schema_mytable, 0, 0, -1, -1, 0, 0}, 该元素的位置需要与第2步中增加的宏定义位置相对应。

时间: 2024-11-01 12:11:45

information_schema Introduction的相关文章

information_schema系列四(跟踪,列约束,表和列)

这个系列的文章主要是为了能够让自己了解MySQL5.7的一些系统表,统一做一下备注和使用,也希望分享出来让大家能够有一点点的受益. 1:KEY_COLUMN_USAGE 按照官方的解释,这个表描述的是关于有约束的列.也就是没有约束的列都不会显示出来,按照整库查了一下,我里面有五张表,结果这个库记录的只有一条信息.因为只有这个列有约束,其他几张表都是测试玩的,并没有什么约束. 我现在创建两张表主键外键关联关系,然后查一下记录: 看一下就很是明朗了有没有,test1的ID只是主键,后面的关联就会显示

Spring AOP之Introduction(@DeclareParents)简介

Spring的文档上对Introduction这个概念和相关的注解@DeclareParents作了如下介绍: Introductions (known as inter-type declarations in AspectJ) enable an aspect to declare that advised objects implement a given interface, and to provide an implementation of that interface on be

information_schema系列五(表,触发器,视图,存储过程和函数)

这个系列的文章主要是为了能够让自己了解MySQL5.7的一些系统表,统一做一下备注和使用,也希望分享出来让大家能够有一点点的受益. 1:TABLES TABLES这张表毫无疑问了,就是记录的数据库中表的信息,其中包括系统数据库和用户创建的数据库.而TABLESPACES 却是标注的活跃表空间. 看一下TABLES 的记录关于TEST1表: 其实我们通过show table status like 'test1'\G;可以看到相同的信息. TABLE_TYPE这列有两种类型,分别是BASE TAB

Introduction and Basic concepts

1 Network Edge The device such as computers and mobiles connect to the Internet. So they are referred as end systems(who run the application programs) sitting at the edge of the Internet. And we use host and end system interchangeably, that is host=e

information_schema系列七

这个系列的文章主要是为了能够让自己了解MySQL5.7的一些系统表,统一做一下备注和使用,也希望分享出来让大家能够有一点点的受益. 第七篇主要看一下一下几系统表:PARAMETERS (定义参数),PARTITIONS(分区相关),PLUGINS(插件),PROCESSLIST(链接信息),PROFILING(优化相关,可以查看具体运行时间等信息) ,REFERENTIAL_CONSTRAINTS (外键约束相关信息),SCHEMATA(SCHEMA信息) ,SCHEMA_PRIVILEGES

information_schema系列六(索引,表空间,权限,约束相关表)

1: STATISTICS 这个表提供的是关于表的索引信息: INFORMATION_SCHEMA Name SHOW Name TABLE_CATALOG   TABLE_SCHEMA   TABLE_NAME Table NON_UNIQUE Non_unique INDEX_SCHEMA   INDEX_NAME Key_name SEQ_IN_INDEX Seq_in_index COLUMN_NAME Column_name COLLATION Collation CARDINALIT

information_schema系列二(列,列权限,事件,存储引擎)

这个系列的文章主要是为了能够让自己了解MySQL5.7的一些系统表,统一做一下备注和使用,也希望分享出来让大家能够有一点点的受益. 1:COLUMNS 老规矩.查一下这个表,看一下记录,由于这个是看表的结构的我们就拿qiandai数据库的一张表作为例子. [email protected] [information_schema]>select * from COLUMNS where TABLE_SCHEMA='qiandai' and TABLE_NAME= 'articles'\G; **

Introduction to Machine Learning

Chapter 1 Introduction 1.1 What Is Machine Learning? To solve a problem on a computer, we need an algorithm. An algorithm is a sequence of instructions that should be carried out to transform the input to output. For example, one can devise an algori

information_schema.column_privileges 学习

mysql 的授权是分层次的 实例级 | 库级 | 表级 | 列级 而这些授权信息被保存在了mysql.user | mysql.db | mysql.tables_priv | mysql.column_priv 等表中 而information_schema.column_privileges 表中的信息来自于mysql.column_priv 表 1.information_schema.column_privileges 表中常用的列: 1.grantee :用户(对列就相应权限的用户)