SSD上的大量MySQL数据导入会损坏它吗?


28

我必须将大量数据(约1亿行,~100次)导入MySQL数据库。目前,它存储在我的硬盘驱动器上,导入的瓶颈似乎是硬盘驱动器的写入速度。

我听说SSD不喜欢大量连续写入,并且它往往会损坏它们。你怎么看?这真的是现代固态硬盘的问题吗?


只要您在分区区域外留出(比方说)2-3GB以进行过度配置,我想你是安全的。我没有看到它有太多问题。大多数SSD已经拥有操作系统无法访问的部分磁盘。如果硬盘驱动器太满,则该空间用于磨损均衡和过度供应。这些额外的GB将为SSD提供更多空间来分发数据以避免损坏。如果你是硬核并希望继续这样做,你可以找出你的ssd有多少内存芯片,并提供1GB的芯片。10个芯片是10个未分区的GB。
Ismael Miguel

5
对于它的价值,我们通常会导入远远超过此数据的数据。我们的一个表中的数据比导入的数据多得多,而且我们有几百个表。我们使用SSD。我希望你会没事的。
ChrisInEdmonton 2015年

4
如今,即使没有操作系统支持,SSD也足够聪明,可以自行处理磨损均衡(即使操作系统要求重写相同的块,SSD的控制器每次都会透明地写入不同的块),所以它会很好。

7
红鲱鱼。固态硬盘的故障率并不是一件令人担心的事情 - 它足够长,以至于它们的寿命仍然比等效的纺纱生锈时间长。
Sobrique 2015年

2
人们对SSD的担心太多了。基本上你永远不会设法“破坏”你的SSD,甚至故意这样做可能需要数周或数月的连续写入。即使你“破坏”它,它仍然会以只读方式提供数据。别担心,只是使用它。您还可以询问硬盘的读/写磁头如何因加速度而磨损。
mic_e 2015年

Answers:


27

这真的不是一个直截了当的答案。

SSD不关心连续写入,也不关心任何特定扇区被覆盖的次数。当SSD首次出现时,像SQL这样的东西是一个坏词,因为操作系统通常像传统硬盘驱动器一样对待驱动器,故障非常频繁。

从那时起,驱动器变得更大,更便宜,更可靠,意味着更多读/写,操作系统变得更加智能。

SQL中的SSD不仅常见,而且经常受到鼓励。随意浏览DBA姐妹网站

我的想法是这样做,假设SQL服务器是使用冗余磁盘正确构建的。如果没有,那么无论如何最终都会失败。


5
“如果没有,那么最终还是会发生失败。” 如果服务器确实使用了冗余磁盘,那么肯定会在某些时候出现故障,并为此做好计划。只是在冗余到位的情况下,单个存储设备故障导致系统停机的可能性要低得多。
2015年

@MichaelKjörling是的,确切地说。在我看来,“正确构建”也假设在发生故障的情况下备份数据库......但有时甚至需要说的还有可以保留未说明的内容,谢谢。
Austin T French

19

读取很好,SSD可以读取它们的位而没有任何不利影响。

写作是另一回事。清除一点会影响该位的完整性,并且在大量顺序写入之后,该位将完全停止接受新写入。然而,它仍然可以阅读。

我只想说新企业驱动器的写入限制是巨大的。以三星新推出的845DC Pro为例。在保修期内,5年内每天可以进行10次驱动器写入。我想它会做两倍的数字。把它归结为数字,这是800 GB模型上5年内写入的14,600 TB。
或者每年2920 TB,
或者每天8 TB,为期五年

给我看一个硬盘驱动器,其保修范围涵盖了这么多用途。我甚至不确定你能在一天内写入8 TB的硬盘: - (50 MB / s平均吞吐量* 60(秒)* 60(分钟)* 24(小时)= 4,320,000 MB /天= 4.32 TB /事实证明你不能(平均驾驶)。

只要您使用这样的驱动器,基于V-NAND(或同样耐用的SLC),而不是基于TLC或坏MLC闪存的驱动器,您应该没问题。无论如何,RAID 10和备份是你的朋友有一个原因。至少如果SSD写入限制确实成为问题,您仍然可以读取存储在故障位中的数据。

固态硬盘的运行成本也更低,更酷,更安静,企业型号特别耐电力问题。没有更多的头部崩溃担心,当然,您的数据库访问需求的巨大性能提升。


12
我可以问为什么选择downvote?
Ctrl-alt-dlt 2015年

你可以问,但显然你不会收到。
Nic Hartley 2015年

12

写入SSD并不一定是坏事。这是单个块的写入和重写,这很糟糕。这意味着如果您编写文件删除它然后再次写入,或一遍又一遍地对文件进行少量更改。这会导致SSD的磨损。数据库绝对适合这一类。

但是根据这篇文章,已经有数PB的数据被写入SSD并且仍然可以运行。这可能是由于磨损均衡的进步:

磨损均衡尝试通过排列数据来解决这些限制,以便在介质上均匀地分配擦除和重写。以这种方式,由于高写入周期的集中,没有单个擦除块过早地失效。

在您的特定情况下,我会将数据库驻留在SSD上以提高速度,但每天都会备份。您也可以考虑在RAID 1阵列中获得两个SSD 。两个SSD同时出现故障的可能性很低。

注意:RAID阵列不是备份!!!! 无论您是否使用RAID阵列,都要备份。无论您是否使用SSD,都要备份。


1
对于你所说的伤害类型,RAID1会做的很少。磨损等级可能是确定性的,这意味着它们将以完全相同的速率和方式磨损,导致错误几乎完全发生在相同的地方。
Aron 2015年

来自链接的文章:“在NAND耗尽之前,SSD中的电子设备将会失效”......等等,什么?
迈克尔

4

我们假设您的导入不涉及更新,也没有删除。所以你要做所有的插入。这应该只是将新数据写入事务日志。

这意味着随着数据的添加,它总是被写入新的扇区。可能会有一些缓冲/交换多次被搅拌/写入,但忽略这一点,所有这些插入理论上会导致每个扇区不超过一次写入。根据MySQL的实现方式以及您正在执行的批量插入,当事务日志集成到主数据文件中时,您可能会在以后生成第二组写入(我对不同的数据库引擎有所了解) ,并假设MySQL在刷新事务日志方面有些相似)。

重点是,你不是在“搅拌”SSD。也就是说,你没有进行大量的修改/移动/删除/等等。这可能会多次重写相同的扇区。所以你基本上只会为每个扇区生成非常少量的写入,这才是真正重要的。

假设您没有完全填满SSD,那么应该有足够的空间用于那些正在搅拌的热点(例如缓冲器/交换),以通过磨损均衡算法最小化磨损。

(索引可能是另一回事。由于许多数据库中的聚簇索引在插入数据时涉及很多修改。通常在数据仓库环境中执行大型isnerts时,在批量导入期间关闭索引然后更新它们。)


3

这不是问题。

首先,SSD在过去几年中有了很大的改进。过度配置和磨损均衡(以及少量,TRIM命令,虽然在您的情况下不适用)使它们非常适合作为重型通用磁盘。我没有在我的开发PC上使用除SSD以外的任何东西(它经常进行大量编译),甚至没有在擦除周期数附近。

此外,这句话:

SSD不喜欢大规模连续写入,并且它往往会损坏它们

是完全错误的。情况恰恰相反,频繁的小写操作(如果有的话)可能会对SSD造成损害。

与传统硬盘不同,SSD(或者更确切地说是基于NAND的闪存)在物理上组织成大块,逻辑上包含多个扇区。典型的块大小是512kB,而扇区(文件系统使用的单位)传统上是1kB(不同的值是可能的,二十年前512B是常见的)。
使用512kB块可以完成三件事。它可以被读取,部分或全部可以被编程(=写入),并且可以擦除整个部分。擦除是有问题的,因为擦除周期数量有限,并且您只能擦除完整的块。

因此,大写非常适合SSD,而小写不是。

在小写入的情况下,控制器必须读取块,修改副本,擦除不同的块并对其进行编程。如果没有缓存,在最糟糕的情况下,您需要擦除512.000块才能写入512 KB。在最好的情况下(大型连续写入),您需要完成1次擦除。

导入MySQL数据库与执行许多单独的插入查询有很大不同。引擎能够将大量写入(数据和索引)合并在一起,并且不需要在每对插入之间进行同步。这相当于一个更友好的SSD写入模式。


2
部门传统上是1 KiB?请引用。在旋转驱动器上,两个扇区大小是常见的:512字节(传统的,就像在我的4 TB HDD上,在IBM兼容机中可以追溯到大约1981年左右)和4096字节(“高级格式”)。文件系统级别分配单元的大小可能不同,但这是一个完全不同的问题,并且纯粹是一个文件系统构造,以使数据结构跟踪分配在文件系统中的合理大小,而不会根据需要动态增长它们; 此外,我怀疑固定的1 KiB块大小在实践中非常普遍。
2015年

@MichaelKjörling:感谢您提供非常宝贵的意见。你当然读过并理解了答案,不是吗?相关的事实是SSD的物理块大小比这大得多,无论逻辑扇区大小如何(我已经看到500到4096字节,甚至两个不同的大小)。不需要引用。
达蒙2015年

1

SSD不喜欢它。如果您将最大写入速度保持5到10年(每天24小时,每周7天),那么最终可能会出现SSD故障。

OFC。5年后,大多数服务器都达到了经济效益。


免责声明:
不要尝试使用第一代SSD。那些不那么健壮的人。


我很清楚,以最大容量7/24使用任何磁盘最终都会损坏它...我的问题是它是否在有限的时间内是安全的(让我们说几次2-3小时)
christophetd

@christophetd - 这取决于。更新您的问题以估算数据量。它更多的是关于驱动器的百分比。在80GB SSD上每小时写入20GB是最糟糕的,然后在1TB SSD上每小时写入20GB。
Ramhound 2015年

同样注意事项:大多数空驱动器意味着许多“空”闪存单元用于磨损均衡。(并且具有相同数据量的更大驱动器是%-while emtier)。
Hennes 2015年

1

如果您真的对确定详细信息感兴趣,那么您需要回答以下问题:

平均每行有多少字节?

如果你可以告诉我有10列,每列是varchar(100),编码是UTF-8那么我可以猜测在最坏的情况下你每行有4,000个字节的数据,并添加更多的字节元数据所以说4,200个字节?

你的酷刑SQL计算4,200 x 100 x 100,000,000 = 42,000,000,000,000 bytes写入磁盘的数据

42,000,000,000,000 / 1000 = 42,000,000,000 KB

42,000,000,000 / 1000 = 42,000,000 MB

42,000,000 / 1000 = 42,000 GB

42,000 / 1000 = 42 TB

在这种理论上最糟糕的情况下,您将向磁盘写入42 TB

根据@KronoS提供的这篇文章,你应该对你的酷刑SQL大约25回合好。


-2

正如这篇关于SSD的文章的海报所说,真正有害的是一次又一次地编写小块数据。

  • 位存储在{1,2,3}位单元中。这些寿命有限。
  • 单元格被分组为[2-16] KB页面(最小可写单元)
  • 页面分为(128-256页)块(最小可擦除单位)
  • 对于要重写的页面,它 - 以及它的整个块---需要先被删除

这就是建议的原因

  • 从不写一页不到一页,
  • 缓冲小写,和
  • 单独的读写请求
  • “大型单线程写入比许多小型并发写入更好”

所以,一次真正的大量似乎更好。


2
这个答案并没有真正提供任何尚未说过的相关信息,此外,它基本上是一个包含在其中的链接的评论。
Ramhound 2015年

@Ramhound:你会赞同你的评论(谢谢,顺便说一句),这也被标记为过时了吗?或者你仍然认为信息已经说/不相关?
serv-inc 2015年

虽然它不再是一个链接,老实说,技术信息本身并不真正适用于用户关于在SSD上运行数据库的问题我
Ramhound 2015年

@Ramhound:对我来说,它似乎是关于导入,而不是运行。从downvotes上看,它好像你是对的
SERV-INC
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.