Source code for twindb_backup.verify
# -*- coding: utf-8 -*-
"""
Module that verify backup copies.
"""
import json
import shutil
import tempfile
import time
import traceback
from configparser import ConfigParser, NoOptionError
from os import path as osp
from twindb_backup import DEFAULT_FILE_ENCODING, LOG
from twindb_backup.exceptions import TwinDBBackupError
from twindb_backup.restore import restore_from_mysql
from twindb_backup.status.mysql_status import MySQLStatus
[docs]def edit_backup_my_cnf(dst_path):
"""Removed options from config(besides MySQL 5.7.8)"""
filename = osp.join(dst_path, "backup-my.cnf")
backup_cfg = ConfigParser(strict=False)
backup_cfg.read(filename)
for option in [
"innodb_log_checksum_algorithm",
"innodb_log_block_size",
"innodb_fast_checksum",
]:
try:
backup_cfg.remove_option(section="mysqld", option=option)
except NoOptionError:
pass
with open(filename, "w", encoding=DEFAULT_FILE_ENCODING) as backup_fp:
backup_cfg.write(backup_fp)
[docs]def verify_mysql_backup(twindb_config, dst_path, backup_file, hostname=None):
"""
Restore mysql backup and measure time
:param hostname:
:param backup_file:
:param dst_path:
:param twindb_config: tool configuration
:type twindb_config: TwinDBBackupConfig
"""
dst = twindb_config.destination(backup_source=hostname)
status = MySQLStatus(dst=dst)
copy = None
if backup_file == "latest":
copy = status.latest_backup
else:
for copy in status:
if backup_file.endswith(copy.key):
break
if copy is None:
return json.dumps(
{"backup_copy": backup_file, "restore_time": 0, "success": False},
indent=4,
sort_keys=True,
)
start_restore_time = time.time()
success = True
tmp_dir = tempfile.mkdtemp()
try:
LOG.debug("Verifying backup copy in %s", tmp_dir)
restore_from_mysql(twindb_config, copy, dst_path, tmp_dir)
edit_backup_my_cnf(dst_path)
except (TwinDBBackupError, OSError, IOError) as err:
LOG.error(err)
LOG.debug(traceback.format_exc())
success = False
finally:
shutil.rmtree(tmp_dir, ignore_errors=True)
end_restore_time = time.time()
restore_time = end_restore_time - start_restore_time
return json.dumps(
{
"backup_copy": copy.key,
"restore_time": restore_time,
"success": success,
},
indent=4,
sort_keys=True,
)