1 | /****************************************************** |
2 | hot backup tool for InnoDB |
3 | (c) 2009-2015 Percona LLC and/or its affiliates |
4 | Originally Created 3/3/2009 Yasufumi Kinoshita |
5 | Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko, |
6 | Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz. |
7 | |
8 | This program is free software; you can redistribute it and/or modify |
9 | it under the terms of the GNU General Public License as published by |
10 | the Free Software Foundation; version 2 of the License. |
11 | |
12 | This program is distributed in the hope that it will be useful, |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | GNU General Public License for more details. |
16 | |
17 | You should have received a copy of the GNU General Public License |
18 | along with this program; if not, write to the Free Software |
19 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
20 | |
21 | ******************************************************* |
22 | |
23 | This file incorporates work covered by the following copyright and |
24 | permission notice: |
25 | |
26 | Copyright (c) 2000, 2011, MySQL AB & Innobase Oy. All Rights Reserved. |
27 | |
28 | This program is free software; you can redistribute it and/or modify it under |
29 | the terms of the GNU General Public License as published by the Free Software |
30 | Foundation; version 2 of the License. |
31 | |
32 | This program is distributed in the hope that it will be useful, but WITHOUT |
33 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
34 | FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. |
35 | |
36 | You should have received a copy of the GNU General Public License along with |
37 | this program; if not, write to the Free Software Foundation, Inc., 59 Temple |
38 | Place, Suite 330, Boston, MA 02111-1307 USA |
39 | |
40 | *******************************************************/ |
41 | |
42 | #include <my_global.h> |
43 | #include <stdio.h> |
44 | #include <string.h> |
45 | #include <mysql.h> |
46 | #include <my_dir.h> |
47 | #include <ut0mem.h> |
48 | #include <os0file.h> |
49 | #include <srv0start.h> |
50 | #include <algorithm> |
51 | #include <mysqld.h> |
52 | #include <my_default.h> |
53 | #include <my_getopt.h> |
54 | #include <string> |
55 | #include <sstream> |
56 | #include <set> |
57 | #include "common.h" |
58 | #include "innobackupex.h" |
59 | #include "xtrabackup.h" |
60 | #include "xbstream.h" |
61 | #include "fil_cur.h" |
62 | #include "write_filt.h" |
63 | #include "backup_copy.h" |
64 | |
65 | using std::min; |
66 | using std::max; |
67 | |
68 | /* options */ |
69 | my_bool opt_ibx_version = FALSE; |
70 | my_bool opt_ibx_help = FALSE; |
71 | my_bool opt_ibx_apply_log = FALSE; |
72 | my_bool opt_ibx_incremental = FALSE; |
73 | my_bool opt_ibx_notimestamp = FALSE; |
74 | |
75 | my_bool opt_ibx_copy_back = FALSE; |
76 | my_bool opt_ibx_move_back = FALSE; |
77 | my_bool opt_ibx_galera_info = FALSE; |
78 | my_bool opt_ibx_slave_info = FALSE; |
79 | my_bool opt_ibx_no_lock = FALSE; |
80 | my_bool opt_ibx_safe_slave_backup = FALSE; |
81 | my_bool opt_ibx_rsync = FALSE; |
82 | my_bool opt_ibx_force_non_empty_dirs = FALSE; |
83 | my_bool opt_ibx_noversioncheck = FALSE; |
84 | my_bool opt_ibx_no_backup_locks = FALSE; |
85 | my_bool opt_ibx_decompress = FALSE; |
86 | |
87 | char *opt_ibx_incremental_history_name = NULL; |
88 | char *opt_ibx_incremental_history_uuid = NULL; |
89 | |
90 | char *opt_ibx_user = NULL; |
91 | char *opt_ibx_password = NULL; |
92 | char *opt_ibx_host = NULL; |
93 | char *opt_ibx_defaults_group = NULL; |
94 | char *opt_ibx_socket = NULL; |
95 | uint opt_ibx_port = 0; |
96 | |
97 | ulong opt_ibx_lock_wait_query_type; |
98 | ulong opt_ibx_kill_long_query_type; |
99 | |
100 | uint opt_ibx_kill_long_queries_timeout = 0; |
101 | uint opt_ibx_lock_wait_timeout = 0; |
102 | uint opt_ibx_lock_wait_threshold = 0; |
103 | uint opt_ibx_debug_sleep_before_unlock = 0; |
104 | uint opt_ibx_safe_slave_backup_timeout = 0; |
105 | |
106 | const char *opt_ibx_history = NULL; |
107 | |
108 | char *opt_ibx_include = NULL; |
109 | char *opt_ibx_databases = NULL; |
110 | bool ibx_partial_backup = false; |
111 | |
112 | char *ibx_position_arg = NULL; |
113 | char *ibx_backup_directory = NULL; |
114 | |
115 | /* copy of proxied xtrabackup options */ |
116 | my_bool ibx_xb_close_files; |
117 | const char *ibx_xtrabackup_compress_alg; |
118 | uint ibx_xtrabackup_compress_threads; |
119 | ulonglong ibx_xtrabackup_compress_chunk_size; |
120 | my_bool ibx_xtrabackup_export; |
121 | char *; |
122 | char *ibx_xtrabackup_incremental_basedir; |
123 | char *ibx_xtrabackup_incremental_dir; |
124 | my_bool ibx_xtrabackup_incremental_force_scan; |
125 | ulint ibx_xtrabackup_log_copy_interval; |
126 | char *ibx_xtrabackup_incremental; |
127 | int ibx_xtrabackup_parallel; |
128 | char *ibx_xtrabackup_stream_str; |
129 | char *ibx_xtrabackup_tables_file; |
130 | long ibx_xtrabackup_throttle; |
131 | char *ibx_opt_mysql_tmpdir; |
132 | longlong ibx_xtrabackup_use_memory; |
133 | |
134 | |
135 | static inline int ibx_msg(const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 1, 2); |
136 | static inline int ibx_msg(const char *fmt, ...) |
137 | { |
138 | int result; |
139 | time_t t = time(NULL); |
140 | char date[100]; |
141 | char *line; |
142 | va_list args; |
143 | |
144 | strftime(date, sizeof(date), "%y%m%d %H:%M:%S" , localtime(&t)); |
145 | |
146 | va_start(args, fmt); |
147 | |
148 | result = vasprintf(&line, fmt, args); |
149 | |
150 | va_end(args); |
151 | |
152 | if (result != -1) { |
153 | result = fprintf(stderr, "%s %s: %s" , |
154 | date, INNOBACKUPEX_BIN_NAME, line); |
155 | free(line); |
156 | } |
157 | |
158 | return result; |
159 | } |
160 | |
161 | enum innobackupex_options |
162 | { |
163 | OPT_APPLY_LOG = 256, |
164 | OPT_COPY_BACK, |
165 | OPT_MOVE_BACK, |
166 | OPT_REDO_ONLY, |
167 | OPT_GALERA_INFO, |
168 | OPT_SLAVE_INFO, |
169 | OPT_INCREMENTAL, |
170 | OPT_INCREMENTAL_HISTORY_NAME, |
171 | OPT_INCREMENTAL_HISTORY_UUID, |
172 | OPT_LOCK_WAIT_QUERY_TYPE, |
173 | OPT_KILL_LONG_QUERY_TYPE, |
174 | OPT_KILL_LONG_QUERIES_TIMEOUT, |
175 | OPT_LOCK_WAIT_TIMEOUT, |
176 | OPT_LOCK_WAIT_THRESHOLD, |
177 | OPT_DEBUG_SLEEP_BEFORE_UNLOCK, |
178 | OPT_NO_LOCK, |
179 | OPT_SAFE_SLAVE_BACKUP, |
180 | OPT_SAFE_SLAVE_BACKUP_TIMEOUT, |
181 | OPT_RSYNC, |
182 | OPT_HISTORY, |
183 | OPT_INCLUDE, |
184 | OPT_FORCE_NON_EMPTY_DIRS, |
185 | OPT_NO_TIMESTAMP, |
186 | OPT_NO_VERSION_CHECK, |
187 | OPT_NO_BACKUP_LOCKS, |
188 | OPT_DATABASES, |
189 | OPT_DECOMPRESS, |
190 | |
191 | /* options wich are passed directly to xtrabackup */ |
192 | OPT_CLOSE_FILES, |
193 | OPT_COMPACT, |
194 | OPT_COMPRESS, |
195 | OPT_COMPRESS_THREADS, |
196 | OPT_COMPRESS_CHUNK_SIZE, |
197 | OPT_EXPORT, |
198 | , |
199 | OPT_INCREMENTAL_BASEDIR, |
200 | OPT_INCREMENTAL_DIR, |
201 | OPT_INCREMENTAL_FORCE_SCAN, |
202 | OPT_LOG_COPY_INTERVAL, |
203 | OPT_PARALLEL, |
204 | OPT_REBUILD_INDEXES, |
205 | OPT_REBUILD_THREADS, |
206 | OPT_STREAM, |
207 | OPT_TABLES_FILE, |
208 | OPT_THROTTLE, |
209 | OPT_USE_MEMORY |
210 | }; |
211 | |
212 | ibx_mode_t ibx_mode = IBX_MODE_BACKUP; |
213 | |
214 | static struct my_option ibx_long_options[] = |
215 | { |
216 | {"version" , 'v', "print xtrabackup version information" , |
217 | (uchar *) &opt_ibx_version, (uchar *) &opt_ibx_version, 0, |
218 | GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, |
219 | |
220 | {"help" , '?', "This option displays a help screen and exits." , |
221 | (uchar *) &opt_ibx_help, (uchar *) &opt_ibx_help, 0, |
222 | GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, |
223 | |
224 | {"apply-log" , OPT_APPLY_LOG, "Prepare a backup in BACKUP-DIR by " |
225 | "applying the redo log 'ib_logfile0' and creating new redo log. " |
226 | "The InnoDB configuration is read from the file \"backup-my.cnf\"." , |
227 | (uchar*) &opt_ibx_apply_log, (uchar*) &opt_ibx_apply_log, |
228 | 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, |
229 | |
230 | {"copy-back" , OPT_COPY_BACK, "Copy all the files in a previously made " |
231 | "backup from the backup directory to their original locations." , |
232 | (uchar *) &opt_ibx_copy_back, (uchar *) &opt_ibx_copy_back, 0, |
233 | GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, |
234 | |
235 | {"move-back" , OPT_MOVE_BACK, "Move all the files in a previously made " |
236 | "backup from the backup directory to the actual datadir location. " |
237 | "Use with caution, as it removes backup files." , |
238 | (uchar *) &opt_ibx_move_back, (uchar *) &opt_ibx_move_back, 0, |
239 | GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, |
240 | |
241 | {"galera-info" , OPT_GALERA_INFO, "This options creates the " |
242 | "xtrabackup_galera_info file which contains the local node state at " |
243 | "the time of the backup. Option should be used when performing the " |
244 | "backup of MariaDB Galera Cluster. Has no effect when backup locks " |
245 | "are used to create the backup." , |
246 | (uchar *) &opt_ibx_galera_info, (uchar *) &opt_ibx_galera_info, 0, |
247 | GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, |
248 | |
249 | {"slave-info" , OPT_SLAVE_INFO, "This option is useful when backing " |
250 | "up a replication slave server. It prints the binary log position " |
251 | "and name of the master server. It also writes this information to " |
252 | "the \"xtrabackup_slave_info\" file as a \"CHANGE MASTER\" command. " |
253 | "A new slave for this master can be set up by starting a slave server " |
254 | "on this backup and issuing a \"CHANGE MASTER\" command with the " |
255 | "binary log position saved in the \"xtrabackup_slave_info\" file." , |
256 | (uchar *) &opt_ibx_slave_info, (uchar *) &opt_ibx_slave_info, 0, |
257 | GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, |
258 | |
259 | {"incremental" , OPT_INCREMENTAL, "This option tells xtrabackup to " |
260 | "create an incremental backup, rather than a full one. It is passed " |
261 | "to the xtrabackup child process. When this option is specified, " |
262 | "either --incremental-lsn or --incremental-basedir can also be given. " |
263 | "If neither option is given, option --incremental-basedir is passed " |
264 | "to xtrabackup by default, set to the first timestamped backup " |
265 | "directory in the backup base directory." , |
266 | (uchar *) &opt_ibx_incremental, (uchar *) &opt_ibx_incremental, 0, |
267 | GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, |
268 | |
269 | {"no-lock" , OPT_NO_LOCK, "Use this option to disable table lock " |
270 | "with \"FLUSH TABLES WITH READ LOCK\". Use it only if ALL your " |
271 | "tables are InnoDB and you DO NOT CARE about the binary log " |
272 | "position of the backup. This option shouldn't be used if there " |
273 | "are any DDL statements being executed or if any updates are " |
274 | "happening on non-InnoDB tables (this includes the system MyISAM " |
275 | "tables in the mysql database), otherwise it could lead to an " |
276 | "inconsistent backup. If you are considering to use --no-lock " |
277 | "because your backups are failing to acquire the lock, this could " |
278 | "be because of incoming replication events preventing the lock " |
279 | "from succeeding. Please try using --safe-slave-backup to " |
280 | "momentarily stop the replication slave thread, this may help " |
281 | "the backup to succeed and you then don't need to resort to " |
282 | "using this option." , |
283 | (uchar *) &opt_ibx_no_lock, (uchar *) &opt_ibx_no_lock, 0, |
284 | GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, |
285 | |
286 | {"safe-slave-backup" , OPT_SAFE_SLAVE_BACKUP, "Stop slave SQL thread " |
287 | "and wait to start backup until Slave_open_temp_tables in " |
288 | "\"SHOW STATUS\" is zero. If there are no open temporary tables, " |
289 | "the backup will take place, otherwise the SQL thread will be " |
290 | "started and stopped until there are no open temporary tables. " |
291 | "The backup will fail if Slave_open_temp_tables does not become " |
292 | "zero after --safe-slave-backup-timeout seconds. The slave SQL " |
293 | "thread will be restarted when the backup finishes." , |
294 | (uchar *) &opt_ibx_safe_slave_backup, |
295 | (uchar *) &opt_ibx_safe_slave_backup, |
296 | 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, |
297 | |
298 | {"rsync" , OPT_RSYNC, "Uses the rsync utility to optimize local file " |
299 | "transfers. When this option is specified, innobackupex uses rsync " |
300 | "to copy all non-InnoDB files instead of spawning a separate cp for " |
301 | "each file, which can be much faster for servers with a large number " |
302 | "of databases or tables. This option cannot be used together with " |
303 | "--stream." , |
304 | (uchar *) &opt_ibx_rsync, (uchar *) &opt_ibx_rsync, |
305 | 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, |
306 | |
307 | {"force-non-empty-directories" , OPT_FORCE_NON_EMPTY_DIRS, "This " |
308 | "option, when specified, makes --copy-back or --move-back transfer " |
309 | "files to non-empty directories. Note that no existing files will be " |
310 | "overwritten. If --copy-back or --nove-back has to copy a file from " |
311 | "the backup directory which already exists in the destination " |
312 | "directory, it will still fail with an error." , |
313 | (uchar *) &opt_ibx_force_non_empty_dirs, |
314 | (uchar *) &opt_ibx_force_non_empty_dirs, |
315 | 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, |
316 | |
317 | {"no-timestamp" , OPT_NO_TIMESTAMP, "This option prevents creation of a " |
318 | "time-stamped subdirectory of the BACKUP-ROOT-DIR given on the " |
319 | "command line. When it is specified, the backup is done in " |
320 | "BACKUP-ROOT-DIR instead." , |
321 | (uchar *) &opt_ibx_notimestamp, |
322 | (uchar *) &opt_ibx_notimestamp, |
323 | 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, |
324 | |
325 | {"no-version-check" , OPT_NO_VERSION_CHECK, "This option disables the " |
326 | "version check which is enabled by the --version-check option." , |
327 | (uchar *) &opt_ibx_noversioncheck, |
328 | (uchar *) &opt_ibx_noversioncheck, |
329 | 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, |
330 | |
331 | {"no-backup-locks" , OPT_NO_BACKUP_LOCKS, "This option controls if " |
332 | "backup locks should be used instead of FLUSH TABLES WITH READ LOCK " |
333 | "on the backup stage. The option has no effect when backup locks are " |
334 | "not supported by the server. This option is enabled by default, " |
335 | "disable with --no-backup-locks." , |
336 | (uchar *) &opt_ibx_no_backup_locks, |
337 | (uchar *) &opt_ibx_no_backup_locks, |
338 | 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, |
339 | |
340 | {"decompress" , OPT_DECOMPRESS, "Decompresses all files with the .qp " |
341 | "extension in a backup previously made with the --compress option." , |
342 | (uchar *) &opt_ibx_decompress, |
343 | (uchar *) &opt_ibx_decompress, |
344 | 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, |
345 | |
346 | {"user" , 'u', "This option specifies the MySQL username used " |
347 | "when connecting to the server, if that's not the current user. " |
348 | "The option accepts a string argument. See mysql --help for details." , |
349 | (uchar*) &opt_ibx_user, (uchar*) &opt_ibx_user, 0, GET_STR, |
350 | REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, |
351 | |
352 | {"host" , 'H', "This option specifies the host to use when " |
353 | "connecting to the database server with TCP/IP. The option accepts " |
354 | "a string argument. See mysql --help for details." , |
355 | (uchar*) &opt_ibx_host, (uchar*) &opt_ibx_host, 0, GET_STR, |
356 | REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, |
357 | |
358 | {"port" , 'P', "This option specifies the port to use when " |
359 | "connecting to the database server with TCP/IP. The option accepts " |
360 | "a string argument. See mysql --help for details." , |
361 | &opt_ibx_port, &opt_ibx_port, 0, GET_UINT, REQUIRED_ARG, |
362 | 0, 0, 0, 0, 0, 0}, |
363 | |
364 | {"password" , 'p', "This option specifies the password to use " |
365 | "when connecting to the database. It accepts a string argument. " |
366 | "See mysql --help for details." , |
367 | 0, 0, 0, GET_STR, |
368 | REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, |
369 | |
370 | {"socket" , 'S', "This option specifies the socket to use when " |
371 | "connecting to the local database server with a UNIX domain socket. " |
372 | "The option accepts a string argument. See mysql --help for details." , |
373 | (uchar*) &opt_ibx_socket, (uchar*) &opt_ibx_socket, 0, GET_STR, |
374 | REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, |
375 | |
376 | {"incremental-history-name" , OPT_INCREMENTAL_HISTORY_NAME, |
377 | "This option specifies the name of the backup series stored in the " |
378 | "PERCONA_SCHEMA.xtrabackup_history history record to base an " |
379 | "incremental backup on. Xtrabackup will search the history table " |
380 | "looking for the most recent (highest innodb_to_lsn), successful " |
381 | "backup in the series and take the to_lsn value to use as the " |
382 | "starting lsn for the incremental backup. This will be mutually " |
383 | "exclusive with --incremental-history-uuid, --incremental-basedir " |
384 | "and --incremental-lsn. If no valid lsn can be found (no series by " |
385 | "that name, no successful backups by that name) xtrabackup will " |
386 | "return with an error. It is used with the --incremental option." , |
387 | (uchar*) &opt_ibx_incremental_history_name, |
388 | (uchar*) &opt_ibx_incremental_history_name, 0, GET_STR, |
389 | REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, |
390 | |
391 | {"incremental-history-uuid" , OPT_INCREMENTAL_HISTORY_UUID, |
392 | "This option specifies the UUID of the specific history record " |
393 | "stored in the PERCONA_SCHEMA.xtrabackup_history to base an " |
394 | "incremental backup on. --incremental-history-name, " |
395 | "--incremental-basedir and --incremental-lsn. If no valid lsn can be " |
396 | "found (no success record with that uuid) xtrabackup will return " |
397 | "with an error. It is used with the --incremental option." , |
398 | (uchar*) &opt_ibx_incremental_history_uuid, |
399 | (uchar*) &opt_ibx_incremental_history_uuid, 0, GET_STR, |
400 | REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, |
401 | |
402 | {"ftwrl-wait-query-type" , OPT_LOCK_WAIT_QUERY_TYPE, |
403 | "This option specifies which types of queries are allowed to complete " |
404 | "before innobackupex will issue the global lock. Default is all." , |
405 | (uchar*) &opt_ibx_lock_wait_query_type, |
406 | (uchar*) &opt_ibx_lock_wait_query_type, &query_type_typelib, |
407 | GET_ENUM, REQUIRED_ARG, QUERY_TYPE_ALL, 0, 0, 0, 0, 0}, |
408 | |
409 | {"kill-long-query-type" , OPT_KILL_LONG_QUERY_TYPE, |
410 | "This option specifies which types of queries should be killed to " |
411 | "unblock the global lock. Default is \"all\"." , |
412 | (uchar*) &opt_ibx_kill_long_query_type, |
413 | (uchar*) &opt_ibx_kill_long_query_type, &query_type_typelib, |
414 | GET_ENUM, REQUIRED_ARG, QUERY_TYPE_SELECT, 0, 0, 0, 0, 0}, |
415 | |
416 | {"history" , OPT_HISTORY, |
417 | "This option enables the tracking of backup history in the " |
418 | "PERCONA_SCHEMA.xtrabackup_history table. An optional history " |
419 | "series name may be specified that will be placed with the history " |
420 | "record for the current backup being taken." , |
421 | NULL, NULL, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, |
422 | |
423 | {"include" , OPT_INCLUDE, |
424 | "This option is a regular expression to be matched against table " |
425 | "names in databasename.tablename format. It is passed directly to " |
426 | "xtrabackup's --tables option. See the xtrabackup documentation for " |
427 | "details." , |
428 | (uchar*) &opt_ibx_include, |
429 | (uchar*) &opt_ibx_include, 0, GET_STR, |
430 | REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, |
431 | |
432 | {"databases" , OPT_DATABASES, |
433 | "This option specifies the list of databases that innobackupex should " |
434 | "back up. The option accepts a string argument or path to file that " |
435 | "contains the list of databases to back up. The list is of the form " |
436 | "\"databasename1[.table_name1] databasename2[.table_name2] . . .\". " |
437 | "If this option is not specified, all databases containing MyISAM and " |
438 | "InnoDB tables will be backed up. Please make sure that --databases " |
439 | "contains all of the InnoDB databases and tables, so that all of the " |
440 | "innodb.frm files are also backed up. In case the list is very long, " |
441 | "this can be specified in a file, and the full path of the file can " |
442 | "be specified instead of the list. (See option --tables-file.)" , |
443 | (uchar*) &opt_ibx_databases, |
444 | (uchar*) &opt_ibx_databases, 0, GET_STR, |
445 | REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, |
446 | |
447 | {"kill-long-queries-timeout" , OPT_KILL_LONG_QUERIES_TIMEOUT, |
448 | "This option specifies the number of seconds innobackupex waits " |
449 | "between starting FLUSH TABLES WITH READ LOCK and killing those " |
450 | "queries that block it. Default is 0 seconds, which means " |
451 | "innobackupex will not attempt to kill any queries." , |
452 | (uchar*) &opt_ibx_kill_long_queries_timeout, |
453 | (uchar*) &opt_ibx_kill_long_queries_timeout, 0, GET_UINT, |
454 | REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, |
455 | |
456 | {"ftwrl-wait-timeout" , OPT_LOCK_WAIT_TIMEOUT, |
457 | "This option specifies time in seconds that innobackupex should wait " |
458 | "for queries that would block FTWRL before running it. If there are " |
459 | "still such queries when the timeout expires, innobackupex terminates " |
460 | "with an error. Default is 0, in which case innobackupex does not " |
461 | "wait for queries to complete and starts FTWRL immediately." , |
462 | (uchar*) &opt_ibx_lock_wait_timeout, |
463 | (uchar*) &opt_ibx_lock_wait_timeout, 0, GET_UINT, |
464 | REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, |
465 | |
466 | {"ftwrl-wait-threshold" , OPT_LOCK_WAIT_THRESHOLD, |
467 | "This option specifies the query run time threshold which is used by " |
468 | "innobackupex to detect long-running queries with a non-zero value " |
469 | "of --ftwrl-wait-timeout. FTWRL is not started until such " |
470 | "long-running queries exist. This option has no effect if " |
471 | "--ftwrl-wait-timeout is 0. Default value is 60 seconds." , |
472 | (uchar*) &opt_ibx_lock_wait_threshold, |
473 | (uchar*) &opt_ibx_lock_wait_threshold, 0, GET_UINT, |
474 | REQUIRED_ARG, 60, 0, 0, 0, 0, 0}, |
475 | |
476 | {"debug-sleep-before-unlock" , OPT_DEBUG_SLEEP_BEFORE_UNLOCK, |
477 | "This is a debug-only option used by the XtraBackup test suite." , |
478 | (uchar*) &opt_ibx_debug_sleep_before_unlock, |
479 | (uchar*) &opt_ibx_debug_sleep_before_unlock, 0, GET_UINT, |
480 | REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, |
481 | |
482 | {"safe-slave-backup-timeout" , OPT_SAFE_SLAVE_BACKUP_TIMEOUT, |
483 | "How many seconds --safe-slave-backup should wait for " |
484 | "Slave_open_temp_tables to become zero. (default 300)" , |
485 | (uchar*) &opt_ibx_safe_slave_backup_timeout, |
486 | (uchar*) &opt_ibx_safe_slave_backup_timeout, 0, GET_UINT, |
487 | REQUIRED_ARG, 300, 0, 0, 0, 0, 0}, |
488 | |
489 | |
490 | /* Following command-line options are actually handled by xtrabackup. |
491 | We put them here with only purpose for them to showup in |
492 | innobackupex --help output */ |
493 | |
494 | {"close_files" , OPT_CLOSE_FILES, "Do not keep files opened. This " |
495 | "option is passed directly to xtrabackup. Use at your own risk." , |
496 | (uchar*) &ibx_xb_close_files, (uchar*) &ibx_xb_close_files, 0, |
497 | GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, |
498 | |
499 | {"compress" , OPT_COMPRESS, "This option instructs xtrabackup to " |
500 | "compress backup copies of InnoDB data files. It is passed directly " |
501 | "to the xtrabackup child process. Try 'xtrabackup --help' for more " |
502 | "details." , (uchar*) &ibx_xtrabackup_compress_alg, |
503 | (uchar*) &ibx_xtrabackup_compress_alg, 0, |
504 | GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, |
505 | |
506 | {"compress-threads" , OPT_COMPRESS_THREADS, |
507 | "This option specifies the number of worker threads that will be used " |
508 | "for parallel compression. It is passed directly to the xtrabackup " |
509 | "child process. Try 'xtrabackup --help' for more details." , |
510 | (uchar*) &ibx_xtrabackup_compress_threads, |
511 | (uchar*) &ibx_xtrabackup_compress_threads, |
512 | 0, GET_UINT, REQUIRED_ARG, 1, 1, UINT_MAX, 0, 0, 0}, |
513 | |
514 | {"compress-chunk-size" , OPT_COMPRESS_CHUNK_SIZE, "Size of working " |
515 | "buffer(s) for compression threads in bytes. The default value " |
516 | "is 64K." , (uchar*) &ibx_xtrabackup_compress_chunk_size, |
517 | (uchar*) &ibx_xtrabackup_compress_chunk_size, |
518 | 0, GET_ULL, REQUIRED_ARG, (1 << 16), 1024, ULONGLONG_MAX, 0, 0, 0}, |
519 | |
520 | {"export" , OPT_EXPORT, "This option is passed directly to xtrabackup's " |
521 | "--export option. It enables exporting individual tables for import " |
522 | "into another server. See the xtrabackup documentation for details." , |
523 | (uchar*) &ibx_xtrabackup_export, (uchar*) &ibx_xtrabackup_export, |
524 | 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, |
525 | |
526 | {"extra-lsndir" , OPT_EXTRA_LSNDIR, "This option specifies the " |
527 | "directory in which to save an extra copy of the " |
528 | "\"xtrabackup_checkpoints\" file. The option accepts a string " |
529 | "argument. It is passed directly to xtrabackup's --extra-lsndir " |
530 | "option. See the xtrabackup documentation for details." , |
531 | (uchar*) &ibx_xtrabackup_extra_lsndir, |
532 | (uchar*) &ibx_xtrabackup_extra_lsndir, |
533 | 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, |
534 | |
535 | {"incremental-basedir" , OPT_INCREMENTAL_BASEDIR, "This option " |
536 | "specifies the directory containing the full backup that is the base " |
537 | "dataset for the incremental backup. The option accepts a string " |
538 | "argument. It is used with the --incremental option." , |
539 | (uchar*) &ibx_xtrabackup_incremental_basedir, |
540 | (uchar*) &ibx_xtrabackup_incremental_basedir, |
541 | 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, |
542 | |
543 | {"incremental-dir" , OPT_INCREMENTAL_DIR, "This option specifies the " |
544 | "directory where the incremental backup will be combined with the " |
545 | "full backup to make a new full backup. The option accepts a string " |
546 | "argument. It is used with the --incremental option." , |
547 | (uchar*) &ibx_xtrabackup_incremental_dir, |
548 | (uchar*) &ibx_xtrabackup_incremental_dir, |
549 | 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, |
550 | |
551 | {"incremental-force-scan" , OPT_INCREMENTAL_FORCE_SCAN, |
552 | "This options tells xtrabackup to perform full scan of data files " |
553 | "for taking an incremental backup even if full changed page bitmap " |
554 | "data is available to enable the backup without the full scan." , |
555 | (uchar*)&ibx_xtrabackup_incremental_force_scan, |
556 | (uchar*)&ibx_xtrabackup_incremental_force_scan, 0, GET_BOOL, NO_ARG, |
557 | 0, 0, 0, 0, 0, 0}, |
558 | |
559 | {"log-copy-interval" , OPT_LOG_COPY_INTERVAL, "This option specifies " |
560 | "time interval between checks done by log copying thread in " |
561 | "milliseconds." , (uchar*) &ibx_xtrabackup_log_copy_interval, |
562 | (uchar*) &ibx_xtrabackup_log_copy_interval, |
563 | 0, GET_LONG, REQUIRED_ARG, 1000, 0, LONG_MAX, 0, 1, 0}, |
564 | |
565 | {"incremental-lsn" , OPT_INCREMENTAL, "This option specifies the log " |
566 | "sequence number (LSN) to use for the incremental backup. The option " |
567 | "accepts a string argument. It is used with the --incremental option. " |
568 | "It is used instead of specifying --incremental-basedir. For " |
569 | "databases created by MySQL and Percona Server 5.0-series versions, " |
570 | "specify the LSN as two 32-bit integers in high:low format. For " |
571 | "databases created in 5.1 and later, specify the LSN as a single " |
572 | "64-bit integer." , |
573 | (uchar*) &ibx_xtrabackup_incremental, |
574 | (uchar*) &ibx_xtrabackup_incremental, |
575 | 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, |
576 | |
577 | {"parallel" , OPT_PARALLEL, "On backup, this option specifies the " |
578 | "number of threads the xtrabackup child process should use to back " |
579 | "up files concurrently. The option accepts an integer argument. It " |
580 | "is passed directly to xtrabackup's --parallel option. See the " |
581 | "xtrabackup documentation for details." , |
582 | (uchar*) &ibx_xtrabackup_parallel, (uchar*) &ibx_xtrabackup_parallel, |
583 | 0, GET_INT, REQUIRED_ARG, 1, 1, INT_MAX, 0, 0, 0}, |
584 | |
585 | |
586 | {"stream" , OPT_STREAM, "This option specifies the format in which to " |
587 | "do the streamed backup. The option accepts a string argument. The " |
588 | "backup will be done to STDOUT in the specified format. Currently, " |
589 | "the only supported formats are tar and xbstream. This option is " |
590 | "passed directly to xtrabackup's --stream option." , |
591 | (uchar*) &ibx_xtrabackup_stream_str, |
592 | (uchar*) &ibx_xtrabackup_stream_str, 0, GET_STR, |
593 | REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, |
594 | |
595 | {"tables-file" , OPT_TABLES_FILE, "This option specifies the file in " |
596 | "which there are a list of names of the form database. The option " |
597 | "accepts a string argument.table, one per line. The option is passed " |
598 | "directly to xtrabackup's --tables-file option." , |
599 | (uchar*) &ibx_xtrabackup_tables_file, |
600 | (uchar*) &ibx_xtrabackup_tables_file, |
601 | 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, |
602 | |
603 | {"throttle" , OPT_THROTTLE, "This option specifies a number of I/O " |
604 | "operations (pairs of read+write) per second. It accepts an integer " |
605 | "argument. It is passed directly to xtrabackup's --throttle option." , |
606 | (uchar*) &ibx_xtrabackup_throttle, (uchar*) &ibx_xtrabackup_throttle, |
607 | 0, GET_LONG, REQUIRED_ARG, 0, 0, LONG_MAX, 0, 1, 0}, |
608 | |
609 | {"tmpdir" , 't', "This option specifies the location where a temporary " |
610 | "files will be stored. If the option is not specified, the default is " |
611 | "to use the value of tmpdir read from the server configuration." , |
612 | (uchar*) &ibx_opt_mysql_tmpdir, |
613 | (uchar*) &ibx_opt_mysql_tmpdir, 0, GET_STR, REQUIRED_ARG, |
614 | 0, 0, 0, 0, 0, 0}, |
615 | |
616 | {"use-memory" , OPT_USE_MEMORY, "This option accepts a string argument " |
617 | "that specifies the amount of memory in bytes for xtrabackup to use " |
618 | "for crash recovery while preparing a backup. Multiples are supported " |
619 | "providing the unit (e.g. 1MB, 1GB). It is used only with the option " |
620 | "--apply-log. It is passed directly to xtrabackup's --use-memory " |
621 | "option. See the xtrabackup documentation for details." , |
622 | (uchar*) &ibx_xtrabackup_use_memory, |
623 | (uchar*) &ibx_xtrabackup_use_memory, |
624 | 0, GET_LL, REQUIRED_ARG, 100*1024*1024L, 1024*1024L, LONGLONG_MAX, 0, |
625 | 1024*1024L, 0}, |
626 | |
627 | { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} |
628 | }; |
629 | |
630 | |
631 | static void usage(void) |
632 | { |
633 | puts("Open source backup tool for InnoDB and XtraDB\n\ |
634 | \n\ |
635 | Copyright (C) 2009-2015 Percona LLC and/or its affiliates.\n\ |
636 | Portions Copyright (C) 2000, 2011, MySQL AB & Innobase Oy. All Rights Reserved.\n\ |
637 | \n\ |
638 | This program is free software; you can redistribute it and/or\n\ |
639 | modify it under the terms of the GNU General Public License\n\ |
640 | as published by the Free Software Foundation version 2\n\ |
641 | of the License.\n\ |
642 | \n\ |
643 | This program is distributed in the hope that it will be useful,\n\ |
644 | but WITHOUT ANY WARRANTY; without even the implied warranty of\n\ |
645 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\ |
646 | GNU General Public License for more details.\n\ |
647 | \n\ |
648 | You can download full text of the license on http://www.gnu.org/licenses/gpl-2.0.txt\n\n" ); |
649 | |
650 | puts("innobackupex - Non-blocking backup tool for InnoDB, XtraDB and HailDB databases\n\ |
651 | \n\ |
652 | SYNOPOSIS\n\ |
653 | \n\ |
654 | innobackupex [--compress] [--compress-threads=NUMBER-OF-THREADS] [--compress-chunk-size=CHUNK-SIZE]\n\ |
655 | [--include=REGEXP] [--user=NAME]\n\ |
656 | [--password=WORD] [--port=PORT] [--socket=SOCKET]\n\ |
657 | [--no-timestamp] [--ibbackup=IBBACKUP-BINARY]\n\ |
658 | [--slave-info] [--galera-info] [--stream=tar|xbstream]\n\ |
659 | [--defaults-file=MY.CNF] [--defaults-group=GROUP-NAME]\n\ |
660 | [--databases=LIST] [--no-lock] \n\ |
661 | [--tmpdir=DIRECTORY] [--tables-file=FILE]\n\ |
662 | [--history=NAME]\n\ |
663 | [--incremental] [--incremental-basedir]\n\ |
664 | [--incremental-dir] [--incremental-force-scan] [--incremental-lsn]\n\ |
665 | [--incremental-history-name=NAME] [--incremental-history-uuid=UUID]\n\ |
666 | [--close-files]\n\ |
667 | BACKUP-ROOT-DIR\n\ |
668 | \n\ |
669 | innobackupex --apply-log [--use-memory=B]\n\ |
670 | [--defaults-file=MY.CNF]\n\ |
671 | [--export] [--ibbackup=IBBACKUP-BINARY]\n\ |
672 | BACKUP-DIR\n\ |
673 | \n\ |
674 | innobackupex --copy-back [--defaults-file=MY.CNF] [--defaults-group=GROUP-NAME] BACKUP-DIR\n\ |
675 | \n\ |
676 | innobackupex --move-back [--defaults-file=MY.CNF] [--defaults-group=GROUP-NAME] BACKUP-DIR\n\ |
677 | \n\ |
678 | innobackupex [--decompress]\n\ |
679 | [--parallel=NUMBER-OF-FORKS] BACKUP-DIR\n\ |
680 | \n\ |
681 | DESCRIPTION\n\ |
682 | \n\ |
683 | The first command line above makes a hot backup of a MySQL database.\n\ |
684 | By default it creates a backup directory (named by the current date\n\ |
685 | and time) in the given backup root directory. With the --no-timestamp\n\ |
686 | option it does not create a time-stamped backup directory, but it puts\n\ |
687 | the backup in the given directory (which must not exist). This\n\ |
688 | command makes a complete backup of all MyISAM and InnoDB tables and\n\ |
689 | indexes in all databases or in all of the databases specified with the\n\ |
690 | --databases option. The created backup contains .frm, .MRG, .MYD,\n\ |
691 | .MYI, .MAD, .MAI, .TRG, .TRN, .ARM, .ARZ, .CSM, CSV, .opt, .par, and\n\ |
692 | InnoDB data and log files. The MY.CNF options file defines the\n\ |
693 | location of the database. This command connects to the MySQL server\n\ |
694 | using the mysql client program, and runs xtrabackup as a child\n\ |
695 | process.\n\ |
696 | \n\ |
697 | The --apply-log command prepares a backup for starting a MySQL\n\ |
698 | server on the backup. This command recovers InnoDB data files as specified\n\ |
699 | in BACKUP-DIR/backup-my.cnf using BACKUP-DIR/ib_logfile0,\n\ |
700 | and creates new InnoDB log files as specified in BACKUP-DIR/backup-my.cnf.\n\ |
701 | The BACKUP-DIR should be the path to a backup directory created by\n\ |
702 | xtrabackup. This command runs xtrabackup as a child process, but it does not \n\ |
703 | connect to the database server.\n\ |
704 | \n\ |
705 | The --copy-back command copies data, index, and log files\n\ |
706 | from the backup directory back to their original locations.\n\ |
707 | The MY.CNF options file defines the original location of the database.\n\ |
708 | The BACKUP-DIR is the path to a backup directory created by xtrabackup.\n\ |
709 | \n\ |
710 | The --move-back command is similar to --copy-back with the only difference that\n\ |
711 | it moves files to their original locations rather than copies them. As this\n\ |
712 | option removes backup files, it must be used with caution. It may be useful in\n\ |
713 | cases when there is not enough free disk space to copy files.\n\ |
714 | \n\ |
715 | The --decompress command will decompress a backup made\n\ |
716 | with the --compress option. The\n\ |
717 | --parallel option will allow multiple files to be decompressed\n\ |
718 | simultaneously. In order to decompress, the qpress utility MUST be installed\n\ |
719 | and accessable within the path. This process will remove the original\n\ |
720 | compressed files and leave the results in the same location.\n\ |
721 | \n\ |
722 | On success the exit code innobackupex is 0. A non-zero exit code \n\ |
723 | indicates an error.\n" ); |
724 | printf("Usage: [%s [--defaults-file=#] --backup | %s [--defaults-file=#] --prepare] [OPTIONS]\n" , my_progname, my_progname); |
725 | my_print_help(ibx_long_options); |
726 | } |
727 | |
728 | |
729 | static |
730 | my_bool |
731 | ibx_get_one_option(int optid, |
732 | const struct my_option *opt __attribute__((unused)), |
733 | char *argument) |
734 | { |
735 | switch(optid) { |
736 | case '?': |
737 | usage(); |
738 | exit(0); |
739 | break; |
740 | case 'v': |
741 | msg("innobackupex version %s %s (%s)\n" , |
742 | MYSQL_SERVER_VERSION, |
743 | SYSTEM_TYPE, MACHINE_TYPE); |
744 | exit(0); |
745 | break; |
746 | case OPT_HISTORY: |
747 | if (argument) { |
748 | opt_ibx_history = argument; |
749 | } else { |
750 | opt_ibx_history = "" ; |
751 | } |
752 | break; |
753 | case OPT_STREAM: |
754 | if (!strcasecmp(argument, "xbstream" )) |
755 | xtrabackup_stream_fmt = XB_STREAM_FMT_XBSTREAM; |
756 | else { |
757 | ibx_msg("Invalid --stream argument: %s\n" , argument); |
758 | return 1; |
759 | } |
760 | xtrabackup_stream = TRUE; |
761 | break; |
762 | case OPT_COMPRESS: |
763 | if (argument == NULL) |
764 | xtrabackup_compress_alg = "quicklz" ; |
765 | else if (strcasecmp(argument, "quicklz" )) |
766 | { |
767 | ibx_msg("Invalid --compress argument: %s\n" , argument); |
768 | return 1; |
769 | } |
770 | xtrabackup_compress = TRUE; |
771 | break; |
772 | case 'p': |
773 | if (argument) |
774 | { |
775 | char *start = argument; |
776 | my_free(opt_ibx_password); |
777 | opt_ibx_password= my_strdup(argument, MYF(MY_FAE)); |
778 | /* Destroy argument */ |
779 | while (*argument) |
780 | *argument++= 'x'; |
781 | if (*start) |
782 | start[1]=0 ; |
783 | } |
784 | break; |
785 | } |
786 | return(0); |
787 | } |
788 | |
789 | bool |
790 | make_backup_dir() |
791 | { |
792 | time_t t = time(NULL); |
793 | char buf[100]; |
794 | |
795 | if (!opt_ibx_notimestamp && !ibx_xtrabackup_stream_str) { |
796 | strftime(buf, sizeof(buf), "%Y-%m-%d_%H-%M-%S" , localtime(&t)); |
797 | ut_a(asprintf(&ibx_backup_directory, "%s/%s" , |
798 | ibx_position_arg, buf) != -1); |
799 | } else { |
800 | ibx_backup_directory = strdup(ibx_position_arg); |
801 | } |
802 | |
803 | if (!directory_exists(ibx_backup_directory, true)) { |
804 | return(false); |
805 | } |
806 | |
807 | return(true); |
808 | } |
809 | |
810 | bool |
811 | ibx_handle_options(int *argc, char ***argv) |
812 | { |
813 | int i, n_arguments; |
814 | |
815 | if (handle_options(argc, argv, ibx_long_options, ibx_get_one_option)) { |
816 | return(false); |
817 | } |
818 | |
819 | if (opt_ibx_apply_log) { |
820 | ibx_mode = IBX_MODE_APPLY_LOG; |
821 | } else if (opt_ibx_copy_back) { |
822 | ibx_mode = IBX_MODE_COPY_BACK; |
823 | } else if (opt_ibx_move_back) { |
824 | ibx_mode = IBX_MODE_MOVE_BACK; |
825 | } else if (opt_ibx_decompress) { |
826 | ibx_mode = IBX_MODE_DECRYPT_DECOMPRESS; |
827 | } else { |
828 | ibx_mode = IBX_MODE_BACKUP; |
829 | } |
830 | |
831 | /* find and save position argument */ |
832 | i = 0; |
833 | n_arguments = 0; |
834 | while (i < *argc) { |
835 | char *opt = (*argv)[i]; |
836 | |
837 | if (strncmp(opt, "--" , 2) != 0 |
838 | && !(strlen(opt) == 2 && opt[0] == '-')) { |
839 | if (ibx_position_arg != NULL |
840 | && ibx_position_arg != opt) { |
841 | ibx_msg("Error: extra argument found %s\n" , |
842 | opt); |
843 | } |
844 | ibx_position_arg = opt; |
845 | ++n_arguments; |
846 | } |
847 | ++i; |
848 | } |
849 | |
850 | *argc -= n_arguments; |
851 | if (n_arguments > 1) { |
852 | return(false); |
853 | } |
854 | |
855 | if (ibx_position_arg == NULL) { |
856 | ibx_msg("Missing argument\n" ); |
857 | return(false); |
858 | } |
859 | |
860 | /* set argv[0] to be the program name */ |
861 | --(*argv); |
862 | ++(*argc); |
863 | |
864 | return(true); |
865 | } |
866 | |
867 | /*********************************************************************//** |
868 | Parse command-line options, connect to MySQL server, |
869 | detect server capabilities, etc. |
870 | @return true on success. */ |
871 | bool |
872 | ibx_init() |
873 | { |
874 | const char *run; |
875 | |
876 | /*=====================*/ |
877 | xtrabackup_copy_back = opt_ibx_copy_back; |
878 | xtrabackup_move_back = opt_ibx_move_back; |
879 | opt_galera_info = opt_ibx_galera_info; |
880 | opt_slave_info = opt_ibx_slave_info; |
881 | opt_no_lock = opt_ibx_no_lock; |
882 | opt_safe_slave_backup = opt_ibx_safe_slave_backup; |
883 | opt_rsync = opt_ibx_rsync; |
884 | opt_force_non_empty_dirs = opt_ibx_force_non_empty_dirs; |
885 | opt_noversioncheck = opt_ibx_noversioncheck; |
886 | opt_no_backup_locks = opt_ibx_no_backup_locks; |
887 | opt_decompress = opt_ibx_decompress; |
888 | |
889 | opt_incremental_history_name = opt_ibx_incremental_history_name; |
890 | opt_incremental_history_uuid = opt_ibx_incremental_history_uuid; |
891 | |
892 | opt_user = opt_ibx_user; |
893 | opt_password = opt_ibx_password; |
894 | opt_host = opt_ibx_host; |
895 | opt_defaults_group = opt_ibx_defaults_group; |
896 | opt_socket = opt_ibx_socket; |
897 | opt_port = opt_ibx_port; |
898 | |
899 | opt_lock_wait_query_type = opt_ibx_lock_wait_query_type; |
900 | opt_kill_long_query_type = opt_ibx_kill_long_query_type; |
901 | |
902 | opt_kill_long_queries_timeout = opt_ibx_kill_long_queries_timeout; |
903 | opt_lock_wait_timeout = opt_ibx_lock_wait_timeout; |
904 | opt_lock_wait_threshold = opt_ibx_lock_wait_threshold; |
905 | opt_debug_sleep_before_unlock = opt_ibx_debug_sleep_before_unlock; |
906 | opt_safe_slave_backup_timeout = opt_ibx_safe_slave_backup_timeout; |
907 | |
908 | opt_history = opt_ibx_history; |
909 | |
910 | /* setup xtrabackup options */ |
911 | xb_close_files = ibx_xb_close_files; |
912 | xtrabackup_compress_alg = ibx_xtrabackup_compress_alg; |
913 | xtrabackup_compress_threads = ibx_xtrabackup_compress_threads; |
914 | xtrabackup_compress_chunk_size = ibx_xtrabackup_compress_chunk_size; |
915 | xtrabackup_export = ibx_xtrabackup_export; |
916 | xtrabackup_extra_lsndir = ibx_xtrabackup_extra_lsndir; |
917 | xtrabackup_incremental_basedir = ibx_xtrabackup_incremental_basedir; |
918 | xtrabackup_incremental_dir = ibx_xtrabackup_incremental_dir; |
919 | xtrabackup_incremental_force_scan = |
920 | ibx_xtrabackup_incremental_force_scan; |
921 | xtrabackup_log_copy_interval = ibx_xtrabackup_log_copy_interval; |
922 | xtrabackup_incremental = ibx_xtrabackup_incremental; |
923 | xtrabackup_parallel = ibx_xtrabackup_parallel; |
924 | xtrabackup_stream_str = ibx_xtrabackup_stream_str; |
925 | xtrabackup_tables_file = ibx_xtrabackup_tables_file; |
926 | xtrabackup_throttle = ibx_xtrabackup_throttle; |
927 | opt_mysql_tmpdir = ibx_opt_mysql_tmpdir; |
928 | xtrabackup_use_memory = ibx_xtrabackup_use_memory; |
929 | |
930 | if (!opt_ibx_incremental |
931 | && (xtrabackup_incremental |
932 | || xtrabackup_incremental_basedir |
933 | || opt_ibx_incremental_history_name |
934 | || opt_ibx_incremental_history_uuid)) { |
935 | ibx_msg("Error: --incremental-lsn, --incremental-basedir, " |
936 | "--incremental-history-name and " |
937 | "--incremental-history-uuid require the " |
938 | "--incremental option.\n" ); |
939 | return(false); |
940 | } |
941 | |
942 | if (opt_ibx_databases != NULL) { |
943 | if (is_path_separator(*opt_ibx_databases)) { |
944 | xtrabackup_databases_file = opt_ibx_databases; |
945 | } else { |
946 | xtrabackup_databases = opt_ibx_databases; |
947 | } |
948 | } |
949 | |
950 | /* --tables and --tables-file options are xtrabackup only */ |
951 | ibx_partial_backup = (opt_ibx_include || opt_ibx_databases); |
952 | |
953 | if (ibx_mode == IBX_MODE_BACKUP) { |
954 | |
955 | if (!make_backup_dir()) { |
956 | return(false); |
957 | } |
958 | } |
959 | |
960 | /* --binlog-info is xtrabackup only, so force |
961 | --binlog-info=ON. i.e. behavior before the feature had been |
962 | implemented */ |
963 | opt_binlog_info = BINLOG_INFO_ON; |
964 | |
965 | switch (ibx_mode) { |
966 | case IBX_MODE_APPLY_LOG: |
967 | xtrabackup_prepare = TRUE; |
968 | xtrabackup_target_dir = ibx_position_arg; |
969 | run = "apply-log" ; |
970 | break; |
971 | case IBX_MODE_BACKUP: |
972 | xtrabackup_backup = TRUE; |
973 | xtrabackup_target_dir = ibx_backup_directory; |
974 | if (opt_ibx_include != NULL) { |
975 | xtrabackup_tables = opt_ibx_include; |
976 | } |
977 | run = "backup" ; |
978 | break; |
979 | case IBX_MODE_COPY_BACK: |
980 | xtrabackup_copy_back = TRUE; |
981 | xtrabackup_target_dir = ibx_position_arg; |
982 | run = "copy-back" ; |
983 | break; |
984 | case IBX_MODE_MOVE_BACK: |
985 | xtrabackup_move_back = TRUE; |
986 | xtrabackup_target_dir = ibx_position_arg; |
987 | run = "move-back" ; |
988 | break; |
989 | case IBX_MODE_DECRYPT_DECOMPRESS: |
990 | xtrabackup_decrypt_decompress = TRUE; |
991 | xtrabackup_target_dir = ibx_position_arg; |
992 | run = "decompress" ; |
993 | break; |
994 | default: |
995 | ut_error; |
996 | } |
997 | |
998 | ibx_msg("Starting the %s operation\n\n" |
999 | "IMPORTANT: Please check that the %s run completes " |
1000 | "successfully.\n" |
1001 | " At the end of a successful %s run innobackupex\n" |
1002 | " prints \"completed OK!\".\n\n" , run, run, run); |
1003 | |
1004 | |
1005 | return(true); |
1006 | } |
1007 | |
1008 | void |
1009 | ibx_cleanup() |
1010 | { |
1011 | free(ibx_backup_directory); |
1012 | } |
1013 | |