step1:查看
1.1 Mysql命令行里輸入“show engines;”查看innoddb數據引擎狀態,
1.2 show variables “%_buffer%”里查看innodb_buffer_pool_size的數值,默認是8M(太小,需要改大一點!)
step2:找配置文件,修改innodb_buffer_pool_size=64M
2.1 在linux里配置文件是my.cnf,windows里是my.ini(注:不是my-default.ini)。Mysql5.7中,my.ini在C:\ProgramData\MySQL\MySQL Server 5.7目錄里,設置對應的innodb_buffer_pool_size=64M
2.2 重啟mysql服務(平時最好設為手動開啟)
配置文件參考資料:
以下是網上的解決教程,
- 參考一:
下文轉自: http://blog.chinaunix.net/uid-25266990-id-3293445.html
在操作mysql數據庫表時出現以下錯誤。
網上google搜索相關問題,發現一位外國牛人這么解釋:
- If you're running an operation on a large number of rows within a table that uses the InnoDB storage engine, you might see this error:
- ERROR 1206 (HY000): The total number of locks exceeds the lock table size
- MySQL is trying to tell you that it doesn't have enough room to store all of the row locks that it would need to execute your query. The only way to fix it for sure is to adjust innodb_buffer_pool_size and restart MySQL. By default, this is set to only 8MB, which is too small for anyone who is using InnoDB to do anything.
- If you need a temporary workaround, reduce the amount of rows you're manipulating in one query. For example, if you need to delete a million rows from a table, try to delete the records in chunks of 50,000 or 100,000 rows. If you're inserting many rows, try to insert portions of the data at a single time.
原來是InnoDB表執行大批量數據的更新,插入,刪除操作時會出現這個問題,需要調整InnoDB全局的innodb_buffer_pool_size的值來解決這個問題,並且重啟mysql服務。
查看當前數據庫存儲引擎,在創建時使用 ENGINE=InnoDB類型。
默認的innodb_buffer_pool_size=8M
修改 innodb_buffer_pool_size的值:
點擊(此處)折疊或打開
- innodb_buffer_pool_size=64M
再一次重啟mysql服務器,執行表操作,成功執行完畢。
- 參考二:
下文轉自: http://www.cnblogs.com/dyllove98/archive/2013/07/28/3221830.html
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 = 512M innodb_additional_mem_pool_size = 256M innodb_log_file_size = 128M # 注意這里跟默認值不一樣! innodb_log_buffer_size = 8M innodb_flush_log_at_trx_commit = 0 # 避免頻繁flush innodb_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 ===============