`
丁林.tb
  • 浏览: 797240 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

在information_schema中“创建”和维护表

阅读更多

Information_schemaMySQL自带的信息数据库。里面的“表”保存着服务器当前的实时信息。

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

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

 

1、特殊的库、特殊的表

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

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

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

c)        对应到MySQLdata目录下,没有相应的以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中。

 

 

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;

  

说明:

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函数结构。

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);
……
   }
} 

 

说明:

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步中增加的宏定义位置相对应。

 

分享到:
评论
3 楼 丁林.tb 2012-03-22  
nofreezou 写道
看到您给mysql因各种原因做了不少修改,请问是以重新编译源代码实现的吗- -

基本上是的. 也有写是plugin方式的
2 楼 nofreezou 2012-03-10  
看到您给mysql因各种原因做了不少修改,请问是以重新编译源代码实现的吗- -
1 楼 zephyrleaves 2010-12-31  
用information_schema_plugin方式,多快好省

相关推荐

    mysql数据库中的information_schema和mysql可以删除吗?

    在日常管理和维护MySQL时,了解并合理使用`information_schema`和`mysql`数据库非常重要。例如,当你要检查某个用户对特定数据库的权限时,可以查询`information_schema`.`USER_PRIVILEGES`表;或者在进行性能优化时...

    解析MySQL的information_schema数据库

    在日常的数据库管理和开发中,熟练使用information_schema数据库能够极大地提高工作效率,例如检查表结构、验证权限设置、诊断性能问题等。了解和掌握这些信息对于任何MySQL数据库管理员和开发者来说都是必要的技能...

    MySQL5.7-information

    MySQL 5.7 中的 `Information Schema` 是一个虚拟数据库,存储了关于数据库元数据(如表定义、列属性等)的信息。这一架构对于系统管理员和开发者来说非常重要,因为它提供了对数据库内部工作原理的深入洞察。下面将...

    ESI_Schema_V1i12.zip

    在 EtherCAT 中,字典存储了设备的输入/输出映射、数据类型和其他配置信息。此文件定义了如何组织和解析这些信息。 5. EtherCATDiag.xsd:这是 EtherCAT 诊断信息的 XML 架构。它可能包含了关于设备状态、错误代码、...

    1. 基础信息1

    在`information_schema`数据库中,有两个关键的表——`tables`和`columns`。`tables`表包含了所有数据库的表结构信息,其字段`table_schema`和`table_name`分别记录了数据库名和表名。另一方面,`columns`表包含了...

    实验2 MySQL数据库对象管理.pdf

    INFORMATION_SCHEMA.SCHEMATA表包含了数据库中所有数据库的信息,例如数据库名和数据库的默认字符集。 2. INFROMATION_SCHEMA.TABLES表 INFORMATION_SCHEMA.TABLES表存储了数据库中所有表的信息,包括表名、表类型...

    sql语句的总结

    SQL(Structured Query Language)是用于管理和操作关系型数据库的标准语言,它被广泛应用于各种数据库系统,如...理解并能有效利用`INFORMATION_SCHEMA`中的视图,可以帮助开发者更好地管理和维护他们的数据库系统。

    在数据库中按照字段名找所在的表的语句

    外层查询则是在`INFORMATION_SCHEMA.COLUMNS`表中查找指定字段名对应的表: ```sql SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME IN (子查询结果) AND COLUMN_NAME = '字段名'; ``` 这里的...

    数据库运维形考任务2 数据库运维.docx

    - **知识点**:在表`stuandcour`的`stuno`和`courno`字段上创建复合索引。 - **操作命令**: ```sql CREATE INDEX idx_stuno_courno ON stuandcour (stuno, courno); ``` ##### 16. 删除创建的索引 - **知识点**...

    MySQL数据库系统库结构.docx

    每个数据库在`SCHEMATA`表中对应一条记录,记录包含了数据库的名称(SCHEMA_NAME)、创建时间(CREATE_TIME)等信息。这使得你可以查询到当前MySQL实例中存在的所有数据库,并了解它们的基本属性。 接下来是`TABLES...

    国家开放大学《数据库运维》实验2 MySQL数据库对象管理.docx

    - 通过查询`INFORMATION_SCHEMA.views`和`INFORMATION_SCHEMA.tables`表,以及使用`DESCRIBE`语句来查看已创建的视图信息。 ##### 实验2-20:查询视图 - 使用`SELECT`语句查询创建好的视图。 #### 三、实验操作...

    循环某数据库所有表,自动创建触发器

    在SQL中,我们可以使用`INFORMATION_SCHEMA.TABLES`来获取所有表的信息。例如,以下是一个查询,用于获取包含`CreatedAt`字段的所有表: ```sql SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN...

    MySQL数据库:项目创建与维护MySQL数据库.pptx

    本资源主要介绍了 MySQL 数据库的创建和维护,涵盖了 SQL 语言的概述、特点和分类, MySQL 数据库文件和自动建立的数据库的介绍,创建数据库的步骤和方法等知识点。 一、SQL 语言概述 SQL(Structured Query ...

    项目4 创建与维护MySQL数据库.pptx

    在项目实践中,理解并熟练掌握SQL语言和MySQL数据库的创建与维护,是进行有效数据管理和应用开发的基础。通过学习,不仅可以创建和维护数据库,还能进行复杂的查询、事务处理以及数据库安全设置,以确保数据的完整性...

    sqlserver 导出表及字段说明脚本.rar

    在SQL Server数据库管理系统中,导出表及字段说明的脚本是数据库管理和维护的重要环节。这个压缩包"sqlserver 导出表及字段说明脚本.rar"包含了一个名为"sqlserver 导出表及字段说明脚本.sql"的文件,这通常是一个...

    mysql触发器之触发器的增删改查操作示例

    此外,也可以通过查询`information_schema`数据库中的`triggers`表来查看触发器的相关信息,包括触发器的名称、所属数据库、触发事件、关联表、定义者等。 例如,要查看名为`database_name`的数据库中一个名为`...

    SQL错误状态的提示信息

    ### SQL错误状态的提示信息详解 #### 概述 在数据库操作过程中,经常会遇到各种各样的错误或异常情况。为了更好地理解和处理这些错误,SQL标准...在开发和维护数据库应用程序时,正确处理这些SQLSTATE是非常重要的。

    mysql添加注释(ment).docx

    在MySQL数据库管理中,添加注释是提升代码可读性和维护性的重要手段。本文将详细介绍如何在MySQL中为表和字段添加、修改以及查看注释。 1. **创建表时写注释** 当我们创建一个新的表时,可以使用`COMMENT`关键字来...

Global site tag (gtag.js) - Google Analytics