MySQL正在执行一个";“无影响”;使用复制避免锁定的临时插入

MySQL正在执行一个";“无影响”;使用复制避免锁定的临时插入,mysql,locking,replication,temporary,read-committed,Mysql,Locking,Replication,Temporary,Read Committed,所以,我们正在尝试运行一个进入屏幕的报告,它不会更改任何存储的数据。 但是,它很复杂,因此需要遍历几个(临时*)表 它从被复制的活动表中提取数据 当涉及到从中获取“合格”记录时,最糟糕的是 临时预信用证 并从实时数据中填充它们,以创建下一个(临时*)表输出 有效地导致: 插入临时后计算(…) 选择。。。 来自临时预信用证 在…上加入live_Tab1。。。 在…上加入live_Tab2。。。 在…上加入live_Tab3 该报告不是一个“确定”的答案,人们期望它只是一个“快照”报告,一旦出现在屏

所以,我们正在尝试运行一个进入屏幕的报告,它不会更改任何存储的数据。 但是,它很复杂,因此需要遍历几个(临时*)表

它从被复制的活动表中提取数据

当涉及到从中获取“合格”记录时,最糟糕的是

临时预信用证

并从实时数据中填充它们,以创建下一个(临时*)表输出

有效地导致:

插入临时后计算(…) 选择。。。 来自临时预信用证 在…上加入live_Tab1。。。 在…上加入live_Tab2。。。 在…上加入live_Tab3

该报告不是一个“确定”的答案,人们期望它只是一个“快照”报告,一旦出现在屏幕上,它就会过时

没有顺序或再现性问题

因此,理想情况下,我会将事务隔离级别降低到读取提交的。。。 但是,我不能,因为live_Tab1、2、3是用BIN_LOG语句类型复制的

该语句非常可爱且快速—几乎不需要任何时间来运行,因此资源负载现在比以前少了(它将选择和插入分开),但它会等待(据我所知),因为选择会等待live_选项卡上的可重复/可同步锁,以便安全地复制任何结果。 事实上,由于等待,现在需要更多的时间

我希望在响应时间方面看到性能优势

除了数据被写入(临时*)表,然后被丢弃

没有live_uu表目标-只有源

    • 这些表实际上不是临时表,而是动态创建和丢弃的InnoDB表,因为报表计算需要自连接和删除。。。但它们是暂时的
我现在似乎在兜圈子寻找答案


我没有超级特权,也不想要它。。。 因此,无法为此连接会话设置BIN_LOG=0(为什么这是一个要求?)

所以

如果我有一个临时数据库或表通配符,它将所有临时表从复制中排除。。。 (我正在我的接待中心等待这项变更)

请允许我

设置会话事务隔离级别READ COMMITED

插入临时后计算(…) 选择。。。 来自临时预信用证 在…上加入live_Tab1。。。 在…上加入live_Tab2。。。 在…上加入live_Tab3。。。 ;

还是我会得到我的

无法执行语句:无法写入二进制日志,因为 BINLOG_FORMAT=语句,并且至少有一个表使用存储引擎 仅限于基于行的日志记录…”

即使这在技术上不是真的? 我希望它会这样做,因为我认为复制将启动,因为它看到“INSERT”语句,并将对涉及复制合格的任何表进行简单检查,即使没有任何目标实际上符合复制合格的条件

还是会让我惊喜

我真的无法面对像这样令人不快的解决方案

选择以导出文件 加载数据填充

事实上,我甚至不认为我可以使用它-我如何获得唯一的文件名?我该如何清理它们? 这些报告由最终用户直接按需运行,我只有对服务器的MySQL接口访问权限


或者通过PHP客户端将其流式传输,只是为了将INSERT和SELECT分开,以便MySQL不会对哪些表符合复制条件感到不安……

因此,看起来唯一的方法似乎是:

我们创建第二个模式“ScratchTemp”。。。 设置可怕的复制--replicate ignore db=ScratchTemp

我的“本地”查询代码打开一个新的mysql连接,并执行USE ScratchTemp; 因为我选择了默认的数据库“ignore”d-one,所以我的任何查询都不会被复制

所以我需要非常小心,不要在这里执行任何真正的查询

通过在我的查询中使用模式限定名作为前缀,引用我的临时表和实际数据表

e、 g。 插入LiveSchema.temp_PostCalc(…)选择。。。从LiveSchema.temp_PreCalc加入LiveSchema.live_Tab1等,如上所述

然后尽快关闭此连接,因为打开非复制连接是非常危险的


叹气…?

作为参考,同时,我实现了一个大型SELECT,通过(php)客户端读取数据,然后通过一次几十行的“捆绑”插入流式输出数据。这确实给了我性能的提升,以及我所期望的响应时间的实际可见的缩短。。。。但仍然让我更希望使用不带锁的插入选择,因为这会毫无理由地通过php客户端传输大量数据。因此,看起来唯一的方法似乎是: