在MySQL gzip备份期间使用内存

您好在EC2服务器上我正在使用以下来从另一台服务器gzip SQL:

mysqldump -h $HOST -u $UNAME -p$PWORD --single-transaction $1 | gzip -5 > $2_`date +%d`.sql.gz 

目前SQL数据是560 Mb,这里是来自“免费”的信息:

  total used free shared buffers cached Mem: 2049568 1731356 318212 360 144328 529472 -/+ buffers/cache: 1057556 992012 Swap: 0 0 0 

我想知道如果我有1 Gb或2 Gb的SQL数据会如何工作? 它是否在接收数据时使用gzip来最大限度地减lessRAM的使用? 还是先得到整个SQL数据然后gzip呢?

除远程系统上的转储外,此命令可以使用令人惊讶的小内存。 Mysqldump可以根据需要将数据文件分页到内存中。 索引不太可能被使用,所以不需要读取数据文件中的所有块。 除了从磁盘读取数据块的额外I / O之外,还可能有额外的I / O将其replace为缓冲区。 由于这是在另一个系统上发生的,本地影响只是networking数据缓冲区的less量内存,less量的mysqldump需要构build输出。

 mysqldump -h $HOST -u $UNAME -p$PWORD --single-transaction $1 

在Linux / Unix平台上,pipe道将只使用足够的内存来阻塞将数据缓冲到gzip。 gzip会缓冲一些数据,使其优化压缩。 较高的压缩值可能会缓冲更多的数据,并且需要更多的CPU。 来自mysqldump的数据是高度可压缩的,因为输出中有很长的重复string。

  |  gzip -5 

redirect将在将数据写入磁盘之前再次阻塞缓冲区数据。 这大部分将使用logging为缓冲区的内存。 现代文件系统在将数据清空到磁盘之前可能会在内存中保留数秒的数据。

  > $ 2_`date +%d`.sql.gz 

数据缓冲区写入后将保留在池中。 如果系统需要空闲内存,这些块将被快速回收。 我已经使用了系统,需要花费数天时间来填充内存,以便数据缓冲区需要被回收。 虽然看起来您使用的内存略微超过了caching和caching的一半,但caching和caching可以显着提高性能。

如果在一台服务器上发生这种情况,则可能会强制从缓冲池中将mysql文件阻塞。 当请求读取时,这些将从内存而不是磁盘提供。 这可能会降低mysql的性能,直到块被replace。 但是,在远程系统上,当数据读入内存时,主动读取块可能被强制排除。