mirror of
https://github.com/MariaDB/server.git
synced 2025-01-15 19:42:28 +01:00
1c55b845e0
Added support to BACKUP STAGE to maria-backup This is a port of the code from ES 10.6 See MDEV-5336 for backup stages description. The following old options are not supported by the new code: --rsync ; This is because rsync will not work on tables that are in used. --no-backup-locks ; This is disabled as mariadb-backup will always use backup locks for better performance.
331 lines
10 KiB
C++
331 lines
10 KiB
C++
/******************************************************
|
|
Copyright (c) 2011-2015 Percona LLC and/or its affiliates.
|
|
|
|
Declarations for xtrabackup.cc
|
|
|
|
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
|
|
|
|
*******************************************************/
|
|
|
|
#ifndef XB_XTRABACKUP_H
|
|
#define XB_XTRABACKUP_H
|
|
|
|
#include <my_getopt.h>
|
|
#include "datasink.h"
|
|
#include "xbstream.h"
|
|
#include "fil0fil.h"
|
|
#include <set>
|
|
#include "handler.h"
|
|
|
|
#include <utility>
|
|
#include <vector>
|
|
#include <tuple>
|
|
#include <functional>
|
|
|
|
|
|
#define XB_TOOL_NAME "mariadb-backup"
|
|
#define XB_HISTORY_TABLE "mysql.mariadb_backup_history"
|
|
|
|
struct xb_delta_info_t
|
|
{
|
|
xb_delta_info_t(ulint page_size, ulint zip_size, uint32_t space_id)
|
|
: page_size(page_size), zip_size(zip_size), space_id(space_id) {}
|
|
|
|
ulint page_size;
|
|
ulint zip_size;
|
|
uint32_t space_id;
|
|
};
|
|
|
|
class CorruptedPages
|
|
{
|
|
public:
|
|
CorruptedPages();
|
|
~CorruptedPages();
|
|
void add_page(const char *file_name, page_id_t page_id);
|
|
bool contains(page_id_t page_id) const;
|
|
void drop_space(uint32_t space_id);
|
|
void rename_space(uint32_t space_id, const std::string &new_name);
|
|
bool print_to_file(ds_ctxt *ds_data, const char *file_name) const;
|
|
void read_from_file(const char *file_name);
|
|
bool empty() const;
|
|
void zero_out_free_pages();
|
|
|
|
void backup_fix_ddl(ds_ctxt *ds_data, ds_ctxt *ds_meta);
|
|
|
|
private:
|
|
void add_page_no_lock(const char *space_name, page_id_t page_id,
|
|
bool convert_space_name);
|
|
struct space_info_t {
|
|
std::string space_name;
|
|
std::set<uint32_t> pages;
|
|
};
|
|
typedef std::map<uint32_t, space_info_t> container_t;
|
|
mutable pthread_mutex_t m_mutex;
|
|
container_t m_spaces;
|
|
};
|
|
|
|
|
|
/* value of the --incremental option */
|
|
extern lsn_t incremental_lsn;
|
|
|
|
extern char *xtrabackup_target_dir;
|
|
extern char *xtrabackup_incremental_dir;
|
|
extern char *xtrabackup_incremental_basedir;
|
|
extern char *innobase_data_home_dir;
|
|
extern char *innobase_buffer_pool_filename;
|
|
extern char *aria_log_dir_path;
|
|
extern char *xb_plugin_dir;
|
|
extern char *xb_rocksdb_datadir;
|
|
extern my_bool xb_backup_rocksdb;
|
|
|
|
extern uint opt_protocol;
|
|
|
|
extern char *xtrabackup_incremental;
|
|
extern my_bool xtrabackup_incremental_force_scan;
|
|
|
|
extern lsn_t metadata_to_lsn;
|
|
|
|
extern xb_stream_fmt_t xtrabackup_stream_fmt;
|
|
extern ibool xtrabackup_stream;
|
|
|
|
extern char *xtrabackup_tables;
|
|
extern char *xtrabackup_tables_file;
|
|
extern char *xtrabackup_databases;
|
|
extern char *xtrabackup_databases_file;
|
|
extern char *xtrabackup_tables_exclude;
|
|
extern char *xtrabackup_databases_exclude;
|
|
|
|
extern uint xtrabackup_compress;
|
|
|
|
extern my_bool xtrabackup_backup;
|
|
extern my_bool xtrabackup_prepare;
|
|
extern my_bool xtrabackup_copy_back;
|
|
extern my_bool xtrabackup_move_back;
|
|
extern my_bool xtrabackup_decrypt_decompress;
|
|
|
|
extern char *innobase_data_file_path;
|
|
extern longlong innobase_page_size;
|
|
|
|
extern uint xtrabackup_parallel;
|
|
|
|
extern my_bool xb_close_files;
|
|
extern const char *xtrabackup_compress_alg;
|
|
|
|
extern uint xtrabackup_compress_threads;
|
|
extern ulonglong xtrabackup_compress_chunk_size;
|
|
|
|
extern my_bool xtrabackup_export;
|
|
extern char *xtrabackup_extra_lsndir;
|
|
extern ulint xtrabackup_log_copy_interval;
|
|
extern char *xtrabackup_stream_str;
|
|
extern long xtrabackup_throttle;
|
|
extern longlong xtrabackup_use_memory;
|
|
|
|
extern my_bool opt_galera_info;
|
|
extern my_bool opt_slave_info;
|
|
extern my_bool opt_no_lock;
|
|
extern my_bool opt_safe_slave_backup;
|
|
extern my_bool opt_force_non_empty_dirs;
|
|
extern my_bool opt_noversioncheck;
|
|
extern my_bool opt_no_backup_locks;
|
|
extern my_bool opt_decompress;
|
|
extern my_bool opt_remove_original;
|
|
extern my_bool opt_extended_validation;
|
|
extern my_bool opt_encrypted_backup;
|
|
extern my_bool opt_lock_ddl_per_table;
|
|
extern my_bool opt_log_innodb_page_corruption;
|
|
|
|
extern char *opt_incremental_history_name;
|
|
extern char *opt_incremental_history_uuid;
|
|
|
|
extern char *opt_user;
|
|
extern const char *opt_password;
|
|
extern char *opt_host;
|
|
extern char *opt_defaults_group;
|
|
extern char *opt_socket;
|
|
extern uint opt_port;
|
|
extern char *opt_log_bin;
|
|
|
|
extern const char *query_type_names[];
|
|
|
|
enum query_type_t {QUERY_TYPE_ALL, QUERY_TYPE_UPDATE,
|
|
QUERY_TYPE_SELECT};
|
|
|
|
extern TYPELIB query_type_typelib;
|
|
|
|
extern ulong opt_lock_wait_query_type;
|
|
extern ulong opt_kill_long_query_type;
|
|
|
|
extern uint opt_kill_long_queries_timeout;
|
|
extern uint opt_lock_wait_timeout;
|
|
extern uint opt_lock_wait_threshold;
|
|
extern uint opt_debug_sleep_before_unlock;
|
|
extern uint opt_safe_slave_backup_timeout;
|
|
|
|
extern const char *opt_history;
|
|
|
|
enum binlog_info_enum { BINLOG_INFO_OFF, BINLOG_INFO_LOCKLESS, BINLOG_INFO_ON,
|
|
BINLOG_INFO_AUTO};
|
|
|
|
extern ulong opt_binlog_info;
|
|
|
|
extern ulong xtrabackup_innodb_force_recovery;
|
|
|
|
void xtrabackup_io_throttling(void);
|
|
my_bool xb_write_delta_metadata(ds_ctxt *ds_meta,
|
|
const char *filename,
|
|
const xb_delta_info_t *info);
|
|
|
|
/************************************************************************
|
|
Checks if a table specified as a name in the form "database/name" (InnoDB 5.6)
|
|
or "./database/name.ibd" (InnoDB 5.5-) should be skipped from backup based on
|
|
the --tables or --tables-file options.
|
|
|
|
@return TRUE if the table should be skipped. */
|
|
my_bool
|
|
check_if_skip_table(
|
|
/******************/
|
|
const char* name); /*!< in: path to the table */
|
|
|
|
|
|
/************************************************************************
|
|
Checks if a database specified by path should be skipped from backup based on
|
|
the --databases, --databases_file or --databases_exclude options.
|
|
|
|
@return TRUE if the table should be skipped. */
|
|
my_bool
|
|
check_if_skip_database_by_path(
|
|
const char* path /*!< in: path to the db directory. */
|
|
);
|
|
|
|
/************************************************************************
|
|
Check if parameter is set in defaults file or via command line argument
|
|
@return true if parameter is set. */
|
|
bool
|
|
check_if_param_set(const char *param);
|
|
|
|
#if defined(HAVE_OPENSSL)
|
|
extern my_bool opt_ssl_verify_server_cert;
|
|
#endif
|
|
|
|
|
|
my_bool
|
|
xb_get_one_option(int optid,
|
|
const struct my_option *opt __attribute__((unused)),
|
|
char *argument);
|
|
|
|
const char*
|
|
xb_get_copy_action(const char *dflt = "Copying");
|
|
|
|
void mdl_lock_init();
|
|
void mdl_lock_table(ulint space_id);
|
|
void mdl_unlock_all();
|
|
bool ends_with(const char *str, const char *suffix);
|
|
|
|
typedef void (*insert_entry_func_t)(const char*);
|
|
|
|
/* Scan string and load filter entries from it.
|
|
@param[in] list string representing a list
|
|
@param[in] delimiters delimiters of entries
|
|
@param[in] ins callback to add entry */
|
|
void xb_load_list_string(char *list, const char *delimiters,
|
|
insert_entry_func_t ins);
|
|
void register_ignore_db_dirs_filter(const char *name);
|
|
|
|
#ifdef _WIN32
|
|
typedef HANDLE os_file_dir_t; /*!< directory stream */
|
|
/** The os_file_opendir() function opens a directory stream corresponding to the
|
|
directory named by the dirname argument. The directory stream is positioned
|
|
at the first entry. In both Unix and Windows we automatically skip the '.'
|
|
and '..' items at the start of the directory listing.
|
|
|
|
@param[in] dirname directory name; it must not contain a trailing
|
|
'\' or '/'
|
|
@return directory stream
|
|
@retval INVALID_HANDLE_VALUE on error */
|
|
HANDLE os_file_opendir(const char *dirname);
|
|
# define os_file_closedir(dir) static_cast<void>(FindClose(dir))
|
|
# define os_file_closedir_failed(dir) !FindClose(dir)
|
|
#else
|
|
typedef DIR* os_file_dir_t;
|
|
# define os_file_opendir(dirname) opendir(dirname)
|
|
# define os_file_closedir(dir) static_cast<void>(closedir(dir))
|
|
# define os_file_closedir_failed(dir) closedir(dir)
|
|
#endif
|
|
|
|
/** This function returns information of the next file in the directory. We jump
|
|
over the '.' and '..' entries in the directory.
|
|
@param[in] dirname directory name or path
|
|
@param[in] dir directory stream
|
|
@param[out] info buffer where the info is returned
|
|
@return 0 if ok, -1 if error, 1 if at the end of the directory */
|
|
int
|
|
os_file_readdir_next_file(
|
|
const char* dirname,
|
|
os_file_dir_t dir,
|
|
os_file_stat_t* info);
|
|
|
|
/***********************************************************************//**
|
|
A fault-tolerant function that tries to read the next file name in the
|
|
directory. We retry 100 times if os_file_readdir_next_file() returns -1. The
|
|
idea is to read as much good data as we can and jump over bad data.
|
|
@return 0 if ok, -1 if error even after the retries, 1 if at the end
|
|
of the directory */
|
|
int
|
|
fil_file_readdir_next_file(
|
|
/*=======================*/
|
|
dberr_t* err, /*!< out: this is set to DB_ERROR if an error
|
|
was encountered, otherwise not changed */
|
|
const char* dirname,/*!< in: directory name or path */
|
|
os_file_dir_t dir, /*!< in: directory stream */
|
|
os_file_stat_t* info); /*!< in/out: buffer where the
|
|
info is returned */
|
|
|
|
const char *convert_dst(const char *dst);
|
|
|
|
std::string get_table_version_from_image(const std::vector<uchar> &frm_image);
|
|
std::pair<bool, legacy_db_type>
|
|
get_table_engine_from_image(const std::vector<uchar> &frm_image);
|
|
std::string read_table_version_id(File file);
|
|
|
|
std::string convert_tablename_to_filepath(
|
|
const char *data_dir_path, const std::string &db, const std::string &table);
|
|
|
|
std::tuple<std::string, std::string, std::string>
|
|
convert_filepath_to_tablename(const char *filepath);
|
|
|
|
typedef std::string table_key_t;
|
|
|
|
inline table_key_t table_key(const std::string &db, const std::string &table) {
|
|
return std::string(db).append(".").append(table);
|
|
};
|
|
|
|
inline table_key_t table_key(const char *db, const char *table) {
|
|
return std::string(db).append(".").append(table);
|
|
};
|
|
|
|
typedef std::function<void(std::string, std::string, std::string)>
|
|
post_copy_table_hook_t;
|
|
|
|
my_bool
|
|
check_if_skip_table(
|
|
/******************/
|
|
const char* name); /*!< in: path to the table */
|
|
|
|
bool is_log_table(const char *dbname, const char *tablename);
|
|
bool is_stats_table(const char *dbname, const char *tablename);
|
|
|
|
extern my_bool xtrabackup_copy_back;
|
|
extern my_bool xtrabackup_move_back;
|
|
#endif /* XB_XTRABACKUP_H */
|