Mysql

為什麼MySQL說我記憶體不足?

  • November 24, 2014

我試圖INSERT...SELECT在 MySQL 中使用 JDBC 執行相當大的任務,但出現以下異常:

Exception in thread "main" java.sql.SQLException: Out of memory (Needed 1073741824 bytes)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)

因為我實際上並沒有返回 ResultSet 對象,所以我認為 Java 堆空間應該不是問題。但是,無論如何,我都嘗試將其提高,但效果不佳。然後我嘗試在 MySQL Workbench 中執行該語句,我得到了基本相同的結果:

Error Code 5: Out of memory (Needed 1073741816 bytes)

我應該有足夠的 RAM 來完成這些操作(足以容納我從中選擇的整個表),但我猜我需要調整各種設置以利用我所有的記憶體。我正在使用Windows Server 2008 AMI執行 Amazon EC2高記憶體雙超大型實例。我試過擺弄 my.ini 文件以使用更好的設置,但據我所知,我可能會讓事情變得更糟。這是該文件的轉儲:

[client]
port=3306
[mysql]
default-character-set=latin1
[mysqld]
port=3306
basedir="C:/Program Files/MySQL/MySQL Server 5.5/"
datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"
character-set-server=latin1
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
max_connections=100
query_cache_size=1024M
table_cache=256
tmp_table_size=25G
thread_cache_size=8
myisam_max_sort_file_size=100G
myisam_repair_threads = 2
myisam_sort_buffer_size=10G
key_buffer_size=5000M
bulk_insert_buffer_size = 4000M
read_buffer_size=8000M
read_rnd_buffer_size=8000M
sort_buffer_size=1G
innodb_additional_mem_pool_size=26M
innodb_flush_log_at_trx_commit=2
innodb_log_buffer_size=13M
innodb_buffer_pool_size=23G
innodb_log_file_size=622M
innodb_thread_concurrency=18
innodb_file_per_table=TRUE
join_buffer_size=4G
max_heap_table_size = 10G

那麼這只是更改上述設置以更好地適應我的環境的問題嗎?如果是這樣,我應該使用什麼設置?我是唯一一個使用過這個實例的人;我將它用於我的個人愛好項目,該項目涉及對大型數據集的統計分析。因此,我可以自由地讓它為我自己的查詢消耗所有可用資源。

如果這不是更改這些設置的問題,那麼問題是什麼?感謝您為如何更好地配置所有內容提供的任何幫助。

鑑於這是一個 Windows 安裝,@DTest 仍然提供了最初的正確方向。

應用以下公式:

大多數人使用這個:

Maximum MySQL Memory Usage = innodb_buffer_pool_size + key_buffer_size + (read_buffer_size + sort_buffer_size) X max_connections

我更喜歡這個:

Maximum MySQL Memory Usage = innodb_buffer_pool_size + key_buffer_size + ((read_buffer_size + read_rnd_buffer_size + sort_buffer_size + join_buffer_size) X max_connections)

這些變數是您需要調整的變數,直到公式產生已安裝 RAM 的 80% 或更少。

sort_buffer_size
read_buffer_size
read_rnd_buffer_size
join_buffer_size
max_connections

引用自:https://dba.stackexchange.com/questions/1927