2億レコードのテーブルを分割しようとしています。このテーブルはすでに存在しています:
CREATE TABLE linkmap_ntoken (
target_nToken varchar(200) NOT NULL,
ntoken_hashcode int(15) NOT NULL,
targeturl varchar(2000) NOT NULL,
targetbreadcrumb varchar(400) NOT NULL,
sourceurl varchar(2000) NOT NULL,
sourcebreadcrumb varchar(400) NOT NULL
) ENGINE=InnoDB.
今、私はこのステートメントで500パーティションを作成しようとしています:
ALTER TABLE linkmap_ntoken partition by HASH (ntoken_hashcode) partitions 500;
例外がスローされます。ロックの総数がロックテーブルのサイズを超えました。
オンラインでいくつかの提案を読み、my.cnf
ファイルを変更しました。構成は次のとおりです。
#クライアントごとの設定# #ビット高ですが、ここには大量のRAMがありました# sort_buffer_size = 2M read_buffer_size = 2M binlog_cache_size = 1M wait_timeout = 31536000 interactive_timeout = 300 max_allowed_packet = 12M thread_stack = 128K table_cache = 1024 myisam_sort_buffer_size = 1M tmp_table_size = 12M max_heap_table_size = 12M #LOGGING# log_queries_not_using_indexes = 1 slow_query_log = 1 slow_query_log_file = /var/lib/mysql/slowquery.log # MyISAM# key_buffer_size = 32M myisam_recover = FORCE、BACKUP #安全# max_allowed_packet = 16M max_connect_errors = 10 00000 #バイナリロギング# log_bin = /var/lib/mysql/mysql-bin expire_logs_days = 14 sync_binlog = 1 #キャッシュと制限# tmp-table-size = 32M max-heap-table-size = 32M query -cache-type = 0 query-cache-size = 0 max-connections = 500 thread-cache-size = 50 open-files-limit = 65535 table-definition-cache = 1024 table-open-cache = 2048 #INNODB# innodb-flush-method = O_DIRECT innodb-log-files-in-group = 2 innodb-log-file-size = 512M innodb-flush-log-at-trx-commit = 1 innodb-file-per-table = 1 innodb-buffer-pool-size = 40G
これらの変更を行った後、mysqlを再起動しました。それでも例外がスローされます。私のサーバーには12コアと48 GBのRAMがあり、当分の間、このサーバーをこのパーティショニングプロセス専用にすることができます。この例外を回避するための提案はありますか(ロックの合計数を超えました)?
グローバル変数を表示したところ、バッファプールサイズが8388608と表示されています。innodb_buffer_pool_size
ブロックの下の[mysqld]
を変更して再起動しました。影響を受けていないようです。それはまだ8388608です。
「なぜパーティション分割するか」については、主キーを持つ一意の列がありません。 1つ追加しても、クエリを実行することはできません。この表を使用して、オンラインアプリケーションのクエリを実行しています。クエリが1秒未満で結果を返すようにしたい。
My.cnfファイルでこれを試してください。
[mysqld] innodb_buffer_pool_size = 80M
また、ワークベンチとSqlサービスを再起動する必要があります。
遅い回答かもしれませんが、将来誰かが同様の問題を経験した場合、解決策はInnodb_buffer_pool_sizeを調整することにあることを覚えておいてください。もちろん、これはあなたのサーバーが専用のmysqlデータベースサーバーであることを前提としています。デフォルトでは、サーバーの実際のメモリサイズよりも10%多くすることをお勧めします。 MySQLはbuffer_poolの使用をゆっくりとスケールアップでき、CRUDアクションでテーブルに優れたパフォーマンスを提供します。