【问题标题】:restore from pg_basebackup从 pg_basebackup 恢复
【发布时间】:2018-06-15 13:04:11
【问题描述】:

我使用命令对 postgresql 数据库进行了每日备份

/usr/bin/pg_basebackup -D $outdir -Ft -x -z -w -R -v

现在我想在另一台服务器上恢复这个数据库。我使用了https://www.postgresql.org/docs/9.5/static/continuous-archiving.html#BACKUP-PITR-RECOVERY 上的描述。

备份中包含的recovery.conf文件内容如下:

standby_mode = 'on'
primary_conninfo = 'user=postgres port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres'

文档中的下一步 (8.) 说启动 postgresql。由于超时,这会导致失败:

3783 postgres: startup process   waiting for 0000000100000024000000B 

在原始服务器上我没有这个文件。是否可以只恢复 pg_basebackup 的状态而不使用任何 WAL 文件?那么 recovery.conf 文件中应该包含什么内容?

根据@JosMac 的建议,我将 recovery.conf 移至以下结果:

shaun2:/var/lib/pgsql/data # service postgresql start
Job for postgresql.service failed because the control process exited with error code. See "systemctl status postgresql.service" and "journalctl -xe" for details.
shaun2:/var/lib/pgsql/data # service postgresql status
â postgresql.service - PostgreSQL database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Mon 2018-06-18 12:02:53 CEST; 12s ago
  Process: 1340 ExecStop=/usr/lib/postgresql-init stop (code=exited, status=0/SUCCESS)
  Process: 9355 ExecStart=/usr/lib/postgresql-init start (code=exited, status=1/FAILURE)
 Main PID: 1060 (code=exited, status=0/SUCCESS)

Jun 18 12:02:52 shaun2 postgres[9369]: [3-1] 2018-06-18 12:02:52 CEST   LOG:  invalid checkpoint record
Jun 18 12:02:52 shaun2 postgres[9369]: [4-1] 2018-06-18 12:02:52 CEST   FATAL:  could not locate required checkpoint record
Jun 18 12:02:52 shaun2 postgres[9369]: [4-2] 2018-06-18 12:02:52 CEST   HINT:  If you are not restoring from a backup, try removing the file "/var/lib/pgsql/data/backup_label".
Jun 18 12:02:52 shaun2 postgres[9367]: [2-1] 2018-06-18 12:02:52 CEST   LOG:  startup process (PID 9369) exited with exit code 1
Jun 18 12:02:52 shaun2 postgres[9367]: [3-1] 2018-06-18 12:02:52 CEST   LOG:  aborting startup due to startup process failure
Jun 18 12:02:53 shaun2 postgresql-init[9355]: pg_ctl: could not start server
Jun 18 12:02:53 shaun2 systemd[1]: postgresql.service: Control process exited, code=exited status=1
Jun 18 12:02:53 shaun2 systemd[1]: Failed to start PostgreSQL database server.
Jun 18 12:02:53 shaun2 systemd[1]: postgresql.service: Unit entered failed state.
Jun 18 12:02:53 shaun2 systemd[1]: postgresql.service: Failed with result 'exit-code'.

我想 PostgreSQL 仍在寻找丢失的 WAL 文件,因为 backup_label 的内容:

shaun2:/var/lib/pgsql/data # cat backup_label
START WAL LOCATION: 24/B0000028 (file 0000000100000024000000B0)
CHECKPOINT LOCATION: 24/B0000028
BACKUP METHOD: streamed
BACKUP FROM: master
START TIME: 2018-06-14 02:55:08 CEST
LABEL: pg_basebackup base backup

将backup_label移走后的结果:

shaun2:/var/lib/pgsql/data # service postgresql status
â postgresql.service - PostgreSQL database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Mon 2018-06-18 12:17:54 CEST; 4s ago
  Process: 1340 ExecStop=/usr/lib/postgresql-init stop (code=exited, status=0/SUCCESS)
  Process: 10401 ExecStart=/usr/lib/postgresql-init start (code=exited, status=1/FAILURE)
 Main PID: 1060 (code=exited, status=0/SUCCESS)

Jun 18 12:17:53 shaun2 postgres[10414]: [4-1] 2018-06-18 12:17:53 CEST   LOG:  invalid secondary checkpoint record
Jun 18 12:17:53 shaun2 postgres[10414]: [5-1] 2018-06-18 12:17:53 CEST   PANIC:  could not locate a valid checkpoint record
Jun 18 12:17:54 shaun2 postgres[10412]: [2-1] 2018-06-18 12:17:54 CEST   LOG:  startup process (PID 10414) was terminated by signal 6: Aborted

【问题讨论】:

    标签: linux postgresql database-restore postgresql-9.5


    【解决方案1】:

    我们使用 pg_basebackup 进行备份,并且还进行了几次恢复,所以通常它运行良好,没有问题。

    但我建议您使用参数-X stream 而不是-x(意思是“-X fetch”)。使用此参数,pg_basebackup 将捕获并存储在备份期间创建的 WAL 日志段以及数据文件。这些 WAL 日志将存储在单独的 pg_xlog.tarpg_wal.tar 文件中(取决于 PG 版本)。

    恢复的完整描述可以在这里找到 - pg_basebackup / pg-barman – restore tar backup

    【讨论】:

    • 不幸的是,我想恢复 2 天前的备份文件,该文件是使用参数 -x 而不是 -X stream 创建的。我既没有pg_xlog.tar,也没有pg_wal.tar。您链接中的描述确实假定recovery.conf 文件中存在这些文件之一。
    • 理论上好了 - 如果在基本备份运行期间没有事务,您可以尝试在没有恢复文件的情况下开始恢复备份。但我对此表示怀疑...如果您的数据库中有归档模式或始终处于打开状态,并且归档命令集或 wal_keep_segments 非常高,则可以从数据库中复制 WAL 日志。如果不是,我会使用新参数制作另一个基本备份...
    • 我需要上周三的数据,所以新的备份没有帮助。备份是在凌晨 3 点进行的,此时没有任何活动。因此,基本备份中的数据将足够准确——如果我能恢复它们的话。当前的 WAL 文件从今天早上开始,因此它们没有任何帮助。
    • 其实我们更进一步。我们重放了 tar 解压缩并获得了所需的一个 WAL 文件。不幸的是,我们仍然无法启动 PostgreSQL,因为“致命:无法连接到主服务器”。我想这是因为我们在另一台服务器上安装了备份。这部分我会再问一个问题。
    • 我们现在设法通过返回您的第一个建议来恢复第二台服务器上的数据:删除 recovery.conf(但这次使用请求的 WAL 文件 - 它有效。非常感谢您的帮助和耐心!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 2021-03-14
    • 1970-01-01
    • 2015-05-07
    • 2013-06-05
    • 2016-04-28
    • 1970-01-01
    相关资源
    最近更新 更多