mirror of
https://github.com/MariaDB/server.git
synced 2025-09-13 13:47:59 +03: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.
76 lines
2.6 KiB
Plaintext
76 lines
2.6 KiB
Plaintext
--source include/have_innodb.inc
|
|
--source include/innodb_undo_tablespaces.inc
|
|
call mtr.add_suppression("InnoDB: New log files created");
|
|
call mtr.add_suppression("InnoDB: Operating system error number .* in a file operation");
|
|
call mtr.add_suppression("InnoDB: The error means the system cannot find the path specified");
|
|
call mtr.add_suppression("InnoDB: Ignoring tablespace for `test`\\.`t21` because it could not be opened");
|
|
call mtr.add_suppression("InnoDB: Cannot open datafile for read-only: ");
|
|
call mtr.add_suppression("Table .* in the InnoDB data dictionary has tablespace id .*, but tablespace with that id or name does not exist");
|
|
|
|
let $basedir=$MYSQLTEST_VARDIR/tmp/backup;
|
|
let $incremental_dir=$MYSQLTEST_VARDIR/tmp/backup_inc1;
|
|
|
|
CREATE TABLE t1(i INT PRIMARY KEY auto_increment, a int) ENGINE INNODB;
|
|
ALTER TABLE t1 FORCE, ALGORITHM=INPLACE;
|
|
|
|
echo # No longer fails during full backup;
|
|
--disable_result_log
|
|
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$basedir;
|
|
--enable_result_log
|
|
|
|
DROP TABLE t1;
|
|
|
|
rmdir $basedir;
|
|
|
|
CREATE TABLE t1(i INT PRIMARY KEY auto_increment, a int) ENGINE INNODB;
|
|
|
|
INSERT INTO t1(a) select 1 union select 2 union select 3;
|
|
|
|
--echo # Create full backup , modify table, then fails during creation of
|
|
--echo # incremental/differential backup
|
|
--disable_result_log
|
|
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$basedir;
|
|
--enable_result_log
|
|
|
|
ALTER TABLE t1 FORCE, ALGORITHM=INPLACE;
|
|
|
|
--disable_result_log
|
|
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$incremental_dir --incremental-basedir=$basedir;
|
|
--enable_result_log
|
|
|
|
DROP TABLE t1;
|
|
|
|
rmdir $basedir;rmdir $incremental_dir;
|
|
|
|
CREATE TABLE t1(i INT) ENGINE INNODB;
|
|
INSERT INTO t1 VALUES(1);
|
|
CREATE TABLE t21(i INT) ENGINE INNODB;
|
|
INSERT INTO t21 VALUES(1);
|
|
|
|
let $MYSQLD_DATADIR= `select @@datadir`;
|
|
let $targetdir=$MYSQLTEST_VARDIR/tmp/bk;
|
|
|
|
CREATE TABLE t2(i int) ENGINE INNODB;
|
|
|
|
ALTER TABLE t21 FORCE, ALGORITHM=INPLACE;
|
|
|
|
--echo # Create partial backup (excluding table t21), Ignore the
|
|
--echo # unsupported redo log for the table t21.
|
|
|
|
--disable_result_log
|
|
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 "--tables-exclude=test.t21" --target-dir=$targetdir --innodb_log_checkpoint_now=1;
|
|
--enable_result_log
|
|
--list_files $targetdir/test *.ibd
|
|
--list_files $targetdir/test *.new
|
|
|
|
--echo # Prepare the full backup
|
|
--disable_result_log
|
|
exec $XTRABACKUP --prepare --target-dir=$targetdir;
|
|
--enable_result_log
|
|
--list_files $targetdir/test *.ibd
|
|
|
|
DROP TABLE t1;
|
|
DROP TABLE t2;
|
|
DROP TABLE t21;
|
|
rmdir $targetdir;
|