summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVlad Lesin <vlad_lesin@mail.ru>2019-11-20 21:27:30 +0300
committerVlad Lesin <vlad_lesin@mail.ru>2019-11-29 08:56:28 +0300
commit17fc9228eac06b02e9cf4bb063702cc241c13abd (patch)
tree6ae9aca1e7b2715e16ad940decab7718d5968853
parent6718d3bc3241f72e07504133371cf3813d2e6fe9 (diff)
downloadmariadb-git-bb-10.2-MDEV-18310-aria_log-incr.tar.gz
MDEV-18310: Aria engine: Undo phase failed with "Got error 121 whenbb-10.2-MDEV-18310-aria_log-incr
executing undo undo_key_delete" upon startup on datadir restored from incremental backup aria_log* files were not copied on --prepare --incremental-dir step from incremental to destination backup directory.
-rw-r--r--extra/mariabackup/backup_copy.cc31
-rw-r--r--mysql-test/suite/mariabackup/incremental_backup.result4
-rw-r--r--mysql-test/suite/mariabackup/incremental_backup.test63
3 files changed, 83 insertions, 15 deletions
diff --git a/extra/mariabackup/backup_copy.cc b/extra/mariabackup/backup_copy.cc
index 524177d7e33..6f9452ef76c 100644
--- a/extra/mariabackup/backup_copy.cc
+++ b/extra/mariabackup/backup_copy.cc
@@ -1669,6 +1669,9 @@ ibx_copy_incremental_over_full()
}
}
+ if (!(ret = backup_files_from_datadir(xtrabackup_incremental_dir)))
+ goto cleanup;
+
/* copy buffer pool dump */
if (innobase_buffer_pool_filename) {
const char *src_name;
@@ -2180,20 +2183,26 @@ static bool backup_files_from_datadir(const char *dir_path)
if (info.type != OS_FILE_TYPE_FILE)
continue;
- const char *pname = strrchr(info.name, IF_WIN('\\', '/'));
+ const char *pname = strrchr(info.name, OS_PATH_SEPARATOR);
if (!pname)
pname = info.name;
- /* Copy aria log files, and aws keys for encryption plugins.*/
- const char *prefixes[] = { "aria_log", "aws-kms-key" };
- for (size_t i = 0; i < array_elements(prefixes); i++) {
- if (starts_with(pname, prefixes[i])) {
- ret = copy_file(ds_data, info.name, info.name, 1);
- if (!ret) {
- break;
- }
- }
- }
+ if (!starts_with(pname, "aws-kms-key") &&
+ !starts_with(pname, "aria_log"))
+ /* For ES exchange the above line with the following code:
+ (!xtrabackup_prepare || !xtrabackup_incremental_dir ||
+ !starts_with(pname, "aria_log")))
+ */
+ continue;
+
+ if (xtrabackup_prepare && xtrabackup_incremental_dir &&
+ file_exists(info.name))
+ unlink(info.name);
+
+ std::string full_path(dir_path);
+ full_path.append(1, OS_PATH_SEPARATOR).append(info.name);
+ if (!(ret = copy_file(ds_data, full_path.c_str() , info.name, 1)))
+ break;
}
os_file_closedir(dir);
return ret;
diff --git a/mysql-test/suite/mariabackup/incremental_backup.result b/mysql-test/suite/mariabackup/incremental_backup.result
index cc7277bdde9..70cc2cf8c4a 100644
--- a/mysql-test/suite/mariabackup/incremental_backup.result
+++ b/mysql-test/suite/mariabackup/incremental_backup.result
@@ -1,4 +1,5 @@
call mtr.add_suppression("InnoDB: New log files created");
+CREATE TABLE t_aria(i INT) ENGINE ARIA;
CREATE TABLE t(i INT PRIMARY KEY) ENGINE INNODB;
BEGIN;
INSERT INTO t VALUES(2);
@@ -11,11 +12,13 @@ INSERT INTO t VALUES(0);
DELETE FROM t WHERE i=0;
connection default;
COMMIT;
+# Generate enough aria log records to increase area log file size
SELECT * FROM t;
i
1
2
# Prepare full backup, apply incremental one
+# Aria log file was updated during applying incremental backup
disconnect con1;
# Restore and check results
# shutdown server
@@ -27,3 +30,4 @@ i
1
2
DROP TABLE t;
+DROP TABLE t_aria;
diff --git a/mysql-test/suite/mariabackup/incremental_backup.test b/mysql-test/suite/mariabackup/incremental_backup.test
index 8fbfa701999..3e877af1398 100644
--- a/mysql-test/suite/mariabackup/incremental_backup.test
+++ b/mysql-test/suite/mariabackup/incremental_backup.test
@@ -1,10 +1,12 @@
+--source include/have_aria.inc
--source include/innodb_page_size.inc
call mtr.add_suppression("InnoDB: New log files created");
-let $basedir=$MYSQLTEST_VARDIR/tmp/backup;
-let $incremental_dir=$MYSQLTEST_VARDIR/tmp/backup_inc1;
+let basedir=$MYSQLTEST_VARDIR/tmp/backup;
+let incremental_dir=$MYSQLTEST_VARDIR/tmp/backup_inc1;
+CREATE TABLE t_aria(i INT) ENGINE ARIA;
CREATE TABLE t(i INT PRIMARY KEY) ENGINE INNODB;
BEGIN;
INSERT INTO t VALUES(2);
@@ -14,21 +16,73 @@ INSERT INTO t VALUES(1);
echo # Create full backup , modify table, then create incremental/differential backup;
--disable_result_log
-exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$basedir;
+exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$basedir;
--enable_result_log
BEGIN;
INSERT INTO t VALUES(0);
DELETE FROM t WHERE i=0;
connection default;
COMMIT;
+
+--echo # Generate enough aria log records to increase area log file size
+--disable_query_log
+--disable_result_log
+INSERT INTO t_aria VALUES
+ (0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
+ (0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
+ (0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
+ (0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
+ (0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
+ (0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
+ (0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
+ (0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
+ (0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
+ (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);
+--let $i = 4
+while ($i) {
+INSERT INTO t_aria SELECT * FROM seq_1_to_2000;
+--dec $i
+}
+--enable_query_log
+--enable_result_log
+
SELECT * FROM t;
-exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --ftwrl-wait-timeout=5 --ftwrl-wait-threshold=300 --ftwrl-wait-query-type=all --target-dir=$incremental_dir --incremental-basedir=$basedir;
+# wf_incremental_init() allocates (page_size/4)*page_size bytes with mmap()
+# in each data file copy thread, what can fail on 32-bit platforms if threads
+# are too much, that's why don't set too big --parallel option value.
+exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=2 --ftwrl-wait-timeout=5 --ftwrl-wait-threshold=300 --ftwrl-wait-query-type=all --target-dir=$incremental_dir --incremental-basedir=$basedir;
--disable_result_log
echo # Prepare full backup, apply incremental one;
exec $XTRABACKUP --prepare --target-dir=$basedir;
exec $XTRABACKUP --prepare --target-dir=$basedir --incremental-dir=$incremental_dir ;
+let perl_result_file=$MYSQLTEST_VARDIR/tmp/check_file_size_result.inc;
+
+--perl END_OF_FILE
+ use strict;
+ use warnings;
+
+ my $dst_file = "$ENV{'basedir'}/aria_log.00000001";
+ my $src_file = "$ENV{'incremental_dir'}/aria_log.00000001";
+ my $out_file = $ENV{'perl_result_file'};
+
+ my $dst_size = -s $dst_file;
+ my $src_size = -s $src_file;
+
+ open (my $output, '>', $out_file) or die $!;
+ if ($dst_size >= $src_size) {
+ print $output '--echo # Aria log file was updated during applying incremental backup'."\n";
+ }
+ else {
+ print $output '--echo # Aria log file was NOT updated during applying incremental backup'."\n";
+ }
+ close $output;
+END_OF_FILE
+
+--source $perl_result_file
+--remove_file $perl_result_file
+
disconnect con1;
echo # Restore and check results;
let $targetdir=$basedir;
@@ -37,6 +91,7 @@ let $targetdir=$basedir;
SELECT * FROM t;
DROP TABLE t;
+DROP TABLE t_aria;
# Cleanup
rmdir $basedir;