--source include/maybe_debug.inc --source include/innodb_page_size_small.inc --echo # --echo # Bug #16963396 INNODB: USE OF LARGE EXTERNALLY-STORED FIELDS MAKES --echo # CRASH RECOVERY LOSE DATA --echo # # .......................................................................... --echo # --echo # Uncompressed Table - Insert Operation - Crash Test --echo # Fresh insert with blobs --echo # CREATE TABLE t1 (a BIGINT PRIMARY KEY, b LONGBLOB) ENGINE=InnoDB; # Insert a few rows (it doesn't really matter how many). These transactions # are committed once they are acked, so they should not be lost. INSERT INTO t1 (a, b) VALUES (1, repeat('^', 40000)); INSERT INTO t1 (a, b) VALUES (2, '2'); INSERT INTO t1 (a, b) VALUES (3, '3'); INSERT INTO t1 (a, b) VALUES (4, '4'); INSERT INTO t1 (a, b) VALUES (5, '5'); # The BLOB insert will fail, and should disappear. However no data committed # up to this point should be lost. begin; INSERT INTO t1 (a, b) VALUES (6, REPEAT('a', 4*1024*1024)); let $shutdown_timeout=0; --source include/restart_mysqld.inc SELECT a, right(b, 50) FROM t1; # .......................................................................... --echo # --echo # Uncompressed Table - UPDATE Operation - Crash Test --echo # Update of non-blob column so that blob is needed. --echo # # The BLOB update will fail, and should disappear. However no data committed # up to this point should be lost. begin; UPDATE t1 set b = REPEAT('a', 4*1024*1024) where a = 5 ; let $shutdown_timeout=0; --source include/restart_mysqld.inc SELECT a, right(b, 50) FROM t1; # .......................................................................... --echo # --echo # Uncompressed Table - UPDATE Operation - Crash Test --echo # Update of blob column to blob. --echo # # The BLOB update will fail, and should disappear. However no data committed # up to this point should be lost. connect (con1,localhost,root,,); begin; UPDATE t1 set b = REPEAT('$', 50000) where a = 1; connection default; SET GLOBAL innodb_flush_log_at_trx_commit=1; UPDATE t1 SET b='five' WHERE a=5; let $shutdown_timeout=0; --source include/restart_mysqld.inc disconnect con1; SELECT a, right(b, 50) FROM t1; # .......................................................................... --echo # --echo # Uncompressed Table - Rollback of UPDATE operation --echo # Update moves offpage data to inline data. --echo # create table t2 (f1 bigint primary key, f2 longblob, f3 longblob, index(f2(10), f3(10))) engine=innodb; insert into t2 values (10, repeat('.', 40000), repeat('?', 40000)); connect (con1,localhost,root,,); begin; update t2 set f2 = '='; select f1, right(f2, 20), right(f3, 20) from t2; update t2 set f3 = '&'; select f1, right(f2, 20), right(f3, 20) from t2; if ($have_debug) { --disable_query_log set DEBUG_SYNC='blob_rollback_middle SIGNAL stuck WAIT_FOR ever'; send ROLLBACK; --enable_query_log } connection default; if ($have_debug) { --disable_query_log SET DEBUG_SYNC = 'now WAIT_FOR stuck'; --enable_query_log } SET GLOBAL innodb_flush_log_at_trx_commit=1; DELETE FROM t1 WHERE a=1; let $shutdown_timeout=0; --source include/restart_mysqld.inc disconnect con1; select f1, right(f2, 20), right(f3, 20) from t2; check table t2; drop table t2; # .......................................................................... --echo # --echo # Compressed Table - Insert Operation - Crash Test --echo # fresh insert with BLOBs --echo # set global innodb_compression_level = 0; create table t3 (f1 bigint primary key, f2 longblob, f3 longblob, index(f2(10), f3(10))) engine=innodb row_format=compressed; # The BLOB insert will fail, and should disappear. However no data committed # up to this point should be lost. connect (con1,localhost,root,,); begin; INSERT INTO t3 (f1, f2, f3) VALUES (6, repeat('/', 40000), repeat('<', 40000)); connection default; SET GLOBAL innodb_flush_log_at_trx_commit=1; DELETE FROM t1 WHERE a=2; let $shutdown_timeout=0; --source include/restart_mysqld.inc disconnect con1; select f1, length(f2), length(f3) from t3; select f1, right(f2, 30), right(f3, 20) from t3; check table t3; # .......................................................................... --echo # --echo # Compressed Table - Update Operation - Crash Test --echo # update of a non-BLOB column so that BLOB is needed --echo # set global innodb_compression_level = 0; insert into t3 values (2, repeat('!', 30), repeat('+', 30)); # The BLOB update will fail, and should disappear. However no data committed # up to this point should be lost. connect (con1,localhost,root,,); begin; UPDATE t3 set f2 = repeat('>', 40000) where f1 = 2; connection default; SET GLOBAL innodb_flush_log_at_trx_commit=1; DELETE FROM t1 WHERE a=3; let $shutdown_timeout=0; --source include/restart_mysqld.inc disconnect con1; select f1, length(f2), length(f3) from t3; select f1, right(f2, 30), right(f3, 20) from t3; check table t3; # .......................................................................... --echo # --echo # Compressed Table - Update Operation - Crash Test --echo # update blob to blob --echo # set global innodb_compression_level = 0; insert into t3 values (3, repeat('%', 40000), repeat('~', 40000)); # The BLOB update will fail, and should disappear. However no data committed # up to this point should be lost. connect (con1,localhost,root,,); begin; UPDATE t3 set f2 = concat(f2, repeat(',', 10)) where f1 = 3; connection default; SET GLOBAL innodb_flush_log_at_trx_commit=1; DELETE FROM t1 WHERE a=4; let $shutdown_timeout=0; --source include/restart_mysqld.inc select f1, length(f2), length(f3) from t3; select f1, right(f2, 30), right(f3, 20) from t3; check table t3; DROP TABLE t1,t3;