2017-06-13 70 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

相關問題