Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复制postgresql数据库的更快方法(或最佳方法)_Postgresql - Fatal编程技术网

复制postgresql数据库的更快方法(或最佳方法)

复制postgresql数据库的更快方法(或最佳方法),postgresql,Postgresql,我对数据库进行了pg_转储,现在正试图将生成的.sql文件安装到另一台服务器上 我正在使用以下命令 psql -f databasedump.sql 我今天早些时候启动了数据库安装,现在7小时后,数据库仍在填充中。我不知道这是不是他应该花多长时间,但我继续监控,到目前为止,我已经看到了超过1200万的插入和计数。我怀疑有一种更快的方法可以做到这一点 通常建议将pg_dump的使用与pg_restore配对,而不是psql。通过传递--jobs标志,此方法可以在堆芯之间拆分,以加快加载过程: $

我对数据库进行了pg_转储,现在正试图将生成的.sql文件安装到另一台服务器上

我正在使用以下命令

psql -f databasedump.sql

我今天早些时候启动了数据库安装,现在7小时后,数据库仍在填充中。我不知道这是不是他应该花多长时间,但我继续监控,到目前为止,我已经看到了超过1200万的插入和计数。我怀疑有一种更快的方法可以做到这一点

通常建议将
pg_dump
的使用与
pg_restore
配对,而不是
psql
。通过传递
--jobs
标志,此方法可以在堆芯之间拆分,以加快加载过程:

$ pg_restore --jobs=8 dump.sql
Postgres本身也有大量的数据加载


我还建议对
postgresql.conf
配置文件进行大量调优,并为
maintenance\u work\u mem
checkpoint\u段设置适当的高值;上面的值越高,您的写入性能可能会显著提高。

为什么要生成原始的.sql转储?的开头说明建议使用“自定义”格式
-Fc

然后,您可以使用pg_restore来恢复数据(或数据的选定部分)。有一个“作业数”选项
-j
,可以使用多个内核(假设您的磁盘还不是限制因素)。在大多数情况下,在现代机器上,您至少可以从中获得一些收益

现在你说“我不知道这要花多长时间”。好吧,除非你做了一些恢复,否则你不会知道。监控您的系统正在做什么,以及您是否受到cpu或磁盘I/O的限制

最后,恢复数据库所需的配置设置不是要运行数据库的配置设置。两个有用的启动程序:

  • 增加,以便可以在更大的块中构建索引
  • 在恢复过程中关闭。如果你的机器崩溃了,你将从头开始
  • 不过,请记住在恢复后重置它们。

    使用创建转储

    pg_dump -Fc -Z 9  --file=file.dump myDb
    
    Fc

    输出适合输入到pg_restore的自定义存档。这是最灵活的格式,因为它允许加载数据以及对象定义的重新排序。默认情况下,此格式也会被压缩

    z9:--compress=0..9

    指定要使用的压缩级别。零表示没有压缩。对于自定义存档格式,这指定了单个表数据段的压缩,默认情况下是以中等级别压缩。对于纯文本输出,设置非零压缩级别会导致整个输出文件被压缩,就好像它是通过gzip传输的一样;但默认情况是不压缩。tar存档格式目前根本不支持压缩

    并用

    pg_restore -Fc -j 8  file.dump
    
    -j:--jobs=作业数量

    使用多个并发作业运行pg_restore中最耗时的部分—加载数据、创建索引或创建约束。此选项可以显著缩短将大型数据库恢复到运行在多处理器计算机上的服务器的时间

    每个作业都是一个进程或一个线程,具体取决于操作系统,并使用到服务器的单独连接

    此选项的最佳值取决于服务器、客户端和网络的硬件设置。这些因素包括CPU内核的数量和磁盘设置。一个很好的起点是服务器上的CPU核心数,但在许多情况下,大于该值也会导致更快的恢复时间。当然,过高的值会由于抖动而导致性能下降

    此选项仅支持自定义和目录存档格式。输入必须是常规文件或目录(例如,不是管道)。当发出脚本而不是直接连接到数据库服务器时,将忽略此选项。此外,多个作业不能与选项--single transaction一起使用

    链接:

    改进pg转储和恢复 PG_DUMP |始终使用带有
    -j
    选项的格式目录

    time pg_dump -j 8 -Fd -f /tmp/newout.dir fsdcm_external
    
    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/`
    
    PG_RESTORE |始终使用带有
    -j
    选项的格式化目录对postgres.conf进行调优

    time pg_dump -j 8 -Fd -f /tmp/newout.dir fsdcm_external
    
    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/`
    
    更多信息


    请不要发布明显错误的信息。如果你不知道问题的答案,那就不要回答。你的答案不仅不正确,任何人都会发现他们的生活变得更加困难,而不是更容易;在我贴出答案后,我意识到答案是不正确的。我已尽我所知更新了答案,但如果我对pg_restore的理解和使用不正确,我将删除答案。您编辑的答案似乎更有用。我已经取消了我的反对票。我想删除我的评论,但我认为这条链没有多大意义。明白了,谢谢-我的头脑被困在了跨多个连接分区和加载数据的世界中,因为它的到来,我只是在说我的第一个答案。漫长的一天…这是非常有用的信息。很明显,我对Postgresql一无所知,尽管我以前使用过它。我发现你的反馈非常有启发性。使用psql大约花了9个小时。我想用pg_restore来测试这一点,我应该只运行pg_restore,还是最好删除我的数据目录,从头开始(这是一个测试盒,关键任务数据都在活动盒上)?您需要一个新的转储(-Fc),如果您有磁盘空间,您可以用不同的名称恢复数据库(如果您愿意)。计划这次监视它-索引很容易比表数据花费更长的时间。您可能会发现,创建一个较小的测试数据库(相同的结构)并多次转储/恢复以更好地了解事物的交互方式非常有用