在使用Mysql的過程中,你總是會遇到這樣那樣的問題,每次去網上查找也相對比較麻煩,所以在此整理一下(以linux ubantu16 系統為例)。
=====================================================================
=====================================================================
1. mysql 連接數太多(SequelizeConnectionError: Too many connections)
這個就是最常見的問題了。因為我做的這個是前端監控系統,日志上報量比較大,所以經常會遇到連接數不夠用的情況。 除了你要使用其他技術來緩解並發量,還需要適當的設置mysql數據庫的最大連接數。那么怎么增加mysql的最大連接數呢,設置多大為合適呢,這又是一個比較麻煩的問題了。下邊是我的一些淺見,僅供參考。
首先我們需要登錄mysql, 進入mysql的命令行:
查看當前mysql的連接數:
mysql> show global status like 'Max_used_connections'; +----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | Max_used_connections | 403 | +----------------------+-------+ 1 row in set (0.00 sec)
如何設置mysql的最大連接數呢?
第一種方法:通過mysql命令設置(這種方法是臨時性的,重啟mysql以后就會失效)
mysql> set GLOBAL max_connections=2000; Query OK, 0 rows affected (0.00 sec)
第二種方法:進入mysql目錄(/usr/local/mysql)找到my.cnf文件,添加如下配置(注意:最大連接數不要設置過大,有可能會在啟動的時候爆掉哦),然后執行命令$: service mysql restart
[mysqld] max_connections=1000
Mysql的最大連接數設置多少合適呢?
對照阿里雲的TCP連接數來看一下,阿里雲的TCP連接數可以看出瞬間並發量的多少,然后跟我們的數據庫連接數做個對比。正常情況下TCP連接數為1K左右的時候,MySQL的連接數為400左右。本來瞬間的並發量能達到9K, 但是我將一部分流量導入到其他服務器上,所以現在最高的並發量能夠達到3.4K。當最大3.4K並發量的時候,有兩台服務器同時訪問mysql,我的數據庫連接數是1153個左右。
所以,如何設置mysql最大連接數,可以參考一下我的這個數值。
2. Mysql連接錯誤太多(SequelizeConnectionError: Host 'xx.xx.xx.xx' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts')
這個問題並不常見,因為一般mysql的默認值是100。只有當同一個IP對mysql訪問出現100次連接錯誤的時候,mysql就會拒絕這個ip的請求訪問。因為我的日志服務和數據庫是分離的,所以,經常會在量大的時候出現這個問題。
查看連接報錯配置:
mysql> show variables like '%max_connect_errors%'; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | max_connect_errors | 100 | +--------------------+-------+ 1 row in set (0.01 sec)
單個ip連接報錯查詢:
select SUM_CONNECT_ERRORS as count from performance_schema.host_cache where ip='xxx.xxx.xxx.xxx'
設置連接數報錯最大數量:
mysql> set GLOBAL max_connect_errors=1000; Query OK, 0 rows affected (0.00 sec)
3. mysql字符集配置錯誤,導致無法插入數據庫(Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation)
在數據庫執行查找的命令,判斷條件含有特殊字符,再執行的時候報了以上錯誤;
查看字段編碼發現是 latin1 字符集的latin1_german1_ci排序規則,而數據庫是utf-8編碼,確定錯誤是編碼導致。
修改數據庫字段為utf-8編碼 再次執行 順利查出結果