information_schema系列三(文件,变量)

这个系列的文章主要是为了能够让自己了解MySQL5.7的一些系统表,统一做一下备注和使用,也希望分享出来让大家能够有一点点的受益。
1:FILES
这张表提供了有关在MySQL的表空间中的数据存储的文件的信息
 
我们刚创建一张表,现在来看一下这张表,我新建了一张maxiangqian名字的表,然后进行查询。
在5.7.8以后版本FILES就是为InnoDB 的数据文件提供记录。在MySQL集群该表还提供了有关在MySQL集群磁盘数据表存储的文件的信息。
这个表的数据是从InnoDB in-memory中拉取出来的,所以说这张表本身也是一个内存表,每次重启重新进行拉取。也就是我们下面要说的INNODB_SYS_DATAFILES这张表。还要注意一点的是这张表包含有临时表的信息,所以说和SYS_DATAFILES 这张表是不能够对等的,还是要从INNODB_SYS_DATAFILES看。如果undo表空间也配置是InnoDB 的话,那么也是会被记录下来的。
老规矩贴一下官网的全表的解释:中间show name是J结合官方解释后我自己的理解
 
INFORMATION_SCHEMA NameSHOW NameRemarks
FILE_ID文件的编号MySQL extension
FILE_NAME文件名MySQL extension
FILE_TYPE表空间文件类型MySQL extension
TABLESPACE_NAME表空间名MySQL extension
TABLE_CATALOG MySQL extension
TABLE_SCHEMA MySQL extension
TABLE_NAME MySQL extension
LOGFILE_GROUP_NAME MySQL extension
LOGFILE_GROUP_NUMBER MySQL extension
ENGINE默认引擎MySQL extension
FULLTEXT_KEYS MySQL extension
DELETED_ROWS MySQL extension
UPDATE_COUNT MySQL extension
FREE_EXTENTS在当前的数据文件的可用空间MySQL extension
TOTAL_EXTENTS当前文件占用的空间MySQL extension
EXTENT_SIZEpage size如果是4,8,16KB的话就是1M。如果是32k的话就是2M,64k的话就是4M,innodb_page_size记录页大小,其他的时候,默认不会记录这个大小。MySQL extension
INITIAL_SIZE文件初始大小,以字节为单位MySQL extension
MAXIMUM_SIZE允许的文件最大值,一般情况下这个值是NULLMySQL extension
AUTOEXTEND_SIZE自增长的值,可以通过两个值设置innodb_data_file_path ,innodb_temp_data_file_pathMySQL extension
CREATION_TIME MySQL extension
LAST_UPDATE_TIME MySQL extension
LAST_ACCESS_TIME MySQL extension
RECOVER_TIME MySQL extension
TRANSACTION_COUNTER MySQL extension
VERSION MySQL extension
ROW_FORMAT MySQL extension
TABLE_ROWS MySQL extension
AVG_ROW_LENGTH MySQL extension
DATA_LENGTH MySQL extension
MAX_DATA_LENGTH MySQL extension
INDEX_LENGTH MySQL extension
DATA_FREE可用空间MySQL extension
CREATE_TIME创建时间MySQL extension
UPDATE_TIME更改时间MySQL extension
CHECK_TIME MySQL extension
CHECKSUM MySQL extension
STATUS默认这个值是NOMAL,当为 IMPORTING时候就表示不可用MySQL extension
EXTRA MySQL extension
 
一般情况下我们直接筛选出来查询还是比较好的,通过下面的语句,其他的列一般是不会记录信息的,官网也没给太多的解释:
SELECT FILE_ID, FILE_NAME, FILE_TYPE, TABLESPACE_NAME, FREE_EXTENTS, TOTAL_EXTENTS, EXTENT_SIZE, INITIAL_SIZE, MAXIMUM_SIZE, AUTOEXTEND_SIZE, DATA_FREE, STATUS ENGINE FROM INFORMATION_SCHEMA.FILES \G

2:INNODB_SYS_DATAFILES

我们来重新查一下这个记录信息:
 
很容易看出来这张表就是记录的表的文件存储的位置和表空间的一个对应关系。这个就是相当容易理解了,就不多做解释了。
不过有一点我们要记住,这个表的SPACE是和FILES这张系统表的TABLESPACE_NAME这个列的最后一个值是相对应的。可以方便我们以后查阅
3:GLOBAL_STATUS 和 SESSION_STATUS 
这张表默认是提供有关服务器状态变量的信息来用的一般情况是不启用的,我们可以通过以下的方法来查看信息
  SHOW GLOBAL STATUS 和GLOBAL_STATUS 是对应的
贴一下列,由于两个表的列是一样的,所以说贴出来一个就好了
 
INFORMATION_SCHEMA NameSHOW NameRemarks
VARIABLE_NAME变量名 
VARIABLE_VALUE变量值 
 
详细的参数我就不再讲了,因为我也不懂啊。后面慢慢补上来。
4:GLOBAL_VARIABLES 和SESSION_VARIABLES
这两张系统表爷放在了一起,主要原因和上面两张是一样的,结构相同,而且可以通过其他方式查询,所以一般情况下是不启动的。
我们可以通过以下的方式进行查询:
SHOW GLOBAL VARIABLES 对应的是GLOBAL_VARIABLES
SHOW SESSION VARIABLES 对应的就是SESSION_VARIABLES
 
下面给出一条记录做个对比看一下:
 
我们可以看到,其实一个是实例级别的参数,一个是会话级别的参数。要记住一点就是 我们平时用的show variables 是等效与 show session variables.
在这里我们也顺便学习一下,全局变量和会话变量的区别:
系统变量又分为全局变量与会话变量。全局变量在MYSQL启动的时候由服务器自动将它们初始化为默认值,这些默认值可以通过更改my.cnf这个文件来更改。
  会话变量在每次建立一个新的连接的时候,由MYSQL来初始化。MYSQL会将当前所有全局变量的值复制一份。来做为会话变量。(也就是说,如果在建立会话以后,没有手动更改过会话变量与全局变量的值,那所有这些变量的值都是一样的。)
  全局变量与会话变量的区别就在于,对全局变量的修改会影响到整个服务器,但是对会话变量的修改,只会影响到当前的会话(也就是当前的数据库连接)。我们可以利用show session variables;语句将所有的会话变量输出
以上关于变量的这四张表其实也是内存表,每次系统启动默认从my.cnf读取生成,如果my.cnf没有配置的话就会使用默认值。
PS:其实关于表空间文件那边也应该扩充一下,以后可以学习一下分享出来,今天有点晚了。就分享这么多吧
 

转载于:https://www.cnblogs.com/shengdimaya/p/5824262.html

<think>首先,用户的问题是关于清除MySQL中information_schema.DDL_JOBS的历史记录。用户提到了“information_schema.DDL_JOBS”,但根据我的知识,information_schema 数据库中并没有名为 DDL_JOBS 的表。我需要检查引用内容。 回顾引用: - 引用[2] 说 information_schema 提供了访问数据库元数据的方式,包含只读表。 - 引用[3] 提到了 information_schema 包含关于数据库对象的元数据。 - 引用[4] 提到了 information_schema 的基本应用。 - 引用[5] 提到了 PERFORMANCE_SCHEMA,但用户说的是 information_schema.DDL_JOBS。 在MySQL中,DDL操作的历史记录通常存储在 performance_schema 或 sys schema 中,而不是 information_schemainformation_schema 主要是静态元数据视图。 具体来说,DDL_JOBS 可能指的是 performance_schema 中的表。在MySQL 5.7及更高版本中,performance_schema 用于监控事件,包括DDL操作。 用户说“information_schema.DDL_JOBS”,这可能是误解。我应该纠正或澄清。 从引用[5]中,它提到了 performance_schema 用于监控事件,包括 setup_consumers、setup_instruments 等表。 所以,很可能用户指的是 performance_schema 中的某个表,而不是 information_schema。 用户的问题:"我想用户想要清除MySQL中information_schema.DDL_JOBS的历史数据" 我需要确认:DDL_JOBS 表存在于哪个schema? 在MySQL中: - information_schema 是只读的视图,不能修改数据。 - performance_schema 包含事件历史表,但默认情况下,DDL操作可能不被记录,除非配置。 具体到 DDL_JOBS:在MySQL中,没有标准表叫 DDL_JOBS。可能用户指的是 events_statements_history 或类似表在 performance_schema 中,用于记录SQL语句历史。 用户可能混淆了 schemas。information_schema 没有可修改的数据;它是只读的。 因此,我不能直接清除 information_schema.DDL_JOBS 的数据,因为它是只读的。 如果用户想清除 performance_schema 中的历史数据,那是可能的。 步骤: 1. **确认表的存在**:首先,确保用户指的是正确的schema和表。可能用户的意思是 performance_schema 中的 events_statements_history 或 ddl_events 表(如果存在)。 在MySQL中,performance_schema 有 events_statements_history 表,记录SQL语句历史,包括DDL。 引用[5] 提到 "history table 发生的各种事件的历史记录表",所以可能是 events_statements_history。 2. **清除历史数据**:对于 performance_schema,用户可以清除历史数据。 - 使用 TRUNCATE TABLE 命令。 - 例如:TRUNCATE TABLE performance_schema.events_statements_history; 但需要确保 performance_schema 已启用,并且相关消费者已启用。 3. **information_schema 是只读的**:不能修改。 所以,在回答中,我应该: - 澄清误解:information_schema 是只读的,不能清除数据。 - 建议检查 performance_schema。 - 提供清除 performance_schema 历史数据的方法。 用户说“清除MySQL information_schema.DDL_JOBS的历史数据”,所以我需要基于此。 或许在一些MySQL版本或特定设置中,有类似表,但标准MySQL没有 DDL_JOBS 在 information_schema。 从引用中,没有提到 DDL_JOBS。 因此,我的回答应该: - 解释 information_schema 是只读的。 - 建议用户可能指的是 performance_schema。 - 提供清除 performance_schema 历史数据的通用方法。 最终回答结构: - 用中文回答。 - 系统级指令:行内数学用 $...$,独立公式用 $$...$$(但这里可能不需要数学公式)。 - 生成相关问题。 - 在引用的段落末尾添加引用标识。 引用内容:用户提供了引用,但它们是关于 information_schema 和 performance_schema 的一般描述,没有具体到 DDL_JOBS。 引用[1]: 关于 INFORMATION_SCHEMA 查询优化。 引用[2]: information_schema 定义。 引用[3]: 系统数据库描述。 引用[4]: information_schema 应用。 引用[5]: performance_schema 描述。 所以,在回答中,我可以引用这些来支持。 例如,引用[2] 说 information_schema 是只读的。 回答步骤: 1. **澄清和解释**:information_schema 是只读的,不能修改数据。DDL_JOBS 可能不存在于 information_schema。 2. **建议正确位置**:可能用户指的是 performance_schema 中的事件历史表。 3. **提供方法**:如何清除 performance_schema 中的历史数据。 - 例如:TRUNCATE TABLE performance_schema.events_statements_history; - 但需要确认表名和权限。 4. **生成相关问题**:在最后添加相关问题。 5. **引用**:在相关部分添加引用标识。 完整回答: - 开头解释。 - 然后步骤。 - 最后相关问题。</think>### 清除 MySQL information_schema.DDL_JOBS 的历史数据 根据您的查询,您希望清除 MySQL 中 `information_schema.DDL_JOBS` 的历史数据。我将逐步解释相关概念并提供解决方案。需要强调的是,MySQL 的 `information_schema` 数据库是只读的,这意味着您无法直接修改或清除其中的数据。`DDL_JOBS` 表可能不存在于 `information_schema` 中,而是可能属于 `performance_schema` 或其他系统 schema。下面我将详细说明原因和替代方案。 #### 1. **理解 information_schema 的只读特性** - `information_schema` 是 MySQL 自带的系统数据库,用于提供数据库元数据(如数据库名、表结构、列类型等)。它包含的“表”实际上是只读视图,而不是可修改的基本表。因此,您无法通过 SQL 命令(如 `DELETE` 或 `TRUNCATE`)清除其中的数据。 - 引用[2] 明确说明:"在INFORMATION_SCHEMA中,有数个只读表。它们实际上是视图,而不是基本表,因此,你将无法看到与之相关的任何文件。" [^2] - 类似地,引用[3] 指出:"information_schema:提供了访问数据库元数据的方式。元数据是关于数据的数据,如数据库名或表名、列的数据类型或访问权限等。... 在这个数据库中,有一些只读表,它们实际上是视图。" [^3] - 如果您尝试查询 `information_schema.DDL_JOBS`,MySQL 会返回错误,因为标准 MySQL 版本中不存在此表。`DDL_JOBS` 可能是一个误解或特定于某些自定义环境(如云数据库或插件),但在原生 MySQL 中,DDL(Data Definition Language)操作的历史记录通常存储在 `performance_schema` 中。 #### 2. **确认 DDL 历史记录的正确位置** - 在 MySQL 中,DDL 操作(如 `CREATE TABLE`、`ALTER TABLE`)的历史记录通常由 `performance_schema` 管理,而非 `information_schema`。`performance_schema` 是 MySQL 的性能监控引擎,用于收集服务器事件历史。 - 引用[5] 提到:"performance_schema:用于监控MySQL服务器的执行过程,帮助用户了解服务器的性能。它提供了有关服务器执行的各种操作的详细信息,可以用于调优和故障排查。... history table 发生的各种事件的历史记录表。" [^5] - 常见的表包括: - `events_statements_history`:记录所有 SQL 语句的历史,包括 DDL。 - `events_ddl_history`(在 MySQL 8.0 及以上版本中引入):专门记录 DDL 事件。 - 如果您的目的是清除 DDL 操作的历史记录,您应该检查 `performance_schema` 中的相关表。 #### 3. **清除 DDL 历史记录的方法** 由于 `information_schema` 是只读的,无法清除数据,我建议转向 `performance_schema`。以下是清除 `performance_schema` 中 DDL 历史记录的步骤(假设您使用的是 MySQL 5.6 或更高版本,且 `performance_schema` 已启用): **步骤 1: 确认 performance_schema 状态** - 首先,检查 `performance_schema` 是否已启用。运行以下 SQL 查询: ```sql SHOW VARIABLES LIKE 'performance_schema'; ``` 如果结果为 `ON`,则继续;如果为 `OFF`,您需要在 MySQL 配置文件(如 `my.cnf` 或 `my.ini`)中添加 `performance_schema=ON` 并重启 MySQL 服务[^5]。 **步骤 2: 识别相关历史表** - 查询 `performance_schema` 中的事件历史表。例如: - 对于通用 SQL 历史(包括 DDL): ```sql SELECT * FROM performance_schema.events_statements_history; ``` - 在 MySQL 8.0+ 中,可能有专门的 DDL 事件表: ```sql SELECT * FROM performance_schema.events_ddl_history; ``` - 如果 `DDL_JOBS` 是自定义表名,请检查您的 MySQL 版本或插件文档。 **步骤 3: 清除历史数据** - 使用 `TRUNCATE TABLE` 命令清除历史数据(这需要适当的权限,如 `SUPER` 或 `ALTER` 权限)。例如: - 清除所有 SQL 语句历史: ```sql TRUNCATE TABLE performance_schema.events_statements_history; ``` - 在 MySQL 8.0+ 中,清除 DDL 特定历史: ```sql TRUNCATE TABLE performance_schema.events_ddl_history; ``` - **注意**:`TRUNCATE TABLE` 会立即删除所有数据,但表结构保持不变。执行后,历史记录将从零开始重新积累。 **步骤 4: 配置 performance_schema 以减少历史积累(可选)** - 如果您希望防止历史数据快速积累,可以调整 `performance_schema` 的设置: - 禁用相关消费者(consumers): ```sql UPDATE performance_schema.setup_consumers SET ENABLED = 'NO' WHERE NAME LIKE 'events_statements_history%'; ``` - 或减少历史记录大小(通过修改 `performance_schema_events_statements_history_size` 变量): ```sql SET GLOBAL performance_schema_events_statements_history_size = 0; -- 设置为0禁用历史记录 ``` - 引用[5] 提到:"setup_consumers 描述各种事件,setup_instruments 描述这个数据库下的表名以及是否开启监控。" [^5] **重要注意事项**: - **权限要求**:执行这些操作需要 MySQL 管理员权限(如 `root` 用户)。 - **性能影响**:清除 `performance_schema` 数据不会影响数据库性能,但如果您禁用监控,可能会影响故障排查。 - **备份建议**:在操作前备份数据库,以防意外。 - **如果 DDL_JOBS 不存在**:如果查询确认没有 `DDL_JOBS` 表,请检查您的 MySQL 版本或是否使用了第方工具(如 Percona Server 或云服务)。您可以通过 `SHOW TABLES FROM performance_schema;` 列出所有表。 #### 4. **为什么无法清除 information_schema** - 再次强调,`information_schema` 是只读的,任何尝试修改的操作都会失败。例如: ```sql DELETE FROM information_schema.tables WHERE ...; -- 这会报错 ``` - 错误消息通常类似:`ERROR 1044 (42000): Access denied for user ... to database 'information_schema'`。 - 如果您需要“清除”元数据缓存(如刷新表信息),可以使用 `FLUSH TABLES` 或重启 MySQL,但这不会删除历史记录,只重置内存中的元数据[^1][^3]。 ### 相关问题 为了帮助您更深入地理解 MySQL 系统数据库的管理,以下是相关问题: 1. **如何监控和优化 MySQL 的 DDL 操作性能?** (涉及 `performance_schema` 配置和事件分析) 2. **MySQL 中 information_schema 和 performance_schema 的主要区别是什么?** (可从元数据 vs. 性能监控的角度展开) 3. **有哪些方法可以定期自动清除 performance_schema 的历史数据?** (例如使用定时任务或存储过程) 如果您有更多细节(如 MySQL 版本或具体错误消息),我可以提供更针对性的建议!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值