mysql報錯"ERROR 1206 (HY000): The total......"的解決方法_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3150 | 回复: 0   主题: mysql報錯"ERROR 1206 (HY000): The total......"的解決方法        下一篇 
tangbao@.@
注册用户
等级:新兵
经验:67
发帖:62
精华:0
注册:2011-7-21
状态:离线
发送短消息息给tangbao@.@ 加好友    发送短消息息给tangbao@.@ 发消息
发表于: IP:您无权察看 2015-5-27 10:35:18 | [全部帖] [楼主帖] 楼主

1. 問題背景

InnoDB是新版MySQL(v5.5及以後)默認的存儲引擎,之前版本的默認引擎為MyISAM,因此,低於5.5版本的mysql配置文件.my.cnf中,關於InnoDB的配置默認是被注釋起來的。在實際使用時,發現不少人只是把mysql的配置文件拷貝到需要的路徑下後,就啟動mysqld,而建表時偏偏又指定engine=innodb。正常情況下,即使不顯式配置innodb引擎的參數,該引擎也可以使用(因為MySQL會採用默認的innodb engine參數來管理對應的表).

但隨著表中數據量不斷增大(如單表數百萬記錄),問題來了:執行一些模糊查詢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典型的配置如下:

[plain]
# 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相關的配置默認都是注釋掉的,開啟並指定新值如下(註:具體的配置值應根據部署機器的物理配置而定):

[plain]
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),發現其輸出如下:

[plain]
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引擎失敗。

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查詢命令也不再報錯。

至此,問題才算徹底解決。

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论