我正在尝试在本地主机上使用 pg_dump 将 4GB 的 PostgreSQL 数据库转储到远程计算机上。我的本地主机报告有 15GB 可用空间。我将输出传输到 gzip。但是,经过大约 15 分钟的处理后,pg_dump 中止,并显示“pg_dump:[tar archiver] 无法写入输出文件:设备上没有剩余空间”。我不断监控机器上的可用磁盘空间量,它始终保持在 ~10GB 范围内。为什么 pg_dump 会因为磁盘空间不足而过早失败,即使还有足够的空间?
我的命令如下:
pg_dump -c --host=${HOST} --username=${DATABASEUSER} --blobs --format=t ${DATABASE} | gzip -c > /tmp/db-backup.tar.gz
答案1
我建议将转储格式更改为自定义格式 (-Fc、--format c),完全避免使用 tar 格式。据我所知,使用 tar 格式代替自定义格式没有任何优势(两者都适用于 pg_restore)。
从字里行间看,我怀疑您正在尝试使用“tar”输出格式,该格式确实需要创建很大的临时文件。如果我猜对了,我建议改用“自定义”格式。tar 格式确实没有任何优势,除了这一点之外还有几个缺点。
从http://postgresql.1045698.n5.nabble.com/Out-of-space-making-backup-td1904089.html
如果您的安装来自软件包,那么您可能有“开箱即用的”自定义格式 (zlib) 支持。您可以使用 -Z 选项(默认值为 6)控制压缩级别,范围从 0(无压缩)到 9。
顺便检查一下你的 -c 选项。根据http://www.postgresql.org/docs/9.0/static/app-pgdump.html
输出命令以在创建数据库对象之前清理(删除)数据库对象。
该选项只对纯文本格式有意义。对于存档格式,你可以在调用 pg_restore 时指定该选项。
BTW2 为了方便起见,您可以使用自动 PostgreSQL 环境变量,例如 PGHOST、PGUSER、PGDATABASE、PGPORT。
答案2
PostgreSQL 中的 tar pg_dump 格式将任何一个表的大小限制为 8GB(在应用压缩之前)。而 4GB 的数据库不会转储到 4GB 的文件中;对于某些数据类型,文本格式会更大,而且由于我看到您转储了 blob,因此您很容易就属于这一类。因此,另一种可能性是,您有一个表,例如 3GB;转储时会扩展到 >8GB;并且您达到了 tar 限制,该限制在压缩开始之前强制执行。如果发生这种情况,则以纯文本或自定义格式转储可以消除您的问题。
另一种可能性是,您的驱动器大小约为 10GB,占其中的 5%。如果您的分区约为 200GB,则可能会达到限制,即在 ext4 上为根目录保留 5% 的空间。如果是这种情况,您可以使用类似下面的方法消除这种情况:
sudo tune2fs -m 0 /dev/sda1