如何从 pg_data_dump 部分恢复数据?

问题描述 投票:0回答:1

我有一个问题。我的应用程序中有备份功能 这是我如何进行转储:

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 标志 我尝试在恢复之前清理我的数据库,它可以工作,但根据我的任务描述,这不是它应该如何工作

database postgresql psql database-restore
1个回答
0
投票

如果您尝试恢复唯一值并且违反了约束,则可以将

--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}'
)

这也简化了删除、重新创建和重新填充对象的过程,因为您可以选择要恢复的内容,而不是破坏并重建整个对象。

© www.soinside.com 2019 - 2024. All rights reserved.