def setup_actions(snapshot, config, client, snap_datadir, spooldir): """Setup actions for a LVM snapshot based on the provided configuration. Optional actions: * MySQL locking * InnoDB recovery * Recording MySQL replication """ if config['mysql-lvm']['lock-tables']: extra_flush = config['mysql-lvm']['extra-flush-tables'] act = FlushAndLockMySQLAction(client, extra_flush) snapshot.register('pre-snapshot', act, priority=100) snapshot.register('post-snapshot', act, priority=100) if config['mysql-lvm'].get('replication', True): repl_cfg = config.setdefault('mysql:replication', {}) act = RecordMySQLReplicationAction(client, repl_cfg) snapshot.register('pre-snapshot', act, 0) if config['mysql-lvm']['innodb-recovery']: mysqld_config = dict(config['mysqld']) mysqld_config['datadir'] = snap_datadir if not mysqld_config['tmpdir']: mysqld_config['tmpdir'] = tempfile.gettempdir() ib_log_size = client.show_variable('innodb_log_file_size') mysqld_config['innodb-log-file-size'] = ib_log_size act = InnodbRecoveryAction(mysqld_config) snapshot.register('post-mount', act, priority=100) archive_stream = open_stream(os.path.join(spooldir, 'backup.tar'), 'w', **config['compression']) act = TarArchiveAction(snap_datadir, archive_stream, config['tar']) snapshot.register('post-mount', act, priority=50) snapshot.register('pre-remove', log_final_snapshot_size)
def setup_actions(snapshot, config, client, snap_datadir, spooldir): """Setup actions for a LVM snapshot based on the provided configuration. Optional actions: * MySQL locking * InnoDB recovery * Recording MySQL replication """ mysql = connect_simple(config['mysql:client']) if mysql.show_variable('have_innodb') == 'YES': try: pathinfo = MySQLPathInfo.from_mysql(mysql) finally: mysql.close() try: check_innodb(pathinfo, ensure_subdir_of_datadir=True) except BackupError: if not config['mysql-lvm']['force-innodb-backup']: raise if config['mysql-lvm']['lock-tables']: extra_flush = config['mysql-lvm']['extra-flush-tables'] act = FlushAndLockMySQLAction(client, extra_flush) snapshot.register('pre-snapshot', act, priority=100) snapshot.register('post-snapshot', act, priority=100) if config['mysql-lvm'].get('replication', True): repl_cfg = config.setdefault('mysql:replication', {}) act = RecordMySQLReplicationAction(client, repl_cfg) snapshot.register('pre-snapshot', act, 0) if config['mysql-lvm']['innodb-recovery']: mysqld_config = dict(config['mysqld']) mysqld_config['datadir'] = snap_datadir if not mysqld_config['tmpdir']: mysqld_config['tmpdir'] = tempfile.gettempdir() ib_log_size = client.show_variable('innodb_log_file_size') mysqld_config['innodb-log-file-size'] = ib_log_size act = InnodbRecoveryAction(mysqld_config) snapshot.register('post-mount', act, priority=100) try: archive_stream = open_stream( os.path.join(spooldir, 'backup.tar'), 'w', method=config['compression']['method'], level=config['compression']['level'], extra_args=config['compression']['options']) except OSError, exc: raise BackupError("Unable to create archive file '%s': %s" % (os.path.join(spooldir, 'backup.tar'), exc))
def setup_actions(snapshot, config, client, datadir, spooldir, plugin): """Setup actions for a LVM snapshot based on the provided configuration. Optional actions: * MySQL locking * Recording MySQL replication """ if config['mysql-lvm']['lock-tables']: extra_flush = config['mysql-lvm']['extra-flush-tables'] act = FlushAndLockMySQLAction(client, extra_flush) snapshot.register('pre-snapshot', act, priority=100) snapshot.register('post-snapshot', act, priority=100) if config['mysql-lvm'].get('replication', True): repl_cfg = config.setdefault('mysql:replication', {}) act = RecordMySQLReplicationAction(client, repl_cfg) snapshot.register('pre-snapshot', act, 0) mysqld_config = dict(config['mysqld']) mysqld_config['datadir'] = datadir if not mysqld_config['tmpdir']: mysqld_config['tmpdir'] = tempfile.gettempdir() ib_log_size = client.show_variable('innodb_log_file_size') if ib_log_size: mysqld_config['innodb-log-file-size'] = ib_log_size act = MySQLDumpDispatchAction(plugin, mysqld_config) snapshot.register('post-mount', act, priority=100) errlog_src = os.path.join(datadir, 'holland_lvm.log') errlog_dst = os.path.join(spooldir, 'holland_lvm.log') snapshot.register( 'pre-unmount', lambda *args, **kwargs: shutil.copyfile(errlog_src, errlog_dst)) snapshot.register('pre-remove', log_final_snapshot_size)
def setup_actions(snapshot, config, client, snap_datadir, spooldir): """Setup actions for a LVM snapshot based on the provided configuration. Optional actions: * MySQL locking * InnoDB recovery * Recording MySQL replication """ mysql = connect_simple(config["mysql:client"]) if mysql.show_variable("have_innodb") == "YES": try: pathinfo = MySQLPathInfo.from_mysql(mysql) finally: mysql.close() try: check_innodb(pathinfo, ensure_subdir_of_datadir=True) except BackupError: if not config["mysql-lvm"]["force-innodb-backup"]: raise if config["mysql-lvm"]["lock-tables"]: extra_flush = config["mysql-lvm"]["extra-flush-tables"] act = FlushAndLockMySQLAction(client, extra_flush) snapshot.register("pre-snapshot", act, priority=100) snapshot.register("post-snapshot", act, priority=100) if config["mysql-lvm"].get("replication", True): repl_cfg = config.setdefault("mysql:replication", {}) act = RecordMySQLReplicationAction(client, repl_cfg) snapshot.register("pre-snapshot", act, 0) if config["mysql-lvm"]["innodb-recovery"]: mysqld_config = dict(config["mysqld"]) mysqld_config["datadir"] = snap_datadir if not mysqld_config["tmpdir"]: mysqld_config["tmpdir"] = tempfile.gettempdir() ib_log_size = client.show_variable("innodb_log_file_size") mysqld_config["innodb-log-file-size"] = ib_log_size act = InnodbRecoveryAction(mysqld_config) snapshot.register("post-mount", act, priority=100) if config["mysql-lvm"]["archive-method"] == "dir": try: backup_datadir = os.path.join(spooldir, "backup_data") os.mkdir(backup_datadir) except OSError as exc: raise BackupError("Unable to create archive directory '%s': %s" % (backup_datadir, exc)) act = DirArchiveAction(snap_datadir, backup_datadir, config["tar"]) snapshot.register("post-mount", act, priority=50) else: try: archive_stream = open_stream( os.path.join(spooldir, "backup.tar"), "w", method=config["compression"]["method"], level=config["compression"]["level"], extra_args=config["compression"]["options"], inline=config["compression"]["inline"], split=config["compression"]["split"], ) except OSError as exc: raise BackupError("Unable to create archive file '%s': %s" % (os.path.join(spooldir, "backup.tar"), exc)) act = TarArchiveAction(snap_datadir, archive_stream, config["tar"]) snapshot.register("post-mount", act, priority=50) snapshot.register("pre-remove", log_final_snapshot_size)
def setup_actions(snapshot, config, client, datadir, spooldir, plugin): """Setup actions for a LVM snapshot based on the provided configuration. Optional actions: * MySQL locking * Recording MySQL replication """ if config['mysql-lvm']['lock-tables']: extra_flush = config['mysql-lvm']['extra-flush-tables'] act = FlushAndLockMySQLAction(client, extra_flush) snapshot.register('pre-snapshot', act, priority=100) snapshot.register('post-snapshot', act, priority=100) if config['mysql-lvm'].get('replication', True): repl_cfg = config.setdefault('mysql:replication', {}) act = RecordMySQLReplicationAction(client, repl_cfg) snapshot.register('pre-snapshot', act, 0) mysqld_config = dict(config['mysqld']) mysqld_config['datadir'] = datadir if not mysqld_config['tmpdir']: mysqld_config['tmpdir'] = tempfile.gettempdir() if client.show_variable('have_innodb') == 'YES': pathinfo = MySQLPathInfo.from_mysql(client) check_innodb(pathinfo) ib_log_size = client.show_variable('innodb_log_file_size') if ib_log_size: mysqld_config['innodb-log-file-size'] = ib_log_size ibd_home_dir = pathinfo.innodb_data_home_dir if ibd_home_dir: # innodb_data_home_dir is set to something ibd_home_dir = pathinfo.remap_path(pathinfo.get_innodb_datadir(), snapshot.mountpoint) mysqld_config['innodb-data-home-dir'] = ibd_home_dir LOG.info( "Remapped innodb-data-home-dir from %s to %s for snapshot", pathinfo.get_innodb_datadir(), ibd_home_dir) ibd_file_path = pathinfo.innodb_data_file_path if ibd_file_path: ibd_file_path = pathinfo.remap_tablespaces(snapshot.mountpoint) mysqld_config['innodb-data-file-path'] = ibd_file_path if ibd_file_path != pathinfo.innodb_data_file_path: LOG.info( "Remapped innodb-data-file-path from %s to %s for snapshot", pathinfo.innodb_data_file_path, ibd_file_path) if not ibd_home_dir: LOG.info("Remapped one or more tablespaces but " "innodb-data-home-dir is not set. Setting " "innodb-data-home-dir = '' to support absolute " "tablespace paths on snapshot.") mysqld_config['innodb-data-home-dir'] = "" ib_logdir = pathinfo.innodb_log_group_home_dir if ib_logdir and ib_logdir != './': ib_logdir = pathinfo.remap_path(pathinfo.get_innodb_logdir(), snapshot.mountpoint) mysqld_config['innodb-log-group-home-dir'] = ib_logdir LOG.info( "Remapped innodb-log-group-home-dir from %s to %s for snapshot", pathinfo.get_innodb_logdir(), ib_logdir) act = MySQLDumpDispatchAction(plugin, mysqld_config) snapshot.register('post-mount', act, priority=100) errlog_src = os.path.join(datadir, 'holland_lvm.log') errlog_dst = os.path.join(spooldir, 'holland_lvm.log') snapshot.register( 'pre-unmount', lambda *args, **kwargs: shutil.copyfile(errlog_src, errlog_dst)) snapshot.register('pre-remove', log_final_snapshot_size)
def setup_actions(snapshot, config, client, datadir, spooldir, plugin): """Setup actions for a LVM snapshot based on the provided configuration. Optional actions: * MySQL locking * Recording MySQL replication """ if config["mysql-lvm"]["lock-tables"]: extra_flush = config["mysql-lvm"]["extra-flush-tables"] act = FlushAndLockMySQLAction(client, extra_flush) snapshot.register("pre-snapshot", act, priority=100) snapshot.register("post-snapshot", act, priority=100) if config["mysql-lvm"].get("replication", True): repl_cfg = config.setdefault("mysql:replication", {}) act = RecordMySQLReplicationAction(client, repl_cfg) snapshot.register("pre-snapshot", act, 0) mysqld_config = dict(config["mysqld"]) mysqld_config["datadir"] = datadir if not mysqld_config["tmpdir"]: mysqld_config["tmpdir"] = tempfile.gettempdir() if client.show_variable("have_innodb") == "YES": pathinfo = MySQLPathInfo.from_mysql(client) check_innodb(pathinfo) ib_log_size = client.show_variable("innodb_log_file_size") if ib_log_size: mysqld_config["innodb-log-file-size"] = ib_log_size ibd_home_dir = pathinfo.innodb_data_home_dir if ibd_home_dir: # innodb_data_home_dir is set to something ibd_home_dir = pathinfo.remap_path(pathinfo.get_innodb_datadir(), snapshot.mountpoint) mysqld_config["innodb-data-home-dir"] = ibd_home_dir LOG.info( "Remapped innodb-data-home-dir from %s to %s for snapshot", pathinfo.get_innodb_datadir(), ibd_home_dir, ) ibd_file_path = pathinfo.innodb_data_file_path if ibd_file_path: ibd_file_path = pathinfo.remap_tablespaces(snapshot.mountpoint) mysqld_config["innodb-data-file-path"] = ibd_file_path if ibd_file_path != pathinfo.innodb_data_file_path: LOG.info( "Remapped innodb-data-file-path from %s to %s for snapshot", pathinfo.innodb_data_file_path, ibd_file_path, ) if not ibd_home_dir: LOG.info("Remapped one or more tablespaces but " "innodb-data-home-dir is not set. Setting " "innodb-data-home-dir = '' to support absolute " "tablespace paths on snapshot.") mysqld_config["innodb-data-home-dir"] = "" ib_logdir = pathinfo.innodb_log_group_home_dir if ib_logdir and ib_logdir != "./": ib_logdir = pathinfo.remap_path(pathinfo.get_innodb_logdir(), snapshot.mountpoint) mysqld_config["innodb-log-group-home-dir"] = ib_logdir LOG.info( "Remapped innodb-log-group-home-dir from %s to %s for snapshot", pathinfo.get_innodb_logdir(), ib_logdir, ) act = MySQLDumpDispatchAction(plugin, mysqld_config) snapshot.register("post-mount", act, priority=100) log_file = mysqld_config["log-error"] if log_file: if os.path.exists(log_file): errlog_src = log_file else: errlog_src = os.path.join(datadir, log_file) else: errlog_src = os.path.join(datadir, "holland_lvm.log") errlog_dst = os.path.join(spooldir, "holland_lvm.log") LOG.info("Saving mysqld log file to %s", errlog_dst) snapshot.register( "pre-unmount", lambda *args, **kwargs: shutil.copyfile(errlog_src, errlog_dst)) snapshot.register("pre-remove", log_final_snapshot_size)