Tenho um problema. Tenho uma funcionalidade de backup no meu aplicativo. Aqui está como eu faço dumps:
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)
Também tenho uma funcionalidade de restauração:
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)
O problema é que preciso restaurar parcialmente os dados do dump. Por exemplo - eu acidentalmente deletei algumas linhas do banco de dados, mas minha tabela ainda está cheia de conteúdo. Não funciona. Funciona apenas quando a tabela está completamente vazia.
Eu tentei o sinalizador --inserts ao criar um despejo de dados. Tentei limpar meu banco de dados antes de restaurar, funcionou, mas não é assim que deveria funcionar de acordo com minha descrição de tarefa.
Se você estiver tentando restaurar valores únicos e isso violar uma restrição, você pode combinar
--inserts
com--on-conflict-do-nothing
:Dessa forma, os valores que você ainda tinha na tabela permanecerão, suas duplicatas recebidas serão ignoradas e somente os que faltam serão inseridos.
Você pode restringir quais objetos deseja despejar especificando
--schema
e--table
:É possível despejar tudo e restringir as coisas durante a restauração, lendo o backup com
pg_restore
e canalizando-o parapsql
, ou deixando que ele cuide da restauração diretamente.Isso também simplifica o processo de remover, recriar e repovoar objetos, porque você pode escolher o que restaurar, em vez de destruir e reconstruir tudo.
Além disso,
pg_restore
pode ler dumps de formato personalizado opcionalmente compactados (criados compg_dump -Fc
) que são muito mais leves e rápidos de processar. Ele também permite restauração multithread se você usar a--jobs
configuração.