我有MySQL 5.6.36數據庫,其中大小爲35G,在CentOS 7.3上運行,內存爲48G。爲什麼MySQL消耗這麼多內存?
[UPDATE 17-08-06]我會更新相關信息here。
我看到我的服務器內存不足,即使使用大約48G的RAM也會崩潰。例如,我無法讓它在24G上運行。這個大小的DB應該能夠運行得更少。顯然,我缺少一些根本性的東西。
[UPDATE:17-08-05]死機,我的意思是mysqld的停止並重新啓動與日誌中沒有有用的信息,比從崩潰重啓等。而且,這一切的記憶,我在恢復過程中得到這個錯誤:
[ERROR] InnoDB: space header page consists of zero bytes in tablespace ./ca_uim/t_qos_snapshot.ibd (table ca_uim/t_qos_snapshot)
我的配置文件中的相關部分看起來像這樣[EDITED 17-08-05添加缺少的行]:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
lower_case_table_names = 1
symbolic-links=0
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
max_allowed_packet = 32M
max_connections = 300
table_definition_cache=2000
innodb_buffer_pool_size = 18G
innodb_buffer_pool_instances = 9
innodb_log_file_size = 1G
innodb_file_per_table=1
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
這是一個忽略每個表使用文件,我需要改變(我有6000個表,其中大部分是分區)。
一會兒(一小時)運行後,mytop表明這一點:
MySQL on 10.238.40.209 (5.6.36) load 0.95 1.08 1.01 1/1003 8525 up 0+01:31:01 [17:44:39]
Queries: 1.5M qps: 283 Slow: 22.0 Se/In/Up/De(%): 50/07/09/01
Sorts: 27 qps now: 706 Slow qps: 0.0 Threads: 118 ( 3/ 2) 43/28/01/00
Key Efficiency: 100.0% Bps in/out: 76.7k/176.8k Now in/out: 144.3k/292.1k
而且免費演出這樣的:
# free -h
total used free shared buff/cache available
Mem: 47G 40G 1.5G 8.1M 5.1G 6.1G
Swap: 3.9G 508K 3.9G
頂部顯示這一點:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2010 mysql 20 0 45.624g 0.039t 9008 S 95.0 84.4 62:31.93 mysqld
如何這可以嗎?這是每個表的相關文件嗎?整個DB可以放在內存中。我究竟做錯了什麼?
如果您使用'join',那麼結果可能是表格大小的許多倍。可能有其他進程使用內存。服務器崩潰時正在運行什麼查詢?當你說'崩潰'時,它是否會停止響應任何應用程序,或只有MySQL?最後,可以肯定的是,你每秒有283個查詢? –
使用http://mysqltuner.pl驗證你的內存配置 – Geoffrey
'mysql> show processlist;'將有助於辨別SO或[SF]。 – Sal