mirror of
https://github.com/MariaDB/server.git
synced 2025-11-27 05:41:41 +03:00
The doublewrite buffer pages must fit in the first InnoDB system
tablespace data file. The checks that were added in the initial patch
(commit 112b21da37)
were at too high level and did not cover all cases.
innodb.log_data_file_size: Test all innodb_page_size combinations.
fsp_header_init(): Never return an error. Move the change buffer creation
to the only caller that needs to do it.
btr_create(): Clean up the logic. Remove the error log messages.
buf_dblwr_create(): Try to return an error on non-fatal failure.
Check that the first data file is big enough for creating the
doublewrite buffers.
buf_dblwr_process(): Check if the doublewrite buffer is available.
Display the message only if it is available.
recv_recovery_from_checkpoint_start_func(): Remove a redundant message
about FIL_PAGE_FILE_FLUSH_LSN mismatch when crash recovery has already
been initiated.
fil_report_invalid_page_access(): Simplify the message.
fseg_create_general(): Do not emit messages to the error log.
innobase_init(): Revert the changes.
trx_rseg_create(): Refactor (no functional change).
252 lines
8.0 KiB
Plaintext
252 lines
8.0 KiB
Plaintext
#
|
|
# Bug #17335427 INNODB CAN NOT USE THE DOUBLEWRITE BUFFER PROPERLY
|
|
# Bug #18144349 INNODB CANNOT USE THE DOUBLEWRITE BUFFER FOR THE FIRST
|
|
# PAGE OF SYSTEM TABLESPACE
|
|
#
|
|
SET GLOBAL innodb_fast_shutdown = 0;
|
|
show variables like 'innodb_doublewrite';
|
|
Variable_name Value
|
|
innodb_doublewrite ON
|
|
show variables like 'innodb_fil_make_page_dirty_debug';
|
|
Variable_name Value
|
|
innodb_fil_make_page_dirty_debug 0
|
|
show variables like 'innodb_saved_page_number_debug';
|
|
Variable_name Value
|
|
innodb_saved_page_number_debug 0
|
|
create table t1 (f1 int primary key, f2 blob) engine=innodb;
|
|
start transaction;
|
|
insert into t1 values(1, repeat('#',12));
|
|
insert into t1 values(2, repeat('+',12));
|
|
insert into t1 values(3, repeat('/',12));
|
|
insert into t1 values(4, repeat('-',12));
|
|
insert into t1 values(5, repeat('.',12));
|
|
commit work;
|
|
# ---------------------------------------------------------------
|
|
# Test Begin: Test if recovery works if first page of user
|
|
# tablespace is full of zeroes.
|
|
select space from information_schema.innodb_sys_tables
|
|
where name = 'test/t1' into @space_id;
|
|
# Ensure that dirty pages of table t1 is flushed.
|
|
flush tables t1 for export;
|
|
unlock tables;
|
|
begin;
|
|
insert into t1 values (6, repeat('%', 12));
|
|
# Make the first page dirty for table t1
|
|
set global innodb_saved_page_number_debug = 0;
|
|
set global innodb_fil_make_page_dirty_debug = @space_id;
|
|
# Ensure that dirty pages of table t1 are flushed.
|
|
set global innodb_buf_flush_list_now = 1;
|
|
# Kill the server
|
|
# Make the first page (page_no=0) of the user tablespace
|
|
# full of zeroes.
|
|
#
|
|
# MDEV-11623: Use old FSP_SPACE_FLAGS in the doublewrite buffer.
|
|
check table t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 check status OK
|
|
select f1, f2 from t1;
|
|
f1 f2
|
|
1 ############
|
|
2 ++++++++++++
|
|
3 ////////////
|
|
4 ------------
|
|
5 ............
|
|
# Test End
|
|
# ---------------------------------------------------------------
|
|
# Test Begin: Test if recovery works if first page of user
|
|
# tablespace is corrupted.
|
|
select space from information_schema.innodb_sys_tables
|
|
where name = 'test/t1' into @space_id;
|
|
# Ensure that dirty pages of table t1 is flushed.
|
|
flush tables t1 for export;
|
|
unlock tables;
|
|
begin;
|
|
insert into t1 values (6, repeat('%', 12));
|
|
# Make the first page dirty for table t1
|
|
set global innodb_saved_page_number_debug = 0;
|
|
set global innodb_fil_make_page_dirty_debug = @space_id;
|
|
# Ensure that dirty pages of table t1 are flushed.
|
|
set global innodb_buf_flush_list_now = 1;
|
|
# Kill the server
|
|
# Corrupt the first page (page_no=0) of the user tablespace.
|
|
check table t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 check status OK
|
|
select f1, f2 from t1;
|
|
f1 f2
|
|
1 ############
|
|
2 ++++++++++++
|
|
3 ////////////
|
|
4 ------------
|
|
5 ............
|
|
# Test End
|
|
# ---------------------------------------------------------------
|
|
# Test Begin: Test if recovery works if 2nd page of user
|
|
# tablespace is full of zeroes.
|
|
select space from information_schema.innodb_sys_tables
|
|
where name = 'test/t1' into @space_id;
|
|
# Ensure that dirty pages of table t1 is flushed.
|
|
flush tables t1 for export;
|
|
unlock tables;
|
|
begin;
|
|
insert into t1 values (6, repeat('%', 400));
|
|
# Make the 2nd page dirty for table t1
|
|
set global innodb_saved_page_number_debug = 1;
|
|
set global innodb_fil_make_page_dirty_debug = @space_id;
|
|
# Ensure that dirty pages of table t1 are flushed.
|
|
set global innodb_buf_flush_list_now = 1;
|
|
# Kill the server
|
|
# Make the 2nd page (page_no=1) of the tablespace all zeroes.
|
|
check table t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 check status OK
|
|
select f1, f2 from t1;
|
|
f1 f2
|
|
1 ############
|
|
2 ++++++++++++
|
|
3 ////////////
|
|
4 ------------
|
|
5 ............
|
|
# Test End
|
|
# ---------------------------------------------------------------
|
|
# Test Begin: Test if recovery works if 2nd page of user
|
|
# tablespace is corrupted.
|
|
select space from information_schema.innodb_sys_tables
|
|
where name = 'test/t1' into @space_id;
|
|
# Ensure that dirty pages of table t1 is flushed.
|
|
flush tables t1 for export;
|
|
unlock tables;
|
|
begin;
|
|
insert into t1 values (6, repeat('%', 400));
|
|
# Make the 2nd page dirty for table t1
|
|
set global innodb_saved_page_number_debug = 1;
|
|
set global innodb_fil_make_page_dirty_debug = @space_id;
|
|
# Ensure that the dirty pages of table t1 are flushed.
|
|
set global innodb_buf_flush_list_now = 1;
|
|
# Kill the server
|
|
# Corrupt the 2nd page (page_no=1) of the user tablespace.
|
|
check table t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 check status OK
|
|
select f1, f2 from t1;
|
|
f1 f2
|
|
1 ############
|
|
2 ++++++++++++
|
|
3 ////////////
|
|
4 ------------
|
|
5 ............
|
|
# Test End
|
|
# ---------------------------------------------------------------
|
|
# Test Begin: Test if recovery works if first page of
|
|
# system tablespace is full of zeroes.
|
|
begin;
|
|
insert into t1 values (6, repeat('%', 400));
|
|
# Ensure that all dirty pages in the system are flushed.
|
|
set global innodb_buf_flush_list_now = 1;
|
|
# Make the first page dirty for system tablespace
|
|
set global innodb_saved_page_number_debug = 0;
|
|
set global innodb_fil_make_page_dirty_debug = 0;
|
|
# Ensure that the dirty page of system tablespace is also flushed.
|
|
set global innodb_buf_flush_list_now = 1;
|
|
# Kill the server
|
|
# Make the first page (page_no=0) of the system tablespace
|
|
# all zeroes.
|
|
check table t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 check status OK
|
|
select f1, f2 from t1;
|
|
f1 f2
|
|
1 ############
|
|
2 ++++++++++++
|
|
3 ////////////
|
|
4 ------------
|
|
5 ............
|
|
# Test End
|
|
# ---------------------------------------------------------------
|
|
# Test Begin: Test if recovery works if first page of
|
|
# system tablespace is corrupted.
|
|
begin;
|
|
insert into t1 values (6, repeat('%', 400));
|
|
# Ensure that all dirty pages in the system are flushed.
|
|
set global innodb_buf_flush_list_now = 1;
|
|
# Make the first page dirty for system tablespace
|
|
set global innodb_saved_page_number_debug = 0;
|
|
set global innodb_fil_make_page_dirty_debug = 0;
|
|
# Ensure that the dirty page of system tablespace is also flushed.
|
|
set global innodb_buf_flush_list_now = 1;
|
|
# Kill the server
|
|
# Corrupt the first page (page_no=0) of the system tablespace.
|
|
check table t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 check status OK
|
|
select f1, f2 from t1;
|
|
f1 f2
|
|
1 ############
|
|
2 ++++++++++++
|
|
3 ////////////
|
|
4 ------------
|
|
5 ............
|
|
# Test End
|
|
# ---------------------------------------------------------------
|
|
# Test Begin: Test if recovery works if 2nd page of
|
|
# system tablespace is full of zeroes.
|
|
begin;
|
|
insert into t1 values (6, repeat('%', 400));
|
|
# Ensure that all dirty pages in the system are flushed.
|
|
set global innodb_buf_flush_list_now = 1;
|
|
# Make the second page dirty for system tablespace
|
|
set global innodb_saved_page_number_debug = 1;
|
|
set global innodb_fil_make_page_dirty_debug = 0;
|
|
# Ensure that the dirty page of system tablespace is also flushed.
|
|
set global innodb_buf_flush_list_now = 1;
|
|
# Kill the server
|
|
# Make the 2nd page (page_no=1) of the system tablespace
|
|
# all zeroes.
|
|
check table t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 check status OK
|
|
select f1, f2 from t1;
|
|
f1 f2
|
|
1 ############
|
|
2 ++++++++++++
|
|
3 ////////////
|
|
4 ------------
|
|
5 ............
|
|
# Test End
|
|
# ---------------------------------------------------------------
|
|
# Test Begin: Test if recovery works if 2nd page of
|
|
# system tablespace is corrupted.
|
|
begin;
|
|
insert into t1 values (6, repeat('%', 400));
|
|
# Ensure that all dirty pages in the system are flushed.
|
|
set global innodb_buf_flush_list_now = 1;
|
|
# Make the second page dirty for system tablespace
|
|
set global innodb_saved_page_number_debug = 1;
|
|
set global innodb_fil_make_page_dirty_debug = 0;
|
|
# Ensure that the dirty page of system tablespace is also flushed.
|
|
set global innodb_buf_flush_list_now = 1;
|
|
# Kill the server
|
|
# Make the 2nd page (page_no=1) of the system tablespace
|
|
# all zeroes.
|
|
check table t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 check status OK
|
|
FOUND /\[ERROR\] InnoDB: .* in tablespace.*test.t1.*/ in mysqld.1.err
|
|
select f1, f2 from t1;
|
|
f1 f2
|
|
1 ############
|
|
2 ++++++++++++
|
|
3 ////////////
|
|
4 ------------
|
|
5 ............
|
|
drop table t1;
|
|
#
|
|
# MDEV-12600 crash during install_db with innodb_page_size=32K
|
|
# and ibdata1=3M
|
|
#
|
|
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
|
WHERE engine = 'innodb'
|
|
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
|
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
|
|
FOUND /\[ERROR\] InnoDB: Cannot create doublewrite buffer/ in mysqld.1.err
|