Mysql
即使在增加緩衝池大小之後,鎖的總數也超過了鎖表的大小
我正在嘗試對包含 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_packet = 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_packet = 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 操作上為您的表提供良好的性能。