如何恢复大型 postgresql 数据库?

use*_*691 3 postgresql postgresql-9.3 postgresql-10

我正在努力将备份从本地 postgresql 恢复到 AWS 中托管的另一个 postgresql 数据库(rds-aurora postgresql,无服务器)。数据大小为170GB的压缩数据。

我之前想过使用 pg_restore 因为我可以传递该-j选项,但提取文件需要花费大量的时间和空间。

我的文件格式为= tar.gz (20200204_data_tar.gz)

我尝试使用管道提取并将其传递给 pg_restore 以节省时间,但出现以下错误。注意:备份是使用 pg_start_backup 生成的。

tar -xzOf 20200204_data_tar.gz | pg_restore
    --host=my-test.us-east-1.rds.amazonaws.com --port=5432 --username=postgresql--dbname=mytest -j 16 --password --verbose --exit-on-error --data-only 

pg_restore: [archiver] input file does not appear to be a valid archive
Run Code Online (Sandbox Code Playgroud)

本地版本 9.3.4 新集群版本使用 10.7

有人可以建议我如何恢复这个大型数据库吗?

Lau*_*lbe 7

当然,最好的选择是记住您到底是如何进行备份的......

如果要恢复托管数据库上的备份,最好是使用pg_dump. 因此,请确保它不是物理备份

  • 运行tar -tzvf 20200204_data_tar.gz并确保它不包含类似postgresql.auto.conf或 之类的文件PG_VERSION

确定后,将存档解压到新目录并检查您获得的内容:

mkdir x && cd x
tar -xzvf ../20200204_data_tar.gz
Run Code Online (Sandbox Code Playgroud)

然后检查文件是什么转储格式并相应地恢复它:

  • “普通”格式:

    该存档包含一个带有 SQL 语句的文本文件,有人很奇怪地将单个文件打包到 tar 存档中。

    这样的转储是通过以下方式恢复的

    psql -f <SQL-file> -h <hostname> -p <port> -U <user> -d <target-database>
    
    Run Code Online (Sandbox Code Playgroud)
  • “自定义”格式:

    该存档包含一个二进制文件,而有人很奇怪地将单个文件打包到 tar 存档中。

    这样的转储是通过以下方式恢复的

    pg_restore -h <hostname> -p <port> -U <user> -d <target-database> <dump-file>
    
    Run Code Online (Sandbox Code Playgroud)
  • “目录”格式:

    存档包含一个文件toc.dat和许多格式为 的文件number.dat.gz

    这样的转储是通过以下方式恢复的

    pg_restore -h <hostname> -p <port> -U <user> -d <target-database> <directory-containing-toc.dat>
    
    Run Code Online (Sandbox Code Playgroud)
  • “tar”格式:

    存档包含文件toc.datrestore.sql许多格式为 的文件number.dat

    这样的转储可以像上面的目录格式一样恢复。