1. 程式人生 > >mysql連線數過多 解決方案 閱讀目錄

mysql連線數過多 解決方案 閱讀目錄

mysql 預設連結數是100個 最大是16384。

原則:想盡一切辦法不重啟

回到頂部

導致原因:

出現這種錯誤明顯就是 mysql_connect 之後忘記 mysql_close;
當大量的connect之後,就會出現Too many connections的錯誤,mysql預設的連線為100個,而什麼情況下會出現這種錯誤呢?

正常的mysql_connect 之後呼叫 mysql_close()關閉連線
但在連線錯誤時,會者mysql_real_query()出現錯誤退出時,可能忘記mysql_close();
所以在程式return 之前一定要判斷是否close(),最穩妥的方法就是在寫任何函式時都只有一個出口!

回到頂部

檢視連結:

檢視當前連線數

./mysqladmin -uroot -p1234.com status
Uptime: 1370150  Threads: 1 (當前連線數) Questions: 79  Slow queries: 0  Opens: 33  Flush tables: 1  Open tables: 26  Queries per second avg: 0.000

複製程式碼

./mysql -uroot -p1234.com -e 'show status' | grep -i  Threads 
Delayed_insert_threads    0
Slow_launch_threads    0
Threads_cached    1
Threads_connected    1
Threads_created    2
Threads_running    1 ##(當前連線數)

複製程式碼

複製程式碼

mysql> show status like 'Threads%';
+-------------------+-------+
| Variable_name    | Value |
+-------------------+-------+
| Threads_cached    | 1    |
| Threads_connected | 1    |
| Threads_created  | 2    |
| Threads_running  | 1    |   ###當前連線數
+-------------------+-------+
4 rows in set (0.00 sec)

複製程式碼

檢視最大連線數

[[email protected] bin]# ./mysql -uroot -p1234.com -e 'show variables' | grep max_connections
max_connections    500

複製程式碼

mysql> show global variables like 'max_conn%';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| max_connect_errors | 10    |
| max_connections    | 500  |## 最大連線數
+--------------------+-------+
2 rows in set (0.00 sec)

複製程式碼

回到頂部

解決方法:

想盡一切辦法不重啟

 

這種情況一般是進不去資料庫了,修改配置檔案得重啟,對於線上的資料庫風險太大了,進入資料庫用sql修改,現在是進不去了 

 

方法1:

使用gdb工具 不用進入資料庫,不用重啟資料庫 方法如下:

複製程式碼

[[email protected] bin]# gdb -p $(cat /data/mydata/xxx.pid) -ex "set max_connections=500" -batch  
[New LWP 7667]
[New LWP 4816]
[New LWP 341]
[New LWP 338]
[New LWP 337]
[New LWP 336]
[New LWP 335]
[New LWP 331]
[New LWP 330]
[New LWP 329]
[New LWP 328]
[New LWP 327]
[New LWP 326]
[New LWP 325]
[New LWP 324]
[New LWP 323]
[New LWP 322]
[Thread debugging using libthread_db enabled]
0x00000035654df1b3 in poll () from /lib64/libc.so.6

複製程式碼

檢視mysql pid位置的方法

 

在配置檔案 my.cnf裡查詢

用 ps -ef | grep mysql 查詢

複製程式碼

mysql> show variables like '%pid%';
+---------------+----------------------+
| Variable_name | Value                |
+---------------+----------------------+
| pid_file      | /data/mydata/xxx.pid |
+---------------+----------------------+
1 row in set (0.00 sec)

複製程式碼

修改完畢後 ,嘗試重新進入資料庫,並檢視連結數

這種方法設定後,只是暫時的,資料庫重啟後,會變為原來的數值,要想永久,設定完後修改配置檔案my.cnf

 

方法2

 

前提是還可以進入資料庫

進入資料庫

設定新的最大連線數為200:mysql> set GLOBAL max_connections=200

顯示當前執行的Query:mysql> show processlist

顯示當前狀態:mysql> show status

退出客戶端:mysql> exit

這種方法設定後,只是暫時的,資料庫重啟後,會變為原來的數值,要想永久,設定完後修改配置檔案my.cnf

方法3:

需要重啟資料庫

修改 my.conf 

max_connection = 1000;

回到頂部

模擬mysql連線數過多 

指令碼內容

複製程式碼

#!/bin/bash
set j=2
while true 
do
        let "j=j+1"
/usr/local/mysql/bin/mysqlslap -a -c 500 -i 10 -uroot -p1234.com
done

複製程式碼

執行此指令碼  ,然後導致mysql連線數過多無法連線,多試幾次確定無法連線  再用gdb工具測試