锁的总数超过了锁表大小

max*_*n92 59 mysql sql

我正在MySQL中运行一个报告.其中一个查询涉及将大量行插入临时表.当我尝试运行它时,我收到此错误:

错误代码1206:锁的数量超过了锁表大小.

有问题的查询是:

create temporary table SkusBought(
customerNum int(11),
sku int(11),
typedesc char(25),
key `customerNum` (customerNum)
)ENGINE=InnoDB DEFAULT CHARSET=latin1;
insert into skusBought
select t1.* from
    (select customer, sku, typedesc from transactiondatatransit
    where (cat = 150 or cat = 151)
    AND daysfrom07jan1 > 731
group by customer, sku
union
select customer, sku, typedesc from transactiondatadelaware
    where (cat = 150 or cat = 151)
    AND daysfrom07jan1 > 731
group by customer, sku
union
select customer, sku, typedesc from transactiondataprestige
    where (cat = 150 or cat = 151)
    AND daysfrom07jan1 > 731
group by customer, sku) t1
join
(select customernum from topThreetransit group by customernum) t2
on t1.customer = t2.customernum;
Run Code Online (Sandbox Code Playgroud)

我已经读过,更改配置文件以增加缓冲池大小会有所帮助,但这没有任何作用.无论是作为临时解决方案还是永久性解决方案,解决此问题的方法是什么?

编辑:更改了部分查询.不应该影响它,但我做了一个发现 - 替换所有,并没有意识到它搞砸了.不影响问题.

编辑2:将typedesc添加到t1.我在查询中更改了它但不在此处.

PHP*_*ugs 54

可以通过设置MySQL变量的较高值来解决此问题innodb_buffer_pool_size.innodb_buffer_pool_size将是默认值8,388,608.

要更改设置值,innodb_buffer_pool_size请参阅以下设置.

  1. my.cnf从服务器中找到该文件.对于Linux服务器,这将主要是在/etc/my.cnf
  2. 将行添加innodb_buffer_pool_size=64MB到此文件
  3. 重启MySQL服务器

要重新启动MySQL服务器,您可以使用以下2个选项中的任何一个:

  1. service mysqld restart
  2. /etc/init.d/mysqld restart

引用锁的总数超过了锁表大小

  • 从 MySQL 5.7.5 开始,您可以简单地运行“SET GLOBAL innodb_buffer_pool_size=268435456;”,而无需搜索 my.cnf 文件并重新启动 mysql。/sf/answers/2683313951/ (8认同)
  • 在 Wamp 中是 my.ini (4认同)
  • 请注意,现在的最低要求是 128MB,因此 64MB 不起作用,您需要提供大于 128MB 的内容 (2认同)

Mic*_*man 22

我找到了解决它的另一种方法 - 使用Table Lock.当然,它可能不适合您的应用程序 - 如果您需要同时更新表.

请参阅:尝试使用LOCK TABLES锁定整个表,而不是InnoDB的MVCC行级锁定的默认操作.如果我没有弄错的话,"锁定表"指的是InnoDB内部结构,它存储了MVCC实现的行和版本标识符,其中一位标识正在语句中修改行,并且具有6000万行的表,可能超过分配给它的内存.该LOCK TABLES命令应通过设置表级锁而不是行级来缓解此问题:

SET @@AUTOCOMMIT=0;
LOCK TABLES avgvol WRITE, volume READ;
INSERT INTO avgvol(date,vol)
SELECT date,avg(vol) FROM volume
GROUP BY date;
UNLOCK TABLES;
Run Code Online (Sandbox Code Playgroud)

MySQL公司北美社区关系经理Jay Pipes

  • 使用Mysql 5.1,这个解决方案对我来说也不起作用.也许这不再适用于更新的版本? (7认同)
  • 就我而言,隔离级别并不重要,我将其更改为 READ UNCOMMITED。这解决了锁的问题。但这取决于您的用例。设置事务隔离级别读取未提交; (2认同)
  • 锁定该表似乎并不能阻止行被单独锁定。所以仍然超出了锁表大小。 (2认同)

Mic*_*Sim 13

MySQL文档(你已经阅读过我看到的):

1206(ER_LOCK_TABLE_FULL)

锁的总数超过了锁表大小.要避免此错误,请增加innodb_buffer_pool_size的值.在单个应用程序中,解决方法可能是将大型操作分解为更小的部分.例如,如果大型INSERT发生错误,请执行几个较小的INSERT操作.

如果增加innodb_buffer_pool_size没有帮助,那么只需按照粗体部分上的指示并将你的INSERT拆分为3.跳过UNION并制作3个INSERT,每个INSERT都加入topThreetransit表.


dej*_*oma 5

我正在使用 MySQL 工作台运行 MySQL 窗口。转到服务器 > 服务器状态在顶部它说配置文件:“路径”(C:\ProgramData\MySQL\...\my.ini

然后在文件“my.ini”中按 control+F 并找到buffer_pool_size. 将值设置得更高,我建议使用 64 MB(默认为 8 MB)。

通过转到实例>启动/关闭>停止服务器重新启动服务器(然后再次启动服务器)

就我而言,我无法从我的表中删除条目。


Bra*_*rad 5

首先,您可以使用 sql 命令show global variables like 'innodb_buffer%';来检查缓冲区大小。

解决方案是找到您的my.cnf文件并添加,

[mysqld]
innodb_buffer_pool_size=1G # depends on your data and machine
Run Code Online (Sandbox Code Playgroud)

不要忘记添加[mysqld],否则,它将不起作用。

在我的情况下,Ubuntu的16.04my.cnf位于文件夹下/etc/mysql/


Efr*_*aza 5

修复错误代码 1206:锁的数量超过了锁表的大小。

就我而言,我使用在带有 WampServer 2.5 的 Windows 上运行的 MySQL Workbench (5.6.17)。

对于 Windows/WampServer,您必须编辑 my.ini 文件(而不是 my.cnf 文件)

要找到此文件,请转到“菜单服务器/服务器状态”(在 MySQL Workbench 中)并在“服务器目录/基本目录”查看

MySQL 服务器 - 服务器状态

在 my.ini 文件中定义了不同设置的部分,查找部分 [mysqld](如果不存在则创建它)并添加命令: innodb_buffer_pool_size=4G

[mysqld]
innodb_buffer_pool_size=4G

buffer_pool 文件的大小将取决于您的特定机器,在大多数情况下,2G 或 4G 将解决问题。

请记住重新启动服务器以采用新配置,它为我解决了问题。

希望能帮助到你!