2017-06-13 35 views
0

我正在使用的软件是使用MySQL服务器(版本5.0.52)。 某些数据库是动态创建的,我需要列出这些数据库的名称(条件是包含具有不同特定名称的两个表的数据库)。因此,我使用INFORMATION_SCHEMA MySQL查询找到我所需要的:必须manualy重新启动每2或3周可以在information_schema崩溃表上完成mysql查询吗?

SELECT distinct T.table_schema 
FROM information_schema.`TABLES` T 
inner join information_schema.`TABLES` T2 
on T2.table_schema = T.table_schema 
where T.table_schema like 'myBase_%' 
and T.table_name like '%\_1' 
and T2.table_schema like 'myBase_%' 
and T2.table_name = 'myTable' 

MySQL的服务,因为一些表似乎崩溃或锁定。来自pid3306_crash.err的错误消息(这是第一个错误,但是一旦我拥有此行,软件试图查询的每个表都会出现此错误,给我5000行“无法找到文件”):

[ERROR] D:\MySQL\MySQL Server 5.0\bin\mysqld-nt: Cannot find the file: '.\myBase_56320\petiquettes_k_1.frm' (Errcode: 22) 

我启用了这个mysql实例的完整日志,唯一可以访问这个表的mysql查询就是我引用的那个。没有任何其他查询与上面引用的第一个错误相关。 所以我的问题是:是否有可能对information_schema查询崩溃我的基地,或者我应该看看其他地方?

谢谢。

回答

0

MySQL 5.0.52已经超越过时 - 几乎10岁。 5.0早已弃用,但同时很多很多错误都得到修复 - 最新的5.0.x版本是5.0.96。

它更可能的查询INFORMATION_SCHEMA到透露相关数据损坏问题(例如,从失败的硬盘驱动器或赎金内存错误),但它不是理由为错误的边界之外,以导致崩溃。

所以......它不应该,但它可能。

information_schema表格不是真正的表格 - 它们是内部服务器内存和磁盘结构的SQL接口。

您的下一步(除了迁移到更新版本的MySQL服务器之外)是用临时表来减少对information_schema代码的需求。

USE test; /* or some other schema, NOT information_schema */ 
CREATE TEMPORARY TABLE ist1 AS SELECT * FROM INFORMATION_SCHEMA.TABLES; 
CREATE TEMPORARY TABLE ist2 AS SELECT * ist1; 

请注意,您应该只选择必要的列,因为这可能会减少在该服务器探测其内部,以满足您的查询的深度。

现在,您有两张临时表ist1ist2,其中包含来自information_schema.tables的快照。重写您的原始查询以使用这些。它们会一直存在,直到从服务器断开连接,然后它们会自动丢弃。

+0

我知道这个版本确实很旧,但由于许可证问题和工作环境的兼容性问题,我无法花费数月时间升级,而且我现在没有时间去做。 我会尝试进一步查看日志以尝试解释它。 我会尝试使用临时tablse来查看它是否改变任何东西,谢谢。 – nivolas

相关问题