mirror of
https://github.com/MariaDB/server.git
synced 2025-09-22 09:05:29 +02:00

Ever since commit685d958e38
(MDEV-14425) mariadb-backup --backup had some trouble to keep up with write workloads of the mariadbd server. Debarun Banerjee found out that mariadb-backup --backup was copying the log in the wrong way and not pausing when it made sense to do so. This change includes his fix as well as some dead code removal from xtrabackup_copy_mmap_logfile(). Some earlier changes to the default behaviour of mariadb-backup --backup will be reverted, by making the configuration parameters OFF by default. These parameters were basically working around this bug: * commit652f33e0a4
(MDEV-30000) introduced --innodb-log-checkpoint-now and made it ON by default. Making the server execute a log checkpoint can be really I/O intensive. * commit6acada713a
(MDEV-34062) introduced --innodb-log-file-mmap and made it ON by default on Linux and FreeBSD. There are no documented semantics what should happen to a memory mapping when there are concurrent pwrite(2) operations by other processes. While it appears to work, it is safer to default to clearly documented semantics. xtrabackup_copy_logfile(): Add a parameter early_exit. Always read a log snippet to the start of recv_sys.buf and assign recv_sys.len to the read length. We used to shift recv_sys.buf with memmove(). However, on recv_sys_t::PREMATURE_EOF we cannot know which part of the mini-transaction was correctly read, because that part of the ib_logfile0 may be concurrently modified by the server. So, we will reread everything from the start of the mini-transaction. xtrabackup_backup_func(): Invoke xtrabackup_copy_logfile(true), allowing it to stop on every recv_sys_t::PREMATURE_EOF. This will also avoid repeated "Retry" messages when there is no more redo log to copy. get_current_lsn(): Execute FLUSH ENGINE LOGS to ensure that InnoDB will complete any buffered writes to the ib_logfile0 and ensure that everything up to the current LSN has been written. backup_wait_for_commit_lsn(): Wait for as much as is really needed. This avoids an extra 5-second wait at the end of the backup. xtrabackup_copy_mmap_logfile(): Remove some dead code, and add debug assertions to demonstrate that the parser can only return recv_sys_t::OK or recv_sys_t::GOT_EOF.
70 lines
1.9 KiB
Text
70 lines
1.9 KiB
Text
#--source include/innodb_page_size.inc
|
|
|
|
# Test --databases-exclude and --tables-exclude feature of xtrabackup 2.3.8
|
|
select @@ignore_db_dirs;
|
|
|
|
let $MYSQLD_DATADIR= `select @@datadir`;
|
|
|
|
mkdir $MYSQLD_DATADIR/db3;
|
|
mkdir $MYSQLD_DATADIR/db4;
|
|
mkdir $MYSQLD_DATADIR/db5;
|
|
|
|
CREATE TABLE t1(i INT) ENGINE INNODB;
|
|
INSERT INTO t1 VALUES(1);
|
|
CREATE TABLE t2(i int) ENGINE INNODB;
|
|
|
|
CREATE DATABASE db2;
|
|
USE db2;
|
|
CREATE TABLE t1(i INT) ENGINE INNODB;
|
|
|
|
USE test;
|
|
|
|
BEGIN;
|
|
INSERT INTO db2.t1 VALUES(20);
|
|
INSERT INTO test.t1 VALUES(20);
|
|
INSERT INTO test.t2 VALUES(20);
|
|
|
|
echo # xtrabackup backup;
|
|
|
|
let $targetdir=$MYSQLTEST_VARDIR/tmp/backup;
|
|
--disable_result_log
|
|
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 "--tables-exclude=test.*2" "--databases-exclude=db2" --target-dir=$targetdir --innodb_log_checkpoint_now=1;
|
|
--enable_result_log
|
|
|
|
COMMIT;
|
|
|
|
# check that only t1 table is in backup (t2 is excluded)
|
|
list_files $targetdir/test *.new;
|
|
list_files $targetdir/test *.ibd;
|
|
# check that db2 database is not in the backup (excluded)
|
|
--error 1
|
|
list_files $targetdir/db2 *.ibd;
|
|
# check that db3 database is not in the backup (excluded)
|
|
--error 1
|
|
list_files $targetdir/db3 *.ibd;
|
|
# check that db4 database is not in the backup (excluded)
|
|
--error 1
|
|
list_files $targetdir/db4 *.ibd;
|
|
# check that db5 database is in the backup
|
|
list_files $targetdir/db5 *.ibd;
|
|
|
|
DROP TABLE t1;
|
|
DROP TABLE t2;
|
|
DROP DATABASE db2;
|
|
rmdir $MYSQLD_DATADIR/db3;
|
|
rmdir $MYSQLD_DATADIR/db4;
|
|
rmdir $MYSQLD_DATADIR/db5;
|
|
|
|
--let $backup_log=$MYSQLTEST_VARDIR/tmp/backup.log
|
|
--disable_result_log
|
|
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --export --prepare --target-dir="$targetdir" > $backup_log;
|
|
--enable_result_log
|
|
|
|
--let SEARCH_FILE=$backup_log
|
|
--let SEARCH_PATTERN=Operating system error number
|
|
--source include/search_pattern_in_file.inc
|
|
--let SEARCH_PATTERN=Could not find a valid tablespace file for
|
|
--source include/search_pattern_in_file.inc
|
|
--remove_file $backup_log
|
|
|
|
rmdir $targetdir;
|