|
3 | 3 |
|
4 | 4 | # Test provisioning a slave from an existing server, using mariabackup --no-lock |
5 | 5 | # and the binlog position recovered from InnoDB redo log. |
| 6 | + |
| 7 | +# Update the InnoDB system tablespace to simulate a pre-10.3.5 |
| 8 | +# position in TRX_SYS. There was a bug that the wrong position could |
| 9 | +# be recovered if the old filename in TRX_SYS compares newer than the |
| 10 | +# newer filenames stored in rseg headers. |
| 11 | +let MYSQLD_DATADIR=`select @@datadir`; |
| 12 | +let INNODB_PAGE_SIZE=`select @@innodb_page_size`; |
| 13 | + |
| 14 | +--source include/shutdown_mysqld.inc |
| 15 | + |
| 16 | +--perl |
| 17 | +use strict; |
| 18 | +use warnings; |
| 19 | +use Fcntl qw(:DEFAULT :seek); |
| 20 | +do "$ENV{MTR_SUITE_DIR}/../innodb/include/crc32.pl"; |
| 21 | +do "$ENV{MTR_SUITE_DIR}/../innodb/include/innodb-util.pl"; |
| 22 | + |
| 23 | +my $ps = $ENV{INNODB_PAGE_SIZE}; |
| 24 | + |
| 25 | +sysopen IBD_FILE, "$ENV{MYSQLD_DATADIR}/ibdata1", O_RDWR |
| 26 | + or die "Cannot open ibdata1: $!\n"; |
| 27 | + |
| 28 | +# Read the TRX_SYS page. |
| 29 | +my $page; |
| 30 | +sysseek(IBD_FILE, $ps * 5, SEEK_SET) |
| 31 | + or die "Cannot seek ibdata1: $!\n"; |
| 32 | +sysread(IBD_FILE, $page, $ps) |
| 33 | + or die "Cannot read ibdata1: $!\n"; |
| 34 | + |
| 35 | +# Put in an old binlog position that will compare larger than master-bin.000001 |
| 36 | +my $old_name= '~~~-bin.999999' . chr(0); |
| 37 | +my $old_off= 0xffff0000; |
| 38 | +my $old_magic= 873422344; |
| 39 | +my $binlog_offset= $ps - 1000 + 38; |
| 40 | +substr($page, $binlog_offset, 4)= pack('N', $old_magic); |
| 41 | +substr($page, $binlog_offset + 4, 4)= pack('N', ($old_off >> 32)); |
| 42 | +substr($page, $binlog_offset + 8, 4)= pack('N', ($old_off & 0xffffffff)); |
| 43 | +substr($page, $binlog_offset + 12, length($old_name))= $old_name; |
| 44 | + |
| 45 | +# Write back the modified page. |
| 46 | +my $full_crc32= get_full_crc32(\*IBD_FILE); |
| 47 | +my $page= fix_page_crc($page, $full_crc32); |
| 48 | +sysseek(IBD_FILE, $ps * 5, SEEK_SET) |
| 49 | + or die "Cannot seek ibdata1: $!\n"; |
| 50 | +syswrite(IBD_FILE, $page, $ps) == $ps |
| 51 | + or die "Cannot write ibdata1: $!\n"; |
| 52 | +close IBD_FILE; |
| 53 | +EOF |
| 54 | + |
| 55 | +--source include/start_mysqld.inc |
| 56 | + |
| 57 | + |
6 | 58 | let $basedir=$MYSQLTEST_VARDIR/tmp/backup; |
7 | 59 |
|
8 | 60 | RESET MASTER; |
|
0 commit comments