Mysql

即使在增加緩衝池大小之後,鎖的總數也超過了鎖表的大小

  • March 3, 2020

我正在嘗試對包含 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 #
排序緩衝區大小 = 2M
讀取緩衝區大小 = 2M
binlog_cache_size = 1M
等待超時 = 31536000
互動超時 = 300
max_allowed_pa​​cket = 12M
執行緒堆棧 = 128K
表記憶體 = 1024
myisam_sort_buffer_size = 1M
tmp_table_size = 12M
max_heap_table_size = 12M


#日誌記錄#
log_queries_not_using_indexes = 1
慢查詢日誌 = 1
slow_query_log_file = /var/lib/mysql/slowquery.log

#MyISAM#
key_buffer_size = 32M
myisam_recover = 強制,備份

# 安全 #
max_allowed_pa​​cket = 16M
max_connect_errors = 1000000


#二進制記錄#
log_bin = /var/lib/mysql/mysql-bin
expire_logs_days = 14
同步二進制日誌 = 1

#記憶體和限制#
tmp 表大小 = 32M
最大堆表大小 = 32M
查詢記憶體類型 = 0
查詢記憶體大小 = 0
最大連接數 = 500
執行緒記憶體大小 = 50
打開文件限制 = 65535
表定義記憶體 = 1024
表打開記憶體 = 2048

#INNODB#
innodb-flush-method = O_DIRECT
innodb-log-files-in-group = 2
innodb 日誌文件大小 = 512M
innodb-flush-log-at-trx-commit = 1
innodb-file-per-table = 1
innodb 緩衝池大小 = 40G

進行這些更改後,我重新啟動了 mysql。它仍然拋出異常。我的伺服器有 12 個核心和 48GB 記憶體,我可以暫時將這台伺服器專門用於這個分區過程。有什麼建議可以繞過這個異常(超過鎖的總數)?

當我確實顯示全域變數時,它顯示緩衝池大小為 8388608。我innodb_buffer_pool_size[mysqld]塊下更改並重新啟動。好像沒有受到影響。仍然是 8388608。

關於“為什麼要分區”,我沒有唯一的列來擁有主鍵。即使我添加一個,我也無法使用它進行查詢。我正在使用此表查詢線上申請。我希望我的查詢在不到一秒的時間內返回結果。

在 my.cnf 文件中試試這個,

$$ mysqld $$ innodb_buffer_pool_size = 80M 並且您需要重新啟動 Workbench 以及 Sql 服務。

這可能是一個遲到的答案,但如果將來有人遇到類似的問題,請記住解決方案在於調整 Innodb_buffer_pool_size。這當然假設您的伺服器是專用的 mysql 數據庫伺服器。預設情況下,最好將其設置為伺服器實際記憶體大小的 10%。MySQL 能夠緩慢地擴大 buffer_pool 的使用量,並在 CRUD 操作上為您的表提供良好的性能。

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