mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-04 04:46:15 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			980 lines
		
	
	
	
		
			36 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			980 lines
		
	
	
	
		
			36 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/******************************************************
 | 
						|
hot backup tool for InnoDB
 | 
						|
(c) 2009-2015 Percona LLC and/or its affiliates
 | 
						|
Originally Created 3/3/2009 Yasufumi Kinoshita
 | 
						|
Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko,
 | 
						|
Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz.
 | 
						|
 | 
						|
This program is free software; you can redistribute it and/or modify
 | 
						|
it under the terms of the GNU General Public License as published by
 | 
						|
the Free Software Foundation; version 2 of the License.
 | 
						|
 | 
						|
This program is distributed in the hope that it will be useful,
 | 
						|
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
GNU General Public License for more details.
 | 
						|
 | 
						|
You should have received a copy of the GNU General Public License
 | 
						|
along with this program; if not, write to the Free Software
 | 
						|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1335  USA
 | 
						|
 | 
						|
*******************************************************
 | 
						|
 | 
						|
This file incorporates work covered by the following copyright and
 | 
						|
permission notice:
 | 
						|
 | 
						|
Copyright (c) 2000, 2011, MySQL AB & Innobase Oy. All Rights Reserved.
 | 
						|
 | 
						|
This program is free software; you can redistribute it and/or modify it under
 | 
						|
the terms of the GNU General Public License as published by the Free Software
 | 
						|
Foundation; version 2 of the License.
 | 
						|
 | 
						|
This program is distributed in the hope that it will be useful, but WITHOUT
 | 
						|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 | 
						|
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 | 
						|
 | 
						|
You should have received a copy of the GNU General Public License along with
 | 
						|
this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
 | 
						|
Street, Fifth Floor, Boston, MA 02110-1335 USA
 | 
						|
 | 
						|
*******************************************************/
 | 
						|
 | 
						|
#include <my_global.h>
 | 
						|
#include <stdio.h>
 | 
						|
#include <string.h>
 | 
						|
#include <mysql.h>
 | 
						|
#include <my_dir.h>
 | 
						|
#include <ut0mem.h>
 | 
						|
#include <os0file.h>
 | 
						|
#include <srv0start.h>
 | 
						|
#include <algorithm>
 | 
						|
#include <mysqld.h>
 | 
						|
#include <my_default.h>
 | 
						|
#include <my_getopt.h>
 | 
						|
#include <string>
 | 
						|
#include <sstream>
 | 
						|
#include <set>
 | 
						|
#include "common.h"
 | 
						|
#include "innobackupex.h"
 | 
						|
#include "xtrabackup.h"
 | 
						|
#include "xbstream.h"
 | 
						|
#include "fil_cur.h"
 | 
						|
#include "write_filt.h"
 | 
						|
#include "backup_copy.h"
 | 
						|
 | 
						|
using std::min;
 | 
						|
using std::max;
 | 
						|
 | 
						|
/* options */
 | 
						|
my_bool opt_ibx_version = FALSE;
 | 
						|
my_bool opt_ibx_help = FALSE;
 | 
						|
my_bool opt_ibx_apply_log = FALSE;
 | 
						|
my_bool opt_ibx_incremental = FALSE;
 | 
						|
my_bool opt_ibx_notimestamp = FALSE;
 | 
						|
 | 
						|
my_bool opt_ibx_copy_back = FALSE;
 | 
						|
my_bool opt_ibx_move_back = FALSE;
 | 
						|
my_bool opt_ibx_galera_info = FALSE;
 | 
						|
my_bool opt_ibx_slave_info = FALSE;
 | 
						|
my_bool opt_ibx_no_lock = FALSE;
 | 
						|
my_bool opt_ibx_safe_slave_backup = FALSE;
 | 
						|
my_bool opt_ibx_force_non_empty_dirs = FALSE;
 | 
						|
my_bool opt_ibx_noversioncheck = FALSE;
 | 
						|
my_bool opt_ibx_decompress = FALSE;
 | 
						|
 | 
						|
char *opt_ibx_incremental_history_name = NULL;
 | 
						|
char *opt_ibx_incremental_history_uuid = NULL;
 | 
						|
 | 
						|
char *opt_ibx_user = NULL;
 | 
						|
const char *opt_ibx_password = NULL;
 | 
						|
char *opt_ibx_host = NULL;
 | 
						|
char *opt_ibx_defaults_group = NULL;
 | 
						|
char *opt_ibx_socket = NULL;
 | 
						|
uint opt_ibx_port = 0;
 | 
						|
 | 
						|
ulong opt_ibx_lock_wait_query_type;
 | 
						|
ulong opt_ibx_kill_long_query_type;
 | 
						|
 | 
						|
uint opt_ibx_kill_long_queries_timeout = 0;
 | 
						|
uint opt_ibx_lock_wait_timeout = 0;
 | 
						|
uint opt_ibx_lock_wait_threshold = 0;
 | 
						|
uint opt_ibx_debug_sleep_before_unlock = 0;
 | 
						|
uint opt_ibx_safe_slave_backup_timeout = 0;
 | 
						|
 | 
						|
const char *opt_ibx_history = NULL;
 | 
						|
 | 
						|
char *opt_ibx_include = NULL;
 | 
						|
char *opt_ibx_databases = NULL;
 | 
						|
bool ibx_partial_backup = false;
 | 
						|
 | 
						|
char *ibx_position_arg = NULL;
 | 
						|
char *ibx_backup_directory = NULL;
 | 
						|
 | 
						|
extern bool xb_opt_destroy_password;
 | 
						|
 | 
						|
/* copy of proxied xtrabackup options */
 | 
						|
my_bool ibx_xb_close_files;
 | 
						|
const char *ibx_xtrabackup_compress_alg;
 | 
						|
uint ibx_xtrabackup_compress_threads;
 | 
						|
ulonglong ibx_xtrabackup_compress_chunk_size;
 | 
						|
my_bool ibx_xtrabackup_export;
 | 
						|
char *ibx_xtrabackup_extra_lsndir;
 | 
						|
char *ibx_xtrabackup_incremental_basedir;
 | 
						|
char *ibx_xtrabackup_incremental_dir;
 | 
						|
my_bool	ibx_xtrabackup_incremental_force_scan;
 | 
						|
ulint ibx_xtrabackup_log_copy_interval;
 | 
						|
char *ibx_xtrabackup_incremental;
 | 
						|
int ibx_xtrabackup_parallel;
 | 
						|
char *ibx_xtrabackup_stream_str;
 | 
						|
char *ibx_xtrabackup_tables_file;
 | 
						|
long ibx_xtrabackup_throttle;
 | 
						|
char *ibx_opt_mysql_tmpdir;
 | 
						|
longlong ibx_xtrabackup_use_memory;
 | 
						|
 | 
						|
 | 
						|
static inline int ibx_msg(const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 1, 2);
 | 
						|
static inline int ibx_msg(const char *fmt, ...)
 | 
						|
{
 | 
						|
	int	result;
 | 
						|
	time_t	t = time(NULL);
 | 
						|
	char	date[100];
 | 
						|
	char	*line;
 | 
						|
	va_list args;
 | 
						|
 | 
						|
	strftime(date, sizeof(date), "%y%m%d %H:%M:%S", localtime(&t));
 | 
						|
 | 
						|
	va_start(args, fmt);
 | 
						|
 | 
						|
	result = vasprintf(&line, fmt, args);
 | 
						|
 | 
						|
	va_end(args);
 | 
						|
 | 
						|
	if (result != -1) {
 | 
						|
		result = fprintf(stderr, "%s %s: %s",
 | 
						|
					date, INNOBACKUPEX_BIN_NAME, line);
 | 
						|
		free(line);
 | 
						|
	}
 | 
						|
 | 
						|
	return result;
 | 
						|
}
 | 
						|
 | 
						|
enum innobackupex_options
 | 
						|
{
 | 
						|
	OPT_APPLY_LOG = 256,
 | 
						|
	OPT_COPY_BACK,
 | 
						|
	OPT_MOVE_BACK,
 | 
						|
	OPT_REDO_ONLY,
 | 
						|
	OPT_GALERA_INFO,
 | 
						|
	OPT_SLAVE_INFO,
 | 
						|
	OPT_INCREMENTAL,
 | 
						|
	OPT_INCREMENTAL_HISTORY_NAME,
 | 
						|
	OPT_INCREMENTAL_HISTORY_UUID,
 | 
						|
	OPT_LOCK_WAIT_QUERY_TYPE,
 | 
						|
	OPT_KILL_LONG_QUERY_TYPE,
 | 
						|
	OPT_KILL_LONG_QUERIES_TIMEOUT,
 | 
						|
	OPT_LOCK_WAIT_TIMEOUT,
 | 
						|
	OPT_LOCK_WAIT_THRESHOLD,
 | 
						|
	OPT_DEBUG_SLEEP_BEFORE_UNLOCK,
 | 
						|
	OPT_NO_LOCK,
 | 
						|
	OPT_SAFE_SLAVE_BACKUP,
 | 
						|
	OPT_SAFE_SLAVE_BACKUP_TIMEOUT,
 | 
						|
	OPT_RSYNC,
 | 
						|
	OPT_HISTORY,
 | 
						|
	OPT_INCLUDE,
 | 
						|
	OPT_FORCE_NON_EMPTY_DIRS,
 | 
						|
	OPT_NO_TIMESTAMP,
 | 
						|
	OPT_NO_VERSION_CHECK,
 | 
						|
	OPT_NO_BACKUP_LOCKS,
 | 
						|
	OPT_DATABASES,
 | 
						|
	OPT_DECOMPRESS,
 | 
						|
 | 
						|
	/* options wich are passed directly to xtrabackup */
 | 
						|
	OPT_CLOSE_FILES,
 | 
						|
	OPT_COMPACT,
 | 
						|
	OPT_COMPRESS,
 | 
						|
	OPT_COMPRESS_THREADS,
 | 
						|
	OPT_COMPRESS_CHUNK_SIZE,
 | 
						|
	OPT_EXPORT,
 | 
						|
	OPT_EXTRA_LSNDIR,
 | 
						|
	OPT_INCREMENTAL_BASEDIR,
 | 
						|
	OPT_INCREMENTAL_DIR,
 | 
						|
	OPT_INCREMENTAL_FORCE_SCAN,
 | 
						|
	OPT_LOG_COPY_INTERVAL,
 | 
						|
	OPT_PARALLEL,
 | 
						|
	OPT_REBUILD_INDEXES,
 | 
						|
	OPT_REBUILD_THREADS,
 | 
						|
	OPT_STREAM,
 | 
						|
	OPT_TABLES_FILE,
 | 
						|
	OPT_THROTTLE,
 | 
						|
	OPT_USE_MEMORY,
 | 
						|
	OPT_INNODB_FORCE_RECOVERY,
 | 
						|
};
 | 
						|
 | 
						|
ibx_mode_t ibx_mode = IBX_MODE_BACKUP;
 | 
						|
 | 
						|
static struct my_option ibx_long_options[] =
 | 
						|
{
 | 
						|
	{"version", 'v', "print version information",
 | 
						|
	 (uchar *) &opt_ibx_version, (uchar *) &opt_ibx_version, 0,
 | 
						|
	 GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"help", '?', "This option displays a help screen and exits.",
 | 
						|
	 (uchar *) &opt_ibx_help, (uchar *) &opt_ibx_help, 0,
 | 
						|
	 GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"apply-log", OPT_APPLY_LOG, "Prepare a backup in BACKUP-DIR by "
 | 
						|
	"applying the redo log 'ib_logfile0' and creating new redo log. "
 | 
						|
	"The InnoDB configuration is read from the file \"backup-my.cnf\".",
 | 
						|
	(uchar*) &opt_ibx_apply_log, (uchar*) &opt_ibx_apply_log,
 | 
						|
	0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"copy-back", OPT_COPY_BACK, "Copy all the files in a previously made "
 | 
						|
	 "backup from the backup directory to their original locations.",
 | 
						|
	 (uchar *) &opt_ibx_copy_back, (uchar *) &opt_ibx_copy_back, 0,
 | 
						|
	 GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"move-back", OPT_MOVE_BACK, "Move all the files in a previously made "
 | 
						|
	 "backup from the backup directory to the actual datadir location. "
 | 
						|
	 "Use with caution, as it removes backup files.",
 | 
						|
	 (uchar *) &opt_ibx_move_back, (uchar *) &opt_ibx_move_back, 0,
 | 
						|
	 GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"galera-info", OPT_GALERA_INFO, "This options creates the "
 | 
						|
	 MB_GALERA_INFO " file which contains the local node state at "
 | 
						|
	 "the time of the backup. Option should be used when performing the "
 | 
						|
	 "backup of MariaDB Galera Cluster. Has no effect when backup locks "
 | 
						|
	 "are used to create the backup.",
 | 
						|
	 (uchar *) &opt_ibx_galera_info, (uchar *) &opt_ibx_galera_info, 0,
 | 
						|
	 GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"slave-info", OPT_SLAVE_INFO, "This option is useful when backing "
 | 
						|
	 "up a replication slave server. It prints the binary log position "
 | 
						|
	 "and name of the master server. It also writes this information to "
 | 
						|
	 "the \"" MB_SLAVE_INFO "\" file as a \"CHANGE MASTER\" command. "
 | 
						|
	 "A new slave for this master can be set up by starting a slave server "
 | 
						|
	 "on this backup and issuing a \"CHANGE MASTER\" command with the "
 | 
						|
	 "binary log position saved in the \"" MB_SLAVE_INFO "\" file.",
 | 
						|
	 (uchar *) &opt_ibx_slave_info, (uchar *) &opt_ibx_slave_info, 0,
 | 
						|
	 GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"incremental", OPT_INCREMENTAL,
 | 
						|
	 "Create an incremental backup, rather than a full one. When this option is specified, "
 | 
						|
	 "either --incremental-lsn or --incremental-basedir can also be given. "
 | 
						|
	 "If neither option is given, option --incremental-basedir is used "
 | 
						|
	 "by default, set to the first timestamped backup "
 | 
						|
	 "directory in the backup base directory.",
 | 
						|
	 (uchar *) &opt_ibx_incremental, (uchar *) &opt_ibx_incremental, 0,
 | 
						|
	 GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"no-lock", OPT_NO_LOCK, "This option should not be used as "
 | 
						|
         "mariadb-backup now is using BACKUP LOCKS, which minimizes the "
 | 
						|
         "lock time. ALTER TABLE can run in parallel with BACKUP LOCKS."
 | 
						|
         "Use the --no-lock option it only if ALL your "
 | 
						|
	 "tables are InnoDB and you DO NOT CARE about the binary log "
 | 
						|
	 "position of the backup. This option shouldn't be used if there "
 | 
						|
	 "are any DDL statements being executed or if any updates are "
 | 
						|
	 "happening on non-InnoDB tables (this includes the system MyISAM "
 | 
						|
	 "tables in the mysql database), otherwise it could lead to an "
 | 
						|
	 "inconsistent backup. If you are considering to use --no-lock "
 | 
						|
	 "because your backups are failing to acquire the lock, this could "
 | 
						|
	 "be because of incoming replication events preventing the lock "
 | 
						|
	 "from succeeding. Please try using --safe-slave-backup to "
 | 
						|
	 "momentarily stop the replication slave thread, this may help "
 | 
						|
	 "the backup to succeed and you then don't need to resort to "
 | 
						|
	 "using this option.",
 | 
						|
	 (uchar *) &opt_ibx_no_lock, (uchar *) &opt_ibx_no_lock, 0,
 | 
						|
	 GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"safe-slave-backup", OPT_SAFE_SLAVE_BACKUP, "Stop slave SQL thread "
 | 
						|
	 "and wait to start backup until Slave_open_temp_tables in "
 | 
						|
	 "\"SHOW STATUS\" is zero. If there are no open temporary tables, "
 | 
						|
	 "the backup will take place, otherwise the SQL thread will be "
 | 
						|
	 "started and stopped until there are no open temporary tables. "
 | 
						|
	 "The backup will fail if Slave_open_temp_tables does not become "
 | 
						|
	 "zero after --safe-slave-backup-timeout seconds. The slave SQL "
 | 
						|
	 "thread will be restarted when the backup finishes.",
 | 
						|
	 (uchar *) &opt_ibx_safe_slave_backup,
 | 
						|
	 (uchar *) &opt_ibx_safe_slave_backup,
 | 
						|
	 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"force-non-empty-directories", OPT_FORCE_NON_EMPTY_DIRS, "This "
 | 
						|
	 "option, when specified, makes --copy-back or --move-back transfer "
 | 
						|
	 "files to non-empty directories. Note that no existing files will be "
 | 
						|
	 "overwritten. If --copy-back or --move-back has to copy a file from "
 | 
						|
	 "the backup directory which already exists in the destination "
 | 
						|
	 "directory, it will still fail with an error.",
 | 
						|
	 (uchar *) &opt_ibx_force_non_empty_dirs,
 | 
						|
	 (uchar *) &opt_ibx_force_non_empty_dirs,
 | 
						|
	 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"no-timestamp", OPT_NO_TIMESTAMP, "This option prevents creation of a "
 | 
						|
	 "time-stamped subdirectory of the BACKUP-ROOT-DIR given on the "
 | 
						|
	 "command line. When it is specified, the backup is done in "
 | 
						|
	 "BACKUP-ROOT-DIR instead.",
 | 
						|
	 (uchar *) &opt_ibx_notimestamp,
 | 
						|
	 (uchar *) &opt_ibx_notimestamp,
 | 
						|
	 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"no-version-check", OPT_NO_VERSION_CHECK, "This option disables the "
 | 
						|
	 "version check which is enabled by the --version-check option.",
 | 
						|
	 (uchar *) &opt_ibx_noversioncheck,
 | 
						|
	 (uchar *) &opt_ibx_noversioncheck,
 | 
						|
	 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"no-backup-locks", OPT_NO_BACKUP_LOCKS,
 | 
						|
         "Old disabled option which has no effect anymore.",
 | 
						|
	 (uchar *) 0, (uchar*) 0,
 | 
						|
	 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"decompress", OPT_DECOMPRESS, "Decompresses all files with the .qp "
 | 
						|
	 "extension in a backup previously made with the --compress option.",
 | 
						|
	 (uchar *) &opt_ibx_decompress,
 | 
						|
	 (uchar *) &opt_ibx_decompress,
 | 
						|
	 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"user", 'u', "This option specifies the MySQL username used "
 | 
						|
	 "when connecting to the server, if that's not the current user. "
 | 
						|
	 "The option accepts a string argument. See mysql --help for details.",
 | 
						|
	 (uchar*) &opt_ibx_user, (uchar*) &opt_ibx_user, 0, GET_STR,
 | 
						|
	 REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"host", 'H', "This option specifies the host to use when "
 | 
						|
	 "connecting to the database server with TCP/IP.  The option accepts "
 | 
						|
	 "a string argument. See mysql --help for details.",
 | 
						|
	 (uchar*) &opt_ibx_host, (uchar*) &opt_ibx_host, 0, GET_STR,
 | 
						|
	 REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"port", 'P', "This option specifies the port to use when "
 | 
						|
	 "connecting to the database server with TCP/IP.  The option accepts "
 | 
						|
	 "a string argument. See mysql --help for details.",
 | 
						|
	 &opt_ibx_port, &opt_ibx_port, 0, GET_UINT, REQUIRED_ARG,
 | 
						|
	 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"password", 'p', "This option specifies the password to use "
 | 
						|
	 "when connecting to the database. It accepts a string argument.  "
 | 
						|
	 "See mysql --help for details.",
 | 
						|
	 0, 0, 0, GET_STR,
 | 
						|
	 REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"socket", 'S', "This option specifies the socket to use when "
 | 
						|
	 "connecting to the local database server with a UNIX domain socket.  "
 | 
						|
	 "The option accepts a string argument. See mysql --help for details.",
 | 
						|
	 (uchar*) &opt_ibx_socket, (uchar*) &opt_ibx_socket, 0, GET_STR,
 | 
						|
	 REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"incremental-history-name", OPT_INCREMENTAL_HISTORY_NAME,
 | 
						|
	 "This option specifies the name of the backup series stored in the "
 | 
						|
	 XB_HISTORY_TABLE " history record to base an "
 | 
						|
	 "incremental backup on. Backup will search the history table "
 | 
						|
	 "looking for the most recent (highest innodb_to_lsn), successful "
 | 
						|
	 "backup in the series and take the to_lsn value to use as the "
 | 
						|
	 "starting lsn for the incremental backup. This will be mutually "
 | 
						|
	 "exclusive with --incremental-history-uuid, --incremental-basedir "
 | 
						|
	 "and --incremental-lsn. If no valid lsn can be found (no series by "
 | 
						|
	 "that name, no successful backups by that name), "
 | 
						|
	 "an error will be returned. It is used with the --incremental option.",
 | 
						|
	 (uchar*) &opt_ibx_incremental_history_name,
 | 
						|
	 (uchar*) &opt_ibx_incremental_history_name, 0, GET_STR,
 | 
						|
	 REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"incremental-history-uuid", OPT_INCREMENTAL_HISTORY_UUID,
 | 
						|
	 "This option specifies the UUID of the specific history record "
 | 
						|
	 "stored in the " XB_HISTORY_TABLE " table to base an "
 | 
						|
	 "incremental backup on. --incremental-history-name, "
 | 
						|
	 "--incremental-basedir and --incremental-lsn. If no valid lsn can be "
 | 
						|
	 "found (no success record with that uuid), an error will be returned."
 | 
						|
	 " It is used with the --incremental option.",
 | 
						|
	 (uchar*) &opt_ibx_incremental_history_uuid,
 | 
						|
	 (uchar*) &opt_ibx_incremental_history_uuid, 0, GET_STR,
 | 
						|
	 REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"ftwrl-wait-query-type", OPT_LOCK_WAIT_QUERY_TYPE,
 | 
						|
         "Old disabled option which has no effect anymore (not needed "
 | 
						|
         "with BACKUP LOCKS)",
 | 
						|
	 (uchar*) 0, (uchar*) 0, &query_type_typelib, GET_ENUM,
 | 
						|
         REQUIRED_ARG, QUERY_TYPE_ALL, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"kill-long-query-type", OPT_KILL_LONG_QUERY_TYPE,
 | 
						|
	 "This option specifies which types of queries should be killed to "
 | 
						|
	 "unblock the global lock. Default is \"all\".",
 | 
						|
	 (uchar*) &opt_ibx_kill_long_query_type,
 | 
						|
	 (uchar*) &opt_ibx_kill_long_query_type, &query_type_typelib,
 | 
						|
	 GET_ENUM, REQUIRED_ARG, QUERY_TYPE_SELECT, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"history", OPT_HISTORY,
 | 
						|
	 "This option enables the tracking of backup history in the "
 | 
						|
	 XB_HISTORY_TABLE " table. An optional history "
 | 
						|
	 "series name may be specified that will be placed with the history "
 | 
						|
	 "record for the current backup being taken.",
 | 
						|
	 NULL, NULL, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"include", OPT_INCLUDE,
 | 
						|
	 "This option is a regular expression to be matched against table "
 | 
						|
	 "names in databasename.tablename format. It is passed directly to "
 | 
						|
	 "--tables option. See the documentation for "
 | 
						|
	 "details.",
 | 
						|
	 (uchar*) &opt_ibx_include,
 | 
						|
	 (uchar*) &opt_ibx_include, 0, GET_STR,
 | 
						|
	 REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"databases", OPT_DATABASES,
 | 
						|
	 "This option specifies the list of databases that innobackupex should "
 | 
						|
	 "back up. The option accepts a string argument or path to file that "
 | 
						|
	 "contains the list of databases to back up. The list is of the form "
 | 
						|
	 "\"databasename1[.table_name1] databasename2[.table_name2] . . .\". "
 | 
						|
	 "If this option is not specified, all databases containing MyISAM and "
 | 
						|
	 "InnoDB tables will be backed up.  Please make sure that --databases "
 | 
						|
	 "contains all of the InnoDB databases and tables, so that all of the "
 | 
						|
	 "innodb.frm files are also backed up. In case the list is very long, "
 | 
						|
	 "this can be specified in a file, and the full path of the file can "
 | 
						|
	 "be specified instead of the list. (See option --tables-file.)",
 | 
						|
	 (uchar*) &opt_ibx_databases,
 | 
						|
	 (uchar*) &opt_ibx_databases, 0, GET_STR,
 | 
						|
	 REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"kill-long-queries-timeout", OPT_KILL_LONG_QUERIES_TIMEOUT,
 | 
						|
         "Old disabled option which has no effect anymore (not needed "
 | 
						|
         "with BACKUP LOCKS)",
 | 
						|
	 (uchar*) 0, (uchar*) 0,  0, GET_UINT,
 | 
						|
	 REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"ftwrl-wait-timeout", OPT_LOCK_WAIT_TIMEOUT,
 | 
						|
         "Alias for startup-wait-timeout",
 | 
						|
         (uchar*) &opt_ibx_lock_wait_timeout,
 | 
						|
         (uchar*) &opt_ibx_lock_wait_timeout, 0, GET_UINT,
 | 
						|
	 REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"startup-wait-timeout", OPT_LOCK_WAIT_TIMEOUT,
 | 
						|
         "This option specifies time in seconds that mariadb-backup should wait for "
 | 
						|
         "BACKUP STAGE START to complete. BACKUP STAGE START has to wait until all "
 | 
						|
         "currently running queries using explicite LOCK TABLES has ended. "
 | 
						|
         "If there are still such queries when the timeout expires, mariadb-backup "
 | 
						|
         "terminates with an error. Default is 0, in which case mariadb-backup waits "
 | 
						|
         "indefinitely for BACKUP STAGE START to finish",
 | 
						|
         (uchar*) &opt_ibx_lock_wait_timeout,
 | 
						|
         (uchar*) &opt_ibx_lock_wait_timeout, 0, GET_UINT,
 | 
						|
	 REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"ftwrl-wait-threshold", OPT_LOCK_WAIT_THRESHOLD,
 | 
						|
         "Old disabled option which has no effect anymore (not needed "
 | 
						|
         "with BACKUP LOCKS)",
 | 
						|
	 (uchar*) 0, (uchar*) 0,  0, GET_UINT,
 | 
						|
	 REQUIRED_ARG, 60, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"safe-slave-backup-timeout", OPT_SAFE_SLAVE_BACKUP_TIMEOUT,
 | 
						|
	 "How many seconds --safe-slave-backup should wait for "
 | 
						|
	 "Slave_open_temp_tables to become zero. (default 300)",
 | 
						|
	 (uchar*) &opt_ibx_safe_slave_backup_timeout,
 | 
						|
	 (uchar*) &opt_ibx_safe_slave_backup_timeout, 0, GET_UINT,
 | 
						|
	 REQUIRED_ARG, 300, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
 | 
						|
	/* Following command-line options are actually handled by xtrabackup.
 | 
						|
	We put them here with only purpose for them to showup in
 | 
						|
	innobackupex --help output */
 | 
						|
 | 
						|
	{"close_files", OPT_CLOSE_FILES, "Do not keep files opened."
 | 
						|
	" Use at your own risk.",
 | 
						|
	 (uchar*) &ibx_xb_close_files, (uchar*) &ibx_xb_close_files, 0,
 | 
						|
	 GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"compress", OPT_COMPRESS, "This option instructs backup to "
 | 
						|
	 "compress backup copies of InnoDB data files."
 | 
						|
	 , (uchar*) &ibx_xtrabackup_compress_alg,
 | 
						|
	 (uchar*) &ibx_xtrabackup_compress_alg, 0,
 | 
						|
	 GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"compress-threads", OPT_COMPRESS_THREADS,
 | 
						|
	 "This option specifies the number of worker threads that will be used "
 | 
						|
	 "for parallel compression.",
 | 
						|
	 (uchar*) &ibx_xtrabackup_compress_threads,
 | 
						|
	 (uchar*) &ibx_xtrabackup_compress_threads,
 | 
						|
	 0, GET_UINT, REQUIRED_ARG, 1, 1, UINT_MAX, 0, 0, 0},
 | 
						|
 | 
						|
	{"compress-chunk-size", OPT_COMPRESS_CHUNK_SIZE, "Size of working "
 | 
						|
	 "buffer(s) for compression threads in bytes. The default value "
 | 
						|
	 "is 64K.", (uchar*) &ibx_xtrabackup_compress_chunk_size,
 | 
						|
	 (uchar*) &ibx_xtrabackup_compress_chunk_size,
 | 
						|
	 0, GET_ULL, REQUIRED_ARG, (1 << 16), 1024, ULONGLONG_MAX, 0, 0, 0},
 | 
						|
 | 
						|
	{"export", OPT_EXPORT, " enables exporting individual tables for import "
 | 
						|
	 "into another server.",
 | 
						|
	 (uchar*) &ibx_xtrabackup_export, (uchar*) &ibx_xtrabackup_export,
 | 
						|
	 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"extra-lsndir", OPT_EXTRA_LSNDIR, "This option specifies the "
 | 
						|
	 "directory in which to save an extra copy of the "
 | 
						|
	 "\"" MB_METADATA_FILENAME "\" file. The option accepts a string "
 | 
						|
	 "argument.",
 | 
						|
	 (uchar*) &ibx_xtrabackup_extra_lsndir,
 | 
						|
	 (uchar*) &ibx_xtrabackup_extra_lsndir,
 | 
						|
	 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"incremental-basedir", OPT_INCREMENTAL_BASEDIR, "This option "
 | 
						|
	 "specifies the directory containing the full backup that is the base "
 | 
						|
	 "dataset for the incremental backup.  The option accepts a string "
 | 
						|
	 "argument. It is used with the --incremental option.",
 | 
						|
	 (uchar*) &ibx_xtrabackup_incremental_basedir,
 | 
						|
	 (uchar*) &ibx_xtrabackup_incremental_basedir,
 | 
						|
	 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"incremental-dir", OPT_INCREMENTAL_DIR, "This option specifies the "
 | 
						|
	 "directory where the incremental backup will be combined with the "
 | 
						|
	 "full backup to make a new full backup.  The option accepts a string "
 | 
						|
	 "argument. It is used with the --incremental option.",
 | 
						|
	 (uchar*) &ibx_xtrabackup_incremental_dir,
 | 
						|
	 (uchar*) &ibx_xtrabackup_incremental_dir,
 | 
						|
	 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"incremental-force-scan", OPT_INCREMENTAL_FORCE_SCAN,
 | 
						|
	 "Perform full scan of data files "
 | 
						|
	 "for taking an incremental backup even if full changed page bitmap "
 | 
						|
	 "data is available to enable the backup without the full scan.",
 | 
						|
	 (uchar*)&ibx_xtrabackup_incremental_force_scan,
 | 
						|
	 (uchar*)&ibx_xtrabackup_incremental_force_scan, 0, GET_BOOL, NO_ARG,
 | 
						|
	 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"log-copy-interval", OPT_LOG_COPY_INTERVAL, "This option specifies "
 | 
						|
	 "time interval between checks done by log copying thread in "
 | 
						|
	 "milliseconds.", (uchar*) &ibx_xtrabackup_log_copy_interval,
 | 
						|
	 (uchar*) &ibx_xtrabackup_log_copy_interval,
 | 
						|
	 0, GET_LONG, REQUIRED_ARG, 1000, 0, LONG_MAX, 0, 1, 0},
 | 
						|
 | 
						|
	{"incremental-lsn", OPT_INCREMENTAL, "This option specifies the log "
 | 
						|
	 "sequence number (LSN) to use for the incremental backup.  The option "
 | 
						|
	 "accepts a string argument. It is used with the --incremental option. "
 | 
						|
	 "It is used instead of specifying --incremental-basedir. For "
 | 
						|
	 "databases created by MySQL and Percona Server 5.0-series versions, "
 | 
						|
	 "specify the LSN as two 32-bit integers in high:low format. For "
 | 
						|
	 "databases created in 5.1 and later, specify the LSN as a single "
 | 
						|
	 "64-bit integer.",
 | 
						|
	 (uchar*) &ibx_xtrabackup_incremental,
 | 
						|
	 (uchar*) &ibx_xtrabackup_incremental,
 | 
						|
	 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"parallel", OPT_PARALLEL, "On backup, this option specifies the "
 | 
						|
	 "number of threads to use to back "
 | 
						|
	 "up files concurrently.  The option accepts an integer argument.",
 | 
						|
	 (uchar*) &ibx_xtrabackup_parallel, (uchar*) &ibx_xtrabackup_parallel,
 | 
						|
	 0, GET_INT, REQUIRED_ARG, 1, 1, INT_MAX, 0, 0, 0},
 | 
						|
 | 
						|
 | 
						|
	{"stream", OPT_STREAM, "This option specifies the format in which to "
 | 
						|
	 "do the streamed backup.  The option accepts a string argument. The "
 | 
						|
	 "backup will be done to STDOUT in the specified format. Currently, "
 | 
						|
	 "the only supported formats are tar and mbstream/xbstream.",
 | 
						|
	 (uchar*) &ibx_xtrabackup_stream_str,
 | 
						|
	 (uchar*) &ibx_xtrabackup_stream_str, 0, GET_STR,
 | 
						|
	 REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"tables-file", OPT_TABLES_FILE, "This option specifies the file in "
 | 
						|
	 "which there are a list of names of the form database.  The option "
 | 
						|
	 "accepts a string argument.table, one per line.",
 | 
						|
	 (uchar*) &ibx_xtrabackup_tables_file,
 | 
						|
	 (uchar*) &ibx_xtrabackup_tables_file,
 | 
						|
	 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"throttle", OPT_THROTTLE, "This option specifies a number of I/O "
 | 
						|
	 "operations (pairs of read+write) per second.  It accepts an integer "
 | 
						|
	 "argument.",
 | 
						|
	 (uchar*) &ibx_xtrabackup_throttle, (uchar*) &ibx_xtrabackup_throttle,
 | 
						|
	 0, GET_LONG, REQUIRED_ARG, 0, 0, LONG_MAX, 0, 1, 0},
 | 
						|
 | 
						|
	{"tmpdir", 't', "This option specifies the location where a temporary "
 | 
						|
	 "files will be stored. If the option is not specified, the default is "
 | 
						|
	 "to use the value of tmpdir read from the server configuration.",
 | 
						|
	 (uchar*) &ibx_opt_mysql_tmpdir,
 | 
						|
	 (uchar*) &ibx_opt_mysql_tmpdir, 0, GET_STR, REQUIRED_ARG,
 | 
						|
	 0, 0, 0, 0, 0, 0},
 | 
						|
 | 
						|
	{"use-memory", OPT_USE_MEMORY, "This option accepts a string argument "
 | 
						|
	 "that specifies the amount of memory in bytes to use "
 | 
						|
	 "for crash recovery while preparing a backup. Multiples are supported "
 | 
						|
	 "providing the unit (e.g. 1MB, 1GB). It is used only with the option "
 | 
						|
	 "--apply-log.",
 | 
						|
	 (uchar*) &ibx_xtrabackup_use_memory,
 | 
						|
	 (uchar*) &ibx_xtrabackup_use_memory,
 | 
						|
	 0, GET_LL, REQUIRED_ARG, 100*1024*1024L, 1024*1024L, LONGLONG_MAX, 0,
 | 
						|
	 1024*1024L, 0},
 | 
						|
 | 
						|
	{"innodb-force-recovery", OPT_INNODB_FORCE_RECOVERY,
 | 
						|
	 "This option starts up the embedded InnoDB instance in crash "
 | 
						|
	 "recovery mode to ignore page corruption; should be used "
 | 
						|
	 "with the \"--apply-log\" option, in emergencies only. The "
 | 
						|
	 "default value is 0. Refer to \"innodb_force_recovery\" server "
 | 
						|
	 "system variable documentation for more details.",
 | 
						|
	 (uchar*)&xtrabackup_innodb_force_recovery,
 | 
						|
	 (uchar*)&xtrabackup_innodb_force_recovery,
 | 
						|
	 0, GET_ULONG, OPT_ARG, 0, 0, SRV_FORCE_IGNORE_CORRUPT, 0, 0, 0},
 | 
						|
 | 
						|
	{ 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
static void usage(void)
 | 
						|
{
 | 
						|
	puts("Open source backup tool\n\
 | 
						|
\n\
 | 
						|
Copyright (C) 2009-2015 Percona LLC and/or its affiliates.\n\
 | 
						|
Portions Copyright (C) 2000, 2011, MySQL AB & Innobase Oy. All Rights Reserved.\n\
 | 
						|
\n\
 | 
						|
This program is free software; you can redistribute it and/or\n\
 | 
						|
modify it under the terms of the GNU General Public License\n\
 | 
						|
as published by the Free Software Foundation version 2\n\
 | 
						|
of the License.\n\
 | 
						|
\n\
 | 
						|
This program is distributed in the hope that it will be useful,\n\
 | 
						|
but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
 | 
						|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\
 | 
						|
GNU General Public License for more details.\n\
 | 
						|
\n\
 | 
						|
You can download full text of the license on http://www.gnu.org/licenses/gpl-2.0.txt\n\n");
 | 
						|
 | 
						|
	puts("innobackupex - Non-blocking backup tool for InnoDB, XtraDB and HailDB databases\n\
 | 
						|
\n\
 | 
						|
SYNOPOSIS\n\
 | 
						|
\n\
 | 
						|
innobackupex [--compress] [--compress-threads=NUMBER-OF-THREADS] [--compress-chunk-size=CHUNK-SIZE]\n\
 | 
						|
             [--include=REGEXP] [--user=NAME]\n\
 | 
						|
             [--password=WORD] [--port=PORT] [--socket=SOCKET]\n\
 | 
						|
             [--no-timestamp] [--ibbackup=IBBACKUP-BINARY]\n\
 | 
						|
             [--slave-info] [--galera-info] [--stream=tar|mbstream|xbstream]\n\
 | 
						|
             [--defaults-file=MY.CNF] [--defaults-group=GROUP-NAME]\n\
 | 
						|
             [--databases=LIST] [--no-lock] \n\
 | 
						|
             [--tmpdir=DIRECTORY] [--tables-file=FILE]\n\
 | 
						|
             [--history=NAME]\n\
 | 
						|
             [--incremental] [--incremental-basedir]\n\
 | 
						|
             [--incremental-dir] [--incremental-force-scan] [--incremental-lsn]\n\
 | 
						|
             [--incremental-history-name=NAME] [--incremental-history-uuid=UUID]\n\
 | 
						|
             [--close-files]\n\
 | 
						|
             BACKUP-ROOT-DIR\n\
 | 
						|
\n\
 | 
						|
innobackupex --apply-log [--use-memory=B]\n\
 | 
						|
             [--defaults-file=MY.CNF]\n\
 | 
						|
             [--export] [--ibbackup=IBBACKUP-BINARY]\n\
 | 
						|
             [--innodb-force-recovery=1]\n\
 | 
						|
             BACKUP-DIR\n\
 | 
						|
\n\
 | 
						|
innobackupex --copy-back [--defaults-file=MY.CNF] [--defaults-group=GROUP-NAME] BACKUP-DIR\n\
 | 
						|
\n\
 | 
						|
innobackupex --move-back [--defaults-file=MY.CNF] [--defaults-group=GROUP-NAME] BACKUP-DIR\n\
 | 
						|
\n\
 | 
						|
innobackupex [--decompress]\n\
 | 
						|
             [--parallel=NUMBER-OF-FORKS] BACKUP-DIR\n\
 | 
						|
\n\
 | 
						|
DESCRIPTION\n\
 | 
						|
\n\
 | 
						|
The first command line above makes a hot backup of a database.\n\
 | 
						|
By default it creates a backup directory (named by the current date\n\
 | 
						|
	and time) in the given backup root directory.  With the --no-timestamp\n\
 | 
						|
option it does not create a time-stamped backup directory, but it puts\n\
 | 
						|
the backup in the given directory (which must not exist).  This\n\
 | 
						|
command makes a complete backup of all MyISAM and InnoDB tables and\n\
 | 
						|
indexes in all databases or in all of the databases specified with the\n\
 | 
						|
--databases option.  The created backup contains .frm, .MRG, .MYD,\n\
 | 
						|
.MYI, .MAD, .MAI, .TRG, .TRN, .ARM, .ARZ, .CSM, CSV, .opt, .par, and\n\
 | 
						|
InnoDB data and log files.  The MY.CNF options file defines the\n\
 | 
						|
location of the database.\n\
 | 
						|
\n\
 | 
						|
The --apply-log command prepares a backup for starting a MySQL\n\
 | 
						|
server on the backup. This command recovers InnoDB data files as specified\n\
 | 
						|
in BACKUP-DIR/backup-my.cnf using BACKUP-DIR/ib_logfile0,\n\
 | 
						|
and creates new InnoDB log files as specified in BACKUP-DIR/backup-my.cnf.\n\
 | 
						|
The BACKUP-DIR should be the path to a backup directory\n\
 | 
						|
\n\
 | 
						|
The --copy-back command copies data, index, and log files\n\
 | 
						|
from the backup directory back to their original locations.\n\
 | 
						|
The MY.CNF options file defines the original location of the database.\n\
 | 
						|
The BACKUP-DIR is the path to a backup directory.\n\
 | 
						|
\n\
 | 
						|
The --move-back command is similar to --copy-back with the only difference that\n\
 | 
						|
it moves files to their original locations rather than copies them. As this\n\
 | 
						|
option removes backup files, it must be used with caution. It may be useful in\n\
 | 
						|
cases when there is not enough free disk space to copy files.\n\
 | 
						|
\n\
 | 
						|
The --decompress command will decompress a backup made\n\
 | 
						|
with the --compress option. The\n\
 | 
						|
--parallel option will allow multiple files to be decompressed\n\
 | 
						|
simultaneously. In order to decompress, the qpress utility MUST be installed\n\
 | 
						|
and accessible within the path. This process will remove the original\n\
 | 
						|
compressed files and leave the results in the same location.\n\
 | 
						|
\n\
 | 
						|
On success the exit code innobackupex is 0. A non-zero exit code \n\
 | 
						|
indicates an error.\n");
 | 
						|
	printf("Usage: [%s [--defaults-file=#] --backup | %s [--defaults-file=#] --prepare] [OPTIONS]\n", my_progname, my_progname);
 | 
						|
	my_print_help(ibx_long_options);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
static
 | 
						|
my_bool
 | 
						|
ibx_get_one_option(const struct my_option *opt,
 | 
						|
                   const char *argument, const char *)
 | 
						|
{
 | 
						|
	switch(opt->id) {
 | 
						|
	case '?':
 | 
						|
		usage();
 | 
						|
		exit(0);
 | 
						|
		break;
 | 
						|
	case 'v':
 | 
						|
		printf("innobackupex version %s %s (%s)",
 | 
						|
			MYSQL_SERVER_VERSION,
 | 
						|
			SYSTEM_TYPE, MACHINE_TYPE);
 | 
						|
		exit(0);
 | 
						|
		break;
 | 
						|
	case OPT_HISTORY:
 | 
						|
		if (argument) {
 | 
						|
			opt_ibx_history = argument;
 | 
						|
		} else {
 | 
						|
			opt_ibx_history = "";
 | 
						|
		}
 | 
						|
		break;
 | 
						|
	case OPT_STREAM:
 | 
						|
		if (!strcasecmp(argument, "mbstream") ||
 | 
						|
		    !strcasecmp(argument, "xbstream"))
 | 
						|
			xtrabackup_stream_fmt = XB_STREAM_FMT_XBSTREAM;
 | 
						|
		else {
 | 
						|
			ibx_msg("Invalid --stream argument: %s\n", argument);
 | 
						|
			return 1;
 | 
						|
		}
 | 
						|
		xtrabackup_stream = TRUE;
 | 
						|
		break;
 | 
						|
	case OPT_COMPRESS:
 | 
						|
		if (argument == NULL)
 | 
						|
			xtrabackup_compress_alg = "quicklz";
 | 
						|
		else if (strcasecmp(argument, "quicklz"))
 | 
						|
		{
 | 
						|
			ibx_msg("Invalid --compress argument: %s\n", argument);
 | 
						|
			return 1;
 | 
						|
		}
 | 
						|
		xtrabackup_compress = TRUE;
 | 
						|
		break;
 | 
						|
	case 'p':
 | 
						|
    opt_ibx_password= argument;
 | 
						|
		break;
 | 
						|
        }
 | 
						|
	return(0);
 | 
						|
}
 | 
						|
 | 
						|
bool
 | 
						|
make_backup_dir()
 | 
						|
{
 | 
						|
	time_t t = time(NULL);
 | 
						|
	char buf[100];
 | 
						|
 | 
						|
	if (!opt_ibx_notimestamp && !ibx_xtrabackup_stream_str) {
 | 
						|
		strftime(buf, sizeof(buf), "%Y-%m-%d_%H-%M-%S", localtime(&t));
 | 
						|
		ut_a(asprintf(&ibx_backup_directory, "%s/%s",
 | 
						|
				ibx_position_arg, buf) != -1);
 | 
						|
	} else {
 | 
						|
		ibx_backup_directory = strdup(ibx_position_arg);
 | 
						|
	}
 | 
						|
 | 
						|
	if (!directory_exists(ibx_backup_directory, true)) {
 | 
						|
		return(false);
 | 
						|
	}
 | 
						|
 | 
						|
	return(true);
 | 
						|
}
 | 
						|
 | 
						|
bool
 | 
						|
ibx_handle_options(int *argc, char ***argv)
 | 
						|
{
 | 
						|
	int i, n_arguments;
 | 
						|
 | 
						|
	if (handle_options(argc, argv, ibx_long_options, ibx_get_one_option)) {
 | 
						|
		return(false);
 | 
						|
	}
 | 
						|
 | 
						|
	if (opt_ibx_apply_log) {
 | 
						|
		ibx_mode = IBX_MODE_APPLY_LOG;
 | 
						|
	} else if (opt_ibx_copy_back) {
 | 
						|
		ibx_mode = IBX_MODE_COPY_BACK;
 | 
						|
	} else if (opt_ibx_move_back) {
 | 
						|
		ibx_mode = IBX_MODE_MOVE_BACK;
 | 
						|
	} else if (opt_ibx_decompress) {
 | 
						|
		ibx_mode = IBX_MODE_DECRYPT_DECOMPRESS;
 | 
						|
	} else {
 | 
						|
		ibx_mode = IBX_MODE_BACKUP;
 | 
						|
	}
 | 
						|
 | 
						|
	/* find and save position argument */
 | 
						|
	i = 0;
 | 
						|
	n_arguments = 0;
 | 
						|
	while (i < *argc) {
 | 
						|
		char *opt = (*argv)[i];
 | 
						|
 | 
						|
		if (strncmp(opt, "--", 2) != 0
 | 
						|
		    && !(strlen(opt) == 2 && opt[0] == '-')) {
 | 
						|
			if (ibx_position_arg != NULL
 | 
						|
				&& ibx_position_arg != opt) {
 | 
						|
				ibx_msg("Error: extra argument found %s\n",
 | 
						|
					opt);
 | 
						|
			}
 | 
						|
			ibx_position_arg = opt;
 | 
						|
			++n_arguments;
 | 
						|
		}
 | 
						|
		++i;
 | 
						|
	}
 | 
						|
 | 
						|
	*argc -= n_arguments;
 | 
						|
	if (n_arguments > 1) {
 | 
						|
		return(false);
 | 
						|
	}
 | 
						|
 | 
						|
	if (ibx_position_arg == NULL) {
 | 
						|
		ibx_msg("Missing argument\n");
 | 
						|
		return(false);
 | 
						|
	}
 | 
						|
 | 
						|
	/* set argv[0] to be the program name */
 | 
						|
	--(*argv);
 | 
						|
	++(*argc);
 | 
						|
 | 
						|
	return(true);
 | 
						|
}
 | 
						|
 | 
						|
/*********************************************************************//**
 | 
						|
Parse command-line options, connect to MySQL server,
 | 
						|
detect server capabilities, etc.
 | 
						|
@return	true on success. */
 | 
						|
bool
 | 
						|
ibx_init()
 | 
						|
{
 | 
						|
	const char *run;
 | 
						|
 | 
						|
	/*=====================*/
 | 
						|
	xtrabackup_copy_back = opt_ibx_copy_back;
 | 
						|
	xtrabackup_move_back = opt_ibx_move_back;
 | 
						|
	opt_galera_info = opt_ibx_galera_info;
 | 
						|
	opt_slave_info = opt_ibx_slave_info;
 | 
						|
	opt_no_lock = opt_ibx_no_lock;
 | 
						|
	opt_safe_slave_backup = opt_ibx_safe_slave_backup;
 | 
						|
	opt_force_non_empty_dirs = opt_ibx_force_non_empty_dirs;
 | 
						|
	opt_noversioncheck = opt_ibx_noversioncheck;
 | 
						|
	opt_decompress = opt_ibx_decompress;
 | 
						|
 | 
						|
	opt_incremental_history_name = opt_ibx_incremental_history_name;
 | 
						|
	opt_incremental_history_uuid = opt_ibx_incremental_history_uuid;
 | 
						|
 | 
						|
	opt_user = opt_ibx_user;
 | 
						|
	opt_password = opt_ibx_password;
 | 
						|
	opt_host = opt_ibx_host;
 | 
						|
	opt_defaults_group = opt_ibx_defaults_group;
 | 
						|
	opt_socket = opt_ibx_socket;
 | 
						|
	opt_port = opt_ibx_port;
 | 
						|
 | 
						|
	opt_lock_wait_query_type = opt_ibx_lock_wait_query_type;
 | 
						|
	opt_kill_long_query_type = opt_ibx_kill_long_query_type;
 | 
						|
 | 
						|
	opt_kill_long_queries_timeout = opt_ibx_kill_long_queries_timeout;
 | 
						|
	opt_lock_wait_timeout = opt_ibx_lock_wait_timeout;
 | 
						|
	opt_lock_wait_threshold = opt_ibx_lock_wait_threshold;
 | 
						|
	opt_debug_sleep_before_unlock = opt_ibx_debug_sleep_before_unlock;
 | 
						|
	opt_safe_slave_backup_timeout = opt_ibx_safe_slave_backup_timeout;
 | 
						|
 | 
						|
	opt_history = opt_ibx_history;
 | 
						|
 | 
						|
	/* setup xtrabackup options */
 | 
						|
	xb_close_files = ibx_xb_close_files;
 | 
						|
	xtrabackup_compress_alg = ibx_xtrabackup_compress_alg;
 | 
						|
	xtrabackup_compress_threads = ibx_xtrabackup_compress_threads;
 | 
						|
	xtrabackup_compress_chunk_size = ibx_xtrabackup_compress_chunk_size;
 | 
						|
	xtrabackup_export = ibx_xtrabackup_export;
 | 
						|
	xtrabackup_extra_lsndir = ibx_xtrabackup_extra_lsndir;
 | 
						|
	xtrabackup_incremental_basedir = ibx_xtrabackup_incremental_basedir;
 | 
						|
	xtrabackup_incremental_dir = ibx_xtrabackup_incremental_dir;
 | 
						|
	xtrabackup_incremental_force_scan =
 | 
						|
					ibx_xtrabackup_incremental_force_scan;
 | 
						|
	xtrabackup_log_copy_interval = ibx_xtrabackup_log_copy_interval;
 | 
						|
	xtrabackup_incremental = ibx_xtrabackup_incremental;
 | 
						|
	xtrabackup_parallel = ibx_xtrabackup_parallel;
 | 
						|
	xtrabackup_stream_str = ibx_xtrabackup_stream_str;
 | 
						|
	xtrabackup_tables_file = ibx_xtrabackup_tables_file;
 | 
						|
	xtrabackup_throttle = ibx_xtrabackup_throttle;
 | 
						|
	opt_mysql_tmpdir = ibx_opt_mysql_tmpdir;
 | 
						|
	xtrabackup_use_memory = ibx_xtrabackup_use_memory;
 | 
						|
 | 
						|
	if (!opt_ibx_incremental
 | 
						|
	    && (xtrabackup_incremental
 | 
						|
	    	|| xtrabackup_incremental_basedir
 | 
						|
	    	|| opt_ibx_incremental_history_name
 | 
						|
	    	|| opt_ibx_incremental_history_uuid)) {
 | 
						|
		ibx_msg("Error: --incremental-lsn, --incremental-basedir, "
 | 
						|
			"--incremental-history-name and "
 | 
						|
			"--incremental-history-uuid require the "
 | 
						|
			"--incremental option.\n");
 | 
						|
		return(false);
 | 
						|
	}
 | 
						|
 | 
						|
	if (opt_ibx_databases != NULL) {
 | 
						|
		if (is_path_separator(*opt_ibx_databases)) {
 | 
						|
			xtrabackup_databases_file = opt_ibx_databases;
 | 
						|
		} else {
 | 
						|
			xtrabackup_databases = opt_ibx_databases;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/* --tables and --tables-file options are xtrabackup only */
 | 
						|
	ibx_partial_backup = (opt_ibx_include || opt_ibx_databases);
 | 
						|
 | 
						|
	if (ibx_mode == IBX_MODE_BACKUP) {
 | 
						|
 | 
						|
		if (!make_backup_dir()) {
 | 
						|
			return(false);
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/* --binlog-info is xtrabackup only, so force
 | 
						|
	--binlog-info=ON. i.e. behavior before the feature had been
 | 
						|
	implemented */
 | 
						|
	opt_binlog_info = BINLOG_INFO_ON;
 | 
						|
 | 
						|
	switch (ibx_mode) {
 | 
						|
	case IBX_MODE_APPLY_LOG:
 | 
						|
		xtrabackup_prepare = TRUE;
 | 
						|
		xtrabackup_target_dir = ibx_position_arg;
 | 
						|
		run = "apply-log";
 | 
						|
		break;
 | 
						|
	case IBX_MODE_BACKUP:
 | 
						|
		xtrabackup_backup = TRUE;
 | 
						|
		xtrabackup_target_dir = ibx_backup_directory;
 | 
						|
		if (opt_ibx_include != NULL) {
 | 
						|
			xtrabackup_tables = opt_ibx_include;
 | 
						|
		}
 | 
						|
		run = "backup";
 | 
						|
		break;
 | 
						|
	case IBX_MODE_COPY_BACK:
 | 
						|
		xtrabackup_copy_back = TRUE;
 | 
						|
		xtrabackup_target_dir = ibx_position_arg;
 | 
						|
		run = "copy-back";
 | 
						|
		break;
 | 
						|
	case IBX_MODE_MOVE_BACK:
 | 
						|
		xtrabackup_move_back = TRUE;
 | 
						|
		xtrabackup_target_dir = ibx_position_arg;
 | 
						|
		run = "move-back";
 | 
						|
		break;
 | 
						|
	case IBX_MODE_DECRYPT_DECOMPRESS:
 | 
						|
		xtrabackup_decrypt_decompress = TRUE;
 | 
						|
		xtrabackup_target_dir = ibx_position_arg;
 | 
						|
		run = "decompress";
 | 
						|
		break;
 | 
						|
	default:
 | 
						|
		ut_error;
 | 
						|
	}
 | 
						|
 | 
						|
	ibx_msg("Starting the %s operation\n\n"
 | 
						|
		"IMPORTANT: Please check that the %s run completes "
 | 
						|
		"successfully.\n"
 | 
						|
		"           At the end of a successful %s run innobackupex\n"
 | 
						|
		"           prints \"completed OK!\".\n\n", run, run, run);
 | 
						|
 | 
						|
 | 
						|
	return(true);
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
ibx_cleanup()
 | 
						|
{
 | 
						|
	free(ibx_backup_directory);
 | 
						|
}
 |