【发布时间】:2023-02-23 02:54:19
【问题描述】:
我在一个架构 (db1) 上有一个表 (my_table),我正试图迁移到同一服务器上的另一个架构 (db2)。为此,我在 db1 上创建了一个触发器,用于对 my_table 进行插入、更新和删除,实质上是将操作复制到 db2.my_table。一切都在开发中运行良好,但我们有一个奇怪的设置,其中这两个模式位于不同的 docker 图像上以用于迁移目的。所以 db1 在一个容器上,db2 在另一个容器上,两个不同的 mysql 服务器实例。
这会导致本地复制触发器出现问题,因此我在其中添加了一个 IF 子句,以确保在触发之前服务器上存在 db2。例如,这是 AFTER INSERT 触发器:
create trigger insert_my_table
after INSERT
on db1.my_table
for each row
begin
IF
(SELECT EXISTS(SELECT SCHEMA_NAME
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'db2')) THEN
insert into db2.my_table
select *
from db1.my_table ff
where ff.id = NEW.id
on duplicate key update db2.my_table.id=NEW.id;
END IF;
end;
现在我可以毫无问题地在my_table 本地插入新行。但是,如果我尝试在插入之前锁定表格(例如 mysqldump 所做的):
lock tables `my_table` write;
insert into my_table (id, name, description) value (1, 'test', 'test_desc');
然后我得到这个错误
"ERROR 1100 (HY000): Table 'my_table' was not locked with LOCK TABLES"
是什么赋予了?有什么我忘记了吗?
【问题讨论】:
标签: mysql docker triggers innodb