在information_schema中“创建”和维护表

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

最近实现的一个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中。

 

 

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

 

通过Excel管理表结构自动生成创建表sql文支持(sqlserver,oracle) 在excel中方便地管理数据库表结构,通过管理的结构自动生成创建表sql文,支持生成sqlserver脚本和oracle脚本;模板默认都是sqlserver数据库字段类型,只需要把oracle对应的类型对应关系维护一下就可以自动生成oracle脚本了,同时支持多Sheet 立即下载

相关推荐

深入解析FDTD Script中的farfieldpolar3d命令:复电场计算与应用

本文深入解析了FDTD仿真中`farfieldpolar3d`命令的核心功能与应用。作为`farfield3d`的复数版本,该命令能计算并返回球坐标系下的复电场矢量,完整保留振幅与相位信息,为光学天线设计、近远场变换及偏振态分析等高级应用提供了关键数据基础。

grafana6viz的博客 287

Schema 创建表、删除表。往表里添加列,及添加列的常用类型及相应介绍。

http://www.k68.org/?p=1546 另外: 在laravel中写法 use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; public function create_table() { Schema::create('tasks

A9925的专栏 1748

Canoe Panel基础功能介绍

CANoe Panel 是 Vector CANoe 软件中用于设计图形化操作界面的功能模块。用户可以在面板上添加合适的控件,实时的改变信号或者变量的值

m0_56208280的博客 1951

Web安全—information_schema数据库详解&基础补充

Web安全—information_schema数据库 前言:在SQL注入中,information_schema数据库中包含的信息特别重要,通过这个表我们可以去获取到存在SQL注入网站的表,列,等信息,其危害不言而喻。 一:information_schema数据库 基础:information_schema是一个存放了当前数据库管理系统中所有数据库信息的一个数据库,数据库只能进行读取,不支持修改(增,删,更新) mysql5.0以下:多用户单操作,不存在information_schema数据库 mys

weixin_44431280的博客 1万+

LTspice introduction - 2 LTspice的界面

LTspice的界面主要有两个:Schematic Capture和Waveform Viewer Schematic Capture 它主要是用来画电路图的,画完电路图之后,添加一些dot 命令同时选择一些仿真的参数,点击执行(Run)Waveform Viewer 如果你的仿真不是op point的话,一个都会打开它,在它里面你可以画图相应的图形。 有两种方式可以在Viewer

贾亮的专栏 3223

CPRI原理及应用--基本原理

本文主要介绍CPRI的基本原理,包括CPRI的发展历程、CPRI基本协议、速率、帧结构、时延模型等

u014035968的博客 2万+

mysql 使用INFORMATION_SCHEMA 表创建 SQL 语句

使用mysql 命令创建 SQL 语句 mysql&gt; SELECT CONCAT("mysqldump -uroot -p ", -&gt; TABLE_SCHEMA," ", TABLE_NAME, " &gt;&gt; ", -&gt; TABLE_SCHEMA,".bak.sql")TA -&gt; FROM TABLES WHERE TABLE_NAME LI

yigongye 1536

2022年电赛E题声源定位跟踪系统

电赛声源定位

qq_53357019的博客 2万+

使用查询脚本生成建表语句

使用information_schema 视图名称columns,table_constraints通过查询用脚本建表 SELECT ‘create table customer (‘t_customer union ALL SELECT cols.txt FROM (SELECT CONCAT(’ ‘,column_name,’ ‘,column_type, CASE when i

Min的博客 1688

2026四款AI原生IDE实测:Trae、Qoder、CodeBuddy、Cursor能力边界深度解析

AI原生IDE正从代码编辑器演进为开发者智能工作流中枢,其核心在于对上下文理解、AST编辑意图建模与多模态任务调度的工程化实现。区别于传统插件式AI辅助,真正的AI原生IDE需具备知识库嵌入、符号图索引、操作链固化等底层能力,从而支撑Figma转码、N+1查询修复、跨语言迁移等复杂场景。Trae强调中文语境与企业规范的强绑定,Qoder聚焦AST级编辑轨迹预测,CodeBuddy通过IDE/插件/CLI三态划分控制权边界,Cursor则以云端Agent实现开发任务的时空并行。本文基于真实项目压测,揭示免费版

ctk87443的博客 2468

STM32实战:用定时器触发ADC+DMA双缓冲实现电机电流采样(附避坑指南)

本文详细介绍了如何利用STM32的定时器触发ADC注入组采样,结合DMA双缓冲机制实现电机电流的高效采样。通过PWM触发和双缓冲架构,解决了开关噪声干扰、实时性要求和数据一致性等核心挑战,显著降低CPU负载并提升采样精度。附有完整的代码示例和避坑指南,适用于无人机电调、工业伺服驱动器等高精度电机控制场景。

weixin_33737134的博客 520

MySQL中information_schema是什么

今天突然看到了mysql有一个information_schema,这个schema并不是我创建的,我就比较疑惑它到底是什么呢? 原来,在安装mysql数据库的时候,就会创建这一个schema;从字面意思上来理解,就是信息计划/图表,那么一个问题就产生了,这个信息是什么呢? 既然information_schema数据库是MySQL自带的,那么,我们可以猜测它就是记录数据库信息的schema,

张佳美的专栏 1万+

【dify】 dify环境变量配置说明

SMTP_SERVER、SMTP_PORT、SMTP_USERNAME、SMTP_PASSWORD、SMTP_USE_TLS、SMTP_OPPORTUNISTIC_TLS:当 MAIL_TYPE 为 smtp 时,SMTP服务器的相关配置。UPLOAD_IMAGE_FILE_SIZE_LIMIT、UPLOAD_VIDEO_FILE_SIZE_LIMIT、UPLOAD_AUDIO_FILE_SIZE_LIMIT:分别为上传图像、视频、音频文件的大小限制(MB)。

tonysh_zds的博客 7357

详解mysql中的information_schema

我们发现,在安装完mysql后,mysql会自带几个数据库,其中一个数据库为:information_schema。 并且这个数据库并不是空的,在数据库中存有很多表,我们可以切换到此数据库: use information_schema; 查询数据库中的表有多少: select count(table_name) FROM tables ; 但注意,我们对这个表只具有查询功能,增删改是不支持的。并且我们可以在这个数据库中找到其它数据库的内容,例如: select table_name, table_ty

码匀的博客 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

mysql自带的information_schema.tables是什么?

【INFORMATION_SCHEMA 数据库】 是MySQL自带的,它提供了访问数据库 元数据 的方式。什么是 元数据 呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。 有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。 在MySQL中,把【INFORMATION_SCHEMA】 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的...

weixin_38972910的博客 3万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

MYSQL中information_schema简介

一、information_schema简介 在MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权 限等。在INFORMATION_SCHEMA中,有数个只读表。它们实际上是视图,而不是基本表,因此,你将无法看到与之相关的任何文件。 二、information_schema数据库表说明: 1、SCHEMATA表:提供了当前mysql实例中所有数据库的信..

u011250186的博客 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

MySQL中information_schema和performance_schema

mysql information_schema 信息相关 performance_schema 性能相关 库 MySQL中information_schema是什么 information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式。什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。 在MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库

定格空间 1916

MySQL之自带四库之information_schema库

Mysql5.7版本自带4个数据库,information_schema、mysql、performance_schema、sys。INFORMATION_SCHEMA提供对数据库元数据的访问 ,有关MySQL服务器的信息,例如数据库或表的名称,列的数据类型或访问权限。有时用于此信息的其他术语是数据字典和系统目录。该位置存储有关MySQL服务器维护的所有其他数据库的信息。information_schema库共计有61张表。

月生的静心苑 6457

MySQL中information_schema详解

MySQL中information_schema介绍

qq_44235792的博客 4354

mysql中information_schema,mysql,performance_schema库详解

今天在使用mysql的时候无意进入了information_schema表,发现我没有权限来操作这个库,才想起这个是进入mysql就本身拥有的。同样在我们进入mysql的时候回发现有三个默认的库information_schema,mysql,performance_schema 这三个库是系统默认就有的。其存在的用途接下来一一说明(网上查找的结果加上自己的一些理解) information_s...

梓源的博客 3288

information_schema

官网描述: INFORMATION_SCHEMAprovides access to databasemetadata, information about the MySQL server such as the name of a database or table, the data type of a column, or access privileges. Other term...

lopeasd 547

mysql中 information_schema用途

一、information_schema简介 在MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权 限等。在INFORMATION_SCHEMA中,有数个只读表。它们实际上是视图,而不是基本表,因此,你将无法看到与之相关的任何文件。 inf...

木牛的博客 2526

MySQL自带的information_schema简介

在MySQL中,information_schema是MySQL自带的,我们可以把 information_schema 看作是一个数据库,它是有关数据库信息的信息数据库。它提供了访问数据库“元数据”的方式,其中保存着关于MySQL服务器所维护的所有其他数据库的信息,如数据库名、数据库中的数据表,数据表的列的数据类型,或访问权限等信息。在information_schema中,有数个只读表,它们实际上是视图,而不是基本表,因此无法看到与之相关的任何文件。 一、information_schema数..

ztnhnr的专栏 1684

information_schema简单说明

MySQL中information_schema是什么 wordpress主机,博客主机 大家在安装或使用MYSQL时,会发现除了自己安装的数据库以外,还有一个information_schema数据库。 information_schema数据库是做什么用的呢,使用WordPress博客的朋友可能会想,是不是安装模板添加的数据库呀?看完本片文章 后,你就会对information_schema数...

小白的劝退之路 1283
上一篇: MySQL自动测试框架介绍
下一篇: 关于MySQL中Y和~问题
iteye_621
博客等级 码龄8年 12粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值