如何檢測正在執行的mysqldump?
以下是我無法更改的內容: 我們有一個執行主伺服器和一些從伺服器的 mySQL myISAM 複製。使用 mysqldump 正在使用一個從屬伺服器進行夜間備份。與主伺服器相比,備份使用重鎖迫使它的從伺服器“老化”。mysqldump 以 root 身份連接所有數據庫,而其他所有連接都在每個數據庫使用一個非超級使用者。轉儲使用專用備份伺服器上的簡單 shell 腳本啟動。
這是問題所在:我想檢測備份是否正在執行,同時作為“普通”使用者連接到正在備份的伺服器上執行的數據庫之一。Cronjobs 應該能夠通過提前退出或僅處理不能等到備份完成的非常重要的必需作業來對正在執行的備份做出反應。執行備份腳本的伺服器與網路伺服器沒有連接,它們唯一的共同點是 mysql 伺服器。備份腳本可以做一些事情來將伺服器標記為“目前正在執行備份”。我更喜歡設置某種“所有使用者可見的全域伺服器端環境變數”以僅忽略執行備份的一個從屬設備,但也可以簡單地知道備份正在該數據庫或複制鏈上執行.
我試圖在備份開始時創建一個臨時表(現有 = 備份正在執行,不存在 = 沒有備份執行),但臨時表只顯示最初創建它的連接(如預期的那樣)。如果非超級使用者可以獲得查看包括其他使用者和 root 在內的所有連接的 SHOW PROCESSLIST 的權限(來自備份伺服器的任何連接 = 備份正在執行),我進行了搜尋 - 但沒有運氣。向所有數據庫使用者提供 SUPER 是沒有選擇的。
有什麼建議?
感謝您閱讀(和回答)。
在這種情況下,您唯一的希望是擁有 PROCESS 特權。
SUPER 權限允許您終止程序。自然,你不希望這樣。另一方面,PROCESS 權限允許您查看程序列表。
根據關於 PROCESS Privilege 的 MySQL 文件
PROCESS 權限與顯示有關在伺服器內執行的執行緒的資訊(即有關會話正在執行的語句的資訊)有關。該權限允許使用 SHOW PROCESSLIST 或 mysqladmin processlist 來查看屬於其他帳戶的執行緒;你總是可以看到你自己的執行緒。
好的,大交易。PROCESS Privilege 允許您查看程序列表。這有什麼幫助?
SHOW PROCESSLIST;
當您執行並在 Info 欄位中看到類似這樣的模式時,您可以快速檢測到正在進行的 mysqldump :SELECT /*!40001 SQL_NO_CACHE */ * FROM
如果你有 PROCESS 權限並且執行 MySQL 5.1+,你可以執行這個查詢:
select COUNT(1) mysqldumpThreads from information_schema.processlist where info like 'SELECT /*!40001 SQL_NO_CACHE */%';
這是一個範例輸出:
mysql> select COUNT(1) mysqldumpThreads -> from information_schema.processlist -> where info like 'SELECT /*!40001 SQL_NO_CACHE */%'; +------------------+ | mysqldumpThreads | +------------------+ | 1 | +------------------+ 1 row in set (0.00 sec)
您需要做的就是查詢該號碼。如果你得到一個非零值,mysqldump 必須正在執行。
試一試 !!!