Pere Miquel Brull 7aed6d340b
Fix #9276 - Fix dump syntax for backup (#9341)
* Update docs

* Clean dump

* Clean dump

Co-authored-by: Teddy Crepineau <teddy.crepineau@gmail.com>
2022-12-16 16:59:13 +01:00

91 lines
2.9 KiB
Python

# Copyright 2021 Collate
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Restore utility for the metadata CLI
"""
import traceback
from sqlalchemy.engine import Engine
from metadata.cli.utils import get_engine
from metadata.utils.ansi import ANSI, print_ansi_encoded_string
from metadata.utils.helpers import BackupRestoreArgs
from metadata.utils.logger import cli_logger
logger = cli_logger()
def execute_sql_file(engine: Engine, sql_file: str) -> None:
"""
Method to create the connection and execute the sql query
"""
with open(sql_file, encoding="utf-8") as file:
failed_queries = 0
all_queries = file.readlines()
print_ansi_encoded_string(
color=ANSI.GREEN,
bold=False,
message=f"Queries to process for restore: {len(all_queries)}",
)
for query in all_queries:
# `%` is a reserved syntax in SQLAlchemy to bind parameters. Escaping it with `%%`
clean_query = query.replace("%", "%%")
try:
with engine.connect() as conn:
conn.execute(clean_query)
except Exception as err:
failed_queries += 1
logger.debug(traceback.format_exc())
logger.warning(
f"Error processing the following query while restoring - {err}"
)
logger.warning(clean_query)
print_ansi_encoded_string(
color=ANSI.GREEN,
bold=False,
message=f"Restore finished. {failed_queries} queries failed.",
)
def run_restore(
common_restore_obj_instance: BackupRestoreArgs,
sql_file: str,
) -> None:
"""
Run and restore the
buckup. Optionally, download it from S3.
:param common_restore_obj_instance: cls instance to fetch common args
:param sql_file: local path of file to restore the backup
"""
print_ansi_encoded_string(
color=ANSI.GREEN,
bold=False,
message="Restoring OpenMetadata backup for "
f"{common_restore_obj_instance.host}:{common_restore_obj_instance.port}/{common_restore_obj_instance.database}",
)
engine = get_engine(common_args=common_restore_obj_instance)
execute_sql_file(engine=engine, sql_file=sql_file)
print_ansi_encoded_string(
color=ANSI.GREEN,
bold=False,
message=f"Backup restored from {sql_file}",
)