web-dev-qa-db-ja.com

バッファプールサイズを増やした後でも、ロックの合計数がロックテーブルのサイズを超えています

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_pa​​cket = 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_pa​​cket = 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秒未満で結果を返すようにしたい。

2
user2611221

My.cnfファイルでこれを試してください。

[mysqld] innodb_buffer_pool_size = 80M

また、ワークベンチとSqlサービスを再起動する必要があります。

1
Akash Desai

遅い回答かもしれませんが、将来誰かが同様の問題を経験した場合、解決策はInnodb_buffer_pool_sizeを調整することにあることを覚えておいてください。もちろん、これはあなたのサーバーが専用のmysqlデータベースサーバーであることを前提としています。デフォルトでは、サーバーの実際のメモリサイズよりも10%多くすることをお勧めします。 MySQLはbuffer_poolの使用をゆっくりとスケールアップでき、CRUDアクションでテーブルに優れたパフォーマンスを提供します。

0
soskola Øl