你們有沒有接觸過這樣的需求,採集歷史數據庫中或者其餘數據庫中的某些信息,這些信息是另外一個服務器須要執行sql的條件。一般咱們的處理手段是把這個信息經過sql找出來或導出,而後使用腳本或者手工拼湊新的新的sql語句。在不少緊急狀況下(產品bug、數據錯亂)會產生這樣的需求,這個時候處理的是在線數據庫,不能有一點馬虎、若是數據量稍微大一點,DBA們就夠焦頭爛額了。我以前也屢次碰見這種狀況,我把一些經驗介紹給你們。 mysql
其實這種狀況下使用concat+out file會獲得事半功倍的效果。 sql
好比咱們須要找到user表中昨天登陸過的用戶,而後修改修改他們的garbage中某個物品的屬性。 數據庫
因爲數據庫的結構,只記錄用戶最後一次登陸的時間,因此當前的數據庫中不能肯定昨天哪些用戶登陸過。咱們須要從備份中去挖出哪些用戶昨天登陸過,而後再 服務器
update garbage set data=value where id=xxx and num=value;
咱們一般的作法是經過sql在備份數據中找到對應的用戶id,而後導出到一個文件中,經過腳原本循環取id,自動生成要執行的sql,或者手工生成要執行的sql。 工具
如今咱們使用concat+out file來實現。 code
在重現備份數據的服務器上。 orm
select concat('update garbage set data=value where id=',id,'and num=value;') from user into outfile '/tmp/a.txt';
檢查生成的文件之後,在線上服務器直接執行 ssl
source /tmp/a.txt;
這個語句還有一個妙用,用來殺掉processlist中的某些鏈接,索然maatkit提供了相似的工具,可是仍是沒有mysql本身來完成方便。 產品
生成殺鏈接的語句,固然你能夠使用where條件過濾某些類型的鏈接。 it
select concat('KILL ',id,';') from information_schema.processlist into outfile '/tmp/kill.txt'; source /tmp/kill.txt;