mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 12:32:27 +01:00
218 lines
7.2 KiB
Text
218 lines
7.2 KiB
Text
# Test of Recovery of R-tree (table t1) and fulltext (table t2) indices
|
|
|
|
--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
|
|
--source include/long_test.inc
|
|
|
|
set global aria_log_file_size=4294959104;
|
|
let $MARIA_LOG=.;
|
|
|
|
--disable_warnings
|
|
drop database if exists mysqltest;
|
|
--enable_warnings
|
|
create database mysqltest;
|
|
let $mms_tname=t;
|
|
|
|
# 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, localhost, root,,mysqltest,,);
|
|
--enable_reconnect
|
|
|
|
connection default;
|
|
use mysqltest;
|
|
--enable_reconnect
|
|
|
|
-- source include/maria_empty_logs.inc
|
|
let $mms_tables=2;
|
|
|
|
CREATE TABLE t1 (
|
|
line POINT NOT NULL,
|
|
kind ENUM('po', 'pp', 'rr', 'dr', 'rd', 'ts', 'cl') NOT NULL DEFAULT 'po',
|
|
name VARCHAR(32)
|
|
,SPATIAL key (line)
|
|
) transactional=1 row_format=page engine=aria;
|
|
SHOW INDEX FROM t1;
|
|
CREATE TABLE t2 (a VARCHAR(200), b TEXT, FULLTEXT (a,b)
|
|
) transactional=1 row_format=page engine=aria;
|
|
SHOW INDEX FROM t2;
|
|
|
|
let $query1= INSERT INTO t1 (name, kind, line) VALUES
|
|
("Aadaouane", "pp", GeomFromText("POINT(32.816667 35.983333)")),
|
|
("Aadassiye", "pp", GeomFromText("POINT(35.816667 36.216667)")),
|
|
("Aadbel", "pp", GeomFromText("POINT(34.533333 36.100000)")),
|
|
("Aadchit", "pp", GeomFromText("POINT(33.347222 35.423611)")),
|
|
("Aadchite", "pp", GeomFromText("POINT(33.347222 35.423611)")),
|
|
("Aadchit el Qoussair", "pp", GeomFromText("POINT(33.283333 35.483333)")),
|
|
("Aaddaye", "pp", GeomFromText("POINT(36.716667 40.833333)")),
|
|
("'Aadeissa", "pp", GeomFromText("POINT(32.823889 35.698889)")),
|
|
("Aaderup", "pp", GeomFromText("POINT(55.216667 11.766667)")),
|
|
("Qalaat Aades", "pp", GeomFromText("POINT(33.503333 35.377500)")),
|
|
("A ad'ino", "pp", GeomFromText("POINT(54.812222 38.209167)")),
|
|
("Aadi Noia", "pp", GeomFromText("POINT(13.800000 39.833333)")),
|
|
("Aad La Macta", "pp", GeomFromText("POINT(35.779444 -0.129167)")),
|
|
("Aadland", "pp", GeomFromText("POINT(60.366667 5.483333)")),
|
|
("Aadliye", "pp", GeomFromText("POINT(33.366667 36.333333)")),
|
|
("Aadloun", "pp", GeomFromText("POINT(33.403889 35.273889)")),
|
|
("Aadma", "pp", GeomFromText("POINT(58.798333 22.663889)")),
|
|
("Aadma Asundus", "pp", GeomFromText("POINT(58.798333 22.663889)")),
|
|
("Aadmoun", "pp", GeomFromText("POINT(34.150000 35.650000)")),
|
|
("Aadneram", "pp", GeomFromText("POINT(59.016667 6.933333)")),
|
|
("Aadneskaar", "pp", GeomFromText("POINT(58.083333 6.983333)")),
|
|
("Aadorf", "pp", GeomFromText("POINT(47.483333 8.900000)")),
|
|
("Aadorp", "pp", GeomFromText("POINT(52.366667 6.633333)")),
|
|
("Aadouane", "pp", GeomFromText("POINT(32.816667 35.983333)")),
|
|
("Aadoui", "pp", GeomFromText("POINT(34.450000 35.983333)")),
|
|
("Aadouiye", "pp", GeomFromText("POINT(34.583333 36.183333)")),
|
|
("Aadouss", "pp", GeomFromText("POINT(33.512500 35.601389)")),
|
|
("Aadra", "pp", GeomFromText("POINT(33.616667 36.500000)")),
|
|
("Aadzi", "pp", GeomFromText("POINT(38.100000 64.850000)"));
|
|
|
|
let $query2= INSERT INTO t2 VALUES
|
|
('MySQL has now support', 'for full-text search'),
|
|
('Full-text indexes', 'are called collections'),
|
|
('Only MyISAM tables','support collections'),
|
|
('Function MATCH ... AGAINST()','is used to do a search'),
|
|
('Full-text search in MySQL', 'implements vector space model'),
|
|
('We want to see', 'if this is recoverable'),
|
|
('Or rather leaves a bad corrupted table', 'after a crash'),
|
|
('Test of REDOs', 'and then UNDOs'),
|
|
('Recovery is interesting', 'but sometimes complicated'),
|
|
('But what if it was simple', 'and boring?'),
|
|
('I wish I knew more', 'about how fulltext works'),
|
|
('Maybe I should read about it', 'on the Internet');
|
|
|
|
--echo * TEST of REDO: see if recovery can reconstruct if we give it an old table
|
|
|
|
-- source include/maria_make_snapshot_for_feeding_recovery.inc
|
|
|
|
--disable_query_log
|
|
let $1=120; # 8 is smallest value to cause root split; 12 for child split
|
|
while($1)
|
|
{
|
|
eval $query1;
|
|
eval $query2;
|
|
dec $1;
|
|
}
|
|
let $1=120;
|
|
while($1)
|
|
{
|
|
delete from t1 limit 1;
|
|
delete from t1 limit 10;
|
|
delete from t1 limit 7;
|
|
delete from t1 limit 2;
|
|
delete from t2 limit 6;
|
|
dec $1;
|
|
}
|
|
--enable_query_log
|
|
-- 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 $mms_compare_physically=0;
|
|
let $mvr_debug_option="+d,maria_flush_whole_log,maria_crash";
|
|
let $mvr_crash_statement= set global aria_checkpoint_interval=1;
|
|
# the script below will trigger recovery and compare checksums
|
|
-- source include/maria_verify_recovery.inc
|
|
|
|
# Test of REDO + UNDO
|
|
--echo * TEST of INSERT and DELETE's rollback
|
|
|
|
# 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;
|
|
# UNDO phase prevents physical comparison, normally,
|
|
# so we'll only use checksums to compare.
|
|
let $mms_compare_physically=0;
|
|
let $mvr_crash_statement= set global aria_checkpoint_interval=1;
|
|
|
|
# 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
|
|
-- source include/maria_make_snapshot_for_comparison.inc
|
|
# Your statements which we expect to be rolled back
|
|
lock tables t1 write, t2 write;
|
|
|
|
--disable_query_log
|
|
let $1=120;
|
|
while($1)
|
|
{
|
|
eval $query1;
|
|
eval $query2;
|
|
dec $1;
|
|
}
|
|
let $1=120;
|
|
while($1)
|
|
{
|
|
delete from t1 limit 1;
|
|
delete from t1 limit 10;
|
|
delete from t1 limit 7;
|
|
delete from t1 limit 2;
|
|
delete from t2 limit 6;
|
|
dec $1;
|
|
}
|
|
--enable_query_log
|
|
|
|
-- source include/maria_verify_recovery.inc
|
|
}
|
|
|
|
# Finally check when we make the table empty
|
|
# This is currently hitting BUG#36319 so is disabled
|
|
|
|
if (0)
|
|
{
|
|
-- source include/maria_make_snapshot_for_comparison.inc
|
|
lock tables t1 write, t2 write;
|
|
select count(*) from t1;
|
|
delete from t1;
|
|
select count(*) from t1;
|
|
select count(*) from t2;
|
|
delete from t2;
|
|
select count(*) from t2;
|
|
}
|
|
|
|
-- source include/maria_verify_recovery.inc
|
|
|
|
# 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;
|