6

在一个事务内插入大量数据会怎么样

 3 years ago
source link: https://www.v2ex.com/t/800340
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  MySQL

在一个事务内插入大量数据会怎么样

  git00ll · 16 小时 51 分钟前 · 1459 次点击

mysql,讨论下面两种场景

开启事务
插入 1000 万条数据
提交事务
开启事务
插入 1000 万条数据
回滚事务

会不会导致数据库挂掉。

如何做到安全插入大批量数据进数据库

17 条回复    2021-09-08 00:16:43 +08:00

HamQ

HamQ   16 小时 42 分钟前

mysql 不清楚 oracle 6 曾经试过 没遇到任何问题 纵然插入数据途中服务器强制断电也没问题

BiChengfei

BiChengfei   16 小时 40 分钟前

产品经理都不敢提的需求
不过可以思考下 insert into A_bak select * from A

Sasasu

Sasasu   15 小时 51 分钟前   ❤️ 4

开启事务 插入 1000 万条数据 提交事务。不会
开启事务 插入 1000 万条数据 回滚事务。会开始 undo,卡很久。

bk201

bk201   15 小时 12 分钟前

我觉得没啥影响,但是事务会超时。

cheng6563

cheng6563   14 小时 29 分钟前

实际上开事务会快很多,很多 GUI 工具的导入功能都会自动开个事务。

sy20030260

sy20030260   13 小时 0 分钟前

@Sasasu 请问下,这里的「卡很久」应该只是卡当前 session ?其他的读写请求也会阻塞?

haoliang

haoliang   12 小时 59 分钟前

同好奇,搜索了下。

参考这里: https://mariadb.com/kb/en/how-to-quickly-insert-data-into-mariadb/#using-big-transactions

> When doing many inserts in a row, you should wrap them with BEGIN / END to avoid doing a full transaction
> (which includes a disk sync) for every row. For example, doing a begin/end every 1000 inserts will speed up your > inserts by almost 1000 times.
> ...
> The reason why you may want to have many BEGIN/END statements instead of just one is that the former will use up less transaction log space.

然后发现了一个 [transaction log]( https://mariadb.com/kb/en/innodb-redo-log/ ),估计事务的一部分代价吧

msg7086

msg7086   12 小时 57 分钟前

理论上只要你硬盘够大够快,就没什么问题。回滚无非就是烧点硬盘性能罢了。

haoliang

haoliang   12 小时 51 分钟前

幸好我看到了 @Sasasu 的留言,这个 transaction log 应该对应的是 [innodb undo log]( https://mariadb.com/kb/en/innodb-undo-log/ )

auxox

auxox   12 小时 20 分钟前

binlog 可能会把磁盘打爆

FaceBug

FaceBug   12 小时 17 分钟前

既然存在不安全的可能性,有没有可能,插入的过程中,程序本身挂掉了

MonkeyJon

MonkeyJon   11 小时 58 分钟前

为什么要一次性插入那么多数据,分批次,批量插入不好嘛

gBurnX

gBurnX   11 小时 55 分钟前

@HamQ

强制断电过分了啊。

只看软件部分,在严格按照鲁棒性要求,做好各种情况的失败处理,并且测试到位,那么用户在生产系统里,强行杀死软件进程,或强制关机,是不会影响到数据安全的。

但强制断电,万一内存条、磁盘甚至 CPU 等硬件炸了,软件再强也没办法了。

lyjr

lyjr   10 小时 52 分钟前

假如 mysql 的 redo 日志配置如下:
innodb_log_files_in_group=4
innodb_log_file_size=4G
则 redo 日志文件总大小就是 16G,写入数据超过了就必然报错了。但其实 mysql 会作 redo 容量预测,有些 mysql 版本远远没到总大小(只到十分之一)就报错了。
redo 日志也比原始写入数据要大,redo 日志构造加入很多元数据,而且 undo 空间也要受 redo 保护,同样耗费 redo 资源。

Sasasu

Sasasu   9 小时 28 分钟前

@sy20030260 理论上应该没有全局锁,但是会吃满你的硬盘 IO,别的东西动弹不了

xuanbg

xuanbg   9 小时 2 分钟前

当然要开启事务了。不过我一般是读 500 写 500,循环到数据搬运完。1000 万一次怼,内存估计会直接爆掉吧。

iseki

iseki   4 小时 2 分钟前

挂掉是不会的,成熟的数据库都不会,如果挂了那就是 bug 。不过如果超过了日志限制会报错回滚的。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK