def __init__(self, name, config, target_directory, dry_run=False): self.name = name self.config = config self.target_directory = target_directory self.dry_run = dry_run self.config.validate_config(self.CONFIGSPEC) # -> ValidationError # Setup a discovery shell to find schema items # This will iterate over items during the estimate # or backup phase, which will call schema.refresh() self.schema = MySQLSchema() config = self.config["mysqldump"] self.schema.add_database_filter(include_glob(*config["databases"])) self.schema.add_database_filter( exclude_glob(*config["exclude-databases"])) self.schema.add_table_filter(include_glob_qualified(*config["tables"])) self.schema.add_table_filter( exclude_glob_qualified(*config["exclude-tables"])) self.schema.add_engine_filter(include_glob(*config["engines"])) self.schema.add_engine_filter(exclude_glob(*config["exclude-engines"])) self.mysql_config = build_mysql_config(self.config["mysql:client"]) self.client = connect(self.mysql_config["client"]) self.mock_env = None
def estimate_backup_size(self): """Estimate the size of the backup this plugin will produce""" try: mysql_config = build_mysql_config(self.config['mysql:client']) client = connect(mysql_config['client']) datadir = client.show_variable('datadir') return directory_size(datadir) except MySQLError, exc: raise BackupError("Failed to lookup the MySQL datadir when " "estimating backup size: [%d] %s" % exc.args)
def estimate_backup_size(self): """Return estimated backup size""" mysql_config = build_mysql_config(self.config["mysql:client"]) client = connect(mysql_config["client"]) try: datadir = client.show_variable("datadir") return directory_size(datadir) except OSError as exc: raise BackupError("Failed to calculate directory size: [%d] %s" % (exc.errno, exc.strerror)) finally: client.close()
def __init__(self, name, config, target_directory, dry_run=False): self.name = name self.config = config self.target_directory = target_directory if dry_run: LOG.info("Dry-run mode") self.dry_run = dry_run self.config.validate_config(CONFIGSPEC) # Setup MySQL connection objects self.schema = MySQLSchema() config = self.config['mysqlhotcopy'] self.mysql_config = build_mysql_config(self.config['mysql:client']) self.client = connect(self.mysql_config['client'])
def backup(self): """Run a database backup with xtrabackup""" defaults_file = os.path.join(self.target_directory, 'my.xtrabackup.cnf') args = [ self.config['xtrabackup']['innobackupex'], '--defaults-file=%s' % defaults_file, '--stream=tar4ibd', tempfile.gettempdir(), ] if self.config['xtrabackup']['slave-info']: args.insert(3, '--slave-info') if self.config['xtrabackup']['no-lock']: args.insert(2, '--no-lock') LOG.info("%s", list2cmdline(args)) if self.dry_run: return config = build_mysql_config(self.config['mysql:client']) write_options(config, defaults_file) shutil.copyfileobj( open(self.config['xtrabackup']['global-defaults'], 'r'), open(defaults_file, 'a')) backup_path = os.path.join(self.target_directory, 'backup.tar') compression_stream = open_stream(backup_path, 'w', **self.config['compression']) error_log_path = os.path.join(self.target_directory, 'xtrabackup.log') error_log = open(error_log_path, 'wb') try: try: check_call(args, stdout=compression_stream, stderr=error_log, close_fds=True) except OSError, exc: LOG.info("Command not found: %s", args[0]) raise BackupError("%s not found. Is xtrabackup installed?" % args[0]) except CalledProcessError, exc: LOG.info("%s failed", list2cmdline(exc.cmd)) for line in open(error_log_path, 'r'): if line.startswith('>>'): continue LOG.info("%s", line.rstrip()) raise BackupError("%s failed" % exc.cmd[0])
def backup(self): """Run a database backup with xtrabackup""" defaults_file = os.path.join(self.target_directory, 'my.xtrabackup.cnf') args = [ self.config['xtrabackup']['innobackupex'], '--defaults-file=%s' % defaults_file, '--stream=tar4ibd', tempfile.gettempdir(), ] if self.config['xtrabackup']['slave-info']: args.insert(3, '--slave-info') if self.config['xtrabackup']['no-lock']: args.insert(2, '--no-lock') LOG.info("%s", list2cmdline(args)) if self.dry_run: return config = build_mysql_config(self.config['mysql:client']) write_options(config, defaults_file) shutil.copyfileobj(open(self.config['xtrabackup']['global-defaults'], 'r'), open(defaults_file, 'a')) backup_path = os.path.join(self.target_directory, 'backup.tar') compression_stream = open_stream(backup_path, 'w', **self.config['compression']) error_log_path = os.path.join(self.target_directory, 'xtrabackup.log') error_log = open(error_log_path, 'wb') try: try: check_call(args, stdout=compression_stream, stderr=error_log, close_fds=True) except OSError, exc: LOG.info("Command not found: %s", args[0]) raise BackupError("%s not found. Is xtrabackup installed?" % args[0]) except CalledProcessError, exc: LOG.info("%s failed", list2cmdline(exc.cmd)) for line in open(error_log_path, 'r'): if line.startswith('>>'): continue LOG.info("%s", line.rstrip()) raise BackupError("%s failed" % exc.cmd[0])
def __init__(self, name, config, target_directory, dry_run=False): self.name = name self.config = config self.target_directory = target_directory self.dry_run = dry_run self.config.validate_config(self.CONFIGSPEC) # -> ValidationError # Setup a discovery shell to find schema items # This will iterate over items during the estimate # or backup phase, which will call schema.refresh() self.schema = MySQLSchema() config = self.config["mysqldump"] self.schema.add_database_filter(include_glob(*config["databases"])) self.schema.add_database_filter(exclude_glob(*config["exclude-databases"])) self.schema.add_table_filter(include_glob_qualified(*config["tables"])) self.schema.add_table_filter(exclude_glob_qualified(*config["exclude-tables"])) self.schema.add_engine_filter(include_glob(*config["engines"])) self.schema.add_engine_filter(exclude_glob(*config["exclude-engines"])) self.mysql_config = build_mysql_config(self.config["mysql:client"]) self.client = connect(self.mysql_config["client"])