mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-04 12:56:14 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			158 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			SQL
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			SQL
		
	
	
	
	
	
# 
 | 
						|
# REPAIR TABLE statements
 | 
						|
#
 | 
						|
# Note: the output is likely to be different for the engine under test,
 | 
						|
# in which case rdiff will be needed. Or, the output might say that
 | 
						|
# the storage engine does not support REPAIR.
 | 
						|
#
 | 
						|
 | 
						|
--disable_warnings
 | 
						|
DROP TABLE IF EXISTS t1,t2;
 | 
						|
--enable_warnings
 | 
						|
 | 
						|
--source create_table.inc
 | 
						|
INSERT INTO t1 (a,b) VALUES (1,'a'),(2,'b');
 | 
						|
--let $table_name = t2
 | 
						|
--source create_table.inc
 | 
						|
 | 
						|
REPAIR TABLE t1;
 | 
						|
if ($mysql_errname)
 | 
						|
{
 | 
						|
  --source unexpected_result.inc
 | 
						|
}
 | 
						|
INSERT INTO t1 (a,b) VALUES (3,'c');
 | 
						|
INSERT INTO t2 (a,b) VALUES (4,'d');
 | 
						|
REPAIR NO_WRITE_TO_BINLOG TABLE t1, t2;
 | 
						|
INSERT INTO t2 (a,b) VALUES (5,'e'),(6,'f');
 | 
						|
REPAIR LOCAL TABLE t2;
 | 
						|
INSERT INTO t1 (a,b) VALUES (7,'g'),(8,'h');
 | 
						|
INSERT INTO t2 (a,b) VALUES (9,'i');
 | 
						|
REPAIR LOCAL TABLE t2, t1 EXTENDED;
 | 
						|
INSERT INTO t1 (a,b) VALUES (10,'j');
 | 
						|
INSERT INTO t2 (a,b) VALUES (11,'k');
 | 
						|
REPAIR TABLE t1, t2 QUICK USE_FRM;
 | 
						|
INSERT INTO t1 (a,b) VALUES (12,'l');
 | 
						|
INSERT INTO t2 (a,b) VALUES (13,'m');
 | 
						|
REPAIR NO_WRITE_TO_BINLOG TABLE t1, t2 QUICK EXTENDED USE_FRM;
 | 
						|
FLUSH TABLE t1;
 | 
						|
 | 
						|
let my_datadir = `SELECT @@datadir`;
 | 
						|
 | 
						|
# Now we'll override all table files except for frm.
 | 
						|
# Some engines are more enduring to table files corruption
 | 
						|
# than others, so the result of the following INSERT and REPAIR
 | 
						|
# will be different for different engines
 | 
						|
 | 
						|
--perl
 | 
						|
@files = glob "$ENV{my_datadir}/test/t1.*";
 | 
						|
foreach (@files)
 | 
						|
{
 | 
						|
  next if /.frm$/;
 | 
						|
  rename($_,"$_.save");
 | 
						|
  open(FILE,">$_") || print "Could not open $_\n" && exit;
 | 
						|
  print FILE "";
 | 
						|
  close(FILE);
 | 
						|
}
 | 
						|
EOF
 | 
						|
 | 
						|
# We don't worry so much about the INSERT or SELECT result,
 | 
						|
# it's REPAIR that we are after. 
 | 
						|
# The preceding INSERT, however, helps to trigger 
 | 
						|
# a bit more internals
 | 
						|
--let $error_codes = 0,130,ER_FAILED_READ_FROM_PAR_FILE,ER_OPEN_AS_READONLY
 | 
						|
INSERT INTO t1 (a,b) VALUES (14,'n');
 | 
						|
--source check_errors.inc
 | 
						|
CHECK TABLE t1;
 | 
						|
--let $error_codes = 0,130,ER_FAILED_READ_FROM_PAR_FILE,ER_OPEN_AS_READONLY
 | 
						|
SELECT a,b FROM t1;
 | 
						|
--source check_errors.inc
 | 
						|
--enable_warnings
 | 
						|
REPAIR TABLE t1;
 | 
						|
 | 
						|
--perl
 | 
						|
@files = glob "$ENV{my_datadir}/test/t1.*.save";
 | 
						|
foreach (@files)
 | 
						|
{
 | 
						|
  $nm = $_;
 | 
						|
  $nm =~ s/\.save$//;
 | 
						|
  rename($_,$nm);
 | 
						|
}
 | 
						|
EOF
 | 
						|
 | 
						|
DROP TABLE t1, t2;
 | 
						|
 | 
						|
--let $continue = 1
 | 
						|
--source have_default_index.inc
 | 
						|
 | 
						|
if ($have_default_index)
 | 
						|
{
 | 
						|
  call mtr.add_suppression("Got an error from thread_id=.*");
 | 
						|
  call mtr.add_suppression("MariaDB thread id .*, query id .* localhost.*root Checking table");
 | 
						|
  call mtr.add_suppression(" '\..test.t1'");
 | 
						|
  call mtr.add_suppression("Couldn't repair table: test.t1");
 | 
						|
 | 
						|
  # In 10.2 with log_warnings=2 the error message is printed to the error log
 | 
						|
  call mtr.add_suppression("Table 't1' is marked as crashed.*");
 | 
						|
 | 
						|
  --let $create_definition = a $int_indexed_col, b $char_col, $default_index (a)
 | 
						|
  --source create_table.inc
 | 
						|
  REPAIR TABLE t1;
 | 
						|
  INSERT INTO t1 (a,b) VALUES (7,'g'),(8,'h');
 | 
						|
  REPAIR TABLE t1 EXTENDED;
 | 
						|
  INSERT INTO t1 (a,b) VALUES (10,'j');
 | 
						|
  REPAIR TABLE t1 USE_FRM;
 | 
						|
 | 
						|
  # We will take files one by one (except for frm file),
 | 
						|
  # save the file, update the table, then restore the file
 | 
						|
  # and check the table.
 | 
						|
  # Results here can be very different depending on the engine.
 | 
						|
 | 
						|
  let $my_errno = 0;
 | 
						|
 | 
						|
  --list_files $my_datadir/test
 | 
						|
 | 
						|
  while (!$my_errno)
 | 
						|
  {
 | 
						|
    --error 0,2
 | 
						|
    --perl 
 | 
						|
    use File::Copy;
 | 
						|
    @files = glob "$ENV{my_datadir}/test/t1*";
 | 
						|
    foreach (@files)
 | 
						|
    {
 | 
						|
      next if /.(?:frm|save|done)$/;
 | 
						|
      next if -e "$_.done";
 | 
						|
      copy($_,"$_.save");
 | 
						|
      exit 0;
 | 
						|
    }
 | 
						|
    # No more files
 | 
						|
    exit 2;
 | 
						|
  EOF
 | 
						|
    let $my_errno = $errno;
 | 
						|
    if (!$my_errno)
 | 
						|
    {
 | 
						|
      --let $error_codes = 0,144
 | 
						|
      INSERT INTO t1 (a,b) VALUES (14,'n'),(15,'o');
 | 
						|
      --source check_errors.inc
 | 
						|
      FLUSH TABLE t1;
 | 
						|
      --replace_result $my_datadir <DATADIR>
 | 
						|
      --perl
 | 
						|
      use File::Copy;
 | 
						|
      @files = glob "$ENV{my_datadir}/test/t1*.save";
 | 
						|
      $nm = $files[0]; 
 | 
						|
      $nm =~ s/\.save$//;
 | 
						|
      print "Restoring $nm\n";
 | 
						|
      copy($files[0],"$nm.done");
 | 
						|
      rename($files[0],$nm);
 | 
						|
  EOF
 | 
						|
      CHECK TABLE t1;
 | 
						|
      --let $error_codes = 0,ER_NOT_KEYFILE,144
 | 
						|
      SELECT a,b FROM t1;
 | 
						|
      --source check_errors.inc
 | 
						|
    }
 | 
						|
  }
 | 
						|
  DROP TABLE t1;
 | 
						|
}
 | 
						|
 | 
						|
--remove_files_wildcard $my_datadir/test t1*
 | 
						|
 | 
						|
 |