Merge lp:~percona-toolkit-dev/percona-toolkit/release-2.2.14 into lp:percona-toolkit/2.2

Proposed by Tomislav Plavcic on 2015-04-15
Status: Merged
Merged at revision: 614
Proposed branch: lp:~percona-toolkit-dev/percona-toolkit/release-2.2.14
Merge into: lp:percona-toolkit/2.2
Diff against target: 1813 lines (+588/-165)
53 files modified
Changelog (+23/-0)
Makefile.PL (+1/-1)
bin/pt-align (+1/-1)
bin/pt-archiver (+2/-2)
bin/pt-config-diff (+2/-2)
bin/pt-deadlock-logger (+2/-2)
bin/pt-diskstats (+2/-2)
bin/pt-duplicate-key-checker (+67/-53)
bin/pt-fifo-split (+1/-1)
bin/pt-find (+2/-2)
bin/pt-fingerprint (+1/-1)
bin/pt-fk-error-logger (+2/-2)
bin/pt-heartbeat (+14/-8)
bin/pt-index-usage (+2/-2)
bin/pt-ioprofile (+1/-1)
bin/pt-kill (+2/-2)
bin/pt-mext (+1/-1)
bin/pt-mysql-summary (+1/-1)
bin/pt-online-schema-change (+17/-3)
bin/pt-pmp (+1/-1)
bin/pt-query-digest (+6/-2)
bin/pt-show-grants (+1/-1)
bin/pt-sift (+1/-1)
bin/pt-slave-delay (+2/-2)
bin/pt-slave-find (+40/-6)
bin/pt-slave-restart (+2/-2)
bin/pt-stalk (+3/-3)
bin/pt-summary (+1/-1)
bin/pt-table-checksum (+43/-14)
bin/pt-table-sync (+16/-2)
bin/pt-table-usage (+1/-1)
bin/pt-upgrade (+26/-13)
bin/pt-variable-advisor (+2/-2)
bin/pt-visual-explain (+1/-1)
config/deb/changelog (+23/-0)
config/rpm/percona-toolkit.spec (+1/-1)
config/sphinx-build/conf.py (+1/-1)
docs/percona-toolkit.pod (+1/-1)
docs/release_notes.rst (+57/-0)
lib/Percona/Toolkit.pm (+1/-1)
lib/ResultWriter.pm (+3/-1)
lib/UpgradeResults.pm (+13/-8)
t/pt-duplicate-key-checker/basics.t (+15/-2)
t/pt-duplicate-key-checker/issue_331.t (+2/-2)
t/pt-duplicate-key-checker/samples/issue_331.txt (+3/-3)
t/pt-duplicate-key-checker/samples/simple_dupe_bug_1217013.txt (+8/-4)
t/pt-slave-find/pt-slave-find.t (+13/-1)
t/pt-table-checksum/progress.t (+1/-1)
t/pt-upgrade/issue_1421781.t (+66/-0)
t/pt-upgrade/samples/008/conf (+2/-0)
t/pt-upgrade/samples/008/fingerprint-grouping-and-max-examples-issue-1421405.log (+9/-0)
t/pt-upgrade/samples/008/fingerprint-grouping-and-max-examples-issue-1421405.txt (+75/-0)
t/pt-upgrade/samples/select_into.log (+4/-0)
To merge this branch: bzr merge lp:~percona-toolkit-dev/percona-toolkit/release-2.2.14
Reviewer Review Type Date Requested Status
Daniel Nichter 2015-04-15 Pending
Review via email: mp+256415@code.launchpad.net

Description of the change

Release branch for PT version 2.2.14

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'Changelog'
2--- Changelog 2015-01-23 10:19:56 +0000
3+++ Changelog 2015-04-15 23:37:30 +0000
4@@ -1,5 +1,28 @@
5 Changelog for Percona Toolkit
6
7+v2.2.14 released 2015-04-14
8+
9+
10+ * Fixed bug 1402730 pt-duplicate-key-checker seems useless with MySQL 5.6
11+ * Fixed bug 1415646 pt-duplicate-key-checker documentation does not explain how Size Duplicate Indexes is calculated
12+ * Fixed bug 1406390 pt-heartbeat crashes with sleep argument error
13+ * Fixed bug 1368244 pt-online-schema-change --alter-foreign-keys-method=drop-swap is not atomic
14+ * FIxed bug 1417864 pt-online-schema-change documentation, the interpretation of --tries create_triggers:5:0.5,drop_triggers:5:0.5 is wrong
15+ * Fixed bug 1404313 pt-query-digest: specifying a file that doesn't exist as log causes the tool to wait for STDIN instead of giving an error
16+ * Feature 1418446 pt-slave-find resolve IP addresses option
17+ * Fixed bug 1417558 pt-stalk with --collect-strace output doesn't go to an YYYY_MM_DD_HH_mm_ss-strace file
18+ * Fixed bug 1425478 pt-stalk removes non-empty files that start with empty line
19+ * Fixed bug 925781 pt-table-checksum checksum error when default-character-set = utf8
20+ * Fixed bug 1381280 pt-table-checksum fails on BINARY field in PK
21+ * Feature 1439842 pt-table-sync lacks --ignore-tables-regex option
22+ * Fixed bug 1401399 pt-table-sync fails to close one db handle
23+ * Fixed bug 1442277 pt-table-sync-ignores system databases but doc doesn't clarify this
24+ * Fixed bug 1421781 pt-upgrade fails on SELECT ... INTO queries
25+ * Fixed bug 1421405 pt-upgrade fails to aggregate queries based on fingerprint
26+ * Fixed bug 1439348 pt-upgrade erroneously reports number of diffs
27+ * Fixed bug 1421025 rpm missing dependency on perl-TermReadKey for --ask-pass
28+
29+
30 v2.2.13 released 2015-01-26
31
32
33
34=== modified file 'Makefile.PL'
35--- Makefile.PL 2015-01-23 10:19:56 +0000
36+++ Makefile.PL 2015-04-15 23:37:30 +0000
37@@ -2,7 +2,7 @@
38
39 WriteMakefile(
40 NAME => 'percona-toolkit',
41- VERSION => '2.2.13',
42+ VERSION => '2.2.14',
43 EXE_FILES => [ <bin/*> ],
44 MAN1PODS => {
45 'docs/percona-toolkit.pod' => 'blib/man1/percona-toolkit.1p',
46
47=== modified file 'bin/pt-align'
48--- bin/pt-align 2015-01-23 10:19:56 +0000
49+++ bin/pt-align 2015-04-15 23:37:30 +0000
50@@ -1331,6 +1331,6 @@
51
52 =head1 VERSION
53
54-pt-align 2.2.13
55+pt-align 2.2.14
56
57 =cut
58
59=== modified file 'bin/pt-archiver'
60--- bin/pt-archiver 2015-01-23 10:19:56 +0000
61+++ bin/pt-archiver 2015-04-15 23:37:30 +0000
62@@ -43,7 +43,7 @@
63 {
64 package Percona::Toolkit;
65
66-our $VERSION = '2.2.13';
67+our $VERSION = '2.2.14';
68
69 use strict;
70 use warnings FATAL => 'all';
71@@ -7910,6 +7910,6 @@
72
73 =head1 VERSION
74
75-pt-archiver 2.2.13
76+pt-archiver 2.2.14
77
78 =cut
79
80=== modified file 'bin/pt-config-diff'
81--- bin/pt-config-diff 2015-01-23 10:19:56 +0000
82+++ bin/pt-config-diff 2015-04-15 23:37:30 +0000
83@@ -43,7 +43,7 @@
84 {
85 package Percona::Toolkit;
86
87-our $VERSION = '2.2.13';
88+our $VERSION = '2.2.14';
89
90 use strict;
91 use warnings FATAL => 'all';
92@@ -5783,6 +5783,6 @@
93
94 =head1 VERSION
95
96-pt-config-diff 2.2.13
97+pt-config-diff 2.2.14
98
99 =cut
100
101=== modified file 'bin/pt-deadlock-logger'
102--- bin/pt-deadlock-logger 2015-01-23 10:19:56 +0000
103+++ bin/pt-deadlock-logger 2015-04-15 23:37:30 +0000
104@@ -42,7 +42,7 @@
105 {
106 package Percona::Toolkit;
107
108-our $VERSION = '2.2.13';
109+our $VERSION = '2.2.14';
110
111 use strict;
112 use warnings FATAL => 'all';
113@@ -5573,6 +5573,6 @@
114
115 =head1 VERSION
116
117-pt-deadlock-logger 2.2.13
118+pt-deadlock-logger 2.2.14
119
120 =cut
121
122=== modified file 'bin/pt-diskstats'
123--- bin/pt-diskstats 2015-01-23 10:19:56 +0000
124+++ bin/pt-diskstats 2015-04-15 23:37:30 +0000
125@@ -38,7 +38,7 @@
126 {
127 package Percona::Toolkit;
128
129-our $VERSION = '2.2.13';
130+our $VERSION = '2.2.14';
131
132 use strict;
133 use warnings FATAL => 'all';
134@@ -5586,6 +5586,6 @@
135
136 =head1 VERSION
137
138-pt-diskstats 2.2.13
139+pt-diskstats 2.2.14
140
141 =cut
142
143=== modified file 'bin/pt-duplicate-key-checker'
144--- bin/pt-duplicate-key-checker 2015-01-23 10:19:56 +0000
145+++ bin/pt-duplicate-key-checker 2015-04-15 23:37:30 +0000
146@@ -39,7 +39,7 @@
147 {
148 package Percona::Toolkit;
149
150-our $VERSION = '2.2.13';
151+our $VERSION = '2.2.14';
152
153 use strict;
154 use warnings FATAL => 'all';
155@@ -2336,7 +2336,8 @@
156 my @dupes;
157
158 KEY:
159- foreach my $key ( values %keys ) {
160+ # sort by key name for consistent testing
161+ foreach my $key ( sort {$a->{name} cmp $b->{name}} values %keys ) {
162 $key->{real_cols} = [ @{$key->{cols}} ];
163
164 $key->{len_cols} = length $key->{colnames};
165@@ -2412,7 +2413,8 @@
166 sub get_duplicate_fks {
167 my ( $self, $fks, %args ) = @_;
168 die "I need a fks argument" unless $fks;
169- my @fks = values %$fks;
170+ # sort by name for consistent testing
171+ my @fks = sort {$a->{name} cmp $b->{name}} values %$fks;
172 my @dupes;
173
174 foreach my $i ( 0..$#fks - 1 ) {
175@@ -4881,7 +4883,7 @@
176 sub main {
177 local @ARGV = @_; # set global ARGV for this package
178
179- my %summary = ( 'Total Indexes' => 0 );
180+ my %summary = ( 'items' => {'Total Indexes' => 0} );
181 my %seen_tbl;
182
183 my $q = new Quoter();
184@@ -4972,51 +4974,49 @@
185 print_all_keys($keys, $tbl, \%seen_tbl) if $keys;
186 print_all_keys($fks, $tbl, \%seen_tbl) if $fks;
187 }
188- else {
189- PTDEBUG && _d('Getting duplicate keys on',
190- $tbl->{db}, $tbl->{tbl});
191- if ( $keys ) {
192- $dk->get_duplicate_keys(
193- $keys,
194- clustered_key => $clustered_key,
195- tbl_info => $tbl,
196- callback => \&print_duplicate_key,
197- %tp_opts,
198- # get_duplicate_keys() ignores these args but passes them
199- # to the callback:
200- dbh => $dbh,
201- is_fk => 0,
202- o => $o,
203- ks => $ks,
204- tp => $tp,
205- q => $q,
206- seen_tbl => \%seen_tbl,
207- summary => \%summary,
208- );
209- }
210- if ( $fks ) {
211- $dk->get_duplicate_fks(
212- $fks,
213- tbl_info => $tbl,
214- callback => \&print_duplicate_key,
215- %tp_opts,
216- # get_duplicate_fks() ignores these args but passes them
217- # to the callback:
218- dbh => $dbh,
219- is_fk => 1,
220- o => $o,
221- ks => $ks,
222- tp => $tp,
223- q => $q,
224- seen_tbl => \%seen_tbl,
225- summary => \%summary,
226- );
227- }
228+ PTDEBUG && _d('Getting duplicate keys on',
229+ $tbl->{db}, $tbl->{tbl});
230+ if ( $keys ) {
231+ $dk->get_duplicate_keys(
232+ $keys,
233+ clustered_key => $clustered_key,
234+ tbl_info => $tbl,
235+ callback => \&print_duplicate_key,
236+ %tp_opts,
237+ # get_duplicate_keys() ignores these args but passes them
238+ # to the callback:
239+ dbh => $dbh,
240+ is_fk => 0,
241+ o => $o,
242+ ks => $ks,
243+ tp => $tp,
244+ q => $q,
245+ seen_tbl => \%seen_tbl,
246+ summary => \%summary,
247+ );
248+ }
249+ if ( $fks ) {
250+ $dk->get_duplicate_fks(
251+ $fks,
252+ tbl_info => $tbl,
253+ callback => \&print_duplicate_key,
254+ %tp_opts,
255+ # get_duplicate_fks() ignores these args but passes them
256+ # to the callback:
257+ dbh => $dbh,
258+ is_fk => 1,
259+ o => $o,
260+ ks => $ks,
261+ tp => $tp,
262+ q => $q,
263+ seen_tbl => \%seen_tbl,
264+ summary => \%summary,
265+ );
266 }
267
268 # Always count Total Keys so print_key_summary won't die
269 # because %summary is empty.
270- $summary{'Total Indexes'} += (scalar keys %$keys)
271+ $summary{items}->{'Total Indexes'} += (scalar keys %$keys)
272 + (scalar keys %$fks)
273 }
274 };
275@@ -5044,7 +5044,8 @@
276 printf $hdr_fmt, "$db.$tbl";
277 printf $hdr_fmt, ('#' x $hdr_width);
278 }
279- foreach my $key ( values %$keys ) {
280+ # Print keys sorted by name (easier to test)
281+ foreach my $key ( sort {$a->{name} cmp $b->{name}} values %$keys ) {
282 print "\n# $key->{name} ($key->{colnames})";
283 }
284 print "\n";
285@@ -5069,6 +5070,10 @@
286 my $summary = $args{summary};
287 my $struct = $tp->parse($args{tbl_info}->{ddl});
288
289+ if ($dupe->{ddl} =~ /FULLTEXT/) {
290+ $summary->{has_fulltext_dupe}++;
291+ }
292+
293 if ( !$seen_tbl->{"$db$tbl"}++ ) {
294 printf $hdr_fmt, ('#' x $hdr_width);
295 printf $hdr_fmt, "$db.$tbl";
296@@ -5111,7 +5116,7 @@
297 print "\n";
298
299 if ( $o->get('summary') && $summary ) {
300- $summary->{'Total Duplicate Indexes'} += 1;
301+ $summary->{'items'}->{'Total Duplicate Indexes'} += 1;
302 my ($size, $chosen_key) = $ks->get_key_size(
303 name => $dupe->{key},
304 cols => $dupe->{cols},
305@@ -5128,7 +5133,7 @@
306 $size ||= 0;
307
308 # Create Size Duplicate Keys summary even if there's no valid keys.
309- $summary->{'Size Duplicate Indexes'} += $size;
310+ $summary->{'items'}->{'Size Duplicate Indexes'} += $size;
311
312 if ( $size ) {
313 if ( $chosen_key && $chosen_key ne $dupe->{key} ) {
314@@ -5143,14 +5148,19 @@
315
316 sub print_key_summary {
317 my ( %summary ) = @_;
318+ my $items = $summary{items};
319 printf $hdr_fmt, ('#' x $hdr_width);
320 printf $hdr_fmt, 'Summary of indexes';
321 printf $hdr_fmt, ('#' x $hdr_width);
322 print "\n";
323- my $max_item = max(map { length($_) } keys %summary);
324- my $line_fmt = "# %-${max_item}s %-s\n";
325- foreach my $item ( sort keys %summary ) {
326- printf $line_fmt, $item, $summary{$item};
327+ my $max_item = max(map { length($_) } keys %$items);
328+ my $line_fmt = "# %-${max_item}s %-s";
329+ foreach my $item ( sort keys %$items ) {
330+ printf $line_fmt, $item, $items->{$item};
331+ if ( $item eq 'Size Duplicate Indexes' && $summary{has_fulltext_dupe} ) {
332+ print ' (not including FULLTEXT indexes)';
333+ }
334+ print "\n";
335 }
336 return;
337 }
338@@ -5220,6 +5230,10 @@
339 same columns as another in the same table, and references the same parent
340 table.
341
342+The output ends with a short summary that includes an estimate of the total
343+size, in bytes, that the duplicate indexes are using. This is calculated by
344+multiplying the index length by the number of rows in their respective tables.
345+
346 =head1 OPTIONS
347
348 This tool accepts additional command-line arguments. Refer to the
349@@ -5607,6 +5621,6 @@
350
351 =head1 VERSION
352
353-pt-duplicate-key-checker 2.2.13
354+pt-duplicate-key-checker 2.2.14
355
356 =cut
357
358=== modified file 'bin/pt-fifo-split'
359--- bin/pt-fifo-split 2015-01-23 10:19:56 +0000
360+++ bin/pt-fifo-split 2015-04-15 23:37:30 +0000
361@@ -1620,6 +1620,6 @@
362
363 =head1 VERSION
364
365-pt-fifo-split 2.2.13
366+pt-fifo-split 2.2.14
367
368 =cut
369
370=== modified file 'bin/pt-find'
371--- bin/pt-find 2015-01-23 10:19:56 +0000
372+++ bin/pt-find 2015-04-15 23:37:30 +0000
373@@ -35,7 +35,7 @@
374 {
375 package Percona::Toolkit;
376
377-our $VERSION = '2.2.13';
378+our $VERSION = '2.2.14';
379
380 use strict;
381 use warnings FATAL => 'all';
382@@ -4991,6 +4991,6 @@
383
384 =head1 VERSION
385
386-pt-find 2.2.13
387+pt-find 2.2.14
388
389 =cut
390
391=== modified file 'bin/pt-fingerprint'
392--- bin/pt-fingerprint 2015-01-23 10:19:56 +0000
393+++ bin/pt-fingerprint 2015-04-15 23:37:30 +0000
394@@ -2211,6 +2211,6 @@
395
396 =head1 VERSION
397
398-pt-fingerprint 2.2.13
399+pt-fingerprint 2.2.14
400
401 =cut
402
403=== modified file 'bin/pt-fk-error-logger'
404--- bin/pt-fk-error-logger 2015-01-23 10:19:56 +0000
405+++ bin/pt-fk-error-logger 2015-04-15 23:37:30 +0000
406@@ -37,7 +37,7 @@
407 {
408 package Percona::Toolkit;
409
410-our $VERSION = '2.2.13';
411+our $VERSION = '2.2.14';
412
413 use strict;
414 use warnings FATAL => 'all';
415@@ -4559,6 +4559,6 @@
416
417 =head1 VERSION
418
419-pt-fk-error-logger 2.2.13
420+pt-fk-error-logger 2.2.14
421
422 =cut
423
424=== modified file 'bin/pt-heartbeat'
425--- bin/pt-heartbeat 2015-01-23 10:19:56 +0000
426+++ bin/pt-heartbeat 2015-04-15 23:37:30 +0000
427@@ -38,7 +38,7 @@
428 {
429 package Percona::Toolkit;
430
431-our $VERSION = '2.2.13';
432+our $VERSION = '2.2.14';
433
434 use strict;
435 use warnings FATAL => 'all';
436@@ -5286,13 +5286,16 @@
437 ) {
438 eval {
439 my $next_interval = $get_next_interval->();
440- if ( time >= $next_interval ) {
441+ # save current time in variable to avoid race condition
442+ # https://bugs.launchpad.net/percona-toolkit/+bug/1406390
443+ my $time = time;
444+ if ( $time >= $next_interval ) {
445 do { $next_interval = $get_next_interval->() }
446- until $next_interval > time;
447+ until $next_interval > $time;
448 PTDEBUG && _d("Missed last interval; next interval:",
449 ts($next_interval));
450 }
451- sleep $next_interval - time;
452+ sleep $next_interval - $time;
453 PTDEBUG && _d('Woke up at', ts(time));
454
455 # Connect or reconnect if necessary.
456@@ -5419,13 +5422,16 @@
457 PTDEBUG && _d('Checking slave', $dp->as_string($dsn));
458
459 my $next_interval = $get_next_interval->();
460- if ( time >= $next_interval ) {
461+ # save current time in variable to avoid race condition
462+ # https://bugs.launchpad.net/percona-toolkit/+bug/1406390
463+ my $time = time;
464+ if ( $time >= $next_interval ) {
465 do { $next_interval = $get_next_interval->() }
466- until $next_interval > time;
467+ until $next_interval > $time;
468 PTDEBUG && _d("Missed last interval; next interval:",
469 ts($next_interval));
470 }
471- sleep $next_interval - time;
472+ sleep $next_interval - $time;
473 PTDEBUG && _d('Woke up at', ts(time));
474 my ($delay, $hostname, $master_server_id) = $get_delay->($sth);
475
476@@ -6225,6 +6231,6 @@
477
478 =head1 VERSION
479
480-pt-heartbeat 2.2.13
481+pt-heartbeat 2.2.14
482
483 =cut
484
485=== modified file 'bin/pt-index-usage'
486--- bin/pt-index-usage 2015-01-23 10:19:56 +0000
487+++ bin/pt-index-usage 2015-04-15 23:37:30 +0000
488@@ -45,7 +45,7 @@
489 {
490 package Percona::Toolkit;
491
492-our $VERSION = '2.2.13';
493+our $VERSION = '2.2.14';
494
495 use strict;
496 use warnings FATAL => 'all';
497@@ -7555,6 +7555,6 @@
498
499 =head1 VERSION
500
501-pt-index-usage 2.2.13
502+pt-index-usage 2.2.14
503
504 =cut
505
506=== modified file 'bin/pt-ioprofile'
507--- bin/pt-ioprofile 2015-01-23 10:19:56 +0000
508+++ bin/pt-ioprofile 2015-04-15 23:37:30 +0000
509@@ -1125,7 +1125,7 @@
510
511 =head1 VERSION
512
513-pt-ioprofile 2.2.13
514+pt-ioprofile 2.2.14
515
516 =cut
517
518
519=== modified file 'bin/pt-kill'
520--- bin/pt-kill 2015-01-23 10:19:56 +0000
521+++ bin/pt-kill 2015-04-15 23:37:30 +0000
522@@ -47,7 +47,7 @@
523 {
524 package Percona::Toolkit;
525
526-our $VERSION = '2.2.13';
527+our $VERSION = '2.2.14';
528
529 use strict;
530 use warnings FATAL => 'all';
531@@ -8254,6 +8254,6 @@
532
533 =head1 VERSION
534
535-pt-kill 2.2.13
536+pt-kill 2.2.14
537
538 =cut
539
540=== modified file 'bin/pt-mext'
541--- bin/pt-mext 2015-01-23 10:19:56 +0000
542+++ bin/pt-mext 2015-04-15 23:37:30 +0000
543@@ -801,7 +801,7 @@
544
545 =head1 VERSION
546
547-pt-mext 2.2.13
548+pt-mext 2.2.14
549
550 =cut
551
552
553=== modified file 'bin/pt-mysql-summary'
554--- bin/pt-mysql-summary 2015-01-23 10:19:56 +0000
555+++ bin/pt-mysql-summary 2015-04-15 23:37:30 +0000
556@@ -3088,7 +3088,7 @@
557
558 =head1 VERSION
559
560-pt-mysql-summary 2.2.13
561+pt-mysql-summary 2.2.14
562
563 =cut
564
565
566=== modified file 'bin/pt-online-schema-change'
567--- bin/pt-online-schema-change 2015-01-23 10:19:56 +0000
568+++ bin/pt-online-schema-change 2015-04-15 23:37:30 +0000
569@@ -55,7 +55,7 @@
570 {
571 package Percona::Toolkit;
572
573-our $VERSION = '2.2.13';
574+our $VERSION = '2.2.14';
575
576 use strict;
577 use warnings FATAL => 'all';
578@@ -7970,6 +7970,7 @@
579
580 my $exit_status = 0;
581 my $oktorun = 1;
582+my $dont_interrupt_now = 0;
583 my @drop_trigger_sqls;
584 my @triggers_not_dropped;
585
586@@ -7983,6 +7984,7 @@
587 $oktorun = 1;
588 @drop_trigger_sqls = ();
589 @triggers_not_dropped = ();
590+ $dont_interrupt_now = 0;
591
592 my %stats = (
593 INSERT => 0,
594@@ -10251,6 +10253,11 @@
595 "DROP TABLE IF EXISTS $orig_tbl->{name}",
596 "RENAME TABLE $new_tbl->{name} TO $orig_tbl->{name}",
597 );
598+
599+ # we don't want to be interrupted during the swap!
600+ # since it might leave original table dropped
601+ # https://bugs.launchpad.net/percona-toolkit/+bug/1368244
602+ $dont_interrupt_now = 1;
603
604 foreach my $sql ( @sqls ) {
605 PTDEBUG && _d($sql);
606@@ -10269,6 +10276,8 @@
607 }
608 }
609
610+ $dont_interrupt_now = 0;
611+
612 if ( $o->get('execute') ) {
613 print ts("Dropped and swapped tables OK.\n");
614 }
615@@ -10667,6 +10676,11 @@
616 # Catches signals so we can exit gracefully.
617 sub sig_int {
618 my ( $signal ) = @_;
619+ if ( $dont_interrupt_now ) {
620+ # we're in the middle of something that shouldn't be interrupted
621+ PTDEBUG && _d("Received Signal: \"$signal\" in middle of critical operation. Continuing anyway.");
622+ return;
623+ }
624 $oktorun = 0; # flag for cleanup tasks
625 print STDERR "# Exiting on SIG$signal.\n";
626 # restore terminal to normal state in case CTL+C issued while
627@@ -11525,7 +11539,7 @@
628
629 --tries create_triggers:5:0.5,drop_triggers:5:0.5
630
631-That makes the tool try C<create_triggers> and C<drop_triggers> 2 times
632+That makes the tool try C<create_triggers> and C<drop_triggers> 5 times
633 with a 0.5 second wait between tries. So the format is:
634
635 operation:tries:wait[,operation:tries:wait]
636@@ -11807,6 +11821,6 @@
637
638 =head1 VERSION
639
640-pt-online-schema-change 2.2.13
641+pt-online-schema-change 2.2.14
642
643 =cut
644
645=== modified file 'bin/pt-pmp'
646--- bin/pt-pmp 2015-01-23 10:19:56 +0000
647+++ bin/pt-pmp 2015-04-15 23:37:30 +0000
648@@ -895,7 +895,7 @@
649
650 =head1 VERSION
651
652-pt-pmp 2.2.13
653+pt-pmp 2.2.14
654
655 =cut
656
657
658=== modified file 'bin/pt-query-digest'
659--- bin/pt-query-digest 2015-01-23 10:19:56 +0000
660+++ bin/pt-query-digest 2015-04-15 23:37:30 +0000
661@@ -64,7 +64,7 @@
662 {
663 package Percona::Toolkit;
664
665-our $VERSION = '2.2.13';
666+our $VERSION = '2.2.14';
667
668 use strict;
669 use warnings FATAL => 'all';
670@@ -13186,6 +13186,10 @@
671 # Open the next file.
672 my ($fh, $filename, $filesize) = $next_file->();
673 if ( $fh ) {
674+ my $fileno = fileno $fh;
675+ if ($fileno == 0) {
676+ print "Reading from STDIN ...\n";
677+ }
678 PTDEBUG && _d('Reading', $filename);
679 PTDEBUG && _d('File size:', $filesize);
680 # catch if user is trying to use an uncoverted (raw) binlog # issue 1377888
681@@ -16624,6 +16628,6 @@
682
683 =head1 VERSION
684
685-pt-query-digest 2.2.13
686+pt-query-digest 2.2.14
687
688 =cut
689
690=== modified file 'bin/pt-show-grants'
691--- bin/pt-show-grants 2015-01-23 10:19:56 +0000
692+++ bin/pt-show-grants 2015-04-15 23:37:30 +0000
693@@ -2414,6 +2414,6 @@
694
695 =head1 VERSION
696
697-pt-show-grants 2.2.13
698+pt-show-grants 2.2.14
699
700 =cut
701
702=== modified file 'bin/pt-sift'
703--- bin/pt-sift 2015-01-23 10:19:56 +0000
704+++ bin/pt-sift 2015-04-15 23:37:30 +0000
705@@ -1243,7 +1243,7 @@
706
707 =head1 VERSION
708
709-pt-sift 2.2.13
710+pt-sift 2.2.14
711
712 =cut
713
714
715=== modified file 'bin/pt-slave-delay'
716--- bin/pt-slave-delay 2015-01-23 10:19:56 +0000
717+++ bin/pt-slave-delay 2015-04-15 23:37:30 +0000
718@@ -40,7 +40,7 @@
719 {
720 package Percona::Toolkit;
721
722-our $VERSION = '2.2.13';
723+our $VERSION = '2.2.14';
724
725 use strict;
726 use warnings FATAL => 'all';
727@@ -4876,6 +4876,6 @@
728
729 =head1 VERSION
730
731-pt-slave-delay 2.2.13
732+pt-slave-delay 2.2.14
733
734 =cut
735
736=== modified file 'bin/pt-slave-find'
737--- bin/pt-slave-find 2015-01-23 10:19:56 +0000
738+++ bin/pt-slave-find 2015-04-15 23:37:30 +0000
739@@ -3778,6 +3778,7 @@
740 node => $root,
741 print_node => $print_node,
742 MasterSlave => $ms,
743+ resolve_address => $o->get('resolve-address'),
744 );
745
746 return 0;
747@@ -3823,7 +3824,7 @@
748
749 sub print_node_hostname {
750 my ( %args ) = @_;
751- my ($ms, $node, $level) = @args{qw(MasterSlave node level)};
752+ my ($ms, $node, $level, $resolve_address) = @args{qw(MasterSlave node level resolve_address)};
753 die "I need a node" unless $node;
754 $level ||= 0;
755
756@@ -3833,15 +3834,16 @@
757 my $prefix = $level ? (' ' x (($level-1)*3) . '+- ') : '';
758
759 PTDEBUG && _d('level', $level, 'host', $host);
760- print "$prefix$host\n";
761+
762+ print_host($prefix, $host, $resolve_address);
763
764 return;
765 }
766
767 sub print_node_summary {
768 my ( %args ) = @_;
769- my ($ms, $node, $level)
770- = @args{qw(MasterSlave node level)};
771+ my ($ms, $node, $level, $resolve_address)
772+ = @args{qw(MasterSlave node level resolve_address)};
773 die "I need a node" unless $node;
774 $level ||= 0;
775
776@@ -3851,7 +3853,7 @@
777
778 PTDEBUG && _d('level', $level, 'host', $host);
779
780- print "$prefix$host\n";
781+ print_host($prefix, $host, $resolve_address);
782
783 my $dbh = $node->{dbh};
784 if ( !$dbh ) {
785@@ -3923,6 +3925,28 @@
786 return;
787 }
788
789+sub print_host {
790+ my ($prefix, $host, $resolve_address) = @_;
791+
792+ my $hostname;
793+ # resolve address to hostname if user requested it
794+ if($resolve_address) {
795+ use Socket;
796+ my $without_port = $host;
797+ $without_port =~ s/:\d*$//; # strip port from ip address
798+ my $packed = inet_aton($without_port);
799+ if ($packed) {
800+ $hostname = gethostbyaddr($packed, AF_INET);
801+ }
802+ }
803+ if ($hostname) {
804+ print "$prefix$host ($hostname)\n";
805+ }
806+ else {
807+ print "$prefix$host\n";
808+ }
809+}
810+
811 sub _d {
812 my ($package, undef, $line) = caller 0;
813 @_ = map { (my $temp = $_) =~ s/\n/\n# /g; $temp; }
814@@ -4155,6 +4179,16 @@
815
816 =back
817
818+=item --resolve-address
819+
820+Resolve ip-address to hostname. Report will print both IP and hostname.
821+
822+Example:
823+
824+ 10.10.7.14 (dbase1.sample.net)
825+
826+Might delay runtime a few seconds.
827+
828 =item --set-vars
829
830 type: Array
831@@ -4342,6 +4376,6 @@
832
833 =head1 VERSION
834
835-pt-slave-find 2.2.13
836+pt-slave-find 2.2.14
837
838 =cut
839
840=== modified file 'bin/pt-slave-restart'
841--- bin/pt-slave-restart 2015-01-23 10:19:56 +0000
842+++ bin/pt-slave-restart 2015-04-15 23:37:30 +0000
843@@ -41,7 +41,7 @@
844 {
845 package Percona::Toolkit;
846
847-our $VERSION = '2.2.13';
848+our $VERSION = '2.2.14';
849
850 use strict;
851 use warnings FATAL => 'all';
852@@ -5944,6 +5944,6 @@
853
854 =head1 VERSION
855
856-pt-slave-restart 2.2.13
857+pt-slave-restart 2.2.14
858
859 =cut
860
861=== modified file 'bin/pt-stalk'
862--- bin/pt-stalk 2015-01-23 10:19:56 +0000
863+++ bin/pt-stalk 2015-04-15 23:37:30 +0000
864@@ -857,7 +857,7 @@
865 have_oprofile="yes"
866 fi
867 elif [ "$CMD_STRACE" -a "$OPT_COLLECT_STRACE" -a "$mysqld_pid" ]; then
868- $CMD_STRACE -T -s 0 -f -p $mysqld_pid > "${DEST}/$d-strace" &
869+ $CMD_STRACE -T -s 0 -f -p $mysqld_pid -o "$d/$p-strace" &
870 local strace_pid=$!
871 fi
872
873@@ -1000,7 +1000,7 @@
874 wait_for_subshells $OPT_RUN_TIME
875 kill_all_subshells
876 for file in "$d/$p-"*; do
877- if [ -z "$(grep -v '^TS ' --max-count 1 "$file")" ]; then
878+ if [ -z "$(grep -v '^TS ' --max-count 10 "$file")" ]; then
879 log "Removing empty file $file";
880 rm "$file"
881 fi
882@@ -2241,7 +2241,7 @@
883
884 =head1 VERSION
885
886-pt-stalk 2.2.13
887+pt-stalk 2.2.14
888
889 =cut
890
891
892=== modified file 'bin/pt-summary'
893--- bin/pt-summary 2015-01-23 10:19:56 +0000
894+++ bin/pt-summary 2015-04-15 23:37:30 +0000
895@@ -2696,7 +2696,7 @@
896
897 =head1 VERSION
898
899-pt-summary 2.2.13
900+pt-summary 2.2.14
901
902 =cut
903
904
905=== modified file 'bin/pt-table-checksum'
906--- bin/pt-table-checksum 2015-01-23 10:19:56 +0000
907+++ bin/pt-table-checksum 2015-04-15 23:37:30 +0000
908@@ -57,7 +57,7 @@
909 {
910 package Percona::Toolkit;
911
912-our $VERSION = '2.2.13';
913+our $VERSION = '2.2.14';
914
915 use strict;
916 use warnings FATAL => 'all';
917@@ -10866,6 +10866,7 @@
918 }
919 }
920 }
921+
922
923 # USE the correct db (probably the repl db, but maybe --replicate-database).
924 use_repl_db(%args);
925@@ -10888,6 +10889,7 @@
926 . "You need to create the table.\n";
927 }
928
929+
930 # We used to check the table privs here, but:
931 # https://bugs.launchpad.net/percona-toolkit/+bug/916168
932
933@@ -10974,6 +10976,18 @@
934 }
935 }
936
937+ if ( $o->get('binary-index') ) {
938+ PTDEBUG && _d('--binary-index : checking if replicate table has binary type columns');
939+ my $create_table = $tp->get_create_table( $dbh, $db, $tbl );
940+ if ( $create_table !~ /lower_boundary`?\s+BLOB/si
941+ || $create_table !~ /upper_boundary`?\s+BLOB/si )
942+ {
943+ die "--binary-index was specified but the current checksum table ($db.$tbl) uses"
944+ ." TEXT columns. To use BLOB columns, drop the current checksum table, then recreate"
945+ ." it by specifying --create-replicate-table --binary-index.";
946+ }
947+ }
948+
949 return; # success, repl table is ready to go
950 }
951
952@@ -11132,6 +11146,10 @@
953 my $sql = $o->read_para_after(__FILE__, qr/MAGIC_create_replicate/);
954 $sql =~ s/CREATE TABLE checksums/CREATE TABLE IF NOT EXISTS $repl_table/;
955 $sql =~ s/;$//;
956+ if ( $o->get('binary-index') ) {
957+ $sql =~ s/`?lower_boundary`?\s+TEXT/`lower_boundary` BLOB/is;
958+ $sql =~ s/`?upper_boundary`?\s+TEXT/`upper_boundary` BLOB/is;
959+ }
960 PTDEBUG && _d($dbh, $sql);
961 eval {
962 $dbh->do($sql);
963@@ -11808,6 +11826,15 @@
964
965 See "Replicas using row-based replication" under L<"LIMITATIONS">.
966
967+=item --binary-index
968+
969+This option modifies the behavior of L<"--create-replicate-table"> such that the
970+replicate table's upper and lower boundary columns are created with the BLOB
971+data type.
972+This is useful in cases where you have trouble checksuming tables with keys that
973+include a binary data type or that have non-standard character sets.
974+See L<"--replicate">.
975+
976 =item --check-interval
977
978 type: time; default: 1; group: Throttle
979@@ -12342,22 +12369,24 @@
980 structure (MAGIC_create_replicate):
981
982 CREATE TABLE checksums (
983- db char(64) NOT NULL,
984- tbl char(64) NOT NULL,
985- chunk int NOT NULL,
986- chunk_time float NULL,
987- chunk_index varchar(200) NULL,
988- lower_boundary text NULL,
989- upper_boundary text NULL,
990- this_crc char(40) NOT NULL,
991- this_cnt int NOT NULL,
992- master_crc char(40) NULL,
993- master_cnt int NULL,
994- ts timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
995+ db CHAR(64) NOT NULL,
996+ tbl CHAR(64) NOT NULL,
997+ chunk INT NOT NULL,
998+ chunk_time FLOAT NULL,
999+ chunk_index VARCHAR(200) NULL,
1000+ lower_boundary TEXT NULL,
1001+ upper_boundary TEXT NULL,
1002+ this_crc CHAR(40) NOT NULL,
1003+ this_cnt INT NOT NULL,
1004+ master_crc CHAR(40) NULL,
1005+ master_cnt INT NULL,
1006+ ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
1007 PRIMARY KEY (db, tbl, chunk),
1008 INDEX ts_db_tbl (ts, db, tbl)
1009 ) ENGINE=InnoDB;
1010
1011+Note: lower_boundary and upper_boundary data type can be BLOB. See L<"--binary-index">.
1012+
1013 By default, L<"--[no]create-replicate-table"> is true, so the database and
1014 the table specified by this option are created automatically if they do not
1015 exist.
1016@@ -12788,6 +12817,6 @@
1017
1018 =head1 VERSION
1019
1020-pt-table-checksum 2.2.13
1021+pt-table-checksum 2.2.14
1022
1023 =cut
1024
1025=== modified file 'bin/pt-table-sync'
1026--- bin/pt-table-sync 2015-01-23 10:19:56 +0000
1027+++ bin/pt-table-sync 2015-04-15 23:37:30 +0000
1028@@ -55,7 +55,7 @@
1029 {
1030 package Percona::Toolkit;
1031
1032-our $VERSION = '2.2.13';
1033+our $VERSION = '2.2.14';
1034
1035 use strict;
1036 use warnings FATAL => 'all';
1037@@ -11039,6 +11039,12 @@
1038 my $dbh = $host->{$thing};
1039 next unless $dbh;
1040 delete $dsn_for{$dbh};
1041+ # The following is for when misc_dbh loses
1042+ # connection due to timeout. Since it has nothing
1043+ # to commit we avoid reporting an error.
1044+ if ( $thing eq 'misc_dbh' && !$dbh->ping() ) {
1045+ next;
1046+ }
1047 $dbh->commit() unless $dbh->{AutoCommit};
1048 $dbh->disconnect();
1049 PTDEBUG && _d('Disconnected dbh', $dbh);
1050@@ -12225,6 +12231,8 @@
1051
1052 Ignore this comma-separated list of databases.
1053
1054+(system databases such as B<information_schema> and B<performance_schema> are ignored by default)
1055+
1056 =item --ignore-engines
1057
1058 type: Hash; default: FEDERATED,MRG_MyISAM
1059@@ -12239,6 +12247,12 @@
1060
1061 Table names may be qualified with the database name.
1062
1063+=item --ignore-tables-regex
1064+
1065+type: string; group: Filter
1066+
1067+Ignore tables whose names match the Perl regex.
1068+
1069 =item --[no]index-hint
1070
1071 default: yes
1072@@ -12775,6 +12789,6 @@
1073
1074 =head1 VERSION
1075
1076-pt-table-sync 2.2.13
1077+pt-table-sync 2.2.14
1078
1079 =cut
1080
1081=== modified file 'bin/pt-table-usage'
1082--- bin/pt-table-usage 2015-01-23 10:19:56 +0000
1083+++ bin/pt-table-usage 2015-04-15 23:37:30 +0000
1084@@ -7571,6 +7571,6 @@
1085
1086 =head1 VERSION
1087
1088-pt-table-usage 2.2.13
1089+pt-table-usage 2.2.14
1090
1091 =cut
1092
1093=== modified file 'bin/pt-upgrade'
1094--- bin/pt-upgrade 2015-01-23 10:19:56 +0000
1095+++ bin/pt-upgrade 2015-04-15 23:37:30 +0000
1096@@ -61,7 +61,7 @@
1097 {
1098 package Percona::Toolkit;
1099
1100-our $VERSION = '2.2.13';
1101+our $VERSION = '2.2.14';
1102
1103 use strict;
1104 use warnings FATAL => 'all';
1105@@ -5858,7 +5858,7 @@
1106 class => $class,
1107 reasons => ["$reason, but hasn't been reported yet"],
1108 );
1109- $class = { reported => 1 };
1110+ $class->{reported} = 1;
1111 };
1112 if ( $EVAL_ERROR ) {
1113 $success = 1;
1114@@ -5872,11 +5872,11 @@
1115 sub report_if_ready {
1116 my ($self, %args) = @_;
1117 my $class = $args{class};
1118-
1119- my $max_examples = $self->max_class_size;
1120+ my $max_examples = $self->max_examples;
1121+ my $max_class_size = $self->max_class_size;
1122 my @report_reasons;
1123
1124- if ( scalar keys %{$class->{unique_queries}} >= $self->max_class_size ) {
1125+ if ( scalar keys %{$class->{unique_queries}} >= $max_class_size ) {
1126 push @report_reasons, "it's full (--max-class-size)";
1127 }
1128
1129@@ -5888,15 +5888,15 @@
1130 push @report_reasons, "there are $max_examples warning diffs";
1131 }
1132
1133- if ( scalar @{$class->{row_diffs}} >= $self->max_examples ) {
1134+ if ( scalar @{$class->{row_diffs}} >= $max_examples ) {
1135 push @report_reasons, "there are $max_examples row diffs";
1136 }
1137
1138- if ( scalar @{$class->{errors}} >= $self->max_examples ) {
1139+ if ( scalar @{$class->{errors}} >= $max_examples ) {
1140 push @report_reasons, "there are $max_examples query errors";
1141 }
1142
1143- if ( scalar @{$class->{failures}} >= $self->max_examples ) {
1144+ if ( scalar @{$class->{failures}} >= $max_examples ) {
1145 push @report_reasons, "there are $max_examples failed queries";
1146 }
1147
1148@@ -5906,7 +5906,7 @@
1149 class => $class,
1150 reasons => \@report_reasons,
1151 );
1152- $class = { reported => 1 };
1153+ $class->{reported} = 1;
1154 }
1155
1156 return;
1157@@ -5917,6 +5917,11 @@
1158 my $class = $args{class};
1159 my $reasons = $args{reasons};
1160
1161+ if ( $class->{reported} ) {
1162+ PTDEBUG && _d('Class already reported');
1163+ return;
1164+ }
1165+
1166 PTDEBUG && _d('Reporting class', $class->{id}, $class->{fingerprint});
1167
1168 $self->_print_class_header(
1169@@ -6304,7 +6309,11 @@
1170 else {
1171 my $rows;
1172 if ( my $sth = $results->{sth} ) {
1173- if ( $event->{arg} =~ m/(?:^\s*SELECT|(?:\*\/\s*SELECT))/i ) {
1174+ # Only fetch rows of select statements
1175+ # *except* when they are directed INTO
1176+ # a file or a variable. (issue lp:1421781)
1177+ if ( $event->{arg} =~ m/(?:^\s*SELECT|(?:\*\/\s*SELECT))/i
1178+ && $event->{arg} !~ /INTO\s*(?:OUTFILE|DUMPFILE|@)/ ) {
1179 $rows = $sth->fetchall_arrayref();
1180 }
1181 eval {
1182@@ -10120,9 +10129,11 @@
1183 ignore_warnings => $ignore_warnings,
1184 );
1185
1186- # Only SELECT statements return rows.
1187+ # Only SELECT statements return rows, *except* when they are directed
1188+ # INTO a file or a variable.
1189 my $row_diffs;
1190- if ( $event->{arg} =~ m/(?:^\s*SELECT|(?:\*\/\s*SELECT))/i ) {
1191+ if ( $event->{arg} =~ m/(?:^\s*SELECT|(?:\*\/\s*SELECT))/i
1192+ && $event->{arg} !~ m/INTO\s*(?:OUTFILE|DUMPFILE|@)/i ) {
1193 $row_diffs = diff_rows(
1194 sth1 => $results1->{sth},
1195 sth2 => $results2->{sth},
1196@@ -10608,6 +10619,8 @@
1197 =head2 READ-ONLY
1198
1199 By default, pt-upgrade only executes C<SELECT> and C<SET> statements.
1200+(This does not include 'SELECT...INTO' statements, which do not return
1201+rows but dump output to a file or variable.)
1202 If you're using recreatable test or development servers and wish to
1203 compare write statements too (e.g. C<INSERT>, C<UPDATE>, C<DELETE>),
1204 then specify C<--no-read-only>. If using a binary log, you must
1205@@ -11290,6 +11303,6 @@
1206
1207 =head1 VERSION
1208
1209-pt-upgrade 2.2.13
1210+pt-upgrade 2.2.14
1211
1212 =cut
1213
1214=== modified file 'bin/pt-variable-advisor'
1215--- bin/pt-variable-advisor 2015-01-23 10:19:56 +0000
1216+++ bin/pt-variable-advisor 2015-04-15 23:37:30 +0000
1217@@ -44,7 +44,7 @@
1218 {
1219 package Percona::Toolkit;
1220
1221-our $VERSION = '2.2.13';
1222+our $VERSION = '2.2.14';
1223
1224 use strict;
1225 use warnings FATAL => 'all';
1226@@ -6145,6 +6145,6 @@
1227
1228 =head1 VERSION
1229
1230-pt-variable-advisor 2.2.13
1231+pt-variable-advisor 2.2.14
1232
1233 =cut
1234
1235=== modified file 'bin/pt-visual-explain'
1236--- bin/pt-visual-explain 2015-01-23 10:19:56 +0000
1237+++ bin/pt-visual-explain 2015-04-15 23:37:30 +0000
1238@@ -3251,6 +3251,6 @@
1239
1240 =head1 VERSION
1241
1242-pt-visual-explain 2.2.13
1243+pt-visual-explain 2.2.14
1244
1245 =cut
1246
1247=== modified file 'config/deb/changelog'
1248--- config/deb/changelog 2015-01-23 10:19:56 +0000
1249+++ config/deb/changelog 2015-04-15 23:37:30 +0000
1250@@ -1,3 +1,26 @@
1251+percona-toolkit (2.2.14) unstable; urgency=low
1252+
1253+ * Fixed bug 1402730 pt-duplicate-key-checker seems useless with MySQL 5.6
1254+ * Fixed bug 1415646 pt-duplicate-key-checker documentation does not explain how Size Duplicate Indexes is calculated
1255+ * Fixed bug 1406390 pt-heartbeat crashes with sleep argument error
1256+ * Fixed bug 1368244 pt-online-schema-change --alter-foreign-keys-method=drop-swap is not atomic
1257+ * FIxed bug 1417864 pt-online-schema-change documentation, the interpretation of --tries create_triggers:5:0.5,drop_triggers:5:0.5 is wrong
1258+ * Fixed bug 1404313 pt-query-digest: specifying a file that doesn't exist as log causes the tool to wait for STDIN instead of giving an error
1259+ * Feature 1418446 pt-slave-find resolve IP addresses option
1260+ * Fixed bug 1417558 pt-stalk with --collect-strace output doesn't go to an YYYY_MM_DD_HH_mm_ss-strace file
1261+ * Fixed bug 1425478 pt-stalk removes non-empty files that start with empty line
1262+ * Fixed bug 925781 pt-table-checksum checksum error when default-character-set = utf8
1263+ * Fixed bug 1381280 pt-table-checksum fails on BINARY field in PK
1264+ * Feature 1439842 pt-table-sync lacks --ignore-tables-regex option
1265+ * Fixed bug 1401399 pt-table-sync fails to close one db handle
1266+ * Fixed bug 1442277 pt-table-sync-ignores system databases but doc doesn't clarify this
1267+ * Fixed bug 1421781 pt-upgrade fails on SELECT ... INTO queries
1268+ * Fixed bug 1421405 pt-upgrade fails to aggregate queries based on fingerprint
1269+ * Fixed bug 1439348 pt-upgrade erroneously reports number of diffs
1270+ * Fixed bug 1421025 rpm missing dependency on perl-TermReadKey for --ask-pass
1271+
1272+ -- Percona Toolkit Developers <toolkit-dev@percona.com> Fri, 10 Apr 2015 08:38:24 +0000
1273+
1274 percona-toolkit (2.2.13) unstable; urgency=low
1275
1276 * Feature 1391240: pt-kill added query fingerprint hash to output
1277
1278=== modified file 'config/rpm/percona-toolkit.spec'
1279--- config/rpm/percona-toolkit.spec 2014-09-25 13:40:32 +0000
1280+++ config/rpm/percona-toolkit.spec 2015-04-15 23:37:30 +0000
1281@@ -9,7 +9,7 @@
1282 Source: percona-toolkit-%{version}.tar.gz
1283 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
1284 BuildArch: noarch
1285-Requires: perl(DBI) >= 1.13, perl(DBD::mysql) >= 1.0, perl(Time::HiRes), perl(IO::Socket::SSL), perl(Digest::MD5)
1286+Requires: perl(DBI) >= 1.13, perl(DBD::mysql) >= 1.0, perl(Time::HiRes), perl(IO::Socket::SSL), perl(Digest::MD5), perl(Term::ReadKey)
1287 AutoReq: no
1288
1289 %description
1290
1291=== modified file 'config/sphinx-build/conf.py'
1292--- config/sphinx-build/conf.py 2015-01-30 19:01:50 +0000
1293+++ config/sphinx-build/conf.py 2015-04-15 23:37:30 +0000
1294@@ -50,7 +50,7 @@
1295 # The short X.Y version.
1296 version = '2.2'
1297 # The full version, including alpha/beta/rc tags.
1298-release = '2.2.13'
1299+release = '2.2.14'
1300
1301 # The language for content autogenerated by Sphinx. Refer to documentation
1302 # for a list of supported languages.
1303
1304=== modified file 'docs/percona-toolkit.pod'
1305--- docs/percona-toolkit.pod 2015-01-23 10:19:56 +0000
1306+++ docs/percona-toolkit.pod 2015-04-15 23:37:30 +0000
1307@@ -557,6 +557,6 @@
1308
1309 =head1 VERSION
1310
1311-Percona Toolkit v2.2.13 released 2015-01-23
1312+Percona Toolkit v2.2.14 released 2015-04-10
1313
1314 =cut
1315
1316=== modified file 'docs/release_notes.rst'
1317--- docs/release_notes.rst 2015-01-23 10:19:56 +0000
1318+++ docs/release_notes.rst 2015-04-15 23:37:30 +0000
1319@@ -1,6 +1,63 @@
1320 Release Notes
1321 *************
1322
1323+v2.2.14 released 2015-04-14
1324+===========================
1325+
1326+Percona Toolkit 2.2.14 has been released. This release contains two new features and seventeen bug fixes.
1327+
1328+New Features:
1329+
1330+* pt-slave-find can now resolve the IP address and show the slave's hostname. This can be done with the new ``--resolve-address`` option.
1331+
1332+* pt-table-sync can now ignore the tables whose names match specific Perl regex with the ``--ignore-tables-regex`` option.
1333+
1334+Bugs Fixed:
1335+
1336+* Fixed bug 925781: Inserting non-BMP characters into a column with utf8 charset would cause the ``Incorrect string value`` error when running the pt-table-checksum.
1337+
1338+* Fixed bug 1368244: pt-online-schema-change ``--alter-foreign-keys-method=drop-swap`` was not atomic and thus it could be interrupted. Fixed by disabling common interrupt signals during the critical drop-rename phase.
1339+
1340+* Fixed bug 1381280: pt-table-checksum was failing on ``BINARY`` field in Primary Key. Fixed by implementing new ``--binary-index`` flag to optionally create checksum table using BLOB data type.
1341+
1342+* Fixed bug 1421405: Running pt-upgrade against a log with many identical (or similar) queries was producing repeated sections with the same fingerprint.
1343+
1344+* Fixed bug 1402730: pt-duplicate-key-checker was not checking for duplicate keys when ``--verbose`` option was set.
1345+
1346+* Fixed bug 1406390: A race condition was causing pt-heartbeat to crash with sleep argument error.
1347+
1348+* Fixed bug 1417558: pt-stalk when used along with ``--collect-strace`` didn't write the strace output to the expected destination file.
1349+
1350+* Fixed bug 1421025: Missing dependency for ``perl-TermReadKey`` RPM package was causing toolkit commands to fail when they were run with ``--ask-pass`` option.
1351+
1352+* Fixed bug 1421781: pt-upgrade would fail when log contained ``SELECT...INTO`` queries. Fixed by ignoring/skipping those queries.
1353+
1354+* Fixed bug 1425478: pt-stalk was removing non-empty files that were starting with an empty line.
1355+
1356+* Fixed bug 1419098: Fixed bad formatting in the pt-table-checksum documentation.
1357+
1358+Changelog
1359+---------
1360+
1361+* Fixed bug 1402730 pt-duplicate-key-checker seems useless with MySQL 5.6
1362+* Fixed bug 1415646 pt-duplicate-key-checker documentation does not explain how Size Duplicate Indexes is calculated
1363+* Fixed bug 1406390 pt-heartbeat crashes with sleep argument error
1364+* Fixed bug 1368244 pt-online-schema-change --alter-foreign-keys-method=drop-swap is not atomic
1365+* FIxed bug 1417864 pt-online-schema-change documentation, the interpretation of --tries create_triggers:5:0.5,drop_triggers:5:0.5 is wrong
1366+* Fixed bug 1404313 pt-query-digest: specifying a file that doesn't exist as log causes the tool to wait for STDIN instead of giving an error
1367+* Feature 1418446 pt-slave-find resolve IP addresses option
1368+* Fixed bug 1417558 pt-stalk with --collect-strace output doesn't go to an YYYY_MM_DD_HH_mm_ss-strace file
1369+* Fixed bug 1425478 pt-stalk removes non-empty files that start with empty line
1370+* Fixed bug 925781 pt-table-checksum checksum error when default-character-set = utf8
1371+* Fixed bug 1381280 pt-table-checksum fails on BINARY field in PK
1372+* Feature 1439842 pt-table-sync lacks --ignore-tables-regex option
1373+* Fixed bug 1401399 pt-table-sync fails to close one db handle
1374+* Fixed bug 1442277 pt-table-sync-ignores system databases but doc doesn't clarify this
1375+* Fixed bug 1421781 pt-upgrade fails on SELECT ... INTO queries
1376+* Fixed bug 1421405 pt-upgrade fails to aggregate queries based on fingerprint
1377+* Fixed bug 1439348 pt-upgrade erroneously reports number of diffs
1378+* Fixed bug 1421025 rpm missing dependency on perl-TermReadKey for --ask-pass
1379+
1380 v2.2.13 released 2015-01-26
1381 ===========================
1382
1383
1384=== modified file 'lib/Percona/Toolkit.pm'
1385--- lib/Percona/Toolkit.pm 2015-01-22 12:51:26 +0000
1386+++ lib/Percona/Toolkit.pm 2015-04-15 23:37:30 +0000
1387@@ -18,7 +18,7 @@
1388 # ###########################################################################
1389 package Percona::Toolkit;
1390
1391-our $VERSION = '2.2.13';
1392+our $VERSION = '2.2.14';
1393
1394 use strict;
1395 use warnings FATAL => 'all';
1396
1397=== modified file 'lib/ResultWriter.pm'
1398--- lib/ResultWriter.pm 2013-02-20 16:37:43 +0000
1399+++ lib/ResultWriter.pm 2015-04-15 23:37:30 +0000
1400@@ -128,9 +128,11 @@
1401 }
1402 else {
1403 # Save rows, if any (i.e. if it's a SELECT statement).
1404+ # *except* if it's a SELECT...INTO (issue lp:1421781)
1405 my $rows;
1406 if ( my $sth = $results->{sth} ) {
1407- if ( $event->{arg} =~ m/(?:^\s*SELECT|(?:\*\/\s*SELECT))/i ) {
1408+ if ( $event->{arg} =~ m/(?:^\s*SELECT|(?:\*\/\s*SELECT))/i
1409+ && $event->{arg} !~ /INTO\s*(?:OUTFILE|DUMPFILE|@)/ ) {
1410 $rows = $sth->fetchall_arrayref();
1411 }
1412 eval {
1413
1414=== modified file 'lib/UpgradeResults.pm'
1415--- lib/UpgradeResults.pm 2013-03-14 15:20:54 +0000
1416+++ lib/UpgradeResults.pm 2015-04-15 23:37:30 +0000
1417@@ -220,7 +220,7 @@
1418 class => $class,
1419 reasons => ["$reason, but hasn't been reported yet"],
1420 );
1421- $class = { reported => 1 };
1422+ $class->{reported} = 1;
1423 };
1424 if ( $EVAL_ERROR ) {
1425 $success = 1;
1426@@ -234,11 +234,11 @@
1427 sub report_if_ready {
1428 my ($self, %args) = @_;
1429 my $class = $args{class};
1430-
1431- my $max_examples = $self->max_class_size;
1432+ my $max_examples = $self->max_examples;
1433+ my $max_class_size = $self->max_class_size;
1434 my @report_reasons;
1435
1436- if ( scalar keys %{$class->{unique_queries}} >= $self->max_class_size ) {
1437+ if ( scalar keys %{$class->{unique_queries}} >= $max_class_size ) {
1438 push @report_reasons, "it's full (--max-class-size)";
1439 }
1440
1441@@ -250,15 +250,15 @@
1442 push @report_reasons, "there are $max_examples warning diffs";
1443 }
1444
1445- if ( scalar @{$class->{row_diffs}} >= $self->max_examples ) {
1446+ if ( scalar @{$class->{row_diffs}} >= $max_examples ) {
1447 push @report_reasons, "there are $max_examples row diffs";
1448 }
1449
1450- if ( scalar @{$class->{errors}} >= $self->max_examples ) {
1451+ if ( scalar @{$class->{errors}} >= $max_examples ) {
1452 push @report_reasons, "there are $max_examples query errors";
1453 }
1454
1455- if ( scalar @{$class->{failures}} >= $self->max_examples ) {
1456+ if ( scalar @{$class->{failures}} >= $max_examples ) {
1457 push @report_reasons, "there are $max_examples failed queries";
1458 }
1459
1460@@ -268,7 +268,7 @@
1461 class => $class,
1462 reasons => \@report_reasons,
1463 );
1464- $class = { reported => 1 };
1465+ $class->{reported} = 1;
1466 }
1467
1468 return;
1469@@ -279,6 +279,11 @@
1470 my $class = $args{class};
1471 my $reasons = $args{reasons};
1472
1473+ if ( $class->{reported} ) {
1474+ PTDEBUG && _d('Class already reported');
1475+ return;
1476+ }
1477+
1478 PTDEBUG && _d('Reporting class', $class->{id}, $class->{fingerprint});
1479
1480 $self->_print_class_header(
1481
1482=== modified file 't/pt-duplicate-key-checker/basics.t'
1483--- t/pt-duplicate-key-checker/basics.t 2013-12-12 03:39:09 +0000
1484+++ t/pt-duplicate-key-checker/basics.t 2015-04-15 23:37:30 +0000
1485@@ -142,12 +142,25 @@
1486
1487 ok(
1488 no_diff(
1489- sub { pt_duplicate_key_checker::main(@args, qw(-t test.domains)) },
1490- "$sample/simple_dupe_bug_1217013.txt"),
1491+ sub { pt_duplicate_key_checker::main(@args, qw(-t test.domains -v)) },
1492+ "$sample/simple_dupe_bug_1217013.txt", keep_output=>1),
1493 'Exact unique dupes (bug 1217013)'
1494 ) or diag($test_diff);
1495
1496 # #############################################################################
1497+# Same thing, but added --verbose option to test for:
1498+# https://bugs.launchpad.net/percona-toolkit/+bug/1402730
1499+# #############################################################################
1500+
1501+ok(
1502+ no_diff(
1503+ sub { pt_duplicate_key_checker::main(@args, qw(-t test.domains --verbose)) },
1504+ "$sample/simple_dupe_bug_1217013.txt", keep_output=>1),
1505+ q[--verbose option doesn't skip dupes reporting (bug 1402730)]
1506+) or diag($test_diff);
1507+
1508+
1509+# #############################################################################
1510 # Done.
1511 # #############################################################################
1512 $sb->wipe_clean($dbh);
1513
1514=== modified file 't/pt-duplicate-key-checker/issue_331.t'
1515--- t/pt-duplicate-key-checker/issue_331.t 2012-06-03 19:14:30 +0000
1516+++ t/pt-duplicate-key-checker/issue_331.t 2015-04-15 23:37:30 +0000
1517@@ -41,10 +41,10 @@
1518 ok(
1519 no_diff(
1520 sub { pt_duplicate_key_checker::main(@args, qw(-d issue_331)) },
1521- 't/pt-duplicate-key-checker/samples/issue_331.txt',
1522+ 't/pt-duplicate-key-checker/samples/issue_331.txt'
1523 ),
1524 'Issue 331 crash on fks'
1525-);
1526+) or diag($test_diff);
1527
1528 # #############################################################################
1529 # Done.
1530
1531=== modified file 't/pt-duplicate-key-checker/samples/issue_331.txt'
1532--- t/pt-duplicate-key-checker/samples/issue_331.txt 2011-06-24 22:02:05 +0000
1533+++ t/pt-duplicate-key-checker/samples/issue_331.txt 2015-04-15 23:37:30 +0000
1534@@ -2,14 +2,14 @@
1535 # issue_331.issue_331_t2
1536 # ########################################################################
1537
1538-# FOREIGN KEY fk_1 (`id`) REFERENCES `issue_331`.`issue_331_t1` (`t1_id`) is a duplicate of FOREIGN KEY fk_2 (`id`) REFERENCES `issue_331`.`issue_331_t1` (`t1_id`)
1539+# FOREIGN KEY fk_2 (`id`) REFERENCES `issue_331`.`issue_331_t1` (`t1_id`) is a duplicate of FOREIGN KEY fk_1 (`id`) REFERENCES `issue_331`.`issue_331_t1` (`t1_id`)
1540 # Key definitions:
1541+# CONSTRAINT `fk_2` FOREIGN KEY (`id`) REFERENCES `issue_331_t1` (`t1_id`)
1542 # CONSTRAINT `fk_1` FOREIGN KEY (`id`) REFERENCES `issue_331_t1` (`t1_id`)
1543-# CONSTRAINT `fk_2` FOREIGN KEY (`id`) REFERENCES `issue_331_t1` (`t1_id`)
1544 # Column types:
1545 # `id` bigint(20) not null default '0'
1546 # To remove this duplicate foreign key, execute:
1547-ALTER TABLE `issue_331`.`issue_331_t2` DROP FOREIGN KEY `fk_1`;
1548+ALTER TABLE `issue_331`.`issue_331_t2` DROP FOREIGN KEY `fk_2`;
1549
1550 # MySQL uses the PRIMARY index for this foreign key constraint
1551
1552
1553=== modified file 't/pt-duplicate-key-checker/samples/simple_dupe_bug_1217013.txt'
1554--- t/pt-duplicate-key-checker/samples/simple_dupe_bug_1217013.txt 2013-12-12 03:39:09 +0000
1555+++ t/pt-duplicate-key-checker/samples/simple_dupe_bug_1217013.txt 2015-04-15 23:37:30 +0000
1556@@ -2,15 +2,19 @@
1557 # test.domains
1558 # ########################################################################
1559
1560-# Uniqueness of domain ignored because unique_key_domain is a duplicate constraint
1561-# domain is a duplicate of unique_key_domain
1562+# PRIMARY (`id`)
1563+# domain (`domain`)
1564+# unique_key_domain (`domain`)
1565+
1566+# Uniqueness of unique_key_domain ignored because domain is a duplicate constraint
1567+# unique_key_domain is a duplicate of domain
1568 # Key definitions:
1569+# UNIQUE KEY `unique_key_domain` (`domain`)
1570 # UNIQUE KEY `domain` (`domain`),
1571-# UNIQUE KEY `unique_key_domain` (`domain`)
1572 # Column types:
1573 # `domain` varchar(175) collate utf8_bin not null
1574 # To remove this duplicate index, execute:
1575-ALTER TABLE `test`.`domains` DROP INDEX `domain`;
1576+ALTER TABLE `test`.`domains` DROP INDEX `unique_key_domain`;
1577
1578 # ########################################################################
1579 # Summary of indexes
1580
1581=== modified file 't/pt-slave-find/pt-slave-find.t'
1582--- t/pt-slave-find/pt-slave-find.t 2012-08-14 23:08:06 +0000
1583+++ t/pt-slave-find/pt-slave-find.t 2015-04-15 23:37:30 +0000
1584@@ -43,7 +43,7 @@
1585 plan skip_all => 'Cannot connect to second sandbox slave';
1586 }
1587 else {
1588- plan tests => 9;
1589+ plan tests => 10;
1590 }
1591
1592 my @args = ('h=127.0.0.1,P=12345,u=msandbox,p=msandbox');
1593@@ -67,6 +67,17 @@
1594 EOF
1595 is($output, $expected, 'Master with slave and slave of slave');
1596
1597+###############################################################################
1598+# Test --resolve-hostname option (we don't know the hostname of the test
1599+# machine so we settle for any non null string)
1600+###############################################################################
1601+$output = `$trunk/bin/pt-slave-find -h 127.0.0.1 -P 12345 -u msandbox -p msandbox --report-format hostname --resolve-address`;
1602+like (
1603+ $output,
1604+ qr/127\.0\.0\.1:12345\s+\(\w+\)/s,
1605+ "--resolve-address option"
1606+) or diag($output);
1607+
1608 # #############################################################################
1609 # Until MasterSlave::find_slave_hosts() is improved to overcome the problems
1610 # with SHOW SLAVE HOSTS, this test won't work.
1611@@ -146,6 +157,7 @@
1612 "Summary report format",
1613 );
1614
1615+
1616 # #############################################################################
1617 # Done.
1618 # #############################################################################
1619
1620=== modified file 't/pt-table-checksum/progress.t'
1621--- t/pt-table-checksum/progress.t 2013-03-02 02:02:13 +0000
1622+++ t/pt-table-checksum/progress.t 2015-04-15 23:37:30 +0000
1623@@ -68,7 +68,7 @@
1624 # then starts it again.
1625 # TEST_WISHLIST PLUGIN_WISHLIST: do this with a plugin to the tool itself,
1626 # not in this unreliable fashion.
1627-system("$trunk/util/wait-to-exec '$scripts/wait-for-chunk.sh 12345 sakila city 1' '$scripts/exec-wait-exec.sh 12347 \"stop slave sql_thread\" 2 \"start slave sql_thread\"' 3 >/dev/null &");
1628+system("$trunk/util/wait-to-exec '$scripts/wait-for-chunk.sh 12345 sakila city 1' '$scripts/exec-wait-exec.sh 12347 \"stop slave sql_thread\" 2 \"start slave sql_thread\"' 4 >/dev/null &");
1629
1630 $output = output(
1631 sub { pt_table_checksum::main(@args, qw(-d sakila)); },
1632
1633=== added file 't/pt-upgrade/issue_1421781.t'
1634--- t/pt-upgrade/issue_1421781.t 1970-01-01 00:00:00 +0000
1635+++ t/pt-upgrade/issue_1421781.t 2015-04-15 23:37:30 +0000
1636@@ -0,0 +1,66 @@
1637+#!/usr/bin/env perl
1638+
1639+BEGIN {
1640+ die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
1641+ unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
1642+ unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
1643+};
1644+
1645+use strict;
1646+use warnings FATAL => 'all';
1647+use English qw(-no_match_vars);
1648+use Test::More;
1649+use File::Basename;
1650+use File::Temp qw(tempdir);
1651+
1652+$ENV{PERCONA_TOOLKIT_TEST_USE_DSN_NAMES} = 1;
1653+$ENV{PRETTY_RESULTS} = 1;
1654+
1655+use PerconaTest;
1656+use Sandbox;
1657+require "$trunk/bin/pt-upgrade";
1658+
1659+my $dp = new DSNParser(opts=>$dsn_opts);
1660+my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp);
1661+my $dbh1 = $sb->get_dbh_for('host1');
1662+
1663+
1664+if ( !$dbh1 ) {
1665+ plan skip_all => 'Cannot connect to sandbox host1';
1666+}
1667+
1668+my $host1_dsn = $sb->dsn_for('host1');
1669+my $tmpdir = tempdir("/tmp/pt-upgrade.$PID.XXXXXX", CLEANUP => 1);
1670+my $samples = "$trunk/t/pt-upgrade/samples";
1671+my $lib_samples = "$trunk/t/lib/samples";
1672+my $exit_status = 0;
1673+my $output;
1674+
1675+# #############################################################################
1676+# genlog
1677+# #############################################################################
1678+
1679+`rm -f /tmp/test_select_into_*.log`;
1680+
1681+$output = output(
1682+ sub {
1683+ $exit_status = pt_upgrade::main($host1_dsn, '--save-results', $tmpdir,
1684+ qw(--type rawlog),
1685+ "$samples/select_into.log",
1686+ )},
1687+ stderr => 1,
1688+);
1689+
1690+is(
1691+ $exit_status,
1692+ 0,
1693+ "Does not fail on SELECT...INTO statements"
1694+);
1695+
1696+
1697+# #############################################################################
1698+# Done.
1699+# #############################################################################
1700+$sb->wipe_clean($dbh1);
1701+ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
1702+done_testing;
1703
1704=== added directory 't/pt-upgrade/samples/008'
1705=== added file 't/pt-upgrade/samples/008/conf'
1706--- t/pt-upgrade/samples/008/conf 1970-01-01 00:00:00 +0000
1707+++ t/pt-upgrade/samples/008/conf 2015-04-15 23:37:30 +0000
1708@@ -0,0 +1,2 @@
1709+type=rawlog
1710+max-examples=3
1711
1712=== added file 't/pt-upgrade/samples/008/fingerprint-grouping-and-max-examples-issue-1421405.log'
1713--- t/pt-upgrade/samples/008/fingerprint-grouping-and-max-examples-issue-1421405.log 1970-01-01 00:00:00 +0000
1714+++ t/pt-upgrade/samples/008/fingerprint-grouping-and-max-examples-issue-1421405.log 2015-04-15 23:37:30 +0000
1715@@ -0,0 +1,9 @@
1716+select @@port
1717+select @@port
1718+select @@port
1719+select @@port
1720+select @@port
1721+select @@port
1722+select @@port
1723+select @@port
1724+select @@port
1725
1726=== added file 't/pt-upgrade/samples/008/fingerprint-grouping-and-max-examples-issue-1421405.txt'
1727--- t/pt-upgrade/samples/008/fingerprint-grouping-and-max-examples-issue-1421405.txt 1970-01-01 00:00:00 +0000
1728+++ t/pt-upgrade/samples/008/fingerprint-grouping-and-max-examples-issue-1421405.txt 2015-04-15 23:37:30 +0000
1729@@ -0,0 +1,75 @@
1730+
1731+#-----------------------------------------------------------------------
1732+# Logs
1733+#-----------------------------------------------------------------------
1734+
1735+File: ...
1736+Size: 126
1737+
1738+#-----------------------------------------------------------------------
1739+# Hosts
1740+#-----------------------------------------------------------------------
1741+
1742+host1:
1743+
1744+ DSN: h=127.1,P=12345
1745+ hostname: ...
1746+ MySQL: ...
1747+
1748+host2:
1749+
1750+ DSN: h=127.1,P=12348
1751+ hostname: ...
1752+ MySQL: ...
1753+
1754+########################################################################
1755+# Query class 3530F787A2430DC8
1756+########################################################################
1757+
1758+Reporting class because there are 3 row diffs.
1759+
1760+Total queries 3
1761+Unique queries 3
1762+Discarded queries 0
1763+
1764+select @@port
1765+
1766+##
1767+## Row diffs: 3
1768+##
1769+
1770+-- 1.
1771+
1772+@ row 1
1773+< 12345
1774+> 12348
1775+
1776+select @@port
1777+
1778+-- 2.
1779+
1780+@ row 1
1781+< 12345
1782+> 12348
1783+
1784+select @@port
1785+
1786+-- 3.
1787+
1788+@ row 1
1789+< 12345
1790+> 12348
1791+
1792+select @@port
1793+
1794+#-----------------------------------------------------------------------
1795+# Stats
1796+#-----------------------------------------------------------------------
1797+
1798+failed_queries 0
1799+not_select 0
1800+queries_filtered 0
1801+queries_no_diffs 0
1802+queries_read 9
1803+queries_with_diffs 9
1804+queries_with_errors 0
1805
1806=== added file 't/pt-upgrade/samples/select_into.log'
1807--- t/pt-upgrade/samples/select_into.log 1970-01-01 00:00:00 +0000
1808+++ t/pt-upgrade/samples/select_into.log 2015-04-15 23:37:30 +0000
1809@@ -0,0 +1,4 @@
1810+SELECT 1 INTO @foo;
1811+SELECT * FROM sakila.actor INTO OUTFILE '/tmp/test_select_into_1.log';
1812+SELECT actor_id,first_name FROM sakila.actor LIMIT 1 INTO DUMPFILE '/tmp/test_select_into_2.log';
1813+

Subscribers

People subscribed via source and target branches