MySQLはなぜメモリ不足だと言っているのですか?


9

INSERT...SELECTJDBCを使用してMySQLでかなり大きなサイズを実行しようとしましたが、次の例外が発生しました。

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が必要です(選択するテーブル全体に収まるほど)が、すべてのメモリを活用するために微調整する必要のあるさまざまな設定があると思います。Amazon EC2 ハイメモリダブルエクストララージインスタンスをWindows Server 2008 AMIで実行しています。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

これは、上記の設定を変更して私の環境でより適切に機能するようにするだけの問題ですか?その場合、どの設定を使用すればよいですか?このインスタンスを使用するのは私だけです。大規模なデータセットの統計分析を含む個人的な趣味のプロジェクトに使用します。そのため、自分のクエリで使用可能なすべてのリソースを消費させることができます。

これがこれらの設定を変更する問題ではない場合、問題は何ですか?すべてを適切に構成する方法について提供できるヘルプをありがとう。


1gクエリキャッシュを使用している人は、何をしているかわかりません。

@winmutt正解は間違いないかもしれませんが、あなたのコメントはそれ以上の説明なしには誰の助けにもなりません。感情の理由を教えてください。
Michael McGowan

回答:


9

これが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

4

バッファサイズを小さくしてみます。それらをあなたが持っているのと同じくらい大きくすると、問題が発生します。これらの値を実行するために使用できるメモリはどれくらいですか?

query_cache_size=1024M
myisam_max_sort_file_size=100G
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_buffer_pool_size=23G

一部のバッファサイズはスレッドごとに割り当てられます。たとえば、myisam_sort_buffer_sizeが10Gの場合、各スレッドに10Gが割り当てられます。

最初にこれらの値を大幅に減らし、次に、これだけのRAMを割り当てる必要がある場合に、どのRAMを割り当てる必要があるかを調査します。


4

MySQLが割り当て可能なメモリ量をMySQLが迅速に判断する方法は次のとおりです。

wget mysqltuner.pl

perl mysqltuner.pl

このスクリプトを実行すると、インストールされているRAMの何パーセントが、MySQLが安全に割り当てることができると考えるかがわかります。与えられた答えが100%を超えている場合は、バッファサイズを下げる必要があります。焦点となる主なものは次のとおりです。

sort_buffer_size
read_buffer_size
read_rnd_buffer_size
join_buffer_size
max_connections
key_buffer_size(4G以降は実際には効果的ではありません)

@DTestはすでに彼の回答であなたの方向性を設定しているため、彼のアンサーに+1します。perlスクリプトは、それを設定しない場合、または値を変更した場合に何が起こるかを通知します。次に例を示します。

私のクライアントは
read_buffer_size = 128K
read_rnd_buffer_size = 256K
sort_buffer_size = 2M
join_buffer_size = 128K
max_connections = 1050

mysqltuner.plからの出力は次のとおりです。

MySQLTuner 1.2.0-主要なヘイデン
バグレポート、機能のリクエスト、http ://mysqltuner.com/でのダウンロード
追加のオプションと出力フィルタリングについては「--help」で実行して
くださいMySQL管理ログインを
入力してください:lwdba MySQL管理者を入力してくださいパスワード:

--------一般統計---------------------------------------- ----------
[-] MySQLTunerスクリプトのバージョンチェックをスキップ
[OK]サポートされているMySQLバージョン5.0.51a-community-logを現在実行中
[!!] 64ビットOSに切り替え-MySQL は現在使用できませんすべてのRAM

--------ストレージエンジンの統計--------------------------------------- ----
[-]ステータス:+ Archive -BDB + Federated + InnoDB -ISAM -NDBCluster
[-] MyISAMテーブルのデータ:319M(テーブル:108)
[-] InnoDBテーブルのデータ:2M(テーブル: 5)
[!!]断片化されたテーブルの総数:22

--------パフォーマンスメトリクス---------------------------------------- ---------
[-]有効期間:52日23時間15分57秒(72M q [15.875 qps]、241K接続、TX:2B、RX:1B)
[-]読み取り/書き込み:59%/ 41%
[-]合計バッファ:グローバル34.0M +スレッドあたり2.7M(最大スレッド数1050)
[!!] 32ビットシステムに2GBを超えるRAMを割り当てると、システムが不安定に
なる可能性があります[!!]可能な最大メモリ使用量:2.8G (インストールされているRAMの72%)
[OK]クエリが遅い:0%(54 / 72M)
[OK]利用可能な接続の最大使用率:6%(65/1050)
[OK]キーバッファーサイズ/合計MyISAMインデックス:8.0M / 82.1M
[OK]キーバッファヒット率:100.0%(4Bキャッシュ/ 1M読み取り)
[!!]クエリキャッシュが無効
[OK]一時テーブルを必要とするソート:0%(0一時ソート/ 948Kソート)
[OK]ディスク上に作成された一時テーブル:3%(ディスク上で11K /合計380K)
[!!]スレッドキャッシュは無効です
[!!]テーブルキャッシュヒット率:0%(64オープン/ 32Kオープン)
[OK]ファイルをオープン使用制限:2%(125 / 5K)
[OK]すぐに取得されるテーブルロック:99%(30M即時/ 30Mロック)
[OK] InnoDBデータサイズ/バッファプール:2.7M / 8.0M

--------推奨事項----------------------------------------- ------------
一般的な推奨事項:
パフォーマンスを向上させるためにOPTIMIZE TABLEを実行してテーブルを最適化
するスロークエリログを有効にして不良クエリのトラブルシューティング
を行う開始値としてthread_cache_sizeを4に設定するtable_cacheを
徐々に増やしてファイル記述子の制限を回避する
変数調整する:
query_cache_size(> = 8M)
thread_cache_size(4から開始)
table_cache(> 64)

パフォーマンス指標の下に注意してください

[-]合計バッファ:グローバル34.0M +スレッドあたり2.7M(最大スレッド数1050)

MySQLは、/ etc / my.cnfの設定に基づいて、インストールされているRAMの最大72%を割り当てることができます。

34Mはinnodb_buffer_pool_sizeとkey_buffer_sizeの組み合わせに基づいています

スレッドあたり2.7Mは、read_buffer_size + read_rnd_buffer_size + sort_buffer_size + join_buffer_sizeに基づいていました。

2.7Mの倍数は、max_connectionsに基づいています。

したがって、インストールされているRAMが100%未満(できれば80%未満)であることがパフォーマンスメトリックレポートで示されるまで、これらのパラメーターを調整する必要があります。


私はあなたのツールを使用できるかわかりません。Windowsを使用しています。ドキュメントにはWindowsはサポートされていないという記述がありましたが、とにかく試しました。実行しようとしたところ、$ PATHにmysqladminが見つからなかったことが示されましたが、MySQLのbinディレクトリは実際に$ PATHにあります。
マイケルマッゴーワン

すみません、Windowsのdatadirに気づきませんでした。別の答えを追加します。
RolandoMySQLDBA 2011年

1

あなたはあなたが持っているRAMの量を言っていませんか?32GB以上だと思います。

innodb_buffer_pool_size-23G

それだけのRAMに適しています。

query_cache_size = 1G

大きすぎます。大きいと非効率です。50M以下をお勧めします。

key-buffer_size = 5G

Windowsには4G(まだ)のハードリミットがある可能性があり、4Gのハードリミットがありました。5Gが1Gに変わった可能性があります。とにかく、すべてのテーブルがInnoDBである場合、なぜRAMを無駄にするのでしょう。50Mに設定します。

エラーメッセージはちょうど1Gだったので、のようなにおいがしsort_buffer_sizeます。32Mが妥当かもしれません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.