2011-05-23 53 views
1

我有一個擁有類似表結構的許多數據庫的MySQL服務器。當一塊遺留軟件進入錯誤狀態時,它會將一行寫入幾張表格並向我發送電子郵件。我正在嘗試編寫一個簡單的SQL查詢來清除這些表(TRUNCATE)。如何自動執行從information_schema生成的MySQL語句?

在我的bash腳本我目前有:

mysql -e "SELECT CONCAT('TRUNCATE TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ';') 
      FROM information_schema.TABLES 
      WHERE TABLE_NAME IN ('errorLog', 'errorLogBacktrace', 'errorLogUrl');" | 
grep -v 'CONCAT(' | 
mysql 

行返回加入到幫助可讀性希望。

但是,這似乎不起作用,只執行上面選擇生成的第一個TRUNCATE TABLE查詢。

從上面的代碼的選擇部分輸出:

mysql -e "SELECT CONCAT('TRUNCATE TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ';') 
      FROM information_schema.TABLES 
      WHERE TABLE_NAME IN ('errorLog', 'errorLogBacktrace', 'errorLogUrl');" | 
grep -v 'CONCAT(' 

是:

TRUNCATE TABLE db1.errorLog; 
TRUNCATE TABLE db1.errorLogBacktrace; 
TRUNCATE TABLE db1.errorLogUrl; 
TRUNCATE TABLE db2.errorLog; 
TRUNCATE TABLE db2.errorLogBacktrace; 
TRUNCATE TABLE db2.errorLogUrl; 
TRUNCATE TABLE db3.errorLog; 
TRUNCATE TABLE db3.errorLogBacktrace; 
TRUNCATE TABLE db3.errorLogUrl; 

我怎樣才能得到這個工作?我是否需要循環播放並逐一執行它們?如果是這樣的話?

+0

可能是服務器故障的一個很好的問題 – 2011-05-23 14:28:09

+0

@Denis真正的問題給你:我如何計算出哪個站點發布到bash腳本?畢竟bash腳本編程。我不知道。我發現難以區分。 – Treffynnon 2011-05-23 14:30:41

+0

我也是,說實話。但我的理解是,服務器故障更多的是系統管理員的環聊。 :-) – 2011-05-23 14:50:39

回答

2

看起來我太過於複雜了。通過serverfault一些搜索後,我發現:https://serverfault.com/questions/124797/alter-table-for-all-tables-in-a-database

所以我的命令現在看起來像:

mysql --batch --skip-column-names -e "SELECT CONCAT('TRUNCATE TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ';') AS table_sql FROM information_schema.TABLES WHERE TABLE_NAME IN ('errorLog', 'errorLogBacktrace', 'errorLogUrl');" | mysql 

並用適當的MySQL逃脫它應該是:

mysql --batch --skip-column-names -e "SELECT CONCAT('TRUNCATE TABLE \`', TABLE_SCHEMA, '\`.\`', TABLE_NAME, '\`;') AS table_sql FROM information_schema.TABLES WHERE TABLE_NAME IN ('errorLog', 'errorLogBacktrace', 'errorLogUrl');" | mysql 

反引號逃脫關鍵字在MySQL數據庫和列名以及其他反斜槓是爲了避免bash的反引號,因爲字符串正在被傳送到第二個MySQL進程中。