我有一个问题。我的应用程序中有备份功能 这是我如何进行转储:
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
结合使用:
data_command = (
f'PGPASSWORD={os.environ["POSTGRES_PASSWORD"]} '
f'pg_dump -U {os.environ["POSTGRES_USER"]} --inserts --on-conflict-do-nothing '
f'--data-only -h {os.environ["DB_HOST"]} {os.environ["DB_NAME"]} > {data_backup_file}'
)
这样,表中仍然存在的值将保留,并且传入的重复项将被忽略,并且仅插入丢失的值。
您还可以通过指定要转储的
--schema
和 --table
来缩小要转储的对象范围:
data_command = (
f'PGPASSWORD={os.environ["POSTGRES_PASSWORD"]} '
f'pg_dump -U {os.environ["POSTGRES_USER"]} --inserts --on-conflict-do-nothing '
f'--data-only --schema {target_schema} --table {target_schema}.{target_table} '
f'-h {os.environ["DB_HOST"]} {os.environ["DB_NAME"]} > {data_backup_file}'
)
pg_restore
读取备份并将其传输到 psql
,或者让它直接处理恢复。
data_restore_command = (
f'PGPASSWORD={os.environ["POSTGRES_PASSWORD"]} '
f'pg_restore -U {os.environ["POSTGRES_USER"]} '
f'--data-only --schema {target_schema} --table {target_schema}.{target_table} '
f'-h {os.environ["DB_HOST"]} -d {os.environ["DB_NAME"]} {data_backup_file}'
)
这也简化了删除、重新创建和重新填充对象的过程,因为您可以选择要恢复的内容,而不是破坏并重建整个对象。