summaryrefslogtreecommitdiff
path: root/extra
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.com>2022-04-30 08:49:13 +0400
committerAlexander Barkov <bar@mariadb.com>2022-05-02 11:21:10 +0400
commit680ca15269ba3fddf3c795da6bf889acacfdd258 (patch)
tree06811e8f67a5111aac6f87e2b8dda43a1c91428b /extra
parentf354e457e1c4171ce38cd3db3e492640db95036c (diff)
downloadmariadb-git-680ca15269ba3fddf3c795da6bf889acacfdd258.tar.gz
MDEV-28446 mariabackup prepare fails for incrementals if a new schema is created after full backup is taken
When "mariabackup --target-dir=$basedir --incremental-dir=$incremental_dir" is running and is moving a new table file (e.g. `db1/t1.new`) from the incremental directory to the base directory, it needs to verify that the base backup database directory (e.g. `$basedir/db1`) really exists (or create it otherwise). The table `db1/t1` can come from a new database `db1` which was created during the base mariabackup execution time. In such case the directory `db1` exists only in the incremental directory, but does not exist in the base directory.
Diffstat (limited to 'extra')
-rw-r--r--extra/mariabackup/xtrabackup.cc16
1 files changed, 14 insertions, 2 deletions
diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc
index c1b2a1a9c85..ada63e1e882 100644
--- a/extra/mariabackup/xtrabackup.cc
+++ b/extra/mariabackup/xtrabackup.cc
@@ -5441,11 +5441,23 @@ static ibool prepare_handle_new_files(const char *data_home_dir,
const char *file_name, void *arg)
{
const char *dest_dir = static_cast<const char *>(arg);
- std::string src_path = std::string(data_home_dir) + '/' + std::string(db_name) + '/' + file_name;
+ std::string src_path = std::string(data_home_dir) + '/' + std::string(db_name) + '/';
/* Copy "*.new" files from incremental to base dir for incremental backup */
std::string dest_path=
dest_dir ? std::string(dest_dir) + '/' + std::string(db_name) +
- '/' + file_name : src_path;
+ '/' : src_path;
+
+ /*
+ A CREATE DATABASE could have happened during the base mariabackup run.
+ In case if the current table file (e.g. `t1.new`) is from such
+ a new database, the database directory may not exist yet in
+ the base backup directory. Let's make sure to check if the directory
+ exists (and create if needed).
+ */
+ if (!directory_exists(dest_path.c_str(), true/*create if not exists*/))
+ return FALSE;
+ src_path+= file_name;
+ dest_path+= file_name;
size_t index = dest_path.find(".new");
DBUG_ASSERT(index != std::string::npos);