有一台 MySQL(percona,14.14 Distrib 5.6.28-76.1)机器,配有 1TB SSD,托管约 712Gb 的 mysql 数据。MySQL 有 4 个数据库,其中 database1 占用了大部分空间,656Gb。我们称这台机器为 machine1。
想要重建另一台具有完全相同配置的 MySQL DB 机器,例如 machine2。因此在 machine1 上创建了 LVM 快照。
df -h 命令将显示 MySQL 和 LVM 分区的以下输出:
On Machine1, after taking LVM snapshot:
/dev/mapper/vgmysql-mysql_tmp 100G 33M 100G 1% /var/tmp/mysql
/dev/mapper/vgmysql-mysql 900G 713G 188G 79% /var/lib/mysql
/dev/mapper/vgmysql-mysql_snapshot 900G 713G 188G 79% /var/cache/mylvmbackup/mnt/backup
/dev/mapper/vgroot-mysql_backup 905G 33M 905G 1% /var/cache/mylvmbackup/backup
使用 NFS 导出挂载选项将 machine2 的 SSD 分区 (/var/lib/mysql) 挂载到 machine1 上,并从 LVM 快照执行 rsync 到远程挂载。挂载远程分区并执行 rsync 后,df -h 在 machine1 上显示以下输出。
On Machine1, after rsyncing to Machine2's remote mount:
/dev/mapper/vgmysql-mysql 800G 713G 88G 90% /var/lib/mysql
/dev/mapper/vgmysql-mysql_tmp 100G 33M 100G 1% /var/tmp/mysql
/dev/mapper/vgmysql-mysql_snapshot 800G 712G 89G 89% /var/cache/mylvmbackup/mnt/backup
/dev/mapper/vgroot-mysql_backup 805G 33M 805G 1% /var/cache/mylvmbackup/backup
machine2:/var/lib/mysql 900G 864G 36G 97% /mnt/machine2
因此,在 rsync 之后,数据的总大小增加了 150Gb。比较每个单独文件的大小和文件数量,发现它们都相同。使用ls -l
和du
命令检查大小。检查 machine2 上的分区大小时,输出结果如下,确认磁盘使用量已增加:
On Machine2:
/dev/mapper/vgmysql-mysql_tmp 100G 33M 100G 1% /var/tmp/mysql
/dev/mapper/vgmysql-mysql 900G 864G 36G 97% /var/lib/mysql
删除了 machine2 上的所有数据,并重新执行了 rsync,结果还是一样。现在,MySQL 总共拥有 4 个数据库,我们分别称之为数据库 1、数据库 2 .... 和数据库 4。每个数据库在 /var/lib/mysql 中都有自己的目录。
如前所述,database1 的大小最大,约为 656Gb。检查 machine2 上 /var/lib/mysql 中 database1 目录的大小时,其大小约为 799G。其余所有目录和文件的大小相同。检查每个文件(ibd 和 frm)并将它们与 machine1 上的文件进行比较,发现每个文件的大小相同。没有额外的隐藏文件。
因此再次删除所有数据,销毁逻辑卷 (/dev/mapper/vgmysql-mysql) 并重新创建它们。再次执行 rsync 并得到相同结果,磁盘使用量增加了 150Gb。
检查了两台机器上的文件系统 (XFS) 参数,全部相同。使用 ncdu 命令,差异很明显:
总磁盘使用量:864.3GiB 表观大小:713.3GiB 项目:1500
是什么原因导致磁盘使用量增加这么多?我在这里遗漏了什么?
答案1
我不确定,但也许你的 MySQL 正在使用稀疏文件
您可以尝试使用 --sparse 或 --inplace 执行 rsync,如下所述:Rsync 和稀疏文件