index_corrupt.pl
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:6k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. #!/usr/bin/perl -w
  2. #
  3. # This is a test for a key cache bug (bug #10167)
  4. # To expose the bug mysqld should be started with --key-buffer-size=64K
  5. #
  6. $opt_loop_count=100000; # Change this to make test harder/easier
  7. ##################### Standard benchmark inits ##############################
  8. use DBI;
  9. use Getopt::Long;
  10. use Benchmark;
  11. package main;
  12. $opt_skip_create=$opt_skip_in=$opt_verbose=$opt_fast_insert=
  13.   $opt_lock_tables=$opt_debug=$opt_skip_delete=$opt_fast=$opt_force=0;
  14. $opt_host=$opt_user=$opt_password=""; $opt_db="test";
  15. GetOptions("host=s","db=s","loop-count=i","skip-create","skip-in",
  16.    "skip-delete","verbose","fast-insert","lock-tables","debug","fast",
  17.    "force","user=s","password=s") || die "Aborted";
  18. $opt_verbose=$opt_debug=$opt_lock_tables=$opt_fast_insert=$opt_fast=$opt_skip_in=$opt_force=undef;  # Ignore warnings from these
  19. $firsttable  = "bench_f1";
  20. $secondtable = "bench_f2";
  21. $kill_file= "/tmp/mysqltest_index_corrupt.$$";
  22. ####
  23. ####  Start timeing and start test
  24. ####
  25. $start_time=new Benchmark;
  26. if (!$opt_skip_create)
  27. {
  28.   $dbh = DBI->connect("DBI:mysql:$opt_db:$opt_host",
  29.       $opt_user, $opt_password,
  30.     { PrintError => 0}) || die $DBI::errstr;
  31.   $dbh->do("drop table if exists $firsttable, $secondtable");
  32.   print "Creating tables in $opt_dbn";
  33.   $dbh->do("create table $firsttable (
  34. c_pollid    INTEGER  NOT NULL,
  35. c_time      BIGINT   NOT NULL,
  36. c_data      DOUBLE   NOT NULL,
  37. c_error     INTEGER  NOT NULL,
  38. c_warning   INTEGER  NOT NULL,
  39. c_okay      INTEGER  NOT NULL,
  40. c_unknown   INTEGER  NOT NULL,
  41. c_rolled_up BIT      NOT NULL,
  42. INDEX t_mgmt_hist_r_i1 (c_pollid),
  43. INDEX t_mgmt_hist_r_i2 (c_time),
  44. INDEX t_mgmt_hist_r_i3 (c_rolled_up))") or die $DBI::errstr;
  45.   $dbh->do("create table $secondtable (
  46. c_pollid  INTEGER  NOT NULL,
  47. c_min_time  BIGINT   NOT NULL,
  48. c_max_time  BIGINT   NOT NULL,
  49. c_min_data  DOUBLE   NOT NULL,
  50. c_max_data  DOUBLE   NOT NULL,
  51. c_avg_data  DOUBLE   NOT NULL,
  52. c_error     INTEGER  NOT NULL,
  53. c_warning   INTEGER  NOT NULL,
  54. c_okay      INTEGER  NOT NULL,
  55. c_unknown   INTEGER  NOT NULL,
  56. c_rolled_up BIT      NOT NULL,
  57. INDEX t_mgmt_hist_d_i1 (c_pollid),
  58. INDEX t_mgmt_hist_d_i2 (c_min_time),
  59. INDEX t_mgmt_hist_d_i3 (c_max_time),
  60. INDEX t_mgmt_hist_d_i4 (c_rolled_up))") or die $DBI::errstr;
  61.   $dbh->disconnect; $dbh=0; # Close handler
  62. }
  63. $|= 1; # Autoflush
  64. ####
  65. #### Start the tests
  66. ####
  67. print "Running testsn";
  68. insert_in_bench() if (($pid=fork()) == 0); $work{$pid}="insert";
  69. select_from_bench() if (($pid=fork()) == 0); $work{$pid}="insert-select;
  70. delete_from_bench() if (($pid=fork()) == 0); $work{$pid}="delete";
  71. $errors=0;
  72. while (($pid=wait()) != -1)
  73. {
  74.   $ret=$?/256;
  75.   print "thread '" . $work{$pid} . "' finished with exit code $retn";
  76.   $errors++ if ($ret != 0);
  77. }
  78. if (!$opt_skip_delete && !$errors)
  79. {
  80.   $dbh = DBI->connect("DBI:mysql:$opt_db:$opt_host",
  81.       $opt_user, $opt_password,
  82.     { PrintError => 0}) || die $DBI::errstr;
  83.   $dbh->do("drop table $firsttable, $secondtable");
  84. }
  85. print ($errors ? "Test failedn" :"Test okn");
  86. $end_time=new Benchmark;
  87. print "Total time: " .
  88.   timestr(timediff($end_time, $start_time),"noc") . "n";
  89. unlink $kill_file;
  90. exit(0);
  91. #
  92. # Insert records in the two tables
  93. #
  94. sub insert_in_bench
  95. {
  96.   my ($dbh,$rows,$found,$i);
  97.   $dbh = DBI->connect("DBI:mysql:$opt_db:$opt_host",
  98.       $opt_user, $opt_password,
  99.     { PrintError => 0}) || die $DBI::errstr;
  100.   for ($rows= 1; $rows <= $opt_loop_count ; $rows++)
  101.   {
  102.     $c_pollid = sprintf("%d",rand 1000);
  103.     $c_time = sprintf("%d",rand 100000);
  104.     $c_data = rand 1000000;
  105.     $test = rand 1;
  106.     $c_error=0;
  107.     $c_warning=0;
  108.     $c_okay=0;
  109.     $c_unknown=0;
  110.     if ($test < .8) {
  111.       $c_okay=1;
  112.     } elsif ($test <.9) {
  113.       $c_error=1;
  114.     } elsif ($test <.95) {
  115.       $c_warning=1;
  116.     } else {
  117.       $c_unknown=1;
  118.     }
  119.     $statement = "INSERT INTO $firsttable (c_pollid, c_time, c_data, c_error
  120. , c_warning, c_okay, c_unknown, c_rolled_up) ".
  121.   "VALUES ($c_pollid,$c_time,$c_data,$c_error,$c_warning,$c_okay,$c_unknown,0)";
  122.     $cursor = $dbh->prepare($statement);
  123.     $cursor->execute();
  124.     $cursor->finish();
  125.   }
  126.   $dbh->disconnect; $dbh=0;
  127.   print "insert_in_bench: Inserted $rows rowsn";
  128.   # Kill other threads
  129.   open(KILLFILE, "> $kill_file");
  130.   close(KILLFILE);
  131.   exit(0);
  132. }
  133. sub select_from_bench
  134. {
  135.   my ($dbh,$rows,$cursor);
  136.   $dbh = DBI->connect("DBI:mysql:$opt_db:$opt_host",
  137.       $opt_user, $opt_password,
  138.     { PrintError => 0}) || die $DBI::errstr;
  139.   for ($rows= 1; $rows < $opt_loop_count ; $rows++)
  140.   {
  141.     $t_value = rand 100000;
  142.     $t_value2 = $t_value+10000;
  143.     $statement = "INSERT INTO $secondtable (c_pollid, c_min_time, c_max_time
  144. , c_min_data, c_max_data, c_avg_data, c_error, c_warning, c_okay, c_unknown, c_rolled_up) SELECT c_pollid, MIN(c_time), MAX(c_time), MIN(c_data), MAX(c_data), AVG(c_data), SUM(c_error), SUM(c_warning), SUM(c_okay), SUM(c_unknown), 0 FROM $firsttable WHERE (c_time>=$t_value) AND (c_time<$t_value2) AND (c_rolled_up=0) GROUP BY c_pollid";
  145.     $cursor = $dbh->prepare($statement);
  146.     $cursor->execute();
  147.     $cursor->finish();
  148.     sleep 1;
  149.     if (-e $kill_file)
  150.     {
  151.       last;
  152.     }
  153.   }
  154.   print "select_from_bench: insert-select executed $rows timesn";
  155.   exit(0);
  156. }
  157. sub delete_from_bench
  158. {
  159.   my ($dbh,$row, $t_value, $t2_value, $statement, $cursor);
  160.   $dbh = DBI->connect("DBI:mysql:$opt_db:$opt_host",
  161.       $opt_user, $opt_password,
  162.     { PrintError => 0}) || die $DBI::errstr;
  163.   for ($rows= 1; $rows < $opt_loop_count ; $rows++)
  164.   {
  165.     $t_value = rand 50000;
  166.     $t2_value = $t_value + 50001;
  167.     $statement = "DELETE FROM $firsttable WHERE (c_time>$t_value) AND (c_time<$t2_value)";
  168.     $cursor = $dbh->prepare($statement);
  169.     $cursor->execute();
  170.     $cursor->finish();
  171.     sleep 10;
  172.     if (-e $kill_file)
  173.     {
  174.       last;
  175.     }
  176.   }
  177.   print "delete: delete executed $rows timesn";
  178.   exit(0);
  179. }