自從上週以來,沒有任何特殊原因,我的網站速度開始急劇下降。我登入 MySQL 並執行 show processlist ,結果如下:
mysql> show full processlist;
+------+------+-----------+---------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+------+------+-----------+---------+---------+------+-------+------------------+
| 2047 | web | localhost | myDB | Sleep | 81 | | NULL |
| 2049 | web | localhost | myDB | Sleep | 81 | | NULL |
| 2050 | web | localhost | myDB | Sleep | 81 | | NULL |
| 2052 | web | localhost | myDB | Sleep | 81 | | NULL |
| 2053 | web | localhost | myDB | Sleep | 81 | | NULL |
| 2054 | web | localhost | myDB | Sleep | 81 | | NULL |
| 2055 | web | localhost | myDB | Sleep | 81 | | NULL |
...
| 2066 | web | localhost | myDB | Sleep | 80 | | NULL |
| 2067 | web | localhost | myDB | Sleep | 80 | | NULL |
| 2178 | web | localhost | myDB | Sleep | 76 | | NULL |
+------+------+-----------+---------+---------+------+-------+------------------+
131 rows in set (0.00 sec)
當我重新啟動 MySQL 時,沒有出現預期的進程。當我刷新網站並快速檢查流程時,我可以看到一些查詢一會兒後就消失了。一切都很完美,但過了一段時間後,我又突然收到了許多如上圖的過程。這當然會凍結我的網站。
它們似乎在一段時間後但在 的值之前消失wait_timeout
,然後在一段時間後以不同的 ID 再次出現。
有誰知道這可能是什麼原因造成的?
我的伺服器規格:
CentOS 5
MySQL版本:5.1.33-log 來源分配
RAM 8GB
my.cnf 的一部分
[mysqld]
default-character-set = utf8
character_set_server = utf8
default-collation = utf8_unicode_ci
collation_server = utf8_unicode_ci
ft_min_word_len = 3
port = 5689
socket = /tmp/mysql.sock
skip-locking
skip-name-resolve
key_buffer_size = 256M
group_concat_max_len = 2048
max_allowed_packet = 10M
table_cache = 512
table_definition_cache = 512
sort_buffer_size = 10M
net_buffer_length = 8K
read_buffer_size = 40M
read_rnd_buffer_size = 10M
myisam_sort_buffer_size = 8M
long_query_time = 1
net_read_timeout = 30
net_write_timeout = 60
log_slow_queries = /var/log/slowqueries
query_cache_type = 1
query_cache_limit = 5MB
query_cache_size = 134217728
max_heap_table_size = 24MB
tmp_table_size = 24MB
expire_logs_days = 99
max_connections = 500
init-connect = 'SET NAMES latin1'
thread_cache_size = 4
wait_timeout = 600
我希望這能幫助你們中的一個人為我指明正確的方向。我沒主意了。
編輯整件事情似乎與那些 MySQL 錯誤有關:
http://bugs.mysql.com/bug.php?id=8945
http://bugs.mysql.com/bug.php?id=6070
不幸的是他們沒有解決:(
答案1
檢查 mysql 伺服器的值。你在mysql中使用預設使用者嗎?我還想看看兩件事:
確保只有特定伺服器可以連接到 mysql 資料庫。如果您有一個從 % 連接的用戶,請確保您有一個好的密碼(和充分的理由)。
確保沒有人向您的應用程式發送超出您運行應用程式所需的程式碼要求的查詢。有人甚至可能在沒有訪問您的網站的情況下將資料注入您的資料庫。
透過密切關注 netstat 來追蹤您的活動連接一段時間。 wait_timeout 表示某人/某事已查詢您的伺服器。密切追蹤將幫助您發現他們是誰。完成此操作後,如果您需要快速阻止它們而不進行重大更改,請使用 iptables。
最後一件事...短暫啟用 mysql 日誌記錄。你的伺服器將會受到打擊但你會清楚地看到 mysql 發生了什麼事。
編輯 my.cnf 檔案並新增(或更新)以下內容:
log = /var/log/mysql/mysql.log
編輯:我提出前面的建議是因為 info 欄位中的 NULL 值表示沒有執行任何語句。