我对一个数据库使用了pg_dump命令,现在正试图将生成的.sql文件安装到另一台服务器上。
我正在使用以下命令。
psql -f databasedump.sql
今天早些时候我启动了数据库安装程序,现在已经过去了7个小时,数据库仍在填充中。我不知道这需要多长时间,但我会继续监控它,到目前为止我已经看到了超过1200万条插入记录。我怀疑是否有更快的方法。
我对一个数据库使用了pg_dump命令,现在正试图将生成的.sql文件安装到另一台服务器上。
我正在使用以下命令。
psql -f databasedump.sql
今天早些时候我启动了数据库安装程序,现在已经过去了7个小时,数据库仍在填充中。我不知道这需要多长时间,但我会继续监控它,到目前为止我已经看到了超过1200万条插入记录。我怀疑是否有更快的方法。
pg_dump -Fc -Z 9 --file=file.dump myDb
Fc
输出适合输入到 pg_restore 的自定义归档文件。这是最灵活的格式,因为它允许重新排序加载数据以及对象定义。此格式还默认进行压缩。
Z 9: --compress=0..9
指定要使用的压缩级别。零表示不压缩。对于自定义归档格式,这会指定对单个表数据段进行压缩,默认情况下压缩级别适中。对于纯文本输出,将非零压缩级别设置为整个输出文件都被压缩,就像它已经通过 gzip 处理过一样;但默认情况下不进行压缩。tar 归档格式目前不支持压缩。
并使用以下命令进行恢复:
pg_restore -Fc -j 8 file.dump
-j: --jobs=number-of-jobs
使用多个并发作业来运行pg_restore中耗时的部分,例如加载数据、创建索引或创建约束。该选项可以大大减少将大型数据库恢复到多处理器计算机上运行的时间。
每个作业都是一个进程或一个线程,取决于操作系统,并使用与服务器的单独连接。
此选项的最佳值取决于服务器、客户端和网络的硬件设置。因素包括CPU核心数和磁盘设置。一个好的起点是服务器上的CPU核心数,但在许多情况下,比该值更大的值也可能导致更快的恢复时间。当然,过高的值会因为抖动而导致性能下降。
仅自定义和目录归档格式支持此选项。输入必须是常规文件或目录(例如不是管道)。在发出脚本而不是直接连接到数据库服务器时,此选项将被忽略。此外,不能将多个作业与选项--single-transaction一起使用。
链接:
-Z0
)后使用 pg_dump
可以更快地执行。显然,此时转储文件会更大。但如果有足够的空间和快速的磁盘,这可能是正确的权衡选择。 - mivkpg_dump ... -Fc -Z0 | pigz > file.dump.gz
对我而言比内置压缩快大约三倍,可能是因为内置压缩是单线程的原因? - Fake NamePG_DUMP | 始终使用带有-j
选项的格式目录。
time pg_dump -j 8 -Fd -f /tmp/newout.dir fsdcm_external
PG_RESTORE | 总是使用格式目录的 postgres.conf 调优选项,带有 -j
选项
work_mem = 32MB
shared_buffers = 4GB
maintenance_work_mem = 2GB
full_page_writes = off
autovacuum = off
wal_buffers = -1
time pg_restore -j 8 --format=d -C -d postgres /tmp/newout.dir/`
了解更多信息
https://gitlab.com/yanar/Tuning/wikis/improve-pg-dump&restore
-Fc
。
然后您可以使用 pg_restore 来还原数据(或选择其中的部分)。有一个“作业数”选项-j
,它可以使用多个核心(假设您的磁盘不是限制因素)。在大多数情况下,在现代机器上,您可以期望至少获得一些性能提升。
现在您说“我不知道这应该花多长时间”。好吧,在进行了几次还原之前,您不会知道。确保监视系统正在执行什么操作以及您是否受到 CPU 或磁盘 I/O 的限制。
最后,您要为恢复数据库设置的配置设置不是您要运行它的设置。以下是一些有用的起点:
但请记得在还原之后重置它们。
通常建议使用pg_dump
与pg_restore
一起使用,而不是psql
。可以通过传递--jobs
标志将此方法分为多个核心以加速加载过程:
$ pg_dump -Fc db > db.Fc.dump
$ pg_restore -d db --jobs=8 db.Fc.dump
postgresql.conf
配置文件进行大量调整,并适当地设置maintenance_work_mem
和checkpoint_segments
值的高值;这些值越高,可能会显著提高写入性能。
--inserts
或--column-inserts
。您还可以检查您的 ASCII 脚本是否使用COPY
来重新加载数据。 - Andrew Lazarus