mirror of
https://github.com/MariaDB/server.git
synced 2025-09-22 00:55:30 +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.
103 lines
3.2 KiB
Text
103 lines
3.2 KiB
Text
#--source include/innodb_page_size.inc
|
|
|
|
# Export single table from backup
|
|
# (xtrabackup with --prepare --export)
|
|
|
|
CREATE TABLE t1(i INT) ENGINE INNODB;
|
|
INSERT INTO t1 VALUES(1);
|
|
CREATE TABLE t21(i INT) ENGINE INNODB;
|
|
INSERT INTO t21 VALUES(1);
|
|
|
|
CREATE TABLE t2(i int) ENGINE INNODB;
|
|
|
|
echo # xtrabackup backup;
|
|
|
|
let targetdir=$MYSQLTEST_VARDIR/tmp/backup;
|
|
--disable_result_log
|
|
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 "--tables=test.*1" --target-dir=$targetdir --innodb_log_checkpoint_now=1;
|
|
--enable_result_log
|
|
list_files $targetdir/test *.ibd;
|
|
list_files $targetdir/test *.new;
|
|
|
|
# Inject a junk .ibd file into backup dir to
|
|
# see if prepare does not choke on it.
|
|
write_file $targetdir/test/junk.ibd;
|
|
EOF
|
|
write_file $targetdir/test/junk.frm;
|
|
EOF
|
|
|
|
let server_cnf=$targetdir/server.cnf;
|
|
copy_file $MYSQLTEST_VARDIR/my.cnf $server_cnf;
|
|
|
|
# Emulate server config file turnes on binary logs
|
|
perl;
|
|
my $binlog_path="$ENV{'targetdir'}/mysqld-bin";
|
|
my $config_path=$ENV{'server_cnf'};
|
|
open(my $fd, '>>', "$config_path");
|
|
print $fd "\n[mysqld]\n";
|
|
print $fd "log-bin=$binlog_path\n";
|
|
close $fd;
|
|
EOF
|
|
|
|
echo # xtrabackup prepare;
|
|
--disable_result_log
|
|
exec $XTRABACKUP --defaults-file=$server_cnf --defaults-group-suffix=.1 --prepare --export --target-dir=$targetdir;
|
|
--enable_result_log
|
|
|
|
list_files $targetdir/test *.cfg;
|
|
# There must not be binary logs created on --prepare step
|
|
list_files $targetdir/ mysqld-bin.*;
|
|
|
|
let $MYSQLD_DATADIR= `select @@datadir`;
|
|
ALTER TABLE t1 DISCARD TABLESPACE;
|
|
copy_file $targetdir/test/t1.ibd $MYSQLD_DATADIR/test/t1.ibd;
|
|
copy_file $targetdir/test/t1.cfg $MYSQLD_DATADIR/test/t1.cfg;
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
|
|
SELECT * FROM t1;
|
|
|
|
--echo # MDEV-33023 Crash in mariadb-backup --prepare --export after --prepare
|
|
--disable_result_log
|
|
exec $XTRABACKUP --defaults-file=$server_cnf --defaults-group-suffix=.1 --prepare --target-dir=$targetdir;
|
|
exec $XTRABACKUP --defaults-file=$server_cnf --defaults-group-suffix=.1 --prepare --export --target-dir=$targetdir;
|
|
--enable_result_log
|
|
|
|
list_files $targetdir/test *.cfg;
|
|
# There must not be binary logs created on --prepare step
|
|
list_files $targetdir/ mysqld-bin.*;
|
|
|
|
let $MYSQLD_DATADIR= `select @@datadir`;
|
|
ALTER TABLE t1 DISCARD TABLESPACE;
|
|
copy_file $targetdir/test/t1.ibd $MYSQLD_DATADIR/test/t1.ibd;
|
|
copy_file $targetdir/test/t1.cfg $MYSQLD_DATADIR/test/t1.cfg;
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
|
|
SELECT * FROM t1;
|
|
|
|
DROP TABLE t1;
|
|
DROP TABLE t2;
|
|
DROP TABLE t21;
|
|
rmdir $targetdir;
|
|
|
|
--echo #
|
|
--echo # MDEV-36287 maribackup ignores tables-file option
|
|
--echo #
|
|
CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB;
|
|
CREATE TABLE t2(f1 INT NOT NULL)ENGINE=InnoDB;
|
|
INSERT INTO t1 values(1);
|
|
let targetdir=$MYSQLTEST_VARDIR/tmp/backup;
|
|
let tables_list=$MYSQLTEST_VARDIR/tmp/tables_list.out;
|
|
--echo # Only backup table t1 by creating tables_file
|
|
--exec echo "test.t1" > $tables_list
|
|
|
|
--echo # Backup with --tables-file option
|
|
--disable_result_log
|
|
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --tables-file=$tables_list --target-dir=$targetdir;
|
|
--enable_result_log
|
|
|
|
--echo # table t2 is skipped. Shows only t1
|
|
--replace_result .new .ibd
|
|
list_files $targetdir/test;
|
|
DROP TABLE t2, t1;
|
|
rmdir $targetdir;
|
|
remove_file $tables_list;
|