`
丁林.tb
  • 浏览: 790523 次
  • 性别: 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 5.1中文手冊

    在同一个数据库中创建多个表的缺陷 7.5. 优化MySQL服务器 7.5.1. 系统因素和启动参数的调节 7.5.2. 调节服务器参数 7.5.3. 控制查询优化器的性能 7.5.4. 编译和链接怎样影响MySQL的速度 7.5.5. MySQL如何使用内存 ...

    mysql官方中文参考手册

    在同一个数据库中创建多个表的缺陷 7.5. 优化MySQL服务器 7.5.1. 系统因素和启动参数的调节 7.5.2. 调节服务器参数 7.5.3. 控制查询优化器的性能 7.5.4. 编译和链接怎样影响MySQL的速度 7.5.5. MySQL如何使用内存 ...

    MYSQL中文手册

    在同一个数据库中创建多个表的缺陷 7.5. 优化MySQL服务器 7.5.1. 系统因素和启动参数的调节 7.5.2. 调节服务器参数 7.5.3. 控制查询优化器的性能 7.5.4. 编译和链接怎样影响MySQL的速度 7.5.5. MySQL如何使用...

    MySQL 5.1参考手册 (中文版)

    在同一个数据库中创建多个表的缺陷 7.5. 优化MySQL服务器 7.5.1. 系统因素和启动参数的调节 7.5.2. 调节服务器参数 7.5.3. 控制查询优化器的性能 7.5.4. 编译和链接怎样影响MySQL的速度 7.5.5. MySQL如何使用内存 ...

    MySQL 5.1官方简体中文参考手册

    在同一个数据库中创建多个表的缺陷 7.5. 优化MySQL服务器 7.5.1. 系统因素和启动参数的调节 7.5.2. 调节服务器参数 7.5.3. 控制查询优化器的性能 7.5.4. 编译和链接怎样影响MySQL的速度 7.5.5. MySQL如何使用内存 ...

    MySQL 5.1参考手册中文版

    在同一个数据库中创建多个表的缺陷 7.5. 优化MySQL服务器 7.5.1. 系统因素和启动参数的调节 7.5.2. 调节服务器参数 7.5.3. 控制查询优化器的性能 7.5.4. 编译和链接怎样影响MySQL的速度 7.5.5. MySQL如何使用...

    MySQL 5.1参考手册

    在同一个数据库中创建多个表的缺陷 7.5. 优化MySQL服务器 7.5.1. 系统因素和启动参数的调节 7.5.2. 调节服务器参数 7.5.3. 控制查询优化器的性能 7.5.4. 编译和链接怎样影响MySQL的速度 7.5.5. MySQL如何使用内存 ...

    mysql5.1中文手册

    在同一个数据库中创建多个表的缺陷 7.5. 优化MySQL服务器 7.5.1. 系统因素和启动参数的调节 7.5.2. 调节服务器参数 7.5.3. 控制查询优化器的性能 7.5.4. 编译和链接怎样影响MySQL的速度 7.5.5. ...

    MySQL5.1参考手册官方简体中文版

    在同一个数据库中创建多个表的缺陷 7.5. 优化MySQL服务器 7.5.1. 系统因素和启动参数的调节 7.5.2. 调节服务器参数 7.5.3. 控制查询优化器的性能 7.5.4. 编译和链接怎样影响MySQL的速度 7.5.5. MySQL如何使用内存 ...

    讲解Oracle数据库中的数据字典及相关SQL查询用法

    数据库是数据的集合,数据库维护和管理这用户的数据,那么这些用户数据表都存在哪里,用户的信息是怎样的,存储这些用户的数据的路径在哪里,这些信息不属于用户的信息,却是数据库维护和管理用户数据的核心,这些...

    SQL Server 2008管理员必备指南(超高清PDF)Part1

    9.3.7 使用sys和INFORMATION_SCHEMA用户 9.4 权限 9.4.1 对象权限 9.4.2 语句权限 9.4.3 隐含权限 9.5 角色 9.5.1 服务器角色 9.5.2 数据库角色 9.6 管理服务器登录 9.6.1 查看和编辑现有的登录 9.6.2 创建登录 ...

    SQL Server 2008管理员必备指南(超高清PDF)Part3

    9.3.7 使用sys和INFORMATION_SCHEMA用户 9.4 权限 9.4.1 对象权限 9.4.2 语句权限 9.4.3 隐含权限 9.5 角色 9.5.1 服务器角色 9.5.2 数据库角色 9.6 管理服务器登录 9.6.1 查看和编辑现有的登录 9.6.2 创建登录 ...

    SQL Server 2008管理员必备指南(超高清PDF)Part2

    9.3.7 使用sys和INFORMATION_SCHEMA用户 9.4 权限 9.4.1 对象权限 9.4.2 语句权限 9.4.3 隐含权限 9.5 角色 9.5.1 服务器角色 9.5.2 数据库角色 9.6 管理服务器登录 9.6.1 查看和编辑现有的登录 9.6.2 创建登录 ...

    SQL.Server.2008管理员必备指南.part2.rar(2/4)

     9.3.7 使用sys和INFORMATION_SCHEMA用户 238  9.4 权限 238  9.4.1 对象权限 238  9.4.2 语句权限 243  9.4.3 隐含权限 243  9.5 角色 243  9.5.1 服务器角色 244  9.5.2 数据库角色 245  9.6 管理服务器...

    SQL.Server.2008管理员必备指南.part1.rar(1/4)

     9.3.7 使用sys和INFORMATION_SCHEMA用户 238  9.4 权限 238  9.4.1 对象权限 238  9.4.2 语句权限 243  9.4.3 隐含权限 243  9.5 角色 243  9.5.1 服务器角色 244  9.5.2 数据库角色 245  9.6 管理服务器...

    SQL.Server.2008管理员必备指南.part3.rar(3/4)

     9.3.7 使用sys和INFORMATION_SCHEMA用户 238  9.4 权限 238  9.4.1 对象权限 238  9.4.2 语句权限 243  9.4.3 隐含权限 243  9.5 角色 243  9.5.1 服务器角色 244  9.5.2 数据库角色 245  9.6 管理服务器...

    SQL.Server.2008管理员必备指南.part4.rar(4/4)

     9.3.7 使用sys和INFORMATION_SCHEMA用户 238  9.4 权限 238  9.4.1 对象权限 238  9.4.2 语句权限 243  9.4.3 隐含权限 243  9.5 角色 243  9.5.1 服务器角色 244  9.5.2 数据库角色 245  9.6 管理服务器...

Global site tag (gtag.js) - Google Analytics