我们遇到了一些问题,DBA或开发人员会意外地做一些事情,

insert into `newtable`
select * from `verylargetable`

在运行此查询10分钟(或可能1小时!)后,我们收到alert ,指出有一个进程正在运行很长时间.问题是,回滚过程与原始问题一样糟糕.

这些通常用于分析工作负载,最好只是取消查询.即使插入了部分行,也比等待20分钟或更长时间才能回滚查询要好.

在InnoDB中,是否有一种方法可以自动提交每行,或者当查询中的大插入完成时,每X行自动提交,或者只是告诉MySQL,如果事情被取消,不要回滚所有东西?我知道这不是InnoDB的设计目的,但MyISAM基本上被弃用,这就是我们所拥有的.

推荐答案

没有办法创建一个单独的SQL语句,即使在执行过程中增量提交INSERT...SELECT条.InnoDB将每个语句视为原子.

如果问题是希望防止意外复制大量包含INSERT...SELECT的行,则可以将safe_updatesmax_join_size设置为某个限制值.

例如,我将其设置为100(默认值为18446744073709551615).然后,我试着将测试表中的行复制到它自己(该表有几千行).

% mysql --safe-updates --max-join-size=100

mysql> insert into t (t) select t from t;
ERROR 1104 (42000): The SELECT would examine more than MAX_JOIN_SIZE rows; 
check your WHERE and use SET SQL_BIG_SELECTS=1 or SET MAX_JOIN_SIZE=# 
if the SELECT is okay

有关安全更新模式的更多详细信息,请阅读https://dev.mysql.com/doc/refman/8.0/en/mysql-tips.html#safe-updates.

Mysql相关问答推荐

如何在逗号分隔字符串值中使用LEFT函数

无条件理解MySQL中内连接和交叉连接的相似性

找出同一表中列A中的每个值在列B中出现的次数

如何在使用VALUES()插入时指定jOOQ中的行别名

为分组记录MySQL取取值为TRUE的单行

在MySQL CLI中,是否有自动完成过程的方法?

获取连续11天未考勤的员工

在 .NET 6 中使用 Dapper Framework 未能成功连接到 MySql

mysql 代码给我的外键格式不正确

使用索引进行查询优化

如何在 MySQL 中使用从 SELECT IF 返回的布尔值

一次更新mysql中的多个列

MySQL过滤食谱上的多对多 - 成分表

在 MySQL 中转换 JSON 数组值

动态创建内联 SQL 表(用于排除左连接)

如何在 Windows 上访问 xampp 的命令行

有没有办法在 Zend Framework 1.5 中执行INSERT...ON DUPLICATE KEY UPDATE?

Doctrine2 迁移向下迁移并从浏览器而不是命令行迁移

我可以在单个 Amazon RDS 实例上创建多少个数据库

使用 Docker 我收到错误:SQLSTATE[HY000] [2002] 没有这样的文件或目录