mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 05:22:25 +01:00
142 lines
4.6 KiB
Text
142 lines
4.6 KiB
Text
|
--source include/not_embedded.inc
|
||
|
# Don't test this under valgrind, memory leaks will occur as we crash
|
||
|
--source include/not_valgrind.inc
|
||
|
# Binary must be compiled with debug for crash to occur
|
||
|
--source include/have_debug.inc
|
||
|
--source include/have_maria.inc
|
||
|
|
||
|
--disable_warnings
|
||
|
drop database if exists mysqltest;
|
||
|
--enable_warnings
|
||
|
create database mysqltest;
|
||
|
|
||
|
# Include scripts can perform SQL. For it to not influence the main test
|
||
|
# they use a separate connection. This way if they use a DDL it would
|
||
|
# not autocommit in the main test.
|
||
|
connect (admin, 127.0.0.1, root,,mysqltest,,);
|
||
|
--enable_reconnect
|
||
|
|
||
|
connection default;
|
||
|
use mysqltest;
|
||
|
--enable_reconnect
|
||
|
|
||
|
# A sample test
|
||
|
-- source include/maria_empty_logs.inc
|
||
|
let $mms_tables=1;
|
||
|
create table t1 (a varchar(1000)) engine=maria;
|
||
|
|
||
|
--echo * TEST: see if recovery can reconstruct if we give it an old table
|
||
|
|
||
|
-- source include/maria_make_snapshot_for_feeding_recovery.inc
|
||
|
# Your committed statements here, which we expect to
|
||
|
# be reconstructed from the log
|
||
|
insert into t1 values ("00000000");
|
||
|
-- source include/maria_make_snapshot_for_comparison.inc
|
||
|
# Your statements which should not commit and we expect to be rolled back
|
||
|
lock tables t1 write;
|
||
|
insert into t1 values ("aaaaaaaaa");
|
||
|
# we want recovery to run on the first snapshot made above
|
||
|
let $mvr_restore_old_snapshot=1;
|
||
|
# the script below will trigger recovery and compare checksums
|
||
|
let $mvr_debug_option="+d,maria_flush_whole_log,maria_crash";
|
||
|
-- source include/maria_verify_recovery.inc
|
||
|
# so a SELECT like this is pure visual effect, brings nothing.
|
||
|
select * from t1;
|
||
|
|
||
|
--echo * TEST: normal recovery test (no moving tables under its feet)
|
||
|
|
||
|
# different types of crash => a loop; here are loop control variables
|
||
|
let $crash_no_flush=1;
|
||
|
let $crash_flush_whole_page_cache=0;
|
||
|
let $crash_flush_states=0;
|
||
|
let $crash_flush_whole_log=0;
|
||
|
let $crash_loop=1;
|
||
|
|
||
|
# we want recovery to use the tables as they were at time of crash
|
||
|
let $mvr_restore_old_snapshot=0;
|
||
|
|
||
|
# Note that we don't remove logs between iterations. Test is
|
||
|
# cumulative (each new recovery processes more log records than the previous).
|
||
|
|
||
|
while ($crash_loop)
|
||
|
{
|
||
|
if ($crash_flush_whole_log)
|
||
|
{
|
||
|
let $mvr_debug_option="+d,maria_flush_whole_log,maria_crash";
|
||
|
# set up what next iteration should do:
|
||
|
let $crash_flush_whole_log=0;
|
||
|
let $crash_loop=0;
|
||
|
}
|
||
|
if ($crash_flush_states)
|
||
|
{
|
||
|
let $mvr_debug_option="+d,maria_flush_states,maria_flush_whole_log,maria_crash";
|
||
|
let $crash_flush_states=0;
|
||
|
let $crash_flush_whole_log=1;
|
||
|
}
|
||
|
if ($crash_flush_whole_page_cache)
|
||
|
{
|
||
|
let $mvr_debug_option="+d,maria_flush_whole_page_cache,maria_crash";
|
||
|
let $crash_flush_whole_page_cache=0;
|
||
|
let $crash_flush_states=1;
|
||
|
}
|
||
|
if ($crash_no_flush)
|
||
|
{
|
||
|
let $mvr_debug_option="+d,maria_crash";
|
||
|
let $crash_no_flush=0;
|
||
|
let $crash_flush_whole_page_cache=1;
|
||
|
}
|
||
|
# Your committed statements here
|
||
|
insert into t1 values ("00000000");
|
||
|
-- source include/maria_make_snapshot_for_comparison.inc
|
||
|
# Your statements which we expect to be rolled back
|
||
|
lock tables t1 write;
|
||
|
insert into t1 values ("aaaaaaaaa");
|
||
|
-- source include/maria_verify_recovery.inc
|
||
|
select * from t1;
|
||
|
}
|
||
|
|
||
|
drop table t1;
|
||
|
|
||
|
# what did we compare above:
|
||
|
# - checksum: tells that the tables contain the same amount of rows
|
||
|
# and same data in rows
|
||
|
# - index: no, neither state nor pages were compared
|
||
|
# - bitmap pages: the REPAIR QUICK done above very probably checks
|
||
|
# that bitmap reflects page occupation; do we need to do physical
|
||
|
# compare?
|
||
|
# - page LSN: not compared; we should compare that page's LSN in new
|
||
|
# table is >= page's LSN in old table (it can be >, due to UNDO phase)
|
||
|
# we had a bug where new page's LSN was 0... todo.
|
||
|
|
||
|
#
|
||
|
# Test problem where an UPDATE purges and rewrites a tail page, and
|
||
|
# recovery applied the purge, stamped page with UNDO's LSN, thus
|
||
|
# the rewrite was ignored.
|
||
|
#
|
||
|
|
||
|
-- source include/maria_empty_logs.inc
|
||
|
let $mms_tables=1;
|
||
|
CREATE TABLE t1 (
|
||
|
i int,
|
||
|
b blob default NULL,
|
||
|
c varchar(6000) default NULL
|
||
|
) ENGINE=MARIA CHECKSUM=1;
|
||
|
-- source include/maria_make_snapshot_for_feeding_recovery.inc
|
||
|
INSERT INTO t1 VALUES (1, REPEAT('a', 5000), REPEAT('b', 5000));
|
||
|
UPDATE t1 SET i=3, b=CONCAT(b,'c') WHERE i=1;
|
||
|
SELECT LENGTH(b) FROM t1 WHERE i=3;
|
||
|
-- source include/maria_make_snapshot_for_comparison.inc
|
||
|
# we want recovery to run on the first snapshot made above
|
||
|
let $mvr_restore_old_snapshot=1;
|
||
|
let $mvr_debug_option="+d,maria_flush_whole_log,maria_crash";
|
||
|
-- source include/maria_verify_recovery.inc
|
||
|
SELECT LENGTH(b) FROM t1 WHERE i=3;
|
||
|
drop table t1;
|
||
|
|
||
|
# clean up everything
|
||
|
let $mms_purpose=feeding_recovery;
|
||
|
eval drop database mysqltest_for_$mms_purpose;
|
||
|
let $mms_purpose=comparison;
|
||
|
eval drop database mysqltest_for_$mms_purpose;
|
||
|
drop database mysqltest;
|