def mysql_init_server(instance, skip_production_check=False, skip_locking=False, skip_backup=True): """ Remove any data and initialize a MySQL instance Args: instance - A hostaddr object pointing towards localhost to act upon skip_production_check - Dangerous! will not run safety checks to protect production data skip_locking - Do not take a lock on localhost. Useful when the caller has already has taken the lock (ie mysql_restore_xtrabackup) skip_backup - Don't run a backup after the instance is setup """ lock_handle = None if not skip_locking: # Take a lock to prevent multiple restores from running concurrently log.info('Taking a flock to block race conditions') lock_handle = host_utils.take_flock_lock(backup.BACKUP_LOCK_FILE) try: # sanity check zk = host_utils.MysqlZookeeper() if (not skip_production_check and instance in zk.get_all_mysql_instances()): raise Exception("It appears {instance} is in use. This is" " very dangerous!".format(instance=instance)) log.info('Checking host for mounts, etc...') basic_host_sanity() log.info('(re)Generating MySQL cnf files') mysql_cnf_builder.build_cnf() log.info('Creating any missing directories') create_and_chown_dirs(instance.port) log.info('Shutting down MySQL (if applicable)') host_utils.stop_mysql(instance.port) log.info('Deleting existing MySQL data') delete_mysql_data(instance.port) log.info('Creating MySQL privileges tables') init_privileges_tables(instance.port) log.info('Clearing innodb log files') delete_innodb_log_files(instance.port) log.info('Starting up instance') host_utils.start_mysql(instance.port) log.info('Importing MySQL users') mysql_grants.manage_mysql_grants(instance, 'nuke_then_import') log.info('Creating test database') mysql_lib.create_db(instance, 'test') log.info('Setting up query response time plugins') mysql_lib.setup_response_time_metrics(instance) log.info('Setting up semi-sync replication plugins') mysql_lib.setup_semisync_plugins(instance) log.info('Restarting pt daemons') host_utils.restart_pt_daemons(instance.port) log.info('MySQL initalization complete') finally: if not skip_locking and lock_handle: log.info('Releasing lock') host_utils.release_flock_lock(lock_handle) if not skip_backup: log.info('Taking a backup') mysql_backup.mysql_backup(instance)
def mysql_init_server(instance, skip_production_check=False, skip_backup=True, lock_handle=None): """ Remove any data and initialize a MySQL instance Args: instance - A hostaddr object pointing towards localhost to act upon skip_production_check - Dangerous! will not run safety checks to protect production data skip_backup - Don't run a backup after the instance is setup lock_handle - If the caller already locked the system, pass in the lock handle, as we may need to release and reacquire to prevent mysqld from keeping it. """ if lock_handle is None: # Take a lock to prevent multiple restores from running concurrently log.info('Taking a lock to block race conditions') lock_handle = host_utils.bind_lock_socket( backup.STD_BACKUP_LOCK_SOCKET) else: log.info('Lock already exists from caller.') try: # sanity check zk = host_utils.MysqlZookeeper() if (not skip_production_check and instance in zk.get_all_mysql_instances()): raise Exception("It appears {instance} is in use. This is" " very dangerous!".format(instance=instance)) log.info('Checking host for mounts, etc...') basic_host_sanity() log.info('(re)Generating MySQL cnf files') mysql_cnf_builder.build_cnf() log.info('Creating any missing directories') create_and_chown_dirs(instance.port) log.info('Shutting down MySQL (if applicable)') host_utils.stop_mysql(instance.port) log.info('Deleting existing MySQL data') delete_mysql_data(instance.port) log.info('Creating MySQL privileges tables') init_privileges_tables(instance.port) log.info('Clearing innodb log files') delete_innodb_log_files(instance.port) log.info('Starting up instance') host_utils.start_mysql(instance.port) log.info('Importing MySQL users') mysql_grants.manage_mysql_grants(instance, 'nuke_then_import') log.info('Creating test database') mysql_lib.create_db(instance, 'test') log.info('Setting up query response time plugins') mysql_lib.setup_response_time_metrics(instance) log.info('Setting up semi-sync replication plugins') mysql_lib.setup_semisync_plugins(instance) log.info('Setting up audit log plugin') mysql_lib.setup_audit_plugin(instance) log.info('Restarting pt daemons') host_utils.manage_pt_daemons(instance.port) log.info('MySQL initalization complete') finally: # We have to do this, ugly though it may be, to ensure that # the running MySQL process doesn't maintain a hold on the lock # socket after the script exits. We reacquire the lock after # the restart and pass it back to the caller. # if lock_handle: log.info('Restarting MySQL, releasing lock.') host_utils.stop_mysql(instance.port) log.info('Sleeping 5 seconds.') time.sleep(5) host_utils.release_lock_socket(lock_handle) host_utils.start_mysql(instance.port) log.info('Reacquiring lock.') lock_handle = host_utils.bind_lock_socket( backup.STD_BACKUP_LOCK_SOCKET) if not skip_backup: log.info('Taking a backup') mysql_backup.mysql_backup(instance, initial_build=True, lock_handle=lock_handle) return lock_handle
def mysql_init_server(instance, skip_production_check=False, skip_locking=False, skip_backup=True): """ Remove any data and initialize a MySQL instance Args: instance - A hostaddr object pointing towards localhost to act upon skip_production_check - Dangerous! will not run safety checks to protect production data skip_locking - Do not take a lock on localhost. Useful when the caller has already has taken the lock (ie mysql_restore_xtrabackup) skip_backup - Don't run a backup after the instance is setup """ lock_handle = None if not skip_locking: # Take a lock to prevent multiple restores from running concurrently log.info('Taking a flock to block race conditions') lock_handle = host_utils.take_flock_lock(backup.BACKUP_LOCK_FILE) try: # sanity check zk = host_utils.MysqlZookeeper() if (not skip_production_check and instance in zk.get_all_mysql_instances()): raise Exception("It appears {instance} is in use. This is" " very dangerous!".format(instance=instance)) log.info('Checking host for mounts, etc...') basic_host_sanity() log.info('(re)Generating MySQL cnf files') mysql_cnf_builder.build_cnf() log.info('Creating any missing directories') create_and_chown_dirs(instance.port) log.info('Shutting down MySQL (if applicable)') host_utils.stop_mysql(instance.port) log.info('Deleting existing MySQL data') delete_mysql_data(instance.port) log.info('Creating MySQL privileges tables') init_privileges_tables(instance.port) log.info('Clearing innodb log files') delete_innodb_log_files(instance.port) log.info('Starting up instance') host_utils.start_mysql(instance.port) log.info('Importing MySQL users') mysql_grants.manage_mysql_grants(instance, 'nuke_then_import') log.info('Creating test database') conn = mysql_lib.connect_mysql(instance) mysql_lib.create_db(conn, 'test') log.info('Setting up query response time plugins') mysql_lib.setup_response_time_metrics(instance) log.info('Setting up semi-sync replication plugins') mysql_lib.setup_semisync_plugins(instance) log.info('Restarting pt daemons') host_utils.restart_pt_daemons(instance.port) log.info('MySQL initalization complete') finally: if not skip_locking and lock_handle: log.info('Releasing lock') host_utils.release_flock_lock(lock_handle) if not skip_backup: log.info('Taking a backup') mysql_backup.mysql_backup(instance)