从 NDBCLUSTER 收到错误 4239“具有给定名称的触发器已存在”
Posted
技术标签:
【中文标题】从 NDBCLUSTER 收到错误 4239“具有给定名称的触发器已存在”【英文标题】:Got error 4239 'Trigger with given name already exists' from NDBCLUSTER 【发布时间】:2014-06-16 11:07:57 【问题描述】:我们正在运行 mysql 集群版本:
mysql> SELECT VERSION();
+------------------------------+
| VERSION() |
+------------------------------+
| 5.6.15-ndb-7.3.4-cluster-gpl |
+------------------------------+
尝试创建表
CREATE TABLE xy (
xa VARCHAR(36) NOT NULL DEFAULT '',
xb VARCHAR(255) NOT NULL,
xc TIMESTAMP NOT NULL,
xd VARCHAR(36) DEFAULT NULL,
xe VARCHAR(36) DEFAULT NULL,
xf VARCHAR(255) DEFAULT NULL,
xg VARCHAR(255) DEFAULT NULL,
xh TEXT,
xi BIGINT(20) DEFAULT NULL,
xj VARCHAR(255) DEFAULT NULL,
xk VARCHAR(255) DEFAULT NULL,
xl VARCHAR(255) DEFAULT NULL,
xz VARCHAR(255) DEFAULT NULL,
xy VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (xa)
) engine=ndb;
带给我(通过命令行直接输入):
ERROR 1296 (HY000): Got error 4239 'Trigger with given name already exists' from NDBCLUSTER
并通过文件:
ERROR 1296 (HY000) at line 8: Got error 4239 'Trigger with given name already exists' from NDBCLUSTER
但是没有mysql触发器:
mysql> SHOW triggers;
Empty set (0.00 sec)
没有桌子:
mysql> show tables;
Empty set (0.01 sec)
有人有想法吗?
【问题讨论】:
您是否尝试更改表的名称?我的意思是,“xy”可能已经被 MySQL 中的某些东西使用了。 真名不是xy——只是匿名化了;) 你给它的名字可能已经被使用了。 你确定你正在执行好的文件吗?真的很奇怪,我以前从未见过这样的错误。 我对 MySQL 复制的了解不够,无法做出真正的猜测,但我想复制实际上是由触发器完成的。我要检查的第一件事是以前是否存在同名的表。如果是这样,也许当它以某种方式被删除时,它的触发器没有被删除。现在,当尝试创建同名表时,数据库会自动尝试为其创建复制触发器,并且生成的触发器名称是基于表名的,因此会发生冲突。这些触发器不会与show triggers
一起显示,因为它们不是用户创建的触发器。
【参考方案1】:
好的 - 我们知道了!
config.ini 中的MaxNoOfTriggers
已到达。
来自Official documentation -> MaxNoOfTriggers:
为每个唯一哈希索引分配内部更新、插入和删除触发器。 (这意味着为每个唯一哈希索引创建三个触发器。)但是,有序索引只需要一个触发器对象。备份还为集群中的每个普通表使用三个触发器对象。
集群之间的复制也使用内部触发器。
该参数设置集群中触发对象的最大数量。
默认值为 768。
【讨论】:
以上是关于从 NDBCLUSTER 收到错误 4239“具有给定名称的触发器已存在”的主要内容,如果未能解决你的问题,请参考以下文章
“无法获取表元数据”“从 NDBCLUSTER 收到错误 157‘未知错误代码’”
MySQL Cluster ERROR 1296 (HY000): 从 NDBCLUSTER 得到错误 157 'Unknown error code'