如果不存在通过 postgres 备份和恢复工具创建数据库的问题

problem with create database if not exist via postgres backup and restore tool

我写了一个 bat 脚本来执行 Postgres 备份和恢复工具。

我在还原流程方面遇到了一点问题: 只要我的数据库存在,它就可以正常工作。但如果不这样做,它将失败。 我的恢复命令:

"pg_restore.exe" -d postgres://postgres:1234@127.0.0.1:9195/mydb -w -c -v -F c --if-exists "DatabaseBackup_mydb.tar" 2>> "DatabaseRestore_mydb.log"

所以我需要以某种方式修改该命令,以处理数据库“mydb”不存在的用例,并在这种情况下创建它。

在这种情况下,仅添加 -C 标志是行不通的。

有什么建议吗?

应该通过使用 postgres://postgres:1234@127.0.0.1:9195/postgres 并添加 -C 来工作。显然是在丢弃实例上进行测试。这将连接到 postgres 数据库 DROP DATABASE IF EXISTS mydb;,然后是 CREATE DATABASE mydb,连接到 mydb,然后恢复数据库对象。

演示:

\l test_db
                       List of databases
 Name | Owner | Encoding | Collate | Ctype | Access privileges 
------+-------+----------+---------+-------+-------------------
(0 rows)

pg_restore -d postgres -c -C -U postgres test_db.out 
pg_restore: while PROCESSING TOC:
pg_restore: from TOC entry 4734; 1262 1170111 DATABASE test_db postgres
pg_restore: error: could not execute query: ERROR:  database "test_db" does not exist
Command was: DROP DATABASE test_db;
pg_restore: warning: errors ignored on restore: 1

 \l test_db
                               List of databases
  Name   |  Owner   | Encoding |   Collate   |    Ctype    | Access privileges 
---------+----------+----------+-------------+-------------+-------------------
 test_db | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
(1 row)

pg_restore -d postgres -c -C -U postgres test_db.out

\l test_db
                               List of databases
  Name   |  Owner   | Encoding |   Collate   |    Ctype    | Access privileges 
---------+----------+----------+-------------+-------------+-------------------
 test_db | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
(1 row)