我正在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请参阅以下设置.
my.cnf从服务器中找到该文件.对于Linux服务器,这将主要是在/etc/my.cnfinnodb_buffer_pool_size=64MB到此文件要重新启动MySQL服务器,您可以使用以下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 工作台运行 MySQL 窗口。转到服务器 > 服务器状态在顶部它说配置文件:“路径”(C:\ProgramData\MySQL\...\my.ini)
然后在文件“my.ini”中按 control+F 并找到buffer_pool_size. 将值设置得更高,我建议使用 64 MB(默认为 8 MB)。
通过转到实例>启动/关闭>停止服务器重新启动服务器(然后再次启动服务器)
就我而言,我无法从我的表中删除条目。
首先,您可以使用 sql 命令show global variables like 'innodb_buffer%';来检查缓冲区大小。
解决方案是找到您的my.cnf文件并添加,
[mysqld]
innodb_buffer_pool_size=1G # depends on your data and machineRun Code Online (Sandbox Code Playgroud)
不要忘记添加[mysqld],否则,它将不起作用。
在我的情况下,Ubuntu的16.04,my.cnf位于文件夹下/etc/mysql/。
修复错误代码 1206:锁的数量超过了锁表的大小。
就我而言,我使用在带有 WampServer 2.5 的 Windows 上运行的 MySQL Workbench (5.6.17)。
对于 Windows/WampServer,您必须编辑 my.ini 文件(而不是 my.cnf 文件)
要找到此文件,请转到“菜单服务器/服务器状态”(在 MySQL Workbench 中)并在“服务器目录/基本目录”下查看
在 my.ini 文件中定义了不同设置的部分,查找部分 [mysqld](如果不存在则创建它)并添加命令: innodb_buffer_pool_size=4G
[mysqld]
innodb_buffer_pool_size=4G
buffer_pool 文件的大小将取决于您的特定机器,在大多数情况下,2G 或 4G 将解决问题。
请记住重新启动服务器以采用新配置,它为我解决了问题。
希望能帮助到你!