【MySQL笔记】mysql报错"ERROR 1206 (HY000): The total number of locks exceeds the lock table size"的解决方法

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服务(平时最好设为手动开启)

配置文件参考资料:

Windows系统中MySQL 5.6的配置文件(my.ini)修改方法:http://blog.csdn.net/skykingf/article/details/19919315

以下是网上的解决教程,

  • 参考一:

下文转自: http://blog.chinaunix.net/uid-25266990-id-3293445.html

在操作mysql数据库表时出现以下错误。

网上google搜索相关问题,发现一位外国牛人这么解释:

  1. 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:
  2. ERROR 1206 (HY000): The total number of locks exceeds the lock table size
  3. 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.
  4. 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的值:

点击(此处)折叠或打开

  1. 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 ===============

来自为知笔记(Wiz)

时间: 2024-12-21 20:23:11

【MySQL笔记】mysql报错"ERROR 1206 (HY000): The total number of locks exceeds the lock table size"的解决方法的相关文章

MYSQL碰到The total number of locks exceeds the lock table size 问题解决记录

解决记录如下: 在mysql里面进行修改操作时提示:The total number of locks exceeds the lock table size ,通过百度搜到innodb_buffer_pool_size过小: 打开mysql 命令框 输入 show variables like "%tmp%"; 查看innodb_buffer_pool_size,输入SET GLOBAL innodb_buffer_pool_size=67108864; 完成之后再次使用show v

mysql创建用户报错ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value

使用如下语句添加用户: insert into mysql.user(Host,User,Password) values ("%","aas","Aas123456"); 错语原因: mysql用户表的中某些字段不能为空,没有默认值,其实是操作错误,mysql添加用户是不能这样直接insert user表的. 解决: create user 'aas'@'%' identified by 'Aas123456'; mysql创建用户报错ERRO

mysql登陆启动报错 ERROR 2002 (HY000) 解决方法

报错信息 登陆数据库报错:` ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2 "No such file or directory")` 重启服务报错:Job for mariadb.service failed because the control process exited with error code. See &quo

mysql报错ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)

23:29:02/2017-05-03 现象描述:在Command Line Client可以登陆,但是在命令提示符cmd下登陆出错. 我最终的解决办法是: 我先去看了一下我的my.ini配置文件. 新版5.7的配置文件不是在安装目录,而是在programDat/mysql文件目录下 打开文件之后: 我在安装的时候修改了默认端口3306为8082, 在cmd登陆的时候仍然是默认端口登陆的,所以会报错.那么在登陆的 时候可以指定端口, -P一定要大写. mysql报错ERROR 2003 (HY0

长久不用的mysql报错ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

mac上安装过mysql: 然而,尝试连接时报错: $ mysql -u root -p Enter password: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 尝试去查看mysql.socket文件,发现没有.. $ which mysql /usr/local/bin/mysql 然后试试重启mysql: $ mysql.server start

mac 安装mysql 报错“ERROR 2002 (HY000): Can not connect to local MySQL server through socket '/tmp/mysql.sock' (2)” 解决办法

首先安装 homebrew 再 brew install mysql 之后连接 mysql 无论是登录还是修改初始密码都会报如下的错误 ERROR 2002 (HY000): Can not connect to local MySQL server through socket '/tmp/mysql.sock' (2) 运行如下解决:参考 http://www.thinksaas.cn/group/topic/347978/ unset TMPDIR mysql_install_db --v

Mac brew 安装mysql 报错 ERROR 2002 (HY000): Can't connect to local MySQL server through socket

安装mysql 最新版 56 brew install mysql 启动报错 ben:~ soul$ which mysql /usr/local/bin/mysql ben:~ soul$ mysql ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 解决办法 运行 ben:~ soul$ mysql.server start Starting MySQL .

MySQL登录报错ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

[[email protected] mysql3307]# /opt/mysql3307/bin/mysql -upisp [email protected]123 mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.so

CentOS命令登录MySQL时,报错ERROR 1045 (28000):

CentOS命令登录MySQL时,报错ERROR 1045 (28000): Access denied for user [email protected] (using password: NO)错误解决方法 1.停用mysql服务:# /etc/rc.d/init.d/mysqld stop 2.输入命令:# mysqld_safe --user=mysql --skip-grant-tables --skip-networking & 3.登入数据库:# mysql -u root my