diff --git a/extra/mariabackup/backup_copy.cc b/extra/mariabackup/backup_copy.cc index 2a64a27c597..09f60418d44 100644 --- a/extra/mariabackup/backup_copy.cc +++ b/extra/mariabackup/backup_copy.cc @@ -1347,6 +1347,8 @@ backup_files(ds_ctxt *ds_data, const char *from) } } } + if (!backup_mroonga_files_from_datadir(ds_data, from)) + goto out; msg("Finished backing up non-InnoDB tables and files"); out: datadir_iter_free(it); @@ -1509,7 +1511,9 @@ ibx_copy_incremental_over_full() "aws-kms-key")) || !(ret = backup_files_from_datadir(ds_data, xtrabackup_incremental_dir, - "aria_log"))) + "aria_log")) || + !(ret = backup_mroonga_files_from_datadir(ds_data, + xtrabackup_incremental_dir))) goto cleanup; /* copy supplementary files */ @@ -2068,6 +2072,46 @@ bool backup_files_from_datadir(ds_ctxt_t *ds_data, return ret; } +bool backup_mroonga_files_from_datadir(ds_ctxt_t *ds_data, + const char *dir_path) +{ + os_file_dir_t dir = os_file_opendir(dir_path); + if (dir == IF_WIN(INVALID_HANDLE_VALUE, nullptr)) return false; + + os_file_stat_t info; + bool ret = true; + while (os_file_readdir_next_file(dir_path, dir, &info) == 0) { + + if (info.type != OS_FILE_TYPE_FILE) + continue; + + const char *pname = strrchr(info.name, '/'); +#ifdef _WIN32 + if (const char *last = strrchr(info.name, '\\')) { + if (!pname || last >pname) { + pname = last; + } + } +#endif + if (!pname) + pname = info.name; + + if (!strstr(pname, ".mrn")) + continue; + + if (xtrabackup_prepare && xtrabackup_incremental_dir && + file_exists(info.name)) + unlink(info.name); + + std::string full_path(dir_path); + full_path.append(1, '/').append(info.name); + if (!(ret = ds_data->copy_file(full_path.c_str() , info.name, 1))) + break; + } + os_file_closedir(dir); + return ret; +} + static int rocksdb_remove_checkpoint_directory() { diff --git a/extra/mariabackup/backup_copy.h b/extra/mariabackup/backup_copy.h index 409e783906f..936df9b8d13 100644 --- a/extra/mariabackup/backup_copy.h +++ b/extra/mariabackup/backup_copy.h @@ -52,6 +52,8 @@ const char *trim_dotslash(const char *path); bool backup_files_from_datadir(ds_ctxt_t *ds_data, const char *dir_path, const char *prefix); +bool backup_mroonga_files_from_datadir(ds_ctxt_t *ds_data, + const char *dir_path); bool is_system_table(const char *dbname, const char *tablename); std::unique_ptr> diff --git a/mysql-test/suite/mariabackup/mroonga.opt b/mysql-test/suite/mariabackup/mroonga.opt new file mode 100644 index 00000000000..d5a1e5190a7 --- /dev/null +++ b/mysql-test/suite/mariabackup/mroonga.opt @@ -0,0 +1 @@ +--loose-plugin-load-add=$HA_MROONGA_SO --loose-plugin-mroonga=ON diff --git a/mysql-test/suite/mariabackup/mroonga.result b/mysql-test/suite/mariabackup/mroonga.result new file mode 100644 index 00000000000..3b302ed78f0 --- /dev/null +++ b/mysql-test/suite/mariabackup/mroonga.result @@ -0,0 +1,11 @@ +CREATE TABLE t(c TEXT, FULLTEXT(c)) ENGINE=Mroonga; +INSERT INTO t VALUES('Once upon a time'),('There was a wicked witch'),('Who ate everybody up'); +# xtrabackup backup +# shutdown server +# remove datadir +# xtrabackup move back +# restart +SELECT * FROM t WHERE MATCH(c) AGAINST('wicked'); +c +There was a wicked witch +DROP TABLE t; diff --git a/mysql-test/suite/mariabackup/mroonga.test b/mysql-test/suite/mariabackup/mroonga.test new file mode 100644 index 00000000000..ea1f75f282f --- /dev/null +++ b/mysql-test/suite/mariabackup/mroonga.test @@ -0,0 +1,16 @@ +if (`SELECT COUNT(*)=0 FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'mroonga' AND PLUGIN_STATUS='ACTIVE'`) +{ + --skip needs mroonga plugin +} +CREATE TABLE t(c TEXT, FULLTEXT(c)) ENGINE=Mroonga; +INSERT INTO t VALUES('Once upon a time'),('There was a wicked witch'),('Who ate everybody up'); +echo # xtrabackup backup; +let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; +exec $XTRABACKUP --prepare --target-dir=$targetdir; +-- source include/restart_and_restore.inc +--enable_result_log +SELECT * FROM t WHERE MATCH(c) AGAINST('wicked'); +DROP TABLE t; +rmdir $targetdir;