Add forked Maatkit tools in bin/ and their tests in t/.

This commit is contained in:
Daniel Nichter
2011-06-24 16:02:05 -06:00
parent 6c501128e6
commit b4b6376be1
679 changed files with 177876 additions and 3 deletions

View File

@@ -0,0 +1,194 @@
#!/usr/bin/env perl
BEGIN {
die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
};
use strict;
use warnings FATAL => 'all';
use English qw(-no_match_vars);
use Test::More;
use MaatkitTest;
use Sandbox;
use Time::HiRes qw(usleep);
use Data::Dumper;
$Data::Dumper::Indent = 1;
$Data::Dumper::Sortkeys = 1;
$Data::Dumper::Quotekeys = 0;
require "$trunk/bin/pt-online-schema-change";
my $dp = new DSNParser(opts=>$dsn_opts);
my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp);
my $dbh = $sb->get_dbh_for('master');
if ( !$dbh ) {
plan skip_all => 'Cannot connect to sandbox master';
}
else {
plan tests => 7;
}
my $output = "";
my $cnf = '/tmp/12345/my.sandbox.cnf';
my @args = ('-F', $cnf);
my $exit = 0;
my $rows;
my $query_table_stop = '/tmp/query_table.stop';
my $query_table_output = '/tmp/query_table.output';
diag(`rm -rf $query_table_stop`);
diag(`rm -rf $query_table_output`);
sub start_query_table {
my ($db, $tbl, $pkcol) = @_;
diag(`rm -rf $query_table_stop`);
diag(`echo > $query_table_output`);
my $cmd = "$trunk/t/pt-online-schema-change/samples/query_table.pl";
system("$cmd 127.1 12345 $db $tbl $pkcol >$query_table_output &");
return;
}
sub stop_query_table {
diag(`touch $query_table_stop`);
sleep 1;
return;
}
sub get_ids {
open my $fh, '<', $query_table_output
or die "Cannot open $query_table_output: $OS_ERROR";
my @lines = <$fh>;
close $fh;
my %ids;
foreach my $line ( @lines ) {
my ($stmt, $ids) = split(':', $line);
chomp $ids;
$ids{$stmt} = $ids;
}
return \%ids;
};
sub check_ids {
my ( $db, $tbl, $pkcol, $ids ) = @_;
my $rows;
my $n_updated = $ids->{updated} ? ($ids->{updated} =~ tr/,//) : 0;
my $n_deleted = $ids->{deleted} ? ($ids->{deleted} =~ tr/,//) : 0;
my $n_inserted = ($ids->{inserted} =~ tr/,//);
# "1,1"=~tr/,// returns 1 but is 2 values
$n_updated++ if $n_updated;
$n_deleted++ if $n_deleted;
$n_inserted++;
$rows = $dbh->selectrow_arrayref(
"SELECT COUNT($pkcol) FROM $db.$tbl");
is(
$rows->[0],
500 + $n_inserted - $n_deleted,
"New table row count: 500 original + $n_inserted inserted - $n_deleted deleted"
) or print Dumper($rows);
$rows = $dbh->selectall_arrayref(
"SELECT $pkcol FROM $db.$tbl WHERE $pkcol > 500 AND $pkcol NOT IN ($ids->{inserted})");
is_deeply(
$rows,
[],
"No extra rows inserted in new table"
) or print Dumper($rows);
if ( $n_deleted ) {
$rows = $dbh->selectall_arrayref(
"SELECT $pkcol FROM $db.$tbl WHERE $pkcol IN ($ids->{deleted})");
is_deeply(
$rows,
[],
"No deleted rows present in new table"
) or print Dumper($rows);
}
else {
ok(
1,
"No rows deleted"
);
};
if ( $n_updated ) {
$rows = $dbh->selectall_arrayref(
"SELECT $pkcol FROM $db.$tbl WHERE $pkcol IN ($ids->{updated}) "
. "AND c <> 'updated'");
is_deeply(
$rows,
[],
"Updated rows correct in new table"
) or print Dumper($rows);
}
else {
ok(
1,
"No rows updated"
);
}
return;
}
# #############################################################################
# Attempt to alter a table while another process is changing it.
# #############################################################################
$sb->load_file('master', "t/pt-online-schema-change/samples/small_table.sql");
$dbh->do('use mkosc');
$dbh->do('truncate table a');
diag(`cp $trunk/t/pt-online-schema-change/samples/a.outfile /tmp/`);
$dbh->do("load data local infile '/tmp/a.outfile' into table mkosc.a");
diag(`rm -rf /tmp/a.outfile`);
start_query_table(qw(mkosc a i));
$output = output(
sub { $exit = mk_online_schema_change::main(@args,
qw(--chunk-size 100),
'D=mkosc,t=a', qw(--alter ENGINE=InnoDB --drop-old-table)) },
);
stop_query_table();
$rows = $dbh->selectall_hashref('show table status from mkosc', 'name');
is(
$rows->{a}->{engine},
'InnoDB',
"New table ENGINE=InnoDB"
);
is(
scalar keys %$rows,
1,
"Dropped old table"
);
is(
$exit,
0,
"Exit status 0"
);
check_ids('mkosc', 'a', 'i', get_ids());
# ############################################################################
# Alter an active table with foreign keys.
# ############################################################################
# #############################################################################
# Done.
# #############################################################################
diag(`rm -rf $query_table_stop`);
#diag(`echo > $query_table_output`);
#$sb->wipe_clean($dbh);
exit;

View File

@@ -0,0 +1,239 @@
#!/usr/bin/env perl
BEGIN {
die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
};
use strict;
use warnings FATAL => 'all';
use English qw(-no_match_vars);
use Test::More;
use MaatkitTest;
use Sandbox;
require "$trunk/bin/pt-online-schema-change";
use Data::Dumper;
my $dp = new DSNParser(opts=>$dsn_opts);
my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp);
my $dbh = $sb->get_dbh_for('master');
if ( !$dbh ) {
plan skip_all => 'Cannot connect to sandbox master';
}
else {
plan tests => 18;
}
my $output = "";
my $cnf = '/tmp/12345/my.sandbox.cnf';
my @args = ('-F', $cnf);
my $exit = 0;
my $rows;
$sb->load_file('master', "t/pt-online-schema-change/samples/small_table.sql");
$dbh->do('use mkosc');
# #############################################################################
# --check-tables-and-exit
# #############################################################################
eval {
$exit = mk_online_schema_change::main(@args,
'D=mkosc,t=a', qw(--check-tables-and-exit --quiet))
};
is(
$EVAL_ERROR,
"",
"--check-tables-and-exit"
);
is(
$exit,
0,
"Exit status 0"
);
# #############################################################################
# --cleanup-and-exit
# #############################################################################
eval {
$exit = mk_online_schema_change::main(@args,
'D=mkosc,t=a', qw(--cleanup-and-exit --quiet))
};
is(
$EVAL_ERROR,
"",
"--cleanup-and-exit",
);
is(
$exit,
0,
"Exit status 0"
);
# #############################################################################
# The most basic: copy, alter and rename a small table that's not even active.
# #############################################################################
output(
sub { $exit = mk_online_schema_change::main(@args,
'D=mkosc,t=a', qw(--alter ENGINE=InnoDB)) },
);
$rows = $dbh->selectall_hashref('show table status from mkosc', 'name');
is(
$rows->{a}->{engine},
'InnoDB',
"New table ENGINE=InnoDB"
);
is(
$rows->{__old_a}->{engine},
'MyISAM',
"Kept old table, ENGINE=MyISAM"
);
my $org_rows = $dbh->selectall_arrayref('select * from mkosc.__old_a order by i');
my $new_rows = $dbh->selectall_arrayref('select * from mkosc.a order by i');
is_deeply(
$new_rows,
$org_rows,
"New tables rows identical to old table rows"
);
is(
$exit,
0,
"Exit status 0"
);
# #############################################################################
# No --alter and --drop-old-table.
# #############################################################################
$dbh->do('drop table mkosc.__old_a'); # from previous run
$sb->load_file('master', "t/pt-online-schema-change/samples/small_table.sql");
output(
sub { $exit = mk_online_schema_change::main(@args,
'D=mkosc,t=a', qw(--drop-old-table)) },
);
$rows = $dbh->selectall_hashref('show table status from mkosc', 'name');
is(
$rows->{a}->{engine},
'MyISAM',
"No --alter, new table still ENGINE=MyISAM"
);
ok(
!exists $rows->{__old_a},
"--drop-old-table"
);
$new_rows = $dbh->selectall_arrayref('select * from mkosc.a order by i');
is_deeply(
$new_rows,
$org_rows, # from previous run since old table was dropped this run
"New tables rows identical to old table rows"
);
is(
$exit,
0,
"Exit status 0"
);
# ############################################################################
# Alter a table with foreign keys.
# ############################################################################
# The tables we're loading have fk constraints like:
# country
# ^- city (on update cascade)
# ^- address (on update cascade)
############################
# rebuild_constraints method
############################
$sb->load_file('master', "t/pt-online-schema-change/samples/fk_tables_schema.sql");
# city has a fk constraint on country, so get its original table def.
my $orig_table_def = $dbh->selectrow_hashref('show create table mkosc.city')->{'create table'};
# Alter the parent table. The error we need to avoid is:
# DBD::mysql::db do failed: Cannot delete or update a parent row:
# a foreign key constraint fails [for Statement "DROP TABLE
# `mkosc`.`__old_country`"]
output(
sub { $exit = mk_online_schema_change::main(@args,
'D=mkosc,t=country', qw(--child-tables auto_detect --drop-old-table),
qw(--update-foreign-keys-method rebuild_constraints)) },
);
is(
$exit,
0,
"Exit status 0 (rebuild_constraints method)"
);
$rows = $dbh->selectall_arrayref('show tables from mkosc like "\_\_%"');
is_deeply(
$rows,
[],
"Old table dropped (rebuild_constraints method)"
);
# Get city's table def again and verify that its fk constraint still
# references country. When country was renamed to __old_country, MySQL
# also updated city's fk constraint to __old_country. We should have
# dropped and re-added that constraint exactly, changing only __old_country
# to country, like it originally was.
my $new_table_def = $dbh->selectrow_hashref('show create table mkosc.city')->{'create table'};
is(
$new_table_def,
$orig_table_def,
"Updated child table foreign key constraint (rebuild_constraints method)"
);
#######################
# drop_old_table method
#######################
$sb->load_file('master', "t/pt-online-schema-change/samples/fk_tables_schema.sql");
$orig_table_def = $dbh->selectrow_hashref('show create table mkosc.city')->{'create table'};
output(
sub { $exit = mk_online_schema_change::main(@args,
'D=mkosc,t=country', qw(--child-tables auto_detect),
qw(--update-foreign-keys-method drop_old_table)) },
);
is(
$exit,
0,
"Exit status 0 (drop_old_table method)"
);
$rows = $dbh->selectall_arrayref('show tables from mkosc like "\_\_%"');
is_deeply(
$rows,
[],
"Old table dropped (drop_old_table method)"
) or print Dumper($rows);
$new_table_def = $dbh->selectrow_hashref('show create table mkosc.city')->{'create table'};
is(
$new_table_def,
$orig_table_def,
"Updated child table foreign key constraint (drop_old_table method)"
);
# #############################################################################
# Done.
# #############################################################################
$sb->wipe_clean($dbh);
exit;

View File

@@ -0,0 +1,128 @@
#!/usr/bin/env perl
BEGIN {
die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
};
use strict;
use warnings FATAL => 'all';
use English qw(-no_match_vars);
use Test::More;
use MaatkitTest;
use Sandbox;
require "$trunk/bin/pt-online-schema-change";
my $dp = new DSNParser(opts=>$dsn_opts);
my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp);
my $dbh = $sb->get_dbh_for('master');
if ( !$dbh ) {
plan skip_all => 'Cannot connect to sandbox master';
}
else {
plan tests => 8;
}
my $vp = new VersionParser();
my $q = new Quoter();
my $tp = new TableParser(Quoter => $q);
my $du = new MySQLDump();
my $chunker = new TableChunker(Quoter => $q, MySQLDump => $du);
my $o = new OptionParser();
$o->get_specs("$trunk/bin/pt-online-schema-change");
$o->get_opts();
mk_online_schema_change::__set_quiet(1);
$sb->load_file('master', "t/pt-online-schema-change/samples/small_table.sql");
$dbh->do('use mkosc');
my $old_tbl_struct = $tp->parse($du->get_create_table($dbh, $q, 'mkosc', 'a'));
my %args = (
dbh => $dbh,
db => 'mkosc',
tbl => 'a',
tmp_tbl => '__tmp_a',
old_tbl => '__old_a', # what tbl becomes after swapped with tmp_tbl
VersionParser => $vp,
Quoter => $q,
TableParser => $tp,
OptionParser => $o,
TableChunker => $chunker,
MySQLDump => $du,
);
my %tbl_info = mk_online_schema_change::check_tables(%args);
is(
$tbl_info{chunk_column},
"i",
"check_tables() returns chunk_column"
);
is(
$tbl_info{chunk_index},
"PRIMARY",
"check_tables() returns chunk_index"
);
ok(
exists $tbl_info{tbl_struct},
"check_tables() returns tbl_struct"
);
throws_ok(
sub { mk_online_schema_change::check_tables(
%args,
tbl => 'does_not_exist'
) },
qr/Table mkosc.does_not_exist does not exist/,
"Table must exist"
);
@ARGV = qw(--rename-tables);
$o->get_opts();
throws_ok(
sub { mk_online_schema_change::check_tables(
%args,
old_tbl => 'a',
) },
qr/Table mkosc.a exists which will prevent mkosc.a/,
"Old table cannot already exist if --rename-tables"
);
throws_ok(
sub { mk_online_schema_change::check_tables(
%args,
tmp_tbl => 'a',
) },
qr/Temporary table mkosc.a exists/,
"Temporary table cannot already exist"
);
$dbh->do('CREATE TRIGGER foo AFTER DELETE ON mkosc.a FOR EACH ROW DELETE FROM mkosc.a WHERE 0');
throws_ok(
sub { mk_online_schema_change::check_tables(%args) },
qr/Table mkosc.a has triggers/,
"Old table cannot have triggers"
);
$dbh->do('DROP TRIGGER mkosc.foo');
$dbh->do('ALTER TABLE mkosc.a DROP COLUMN i');
my $tmp_struct = $tp->parse($du->get_create_table($dbh, $q, 'mkosc', 'a'));
throws_ok(
sub { mk_online_schema_change::check_tables(
%args,
) },
qr/Table mkosc.a cannot be chunked/,
"Table must have a chunkable index"
);
# #############################################################################
# Done.
# #############################################################################
$sb->wipe_clean($dbh);
exit;

View File

@@ -0,0 +1,50 @@
#!/usr/bin/env perl
BEGIN {
die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
};
use strict;
use warnings FATAL => 'all';
use English qw(-no_match_vars);
use Test::More tests => 4;
use MaatkitTest;
my $output = "";
my $cmd = "$trunk/bin/pt-online-schema-change";
$output = `$cmd`;
like(
$output,
qr/A DSN with a t part must be specified/,
"Must specify a DSN with t part"
);
$output = `$cmd h=127.1,P=12345,u=msandbox,p=msandbox`;
like(
$output,
qr/The DSN must specify a t/,
"DSN must specify t part"
);
$output = `$cmd h=127.1,P=12345,u=msandbox,p=msandbox h=127.1`;
like(
$output,
qr/Specify only one DSN/,
"Only 1 DSN allowed"
);
$output = `$cmd h=127.1,P=12345,t=tbl`;
like(
$output,
qr/No database was specified/,
"Either DSN D part or --database required"
);
# #############################################################################
# Done.
# #############################################################################
exit;

View File

@@ -0,0 +1,500 @@
1 loaded 2011-03-17
2 loaded 2011-03-17
3 loaded 2011-03-17
4 loaded 2011-03-17
5 loaded 2011-03-17
6 loaded 2011-03-17
7 loaded 2011-03-17
8 loaded 2011-03-17
9 loaded 2011-03-17
10 loaded 2011-03-17
11 loaded 2011-03-17
12 loaded 2011-03-17
13 loaded 2011-03-17
14 loaded 2011-03-17
15 loaded 2011-03-17
16 loaded 2011-03-17
17 loaded 2011-03-17
18 loaded 2011-03-17
19 loaded 2011-03-17
20 loaded 2011-03-17
21 loaded 2011-03-17
22 loaded 2011-03-17
23 loaded 2011-03-17
24 loaded 2011-03-17
25 loaded 2011-03-17
26 loaded 2011-03-17
27 loaded 2011-03-17
28 loaded 2011-03-17
29 loaded 2011-03-17
30 loaded 2011-03-17
31 loaded 2011-03-17
32 loaded 2011-03-17
33 loaded 2011-03-17
34 loaded 2011-03-17
35 loaded 2011-03-17
36 loaded 2011-03-17
37 loaded 2011-03-17
38 loaded 2011-03-17
39 loaded 2011-03-17
40 loaded 2011-03-17
41 loaded 2011-03-17
42 loaded 2011-03-17
43 loaded 2011-03-17
44 loaded 2011-03-17
45 loaded 2011-03-17
46 loaded 2011-03-17
47 loaded 2011-03-17
48 loaded 2011-03-17
49 loaded 2011-03-17
50 loaded 2011-03-17
51 loaded 2011-03-17
52 loaded 2011-03-17
53 loaded 2011-03-17
54 loaded 2011-03-17
55 loaded 2011-03-17
56 loaded 2011-03-17
57 loaded 2011-03-17
58 loaded 2011-03-17
59 loaded 2011-03-17
60 loaded 2011-03-17
61 loaded 2011-03-17
62 loaded 2011-03-17
63 loaded 2011-03-17
64 loaded 2011-03-17
65 loaded 2011-03-17
66 loaded 2011-03-17
67 loaded 2011-03-17
68 loaded 2011-03-17
69 loaded 2011-03-17
70 loaded 2011-03-17
71 loaded 2011-03-17
72 loaded 2011-03-17
73 loaded 2011-03-17
74 loaded 2011-03-17
75 loaded 2011-03-17
76 loaded 2011-03-17
77 loaded 2011-03-17
78 loaded 2011-03-17
79 loaded 2011-03-17
80 loaded 2011-03-17
81 loaded 2011-03-17
82 loaded 2011-03-17
83 loaded 2011-03-17
84 loaded 2011-03-17
85 loaded 2011-03-17
86 loaded 2011-03-17
87 loaded 2011-03-17
88 loaded 2011-03-17
89 loaded 2011-03-17
90 loaded 2011-03-17
91 loaded 2011-03-17
92 loaded 2011-03-17
93 loaded 2011-03-17
94 loaded 2011-03-17
95 loaded 2011-03-17
96 loaded 2011-03-17
97 loaded 2011-03-17
98 loaded 2011-03-17
99 loaded 2011-03-17
100 loaded 2011-03-17
101 loaded 2011-03-17
102 loaded 2011-03-17
103 loaded 2011-03-17
104 loaded 2011-03-17
105 loaded 2011-03-17
106 loaded 2011-03-17
107 loaded 2011-03-17
108 loaded 2011-03-17
109 loaded 2011-03-17
110 loaded 2011-03-17
111 loaded 2011-03-17
112 loaded 2011-03-17
113 loaded 2011-03-17
114 loaded 2011-03-17
115 loaded 2011-03-17
116 loaded 2011-03-17
117 loaded 2011-03-17
118 loaded 2011-03-17
119 loaded 2011-03-17
120 loaded 2011-03-17
121 loaded 2011-03-17
122 loaded 2011-03-17
123 loaded 2011-03-17
124 loaded 2011-03-17
125 loaded 2011-03-17
126 loaded 2011-03-17
127 loaded 2011-03-17
128 loaded 2011-03-17
129 loaded 2011-03-17
130 loaded 2011-03-17
131 loaded 2011-03-17
132 loaded 2011-03-17
133 loaded 2011-03-17
134 loaded 2011-03-17
135 loaded 2011-03-17
136 loaded 2011-03-17
137 loaded 2011-03-17
138 loaded 2011-03-17
139 loaded 2011-03-17
140 loaded 2011-03-17
141 loaded 2011-03-17
142 loaded 2011-03-17
143 loaded 2011-03-17
144 loaded 2011-03-17
145 loaded 2011-03-17
146 loaded 2011-03-17
147 loaded 2011-03-17
148 loaded 2011-03-17
149 loaded 2011-03-17
150 loaded 2011-03-17
151 loaded 2011-03-17
152 loaded 2011-03-17
153 loaded 2011-03-17
154 loaded 2011-03-17
155 loaded 2011-03-17
156 loaded 2011-03-17
157 loaded 2011-03-17
158 loaded 2011-03-17
159 loaded 2011-03-17
160 loaded 2011-03-17
161 loaded 2011-03-17
162 loaded 2011-03-17
163 loaded 2011-03-17
164 loaded 2011-03-17
165 loaded 2011-03-17
166 loaded 2011-03-17
167 loaded 2011-03-17
168 loaded 2011-03-17
169 loaded 2011-03-17
170 loaded 2011-03-17
171 loaded 2011-03-17
172 loaded 2011-03-17
173 loaded 2011-03-17
174 loaded 2011-03-17
175 loaded 2011-03-17
176 loaded 2011-03-17
177 loaded 2011-03-17
178 loaded 2011-03-17
179 loaded 2011-03-17
180 loaded 2011-03-17
181 loaded 2011-03-17
182 loaded 2011-03-17
183 loaded 2011-03-17
184 loaded 2011-03-17
185 loaded 2011-03-17
186 loaded 2011-03-17
187 loaded 2011-03-17
188 loaded 2011-03-17
189 loaded 2011-03-17
190 loaded 2011-03-17
191 loaded 2011-03-17
192 loaded 2011-03-17
193 loaded 2011-03-17
194 loaded 2011-03-17
195 loaded 2011-03-17
196 loaded 2011-03-17
197 loaded 2011-03-17
198 loaded 2011-03-17
199 loaded 2011-03-17
200 loaded 2011-03-17
201 loaded 2011-03-17
202 loaded 2011-03-17
203 loaded 2011-03-17
204 loaded 2011-03-17
205 loaded 2011-03-17
206 loaded 2011-03-17
207 loaded 2011-03-17
208 loaded 2011-03-17
209 loaded 2011-03-17
210 loaded 2011-03-17
211 loaded 2011-03-17
212 loaded 2011-03-17
213 loaded 2011-03-17
214 loaded 2011-03-17
215 loaded 2011-03-17
216 loaded 2011-03-17
217 loaded 2011-03-17
218 loaded 2011-03-17
219 loaded 2011-03-17
220 loaded 2011-03-17
221 loaded 2011-03-17
222 loaded 2011-03-17
223 loaded 2011-03-17
224 loaded 2011-03-17
225 loaded 2011-03-17
226 loaded 2011-03-17
227 loaded 2011-03-17
228 loaded 2011-03-17
229 loaded 2011-03-17
230 loaded 2011-03-17
231 loaded 2011-03-17
232 loaded 2011-03-17
233 loaded 2011-03-17
234 loaded 2011-03-17
235 loaded 2011-03-17
236 loaded 2011-03-17
237 loaded 2011-03-17
238 loaded 2011-03-17
239 loaded 2011-03-17
240 loaded 2011-03-17
241 loaded 2011-03-17
242 loaded 2011-03-17
243 loaded 2011-03-17
244 loaded 2011-03-17
245 loaded 2011-03-17
246 loaded 2011-03-17
247 loaded 2011-03-17
248 loaded 2011-03-17
249 loaded 2011-03-17
250 loaded 2011-03-17
251 loaded 2011-03-17
252 loaded 2011-03-17
253 loaded 2011-03-17
254 loaded 2011-03-17
255 loaded 2011-03-17
256 loaded 2011-03-17
257 loaded 2011-03-17
258 loaded 2011-03-17
259 loaded 2011-03-17
260 loaded 2011-03-17
261 loaded 2011-03-17
262 loaded 2011-03-17
263 loaded 2011-03-17
264 loaded 2011-03-17
265 loaded 2011-03-17
266 loaded 2011-03-17
267 loaded 2011-03-17
268 loaded 2011-03-17
269 loaded 2011-03-17
270 loaded 2011-03-17
271 loaded 2011-03-17
272 loaded 2011-03-17
273 loaded 2011-03-17
274 loaded 2011-03-17
275 loaded 2011-03-17
276 loaded 2011-03-17
277 loaded 2011-03-17
278 loaded 2011-03-17
279 loaded 2011-03-17
280 loaded 2011-03-17
281 loaded 2011-03-17
282 loaded 2011-03-17
283 loaded 2011-03-17
284 loaded 2011-03-17
285 loaded 2011-03-17
286 loaded 2011-03-17
287 loaded 2011-03-17
288 loaded 2011-03-17
289 loaded 2011-03-17
290 loaded 2011-03-17
291 loaded 2011-03-17
292 loaded 2011-03-17
293 loaded 2011-03-17
294 loaded 2011-03-17
295 loaded 2011-03-17
296 loaded 2011-03-17
297 loaded 2011-03-17
298 loaded 2011-03-17
299 loaded 2011-03-17
300 loaded 2011-03-17
301 loaded 2011-03-17
302 loaded 2011-03-17
303 loaded 2011-03-17
304 loaded 2011-03-17
305 loaded 2011-03-17
306 loaded 2011-03-17
307 loaded 2011-03-17
308 loaded 2011-03-17
309 loaded 2011-03-17
310 loaded 2011-03-17
311 loaded 2011-03-17
312 loaded 2011-03-17
313 loaded 2011-03-17
314 loaded 2011-03-17
315 loaded 2011-03-17
316 loaded 2011-03-17
317 loaded 2011-03-17
318 loaded 2011-03-17
319 loaded 2011-03-17
320 loaded 2011-03-17
321 loaded 2011-03-17
322 loaded 2011-03-17
323 loaded 2011-03-17
324 loaded 2011-03-17
325 loaded 2011-03-17
326 loaded 2011-03-17
327 loaded 2011-03-17
328 loaded 2011-03-17
329 loaded 2011-03-17
330 loaded 2011-03-17
331 loaded 2011-03-17
332 loaded 2011-03-17
333 loaded 2011-03-17
334 loaded 2011-03-17
335 loaded 2011-03-17
336 loaded 2011-03-17
337 loaded 2011-03-17
338 loaded 2011-03-17
339 loaded 2011-03-17
340 loaded 2011-03-17
341 loaded 2011-03-17
342 loaded 2011-03-17
343 loaded 2011-03-17
344 loaded 2011-03-17
345 loaded 2011-03-17
346 loaded 2011-03-17
347 loaded 2011-03-17
348 loaded 2011-03-17
349 loaded 2011-03-17
350 loaded 2011-03-17
351 loaded 2011-03-17
352 loaded 2011-03-17
353 loaded 2011-03-17
354 loaded 2011-03-17
355 loaded 2011-03-17
356 loaded 2011-03-17
357 loaded 2011-03-17
358 loaded 2011-03-17
359 loaded 2011-03-17
360 loaded 2011-03-17
361 loaded 2011-03-17
362 loaded 2011-03-17
363 loaded 2011-03-17
364 loaded 2011-03-17
365 loaded 2011-03-17
366 loaded 2011-03-17
367 loaded 2011-03-17
368 loaded 2011-03-17
369 loaded 2011-03-17
370 loaded 2011-03-17
371 loaded 2011-03-17
372 loaded 2011-03-17
373 loaded 2011-03-17
374 loaded 2011-03-17
375 loaded 2011-03-17
376 loaded 2011-03-17
377 loaded 2011-03-17
378 loaded 2011-03-17
379 loaded 2011-03-17
380 loaded 2011-03-17
381 loaded 2011-03-17
382 loaded 2011-03-17
383 loaded 2011-03-17
384 loaded 2011-03-17
385 loaded 2011-03-17
386 loaded 2011-03-17
387 loaded 2011-03-17
388 loaded 2011-03-17
389 loaded 2011-03-17
390 loaded 2011-03-17
391 loaded 2011-03-17
392 loaded 2011-03-17
393 loaded 2011-03-17
394 loaded 2011-03-17
395 loaded 2011-03-17
396 loaded 2011-03-17
397 loaded 2011-03-17
398 loaded 2011-03-17
399 loaded 2011-03-17
400 loaded 2011-03-17
401 loaded 2011-03-17
402 loaded 2011-03-17
403 loaded 2011-03-17
404 loaded 2011-03-17
405 loaded 2011-03-17
406 loaded 2011-03-17
407 loaded 2011-03-17
408 loaded 2011-03-17
409 loaded 2011-03-17
410 loaded 2011-03-17
411 loaded 2011-03-17
412 loaded 2011-03-17
413 loaded 2011-03-17
414 loaded 2011-03-17
415 loaded 2011-03-17
416 loaded 2011-03-17
417 loaded 2011-03-17
418 loaded 2011-03-17
419 loaded 2011-03-17
420 loaded 2011-03-17
421 loaded 2011-03-17
422 loaded 2011-03-17
423 loaded 2011-03-17
424 loaded 2011-03-17
425 loaded 2011-03-17
426 loaded 2011-03-17
427 loaded 2011-03-17
428 loaded 2011-03-17
429 loaded 2011-03-17
430 loaded 2011-03-17
431 loaded 2011-03-17
432 loaded 2011-03-17
433 loaded 2011-03-17
434 loaded 2011-03-17
435 loaded 2011-03-17
436 loaded 2011-03-17
437 loaded 2011-03-17
438 loaded 2011-03-17
439 loaded 2011-03-17
440 loaded 2011-03-17
441 loaded 2011-03-17
442 loaded 2011-03-17
443 loaded 2011-03-17
444 loaded 2011-03-17
445 loaded 2011-03-17
446 loaded 2011-03-17
447 loaded 2011-03-17
448 loaded 2011-03-17
449 loaded 2011-03-17
450 loaded 2011-03-17
451 loaded 2011-03-17
452 loaded 2011-03-17
453 loaded 2011-03-17
454 loaded 2011-03-17
455 loaded 2011-03-17
456 loaded 2011-03-17
457 loaded 2011-03-17
458 loaded 2011-03-17
459 loaded 2011-03-17
460 loaded 2011-03-17
461 loaded 2011-03-17
462 loaded 2011-03-17
463 loaded 2011-03-17
464 loaded 2011-03-17
465 loaded 2011-03-17
466 loaded 2011-03-17
467 loaded 2011-03-17
468 loaded 2011-03-17
469 loaded 2011-03-17
470 loaded 2011-03-17
471 loaded 2011-03-17
472 loaded 2011-03-17
473 loaded 2011-03-17
474 loaded 2011-03-17
475 loaded 2011-03-17
476 loaded 2011-03-17
477 loaded 2011-03-17
478 loaded 2011-03-17
479 loaded 2011-03-17
480 loaded 2011-03-17
481 loaded 2011-03-17
482 loaded 2011-03-17
483 loaded 2011-03-17
484 loaded 2011-03-17
485 loaded 2011-03-17
486 loaded 2011-03-17
487 loaded 2011-03-17
488 loaded 2011-03-17
489 loaded 2011-03-17
490 loaded 2011-03-17
491 loaded 2011-03-17
492 loaded 2011-03-17
493 loaded 2011-03-17
494 loaded 2011-03-17
495 loaded 2011-03-17
496 loaded 2011-03-17
497 loaded 2011-03-17
498 loaded 2011-03-17
499 loaded 2011-03-17
500 loaded 2011-03-17

View File

@@ -0,0 +1,31 @@
DROP DATABASE IF EXISTS `mkosc`;
CREATE DATABASE `mkosc`;
USE `mkosc`;
CREATE TABLE `country` (
`country_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`country` varchar(50) NOT NULL,
`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`country_id`)
) ENGINE=InnoDB;
CREATE TABLE `city` (
`city_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`city` varchar(50) NOT NULL,
`country_id` smallint(5) unsigned NOT NULL,
`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`city_id`),
KEY `idx_fk_country_id` (`country_id`),
CONSTRAINT `fk_city_country` FOREIGN KEY (`country_id`) REFERENCES `country` (`country_id`) ON UPDATE CASCADE
) ENGINE=InnoDB;
CREATE TABLE `address` (
`address_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`address` varchar(50) NOT NULL,
`city_id` smallint(5) unsigned NOT NULL,
`postal_code` varchar(10) DEFAULT NULL,
`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`address_id`),
KEY `idx_fk_city_id` (`city_id`),
CONSTRAINT `fk_address_city` FOREIGN KEY (`city_id`) REFERENCES `city` (`city_id`) ON UPDATE CASCADE
) ENGINE=InnoDB;

View File

@@ -0,0 +1,73 @@
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use English qw(-no_match_vars);
use DBI;
use Time::HiRes qw(usleep);
my ($host, $port, $db, $tbl, $pkcol, $sleep_time) = @ARGV;
my $dbh = DBI->connect(
"DBI:mysql:$db;host=$host;port=$port;mysql_read_default_group=client",
'msandbox', 'msandbox',
{RaiseError => 1, AutoCommit => 0, ShowErrorStatement => 1, PrintError => 0},
);
my $sleep = ($sleep_time || 0.001) * 1_000_000;
my $cnt = 0;
my @del;
my @upd;
my @ins;
my $start_xa = "START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */";
$dbh->do($start_xa);
for my $i ( 1..5_000 ) {
last if -f '/tmp/query_table.stop';
eval {
# We do roughly 25% DELETE, 25% UPDATE and 50% INSERT.
my $x = int(rand(5));
if ($x == 1) {
my $id = int(rand(500)) || 1;
$dbh->do("delete from $db.$tbl where $pkcol=$id");
# To challenge the tool, we *do* (or can) delete the same id twice.
# But to keep the numbers straight, we only record each deleted
# id once.
push @del, $id unless grep { $_ == $id } @del;
}
elsif ($x == 2) {
my $id = int(rand(500)) || 1;
if ( !grep { $_ == $id } @del ) {
$dbh->do("update $db.$tbl set c='updated' where $pkcol=$id");
push @upd, $id;
}
}
else {
my $id = 500 + $i;
$dbh->do("insert ignore into $db.$tbl ($pkcol, c) values ($id, 'inserted')");
push @ins, $id;
}
# COMMIT every N statements
if ( $cnt++ > 5 ) {
$dbh->do('COMMIT');
$cnt = 0;
usleep($sleep);
$dbh->do($start_xa);
}
};
if ( $EVAL_ERROR ) {
warn $EVAL_ERROR;
last;
}
}
$dbh->do('COMMIT');
$dbh->disconnect();
print "deleted:" . join(',', @del) . "\n";
print "updated:" . join(',', @upd) . "\n";
print "inserted:" . join(',', @ins) . "\n";
exit 0;

View File

@@ -0,0 +1,27 @@
DROP DATABASE IF EXISTS `mkosc`;
CREATE DATABASE `mkosc`;
USE `mkosc`;
CREATE TABLE a (
i int auto_increment primary key,
c char(16),
d date
) ENGINE=MyISAM;
INSERT INTO a VALUES
(null, 'a', now()),
(null, 'b', now()),
(null, 'c', now()),
(null, 'd', now()),
(null, 'e', now()),
(null, 'f', now()),
(null, 'g', now()),
(null, 'h', now()),
(null, 'i', now()),
(null, 'j', now()),
(null, 'k', now()),
(null, 'l', now()),
(null, 'm', now()),
(null, 'n', now()),
(null, 'o', now()),
(null, 'p', now()),
(null, 'q', now()),
(null, 'r', now());