日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql报错ERROR 1206 (HY000): The total number of locks exceeds the lock table size的解决方法...

發布時間:2025/4/14 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql报错ERROR 1206 (HY000): The total number of locks exceeds the lock table size的解决方法... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 問題背景
? ? ? ? InnoDB是新版MySQL(v5.5及以后)默認的存儲引擎,之前版本的默認引擎為MyISAM,因此,低于5.5版本的mysql配置文件.my.cnf中,關于InnoDB的配置默認是被注釋起來的。在實際使用時,發現不少人只是把mysql的配置文件拷貝到需要的路徑下后,就啟動mysqld,而建表時偏偏又指定engine=innodb。正常情況下,即使不顯式配置innodb引擎的參數,該引擎也可以使用(因為MySQL會采用默認的innodb engine參數來管理對應的表),于是,大家用的很happy,因為一切正常啊。
? ? ? ? 但隨著表中數據量不斷增大(如單表數百萬記錄),問題來了:執行一些模糊查詢SQL語句時會因默認的引擎參數太小而報錯,典型的錯誤類型如下:
? ? ? ? ? ? ERROR 1206 (HY000): The total number of locks exceeds the lock table size
? ? ? ? 比如,在一個200w+記錄的單表中執行類似于這樣的SQL命令:delete from table_xxx where col_1 like '%http://www.youku.com/%',而符合模糊條件的記錄又較多時,InnoDB引擎會因需要鎖的行太多而拋出上面給出的那個錯誤。
? ? ? ? 查閱資料(比如 這里 )可知,這類錯誤是由于InnoDB默認的配置參數不合適導致的,顯然,解決這個異常的辦法就是修改配置并重啟mysqld。

2. 修改.my.cnf中InnoDB的默認配置

? ? ? ? 配置文件中,InnoDB典型的配置如下:

# Uncomment the following if you are using InnoDB tables #innodb_data_home_dir = /home/root/tools/mysql-5.0.80/var/ #innodb_data_file_path = ibdata1:10M:autoextend #innodb_log_group_home_dir = /home/root/tools/mysql-5.0.80/var/ #innodb_log_arch_dir = /home/root/tools/mysql-5.0.80/var/ # You can set .._buffer_pool_size up to 50 - 80 % # of RAM but beware of setting memory usage too high #innodb_buffer_pool_size = 16M #innodb_additional_mem_pool_size = 2M # Set .._log_file_size to 25 % of buffer pool size #innodb_log_file_size = 5M #innodb_log_buffer_size = 8M #innodb_flush_log_at_trx_commit = 1 #innodb_lock_wait_timeout = 50

? ? ? ? 可見,InnoDB相關的配置默認都是注釋掉的,開啟并指定新值如下(注:具體的配置值應根據部署機器的物理配置而定):

innodb_buffer_pool_size = 512Minnodb_additional_mem_pool_size = 256Minnodb_log_file_size = 128M # 注意這里跟默認值不一樣!innodb_log_buffer_size = 8Minnodb_flush_log_at_trx_commit = 0 # 避免頻繁flushinnodb_lock_wait_timeout = 50

? ? ? ? 修改完成后,mysql安裝路徑下執行"./bin/mysqld_safe &",以重啟mysql server。shell終端執行ps aux | grep "mysqld"可看到進程已啟動。
? ? ? ? 到這里,似乎大功告成了,但是。。。且慢!
? ? ? ? 命令行登錄mysql后,對使用InnoDB的數據表進程操作時會悲催地發現,執行SQL命令會報錯:
? ? ? ? ? ? Error 'Unknown table engine 'InnoDB'' on query.
? ? ? ? mysql命令行輸入show engines \G后發現,列出的Engines中沒有InnoDB。
? ? ? ? 怎么回事?mysql server進程正常,為什么InnoDB引擎出錯??
? ? ? ? 查看mysql安裝路徑下mysql server的error日志(./var/xxx.err),發現其輸出如下:

130701 16:15:20 mysqld started InnoDB: Error: log file /home/root/tools/mysql/var/ib_logfile0 is of different size 0 5242880 bytes InnoDB: than specified in the .cnf file 0 134217728 bytes! 130701 16:15:21 [Note] /home/root/tools/mysql/libexec/mysqld: ready for connections. Version: '5.0.80-log' socket: '/home/root/tools/mysql/var/mysql.sock' port: 3306 Source distribution 130701 16:15:37 [ERROR] /home/root/tools/mysql/libexec/mysqld: Incorrect information in file: './data/tv_KEY_PREDEAL.frm' 130701 16:15:37 [ERROR] /home/root/tools/mysql/libexec/mysqld: Incorrect information in file: './data/tv_KEY_PREDEAL.frm' # 此處省略若干行,均是加載數據表的frm文件失敗的Error日志

? ? ? ? 從日志看到,重啟mysql server實例時確實發生了錯誤,log file對不上導致加載InnoDB引擎失敗。
? ? ? ? how to solve it ?

3. 最終解決方法
? ? ? ? 從上面分析可知,我們現在遇到兩個錯誤:
? ? ? ? ? 1)mysql命令行拋出的: Error 'Unknown table engine 'InnoDB'' on query.
? ? ? ? ? 2)mysql error日志輸出:InnoDB: Error: log file /home/root/tools/mysql/var/ib_logfile0 is of different size 0 5242880 bytes
? ? ? ? 從因果關系看,后者是出錯的根本原因,因此,只需解決這個error即可。
? ? ? ? 根據stackoverflow上的這篇帖子給出的解決方法,執行以下操作:
? ? ? ? ? ?1)刪除mysql數據文件夾下的ib_logfile0和ib_logfile1(更安全的做法是將它們mv備份到其它路徑下)
? ? ? ? ? ?2)重啟mysql server
? ? ? ? 此時,查看mysql啟動日志無ERROR,同時,在mysql命令行show engines可看到innodb對應的"Support"一列為YES狀態,表明mysql server已經成功加載該引擎,最后,執行SQL查詢命令也不再報錯。
? ? ? ? 至此,問題才算徹底解決。

備注: mysql 5.0.22版本的bug
? ? ? ? 特別需要注意的是,修改配置導致InnoDB不可用的現象并沒有在5.0.22上復現。雖然其mysql啟動日志也輸出了類似于"InnoDB: Error: log file /mysql/var/ib_logfile0 is of different size 0 5242880 bytes"這樣的Error信息,且show engines表明InnoDB引擎處于DISABLED狀態,但奇怪的是,對使用innodb引擎的table執行sql查詢時,并沒有報錯"Error 'Unknown table engine 'InnoDB'' on query.",而是一切正常。
? ? ? ? 執行show table status where name = 'demo_table'后發現,該表的引擎居然自動變成了MyISAM,難怪查詢不報錯。
? ? ? ? 一番尋覓后,在 這里 找到了答案,原來是5.0.22版本的已知bug,囧。。。 ?

【參考資料】
1. StackOverflow: Unknown table engine 'InnoDB'?
2. StackExchange: InnoDB: Error: log file ./ib_logfile0 is of different size
3. MySQL BUG ISSUES - bug about v5.0.22?

================ EOF ===============


?

轉載于:https://www.cnblogs.com/dyllove98/p/3221830.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的mysql报错ERROR 1206 (HY000): The total number of locks exceeds the lock table size的解决方法...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。