Mysql

MySQL gzip 備份期間的記憶體使用

  • May 18, 2017

嗨,在 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 以最大程度地減少 RAM 使用?還是先獲取整個 SQL 數據,然後再對其進行 gzip 壓縮?

除了遠端系統上的轉儲之外,此命令可以使用令人驚訝的少量記憶體。mysqldump 可以根據需要將數據文件分頁到記憶體中。不太可能使用索引,因此並非數據文件中的所有塊都需要讀取。除了從磁碟讀取塊的額外 I/O 之外,可能還有額外的 I/O 來替換緩衝區中的塊。由於這發生在另一個系統上,本地影響只是網路數據緩衝區的少量記憶體,少量 mysqldump 需要建構輸出。

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

在 Linux/Unix 平台上,管道將僅使用足夠的記憶體來阻止將數據緩衝到 gzip。gzip 將緩沖一些數據以使其能夠優化壓縮。更高的壓縮值可能會緩衝更多的數據,並且需要更多的 CPU。來自 mysqldump 的數據是高度可壓縮的,因為輸出中有很長的重複字元串。

| 壓縮包 -5

重定向將在將緩衝區數據寫入磁碟之前再次將其阻塞。其中大部分將使用記錄為緩衝區的記憶體。在將數據刷新到磁碟之前,現代文件系統可能會在記憶體中保留幾秒鐘的數據。

> $2_`日期+%d`.sql.gz

數據緩衝區在寫入後將保留在池中。如果系統需要空閒記憶體,這些塊將被快速回收。我使用過需要幾天時間才能將記憶體填充到需要回收數據緩衝區的系統。雖然看起來您使用了略多於一半的可用記憶體(不包括緩衝區和記憶體),但緩衝區和記憶體可以顯著提高性能。

如果這一切都發生在一台伺服器上,這可能會強制將 mysql 文件的塊從緩衝池中移出。當請求讀取時,這些將是從記憶體而不是磁碟提供的。這可能會降低 mysql 的性能,直到塊被替換。但是,在遠端系統上,當數據被讀入記憶體時,主動讀取的塊可能會被強制退出。

引用自:https://serverfault.com/questions/850811