From 264cebd2b10cd13c3782d639bba32e07f556c2be Mon Sep 17 00:00:00 2001 From: Divyansh Singh Date: Tue, 11 Apr 2023 23:19:49 +0530 Subject: [PATCH] complete psql multi schema backup --- borgmatic/actions/restore.py | 9 ++------- borgmatic/commands/arguments.py | 2 +- borgmatic/hooks/postgresql.py | 7 +++++-- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/borgmatic/actions/restore.py b/borgmatic/actions/restore.py index fa7b04b7..1e8d175d 100644 --- a/borgmatic/actions/restore.py +++ b/borgmatic/actions/restore.py @@ -68,15 +68,12 @@ def restore_single_database( archive_name, hook_name, database, - schemas ): # pragma: no cover ''' Given (among other things) an archive name, a database hook name, and a configured database configuration dict, restore that database from the archive. ''' logger.info(f'{repository}: Restoring database {database["name"]}') - if schemas: - database['schemas'] = schemas dump_pattern = borgmatic.hooks.dispatch.call_hooks( 'make_database_dump_pattern', @@ -316,8 +313,7 @@ def run_restore( remote_path, archive_name, found_hook_name or hook_name, - found_database, - schemas = restore_arguments.schemas, + dict(found_database, **{'schemas': restore_arguments.schemas}), ) # For any database that weren't found via exact matches in the hooks configuration, try to @@ -346,8 +342,7 @@ def run_restore( remote_path, archive_name, found_hook_name or hook_name, - database, - schemas = restore_arguments.schemas, + dict(database, **{'schemas': restore_arguments.schemas}), ) borgmatic.hooks.dispatch.call_hooks_even_if_unconfigured( diff --git a/borgmatic/commands/arguments.py b/borgmatic/commands/arguments.py index 7f93910e..ebd7b8eb 100644 --- a/borgmatic/commands/arguments.py +++ b/borgmatic/commands/arguments.py @@ -634,7 +634,7 @@ def make_parsers(): metavar='NAME', nargs='+', dest='schemas', - help="Names of schemas to restore from the database, defaults to all schemas." + help="Names of schemas to restore from the database, defaults to all schemas. Schemas are only supported for PostgreSQL and MongoDB databases", ) restore_group.add_argument( '-h', '--help', action='help', help='Show this help message and exit' diff --git a/borgmatic/hooks/postgresql.py b/borgmatic/hooks/postgresql.py index 5d951f6d..d296fa1c 100644 --- a/borgmatic/hooks/postgresql.py +++ b/borgmatic/hooks/postgresql.py @@ -213,7 +213,6 @@ def restore_database_dump(database_config, log_prefix, location_config, dry_run, + ('--command', 'ANALYZE') ) pg_restore_command = database.get('pg_restore_command') or 'pg_restore' - backup_schemas = ', '.join(database['schemas']) if 'schemas' in database else None restore_command = ( (psql_command if all_databases else pg_restore_command, '--no-password') + ( @@ -224,10 +223,14 @@ def restore_database_dump(database_config, log_prefix, location_config, dry_run, + (('--host', database['hostname']) if 'hostname' in database else ()) + (('--port', str(database['port'])) if 'port' in database else ()) + (('--username', database['username']) if 'username' in database else ()) - + (('--schema', backup_schemas) if backup_schemas else ()) + (tuple(database['restore_options'].split(' ')) if 'restore_options' in database else ()) + (() if extract_process else (dump_filename,)) ) + + if database['schemas']: + for schema in database['schemas']: + restore_command += ('--schema', schema) + extra_environment = make_extra_environment(database) logger.debug(f"{log_prefix}: Restoring PostgreSQL database {database['name']}{dry_run_label}")