Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
MDEV-26326 mariabackup skip valid ibd file
- Store the deferred tablespace name while loading the tablespace for backup process. - Mariabackup stores the list of space ids which has page0 INIT_PAGE records. backup_first_page_op() and first_page_init() was introduced to track the page0 INIT_PAGE records. - backup_file_op() and log_file_op() was changed to handle FILE_MODIFY redo log records. It is used to identify the deferred tablespace space id. - Whenever file operation redo log was processed by backup, backup_file_op() should check whether the space name exist in deferred tablespace. If it is then it needs to store the space id, name when FILE_MODIFY, FILE_RENAME redo log processed and it should delete the tablespace name from defer list in other cases. - backup_fix_ddl() should check whether deferred tablespace has any page0 init records. If it is then consider the tablespace as newly created tablespace. If not then backup should try to reload the tablespace with SRV_BACKUP_NO_DEFER mode to avoid the deferring of tablespace.
- Loading branch information
1 parent
62ba2f2
commit 8d742fe
Showing
8 changed files
with
278 additions
and
34 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
call mtr.add_suppression("InnoDB: Expected tablespace id .*"); | ||
# Mariabackup --backup with page0 INIT_PAGE redo record | ||
# and there is no FILE_CREATE for the tablespace t1 | ||
SET DEBUG_DBUG="+d,checkpoint_after_file_create"; | ||
CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB; | ||
INSERT INTO t1 VALUES(1); | ||
# xtrabackup backup | ||
# xtrabackup prepare | ||
# shutdown server | ||
# remove datadir | ||
# xtrabackup move back | ||
# restart | ||
SELECT * FROM t1; | ||
f1 | ||
1 | ||
DROP TABLE t1; | ||
SET DEBUG_DBUG="-d,checkpoint_after_file_create"; | ||
# Mariabackup fails after corrupting the page0 in disk | ||
# and there is no INIT_PAGE for page0 | ||
CREATE TABLE t1(c INT) ENGINE=INNODB; | ||
# Corrupt the table | ||
# restart | ||
# xtrabackup backup | ||
FOUND 10 /Header page consists of zero bytes*/ in backup.log | ||
UNLOCK TABLES; | ||
DROP TABLE t1; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
--source include/have_innodb.inc | ||
--source include/have_debug.inc | ||
--source include/not_embedded.inc | ||
|
||
call mtr.add_suppression("InnoDB: Expected tablespace id .*"); | ||
--echo # Mariabackup --backup with page0 INIT_PAGE redo record | ||
--echo # and there is no FILE_CREATE for the tablespace t1 | ||
SET DEBUG_DBUG="+d,checkpoint_after_file_create"; | ||
CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB; | ||
INSERT INTO t1 VALUES(1); | ||
|
||
echo # xtrabackup backup; | ||
let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; | ||
|
||
--disable_result_log | ||
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; | ||
--enable_result_log | ||
|
||
echo # xtrabackup prepare; | ||
--disable_result_log | ||
exec $XTRABACKUP --prepare --target-dir=$targetdir; | ||
-- source include/restart_and_restore.inc | ||
--enable_result_log | ||
|
||
SELECT * FROM t1; | ||
DROP TABLE t1; | ||
rmdir $targetdir; | ||
SET DEBUG_DBUG="-d,checkpoint_after_file_create"; | ||
|
||
--echo # Mariabackup fails after corrupting the page0 in disk | ||
--echo # and there is no INIT_PAGE for page0 | ||
|
||
CREATE TABLE t1(c INT) ENGINE=INNODB; | ||
let MYSQLD_DATADIR=`select @@datadir`; | ||
let INNODB_PAGE_SIZE=`select @@innodb_page_size`; | ||
--source include/shutdown_mysqld.inc | ||
|
||
--echo # Corrupt the table | ||
|
||
perl; | ||
use strict; | ||
use warnings; | ||
use Fcntl qw(:DEFAULT :seek); | ||
my $page_size = $ENV{INNODB_PAGE_SIZE}; | ||
|
||
sysopen FILE, "$ENV{MYSQLD_DATADIR}/test/t1.ibd", O_RDWR | ||
|| die "Cannot open t1.ibd\n"; | ||
sysseek(FILE, 0, SEEK_SET) || die "Cannot seek t1.ibd\n"; | ||
my $page=chr(0) x $page_size; | ||
syswrite(FILE, $page, $page_size)==$page_size; | ||
close FILE or die "close"; | ||
EOF | ||
|
||
--source include/start_mysqld.inc | ||
echo # xtrabackup backup; | ||
let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; | ||
let $backuplog=$MYSQLTEST_VARDIR/tmp/backup.log; | ||
--disable_result_log | ||
--error 1 | ||
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir --core-file > $backuplog; | ||
--enable_result_log | ||
|
||
--let SEARCH_PATTERN=Header page consists of zero bytes* | ||
--let SEARCH_FILE=$backuplog | ||
--source include/search_pattern_in_file.inc | ||
UNLOCK TABLES; | ||
DROP TABLE t1; | ||
rmdir $targetdir; | ||
remove_file $backuplog; |
Oops, something went wrong.