我有一个问题。我的应用程序中有一个备份功能,下面是我进行转储的方法:
schema_command = (
f'PGPASSWORD={os.environ["POSTGRES_PASSWORD"]} '
f'pg_dump -U {os.environ["POSTGRES_USER"]} '
f'--schema-only -h {os.environ["DB_HOST"]} {os.environ["DB_NAME"]} > {schema_backup_file}'
)
subprocess.run(schema_command, shell=True, check=True)
data_command = (
f'PGPASSWORD={os.environ["POSTGRES_PASSWORD"]} '
f'pg_dump -U {os.environ["POSTGRES_USER"]} '
f'--data-only -h {os.environ["DB_HOST"]} {os.environ["DB_NAME"]} > {data_backup_file}'
)
subprocess.run(data_command, shell=True, check=True)
我还有一个恢复功能:
schema_restore_command = (
f'PGPASSWORD={os.environ["POSTGRES_PASSWORD"]} '
f'psql -U {os.environ["POSTGRES_USER"]} '
f'-h {os.environ["DB_HOST"]} -d {os.environ["DB_NAME"]} < {schema_backup_file}'
)
print(schema_restore_command)
subprocess.run(schema_restore_command, shell=True, check=True)
data_restore_command = (
f'PGPASSWORD={os.environ["POSTGRES_PASSWORD"]} '
f'psql -U {os.environ["POSTGRES_USER"]} '
f'-h {os.environ["DB_HOST"]} -d {os.environ["DB_NAME"]} < {data_backup_file}'
)
print(data_restore_command)
subprocess.run(data_restore_command, shell=True, check=True)
问题是我需要从转储中部分恢复数据。例如 - 我意外删除了一些数据库行,但我的表仍然充满内容。它不起作用。只有当表完全为空时它才有效。
我在创建数据转储时尝试了 --inserts 标志,我尝试在恢复之前清理数据库,它可以工作,但根据我的任务描述,它不应该这样工作
如果您尝试恢复唯一值并且违反了约束,则可以结合
--inserts
使用--on-conflict-do-nothing
:这样,表中原来的值就会保留,传入的重复值将被忽略,并且只插入缺失的值。
--schema
您可以通过指定和来缩小要转储的对象的范围--table
:可以通过读取备份
pg_restore
并将其传送至psql
,或者让其直接处理恢复,从而转储所有内容并缩小恢复范围。这也简化了删除、重新创建和重新填充对象的过程,因为您可以选择要恢复的内容,而不是删除并重建整个内容。
最重要的是,
pg_restore
可以读取可选压缩的自定义格式转储(使用 创建pg_dump -Fc
),这些转储更轻量且处理速度更快。如果您使用该设置,它还可以启用多线程恢复--jobs
。