From 871e217f3b502ca3b4f34b58a1ece254ad0d537d Mon Sep 17 00:00:00 2001 From: Brian Fraser Date: Fri, 19 Apr 2013 20:26:48 -0300 Subject: [PATCH] Build percona-toolkit-2.2.2 --- Changelog | 2 + Makefile.PL | 2 +- bin/pt-align | 2 +- bin/pt-archiver | 15 +++- bin/pt-config-diff | 39 ++++++++- bin/pt-deadlock-logger | 39 ++++++++- bin/pt-diskstats | 44 +++++++++- bin/pt-duplicate-key-checker | 4 +- bin/pt-fifo-split | 42 ++++++++- bin/pt-find | 4 +- bin/pt-fingerprint | 42 ++++++++- bin/pt-fk-error-logger | 30 ++++++- bin/pt-heartbeat | 10 ++- bin/pt-index-usage | 4 +- bin/pt-ioprofile | 6 +- bin/pt-kill | 32 ++++++- bin/pt-mext | 2 +- bin/pt-mysql-summary | 2 +- bin/pt-online-schema-change | 162 ++++++++++++++++++++++++++++++++--- bin/pt-pmp | 2 +- bin/pt-query-digest | 6 +- bin/pt-show-grants | 2 +- bin/pt-sift | 2 +- bin/pt-slave-delay | 15 +++- bin/pt-slave-find | 13 ++- bin/pt-slave-restart | 15 +++- bin/pt-stalk | 2 +- bin/pt-summary | 2 +- bin/pt-table-checksum | 4 +- bin/pt-table-sync | 17 +++- bin/pt-table-usage | 2 +- bin/pt-upgrade | 30 ++++++- bin/pt-variable-advisor | 13 ++- bin/pt-visual-explain | 2 +- config/deb/changelog | 17 ++++ config/sphinx-build/conf.py | 2 +- docs/percona-toolkit.pod | 2 +- docs/release_notes.rst | 54 ++++++++++++ lib/Percona/Toolkit.pm | 2 +- 39 files changed, 606 insertions(+), 81 deletions(-) diff --git a/Changelog b/Changelog index 39644b00..ae6522d9 100644 --- a/Changelog +++ b/Changelog @@ -1,5 +1,7 @@ Changelog for Percona Toolkit +v2.2.2 released 2013-04-19 + * Restored --show-all in pt-query-digest * Cluster nodes can now be autodiscovered in pt-table-checksum * Fixed bug 1127450: pt-archiver --charset and --bulk-insert fail, may corrupt data diff --git a/Makefile.PL b/Makefile.PL index 38135382..eb498a2f 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -2,7 +2,7 @@ use ExtUtils::MakeMaker; WriteMakefile( NAME => 'percona-toolkit', - VERSION => '2.2.1', + VERSION => '2.2.2', EXE_FILES => [ ], MAN1PODS => { 'docs/percona-toolkit.pod' => 'blib/man1/percona-toolkit.1p', diff --git a/bin/pt-align b/bin/pt-align index d544058b..73bcfbd7 100755 --- a/bin/pt-align +++ b/bin/pt-align @@ -1313,6 +1313,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-align 2.2.1 +pt-align 2.2.2 =cut diff --git a/bin/pt-archiver b/bin/pt-archiver index 6df135c5..395a56ce 100755 --- a/bin/pt-archiver +++ b/bin/pt-archiver @@ -42,7 +42,7 @@ BEGIN { # ########################################################################### { package Percona::Toolkit; -our $VERSION = '2.2.1'; +our $VERSION = '2.2.2'; 1; } @@ -60,6 +60,7 @@ our $VERSION = '2.2.1'; # ########################################################################### { package Lmo::Utils; + use strict; use warnings qw( FATAL all ); require Exporter; @@ -67,7 +68,12 @@ our (@ISA, @EXPORT, @EXPORT_OK); BEGIN { @ISA = qw(Exporter); - @EXPORT = @EXPORT_OK = qw(_install_coderef _unimport_coderefs _glob_for _stash_for); + @EXPORT = @EXPORT_OK = qw( + _install_coderef + _unimport_coderefs + _glob_for + _stash_for + ); } { @@ -251,7 +257,6 @@ sub meta { return Lmo::Meta->new(class => $class); } - 1; } # ########################################################################### @@ -3462,6 +3467,8 @@ sub get_slaves { my $dp = $self->{DSNParser}; my $methods = $self->_resolve_recursion_methods($args{dsn}); + return $slaves unless @$methods; + if ( grep { m/processlist|hosts/i } @$methods ) { my @required_args = qw(dbh dsn); foreach my $arg ( @required_args ) { @@ -7847,6 +7854,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-archiver 2.2.1 +pt-archiver 2.2.2 =cut diff --git a/bin/pt-config-diff b/bin/pt-config-diff index 2b97560f..dd8c4557 100755 --- a/bin/pt-config-diff +++ b/bin/pt-config-diff @@ -42,7 +42,7 @@ BEGIN { # ########################################################################### { package Percona::Toolkit; -our $VERSION = '2.2.1'; +our $VERSION = '2.2.2'; 1; } @@ -60,6 +60,7 @@ our $VERSION = '2.2.1'; # ########################################################################### { package Lmo::Utils; + use strict; use warnings qw( FATAL all ); require Exporter; @@ -67,7 +68,12 @@ our (@ISA, @EXPORT, @EXPORT_OK); BEGIN { @ISA = qw(Exporter); - @EXPORT = @EXPORT_OK = qw(_install_coderef _unimport_coderefs _glob_for _stash_for); + @EXPORT = @EXPORT_OK = qw( + _install_coderef + _unimport_coderefs + _glob_for + _stash_for + ); } { @@ -251,7 +257,6 @@ sub meta { return Lmo::Meta->new(class => $class); } - 1; } # ########################################################################### @@ -2326,6 +2331,32 @@ sub name { return $self->{hostname} || $self->{dsn_name} || 'unknown host'; } +sub remove_duplicate_cxns { + my ($self, %args) = @_; + my @cxns = @{$args{cxns}}; + my $seen_ids = $args{seen_ids} || {}; + PTDEBUG && _d("Removing duplicates from ", join(" ", map { $_->name } @cxns)); + my @trimmed_cxns; + + for my $cxn ( @cxns ) { + my $dbh = $cxn->dbh(); + my $sql = q{SELECT @@server_id}; + PTDEBUG && _d($sql); + my ($id) = $dbh->selectrow_array($sql); + PTDEBUG && _d('Server ID for ', $cxn->name, ': ', $id); + + if ( ! $seen_ids->{$id}++ ) { + push @trimmed_cxns, $cxn + } + else { + PTDEBUG && _d("Removing ", $cxn->name, + ", ID ", $id, ", because we've already seen it"); + } + } + + return \@trimmed_cxns; +} + sub DESTROY { my ($self) = @_; @@ -5664,6 +5695,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-config-diff 2.2.1 +pt-config-diff 2.2.2 =cut diff --git a/bin/pt-deadlock-logger b/bin/pt-deadlock-logger index 8ae68f04..483c1a62 100755 --- a/bin/pt-deadlock-logger +++ b/bin/pt-deadlock-logger @@ -41,7 +41,7 @@ BEGIN { # ########################################################################### { package Percona::Toolkit; -our $VERSION = '2.2.1'; +our $VERSION = '2.2.2'; 1; } @@ -1124,6 +1124,7 @@ if ( PTDEBUG ) { # ########################################################################### { package Lmo::Utils; + use strict; use warnings qw( FATAL all ); require Exporter; @@ -1131,7 +1132,12 @@ our (@ISA, @EXPORT, @EXPORT_OK); BEGIN { @ISA = qw(Exporter); - @EXPORT = @EXPORT_OK = qw(_install_coderef _unimport_coderefs _glob_for _stash_for); + @EXPORT = @EXPORT_OK = qw( + _install_coderef + _unimport_coderefs + _glob_for + _stash_for + ); } { @@ -1315,7 +1321,6 @@ sub meta { return Lmo::Meta->new(class => $class); } - 1; } # ########################################################################### @@ -2670,6 +2675,32 @@ sub name { return $self->{hostname} || $self->{dsn_name} || 'unknown host'; } +sub remove_duplicate_cxns { + my ($self, %args) = @_; + my @cxns = @{$args{cxns}}; + my $seen_ids = $args{seen_ids} || {}; + PTDEBUG && _d("Removing duplicates from ", join(" ", map { $_->name } @cxns)); + my @trimmed_cxns; + + for my $cxn ( @cxns ) { + my $dbh = $cxn->dbh(); + my $sql = q{SELECT @@server_id}; + PTDEBUG && _d($sql); + my ($id) = $dbh->selectrow_array($sql); + PTDEBUG && _d('Server ID for ', $cxn->name, ': ', $id); + + if ( ! $seen_ids->{$id}++ ) { + push @trimmed_cxns, $cxn + } + else { + PTDEBUG && _d("Removing ", $cxn->name, + ", ID ", $id, ", because we've already seen it"); + } + } + + return \@trimmed_cxns; +} + sub DESTROY { my ($self) = @_; @@ -5437,6 +5468,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-deadlock-logger 2.2.1 +pt-deadlock-logger 2.2.2 =cut diff --git a/bin/pt-diskstats b/bin/pt-diskstats index 99b1762d..4424614c 100755 --- a/bin/pt-diskstats +++ b/bin/pt-diskstats @@ -37,7 +37,7 @@ BEGIN { # ########################################################################### { package Percona::Toolkit; -our $VERSION = '2.2.1'; +our $VERSION = '2.2.2'; 1; } @@ -63,6 +63,7 @@ use constant PTDEBUG => $ENV{PTDEBUG} || 0; use List::Util qw(max); use Getopt::Long; +use Data::Dumper; my $POD_link_re = '[LC]<"?([^">]+)"?>'; @@ -1046,6 +1047,45 @@ sub _parse_synopsis { ); }; +sub set_vars { + my ($self, $file) = @_; + $file ||= $self->{file} || __FILE__; + + my %user_vars; + my $user_vars = $self->has('set-vars') ? $self->get('set-vars') : undef; + if ( $user_vars ) { + foreach my $var_val ( @$user_vars ) { + my ($var, $val) = $var_val =~ m/([^\s=]+)=(\S+)/; + die "Invalid --set-vars value: $var_val\n" unless $var && $val; + $user_vars{$var} = { + val => $val, + default => 0, + }; + } + } + + my %default_vars; + my $default_vars = $self->read_para_after($file, qr/MAGIC_set_vars/); + if ( $default_vars ) { + %default_vars = map { + my $var_val = $_; + my ($var, $val) = $var_val =~ m/([^\s=]+)=(\S+)/; + die "Invalid --set-vars value: $var_val\n" unless $var && $val; + $var => { + val => $val, + default => 1, + }; + } split("\n", $default_vars); + } + + my %vars = ( + %default_vars, # first the tool's defaults + %user_vars, # then the user's which overwrite the defaults + ); + PTDEBUG && _d('--set-vars:', Dumper(\%vars)); + return \%vars; +} + sub _d { my ($package, undef, $line) = caller 0; @_ = map { (my $temp = $_) =~ s/\n/\n# /g; $temp; } @@ -5501,6 +5541,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-diskstats 2.2.1 +pt-diskstats 2.2.2 =cut diff --git a/bin/pt-duplicate-key-checker b/bin/pt-duplicate-key-checker index 6417d49a..96b9e287 100755 --- a/bin/pt-duplicate-key-checker +++ b/bin/pt-duplicate-key-checker @@ -38,7 +38,7 @@ BEGIN { # ########################################################################### { package Percona::Toolkit; -our $VERSION = '2.2.1'; +our $VERSION = '2.2.2'; 1; } @@ -5480,6 +5480,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-duplicate-key-checker 2.2.1 +pt-duplicate-key-checker 2.2.2 =cut diff --git a/bin/pt-fifo-split b/bin/pt-fifo-split index 6a3a8e94..f1ca6762 100755 --- a/bin/pt-fifo-split +++ b/bin/pt-fifo-split @@ -36,6 +36,7 @@ use constant PTDEBUG => $ENV{PTDEBUG} || 0; use List::Util qw(max); use Getopt::Long; +use Data::Dumper; my $POD_link_re = '[LC]<"?([^">]+)"?>'; @@ -1019,6 +1020,45 @@ sub _parse_synopsis { ); }; +sub set_vars { + my ($self, $file) = @_; + $file ||= $self->{file} || __FILE__; + + my %user_vars; + my $user_vars = $self->has('set-vars') ? $self->get('set-vars') : undef; + if ( $user_vars ) { + foreach my $var_val ( @$user_vars ) { + my ($var, $val) = $var_val =~ m/([^\s=]+)=(\S+)/; + die "Invalid --set-vars value: $var_val\n" unless $var && $val; + $user_vars{$var} = { + val => $val, + default => 0, + }; + } + } + + my %default_vars; + my $default_vars = $self->read_para_after($file, qr/MAGIC_set_vars/); + if ( $default_vars ) { + %default_vars = map { + my $var_val = $_; + my ($var, $val) = $var_val =~ m/([^\s=]+)=(\S+)/; + die "Invalid --set-vars value: $var_val\n" unless $var && $val; + $var => { + val => $val, + default => 1, + }; + } split("\n", $default_vars); + } + + my %vars = ( + %default_vars, # first the tool's defaults + %user_vars, # then the user's which overwrite the defaults + ); + PTDEBUG && _d('--set-vars:', Dumper(\%vars)); + return \%vars; +} + sub _d { my ($package, undef, $line) = caller 0; @_ = map { (my $temp = $_) =~ s/\n/\n# /g; $temp; } @@ -1562,6 +1602,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-fifo-split 2.2.1 +pt-fifo-split 2.2.2 =cut diff --git a/bin/pt-find b/bin/pt-find index f7d50d5b..88c0d37b 100755 --- a/bin/pt-find +++ b/bin/pt-find @@ -34,7 +34,7 @@ BEGIN { # ########################################################################### { package Percona::Toolkit; -our $VERSION = '2.2.1'; +our $VERSION = '2.2.2'; 1; } @@ -4946,6 +4946,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-find 2.2.1 +pt-find 2.2.2 =cut diff --git a/bin/pt-fingerprint b/bin/pt-fingerprint index a0227071..3cfe81c3 100755 --- a/bin/pt-fingerprint +++ b/bin/pt-fingerprint @@ -37,6 +37,7 @@ use constant PTDEBUG => $ENV{PTDEBUG} || 0; use List::Util qw(max); use Getopt::Long; +use Data::Dumper; my $POD_link_re = '[LC]<"?([^">]+)"?>'; @@ -1020,6 +1021,45 @@ sub _parse_synopsis { ); }; +sub set_vars { + my ($self, $file) = @_; + $file ||= $self->{file} || __FILE__; + + my %user_vars; + my $user_vars = $self->has('set-vars') ? $self->get('set-vars') : undef; + if ( $user_vars ) { + foreach my $var_val ( @$user_vars ) { + my ($var, $val) = $var_val =~ m/([^\s=]+)=(\S+)/; + die "Invalid --set-vars value: $var_val\n" unless $var && $val; + $user_vars{$var} = { + val => $val, + default => 0, + }; + } + } + + my %default_vars; + my $default_vars = $self->read_para_after($file, qr/MAGIC_set_vars/); + if ( $default_vars ) { + %default_vars = map { + my $var_val = $_; + my ($var, $val) = $var_val =~ m/([^\s=]+)=(\S+)/; + die "Invalid --set-vars value: $var_val\n" unless $var && $val; + $var => { + val => $val, + default => 1, + }; + } split("\n", $default_vars); + } + + my %vars = ( + %default_vars, # first the tool's defaults + %user_vars, # then the user's which overwrite the defaults + ); + PTDEBUG && _d('--set-vars:', Dumper(\%vars)); + return \%vars; +} + sub _d { my ($package, undef, $line) = caller 0; @_ = map { (my $temp = $_) =~ s/\n/\n# /g; $temp; } @@ -2153,6 +2193,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-fingerprint 2.2.1 +pt-fingerprint 2.2.2 =cut diff --git a/bin/pt-fk-error-logger b/bin/pt-fk-error-logger index 4066e5ed..40cd7fc9 100755 --- a/bin/pt-fk-error-logger +++ b/bin/pt-fk-error-logger @@ -36,7 +36,7 @@ BEGIN { # ########################################################################### { package Percona::Toolkit; -our $VERSION = '2.2.1'; +our $VERSION = '2.2.2'; 1; } @@ -1827,6 +1827,32 @@ sub name { return $self->{hostname} || $self->{dsn_name} || 'unknown host'; } +sub remove_duplicate_cxns { + my ($self, %args) = @_; + my @cxns = @{$args{cxns}}; + my $seen_ids = $args{seen_ids} || {}; + PTDEBUG && _d("Removing duplicates from ", join(" ", map { $_->name } @cxns)); + my @trimmed_cxns; + + for my $cxn ( @cxns ) { + my $dbh = $cxn->dbh(); + my $sql = q{SELECT @@server_id}; + PTDEBUG && _d($sql); + my ($id) = $dbh->selectrow_array($sql); + PTDEBUG && _d('Server ID for ', $cxn->name, ': ', $id); + + if ( ! $seen_ids->{$id}++ ) { + push @trimmed_cxns, $cxn + } + else { + PTDEBUG && _d("Removing ", $cxn->name, + ", ID ", $id, ", because we've already seen it"); + } + } + + return \@trimmed_cxns; +} + sub DESTROY { my ($self) = @_; @@ -4445,6 +4471,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-fk-error-logger 2.2.1 +pt-fk-error-logger 2.2.2 =cut diff --git a/bin/pt-heartbeat b/bin/pt-heartbeat index 9e02a658..0e2100ee 100755 --- a/bin/pt-heartbeat +++ b/bin/pt-heartbeat @@ -37,7 +37,7 @@ BEGIN { # ########################################################################### { package Percona::Toolkit; -our $VERSION = '2.2.1'; +our $VERSION = '2.2.2'; 1; } @@ -105,6 +105,8 @@ sub get_slaves { my $dp = $self->{DSNParser}; my $methods = $self->_resolve_recursion_methods($args{dsn}); + return $slaves unless @$methods; + if ( grep { m/processlist|hosts/i } @$methods ) { my @required_args = qw(dbh dsn); foreach my $arg ( @required_args ) { @@ -3047,6 +3049,8 @@ use warnings FATAL => 'all'; use English qw(-no_match_vars); use constant PTDEBUG => $ENV{PTDEBUG} || 0; +use Time::HiRes qw(sleep); + sub new { my ( $class, %args ) = @_; my $self = { @@ -5955,7 +5959,7 @@ not check or adjust for different system or MySQL time zones which can cause the tool to compute the lag incorrectly. Specifying this option is a good idea because it ensures that the tool works correctly regardless of time zones, but it also makes the tool backwards-incompatible with -pt-heartbeat 2.2.1 and older (unless the older version of pt-heartbeat +pt-heartbeat 2.2.2 and older (unless the older version of pt-heartbeat is running on a system that uses UTC). =item --version @@ -6137,6 +6141,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-heartbeat 2.2.1 +pt-heartbeat 2.2.2 =cut diff --git a/bin/pt-index-usage b/bin/pt-index-usage index fa67dfbc..d0d32ddb 100755 --- a/bin/pt-index-usage +++ b/bin/pt-index-usage @@ -44,7 +44,7 @@ BEGIN { # ########################################################################### { package Percona::Toolkit; -our $VERSION = '2.2.1'; +our $VERSION = '2.2.2'; 1; } @@ -7476,6 +7476,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-index-usage 2.2.1 +pt-index-usage 2.2.2 =cut diff --git a/bin/pt-ioprofile b/bin/pt-ioprofile index 2039d836..1f6a3dab 100755 --- a/bin/pt-ioprofile +++ b/bin/pt-ioprofile @@ -345,14 +345,14 @@ _parse_command_line() { if [ "$next_opt_is_val" ]; then next_opt_is_val="" - if [ $# -eq 0 ] || [ $(expr "$opt" : "-") -eq 1 ]; then + if [ $# -eq 0 ] || [ $(expr "$opt" : "\-") -eq 1 ]; then option_error "$real_opt requires a $required_arg argument" continue fi val="$opt" opt_is_ok=1 else - if [ $(expr "$opt" : "-") -eq 0 ]; then + if [ $(expr "$opt" : "\-") -eq 0 ]; then if [ -z "$ARGV" ]; then ARGV="$opt" else @@ -1115,7 +1115,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-ioprofile 2.2.1 +pt-ioprofile 2.2.2 =cut diff --git a/bin/pt-kill b/bin/pt-kill index fe71ea67..237dd134 100755 --- a/bin/pt-kill +++ b/bin/pt-kill @@ -46,7 +46,7 @@ BEGIN { # ########################################################################### { package Percona::Toolkit; -our $VERSION = '2.2.1'; +our $VERSION = '2.2.2'; 1; } @@ -3738,6 +3738,8 @@ sub get_slaves { my $dp = $self->{DSNParser}; my $methods = $self->_resolve_recursion_methods($args{dsn}); + return $slaves unless @$methods; + if ( grep { m/processlist|hosts/i } @$methods ) { my @required_args = qw(dbh dsn); foreach my $arg ( @required_args ) { @@ -5178,6 +5180,32 @@ sub name { return $self->{hostname} || $self->{dsn_name} || 'unknown host'; } +sub remove_duplicate_cxns { + my ($self, %args) = @_; + my @cxns = @{$args{cxns}}; + my $seen_ids = $args{seen_ids} || {}; + PTDEBUG && _d("Removing duplicates from ", join(" ", map { $_->name } @cxns)); + my @trimmed_cxns; + + for my $cxn ( @cxns ) { + my $dbh = $cxn->dbh(); + my $sql = q{SELECT @@server_id}; + PTDEBUG && _d($sql); + my ($id) = $dbh->selectrow_array($sql); + PTDEBUG && _d('Server ID for ', $cxn->name, ': ', $id); + + if ( ! $seen_ids->{$id}++ ) { + push @trimmed_cxns, $cxn + } + else { + PTDEBUG && _d("Removing ", $cxn->name, + ", ID ", $id, ", because we've already seen it"); + } + } + + return \@trimmed_cxns; +} + sub DESTROY { my ($self) = @_; @@ -8098,6 +8126,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-kill 2.2.1 +pt-kill 2.2.2 =cut diff --git a/bin/pt-mext b/bin/pt-mext index 8c087c53..6ee065bf 100755 --- a/bin/pt-mext +++ b/bin/pt-mext @@ -791,7 +791,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-mext 2.2.1 +pt-mext 2.2.2 =cut diff --git a/bin/pt-mysql-summary b/bin/pt-mysql-summary index 52de71fd..0cbf8bb6 100755 --- a/bin/pt-mysql-summary +++ b/bin/pt-mysql-summary @@ -3111,7 +3111,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-mysql-summary 2.2.1 +pt-mysql-summary 2.2.2 =cut diff --git a/bin/pt-online-schema-change b/bin/pt-online-schema-change index 9afafc2e..dd4e0691 100755 --- a/bin/pt-online-schema-change +++ b/bin/pt-online-schema-change @@ -53,7 +53,7 @@ BEGIN { # ########################################################################### { package Percona::Toolkit; -our $VERSION = '2.2.1'; +our $VERSION = '2.2.2'; 1; } @@ -1137,6 +1137,7 @@ if ( PTDEBUG ) { # ########################################################################### { package Lmo::Utils; + use strict; use warnings qw( FATAL all ); require Exporter; @@ -1144,7 +1145,12 @@ our (@ISA, @EXPORT, @EXPORT_OK); BEGIN { @ISA = qw(Exporter); - @EXPORT = @EXPORT_OK = qw(_install_coderef _unimport_coderefs _glob_for _stash_for); + @EXPORT = @EXPORT_OK = qw( + _install_coderef + _unimport_coderefs + _glob_for + _stash_for + ); } { @@ -1328,7 +1334,6 @@ sub meta { return Lmo::Meta->new(class => $class); } - 1; } # ########################################################################### @@ -3786,6 +3791,32 @@ sub name { return $self->{hostname} || $self->{dsn_name} || 'unknown host'; } +sub remove_duplicate_cxns { + my ($self, %args) = @_; + my @cxns = @{$args{cxns}}; + my $seen_ids = $args{seen_ids} || {}; + PTDEBUG && _d("Removing duplicates from ", join(" ", map { $_->name } @cxns)); + my @trimmed_cxns; + + for my $cxn ( @cxns ) { + my $dbh = $cxn->dbh(); + my $sql = q{SELECT @@server_id}; + PTDEBUG && _d($sql); + my ($id) = $dbh->selectrow_array($sql); + PTDEBUG && _d('Server ID for ', $cxn->name, ': ', $id); + + if ( ! $seen_ids->{$id}++ ) { + push @trimmed_cxns, $cxn + } + else { + PTDEBUG && _d("Removing ", $cxn->name, + ", ID ", $id, ", because we've already seen it"); + } + } + + return \@trimmed_cxns; +} + sub DESTROY { my ($self) = @_; @@ -3880,6 +3911,8 @@ sub get_slaves { my $dp = $self->{DSNParser}; my $methods = $self->_resolve_recursion_methods($args{dsn}); + return $slaves unless @$methods; + if ( grep { m/processlist|hosts/i } @$methods ) { my @required_args = qw(dbh dsn); foreach my $arg ( @required_args ) { @@ -7481,6 +7514,8 @@ use constant PTDEBUG => $ENV{PTDEBUG} || 0; use Lmo; use Data::Dumper; +{ local $EVAL_ERROR; eval { require Cxn } }; + sub get_cluster_name { my ($self, $cxn) = @_; my $sql = "SHOW VARIABLES LIKE 'wsrep\_cluster\_name'"; @@ -7505,13 +7540,67 @@ sub is_cluster_node { sub same_node { my ($self, $cxn1, $cxn2) = @_; - my $sql = "SHOW VARIABLES LIKE 'wsrep\_sst\_receive\_address'"; - PTDEBUG && _d($cxn1->name, $sql); - my (undef, $val1) = $cxn1->dbh->selectrow_array($sql); - PTDEBUG && _d($cxn2->name, $sql); - my (undef, $val2) = $cxn2->dbh->selectrow_array($sql); + foreach my $val ('wsrep\_sst\_receive\_address', 'wsrep\_node\_name', 'wsrep\_node\_address') { + my $sql = "SHOW VARIABLES LIKE '$val'"; + PTDEBUG && _d($cxn1->name, $cxn2->name, $sql); + my (undef, $val1) = $cxn1->dbh->selectrow_array($sql); + my (undef, $val2) = $cxn2->dbh->selectrow_array($sql); - return ($val1 || '') eq ($val2 || ''); + return unless ($val1 || '') eq ($val2 || ''); + } + + return 1; +} + +sub find_cluster_nodes { + my ($self, %args) = @_; + + my $dbh = $args{dbh}; + my $dsn = $args{dsn}; + my $dp = $args{DSNParser}; + my $make_cxn = $args{make_cxn}; + + + my $sql = q{SHOW STATUS LIKE 'wsrep\_incoming\_addresses'}; + PTDEBUG && _d($sql); + my (undef, $addresses) = $dbh->selectrow_array($sql); + PTDEBUG && _d("Cluster nodes found: ", $addresses); + return unless $addresses; + + my @addresses = grep { !/\Aunspecified\z/i } + split /,\s*/, $addresses; + + my @nodes; + foreach my $address ( @addresses ) { + my ($host, $port) = split /:/, $address; + my $spec = "h=$host" + . ($port ? ",P=$port" : ""); + my $node_dsn = $dp->parse($spec, $dsn); + my $node_dbh = eval { $dp->get_dbh( + $dp->get_cxn_params($node_dsn), { AutoCommit => 1 }) }; + if ( $EVAL_ERROR ) { + print STDERR "Cannot connect to ", $dp->as_string($node_dsn), + ", discovered through $sql: $EVAL_ERROR\n"; + if ( !$port && $dsn->{P} != 3306 ) { + $address .= ":3306"; + redo; + } + next; + } + PTDEBUG && _d('Connected to', $dp->as_string($node_dsn)); + $node_dbh->disconnect(); + + push @nodes, $make_cxn->(dsn => $node_dsn); + } + + return \@nodes; +} + +sub remove_duplicate_cxns { + my ($self, %args) = @_; + my @cxns = @{$args{cxns}}; + my $seen_ids = $args{seen_ids}; + return Cxn->remove_duplicate_cxns(%args); } sub same_cluster { @@ -7525,6 +7614,59 @@ sub same_cluster { return ($cluster1 || '') eq ($cluster2 || ''); } +sub autodetect_nodes { + my ($self, %args) = @_; + my $ms = $args{MasterSlave}; + my $dp = $args{DSNParser}; + my $make_cxn = $args{make_cxn}; + my $nodes = $args{nodes}; + my $seen_ids = $args{seen_ids}; + + my $new_nodes = []; + + return $new_nodes unless @$nodes; + + for my $node ( @$nodes ) { + my $nodes_found = $self->find_cluster_nodes( + dbh => $node->dbh(), + dsn => $node->dsn(), + make_cxn => $make_cxn, + DSNParser => $dp, + ); + push @$new_nodes, @$nodes_found; + } + + $new_nodes = $self->remove_duplicate_cxns( + cxns => $new_nodes, + seen_ids => $seen_ids + ); + + my $new_slaves = []; + foreach my $node (@$new_nodes) { + my $node_slaves = $ms->get_slaves( + dbh => $node->dbh(), + dsn => $node->dsn(), + make_cxn => $make_cxn, + ); + push @$new_slaves, @$node_slaves; + } + + $new_slaves = $self->remove_duplicate_cxns( + cxns => $new_slaves, + seen_ids => $seen_ids + ); + + my @new_slave_nodes = grep { $self->is_cluster_node($_) } @$new_slaves; + + my $slaves_of_slaves = $self->autodetect_nodes( + %args, + nodes => \@new_slave_nodes, + ); + + my @autodetected_nodes = ( @$new_nodes, @$new_slaves, @$slaves_of_slaves ); + return \@autodetected_nodes; +} + sub _d { my ($package, undef, $line) = caller 0; @_ = map { (my $temp = $_) =~ s/\n/\n# /g; $temp; } @@ -11255,6 +11397,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-online-schema-change 2.2.1 +pt-online-schema-change 2.2.2 =cut diff --git a/bin/pt-pmp b/bin/pt-pmp index 39ae6428..064b6f51 100755 --- a/bin/pt-pmp +++ b/bin/pt-pmp @@ -885,7 +885,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-pmp 2.2.1 +pt-pmp 2.2.2 =cut diff --git a/bin/pt-query-digest b/bin/pt-query-digest index dbb0b194..a3d6c2b2 100755 --- a/bin/pt-query-digest +++ b/bin/pt-query-digest @@ -63,7 +63,7 @@ BEGIN { # ########################################################################### { package Percona::Toolkit; -our $VERSION = '2.2.1'; +our $VERSION = '2.2.2'; 1; } @@ -10011,6 +10011,8 @@ sub get_slaves { my $dp = $self->{DSNParser}; my $methods = $self->_resolve_recursion_methods($args{dsn}); + return $slaves unless @$methods; + if ( grep { m/processlist|hosts/i } @$methods ) { my @required_args = qw(dbh dsn); foreach my $arg ( @required_args ) { @@ -16082,6 +16084,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-query-digest 2.2.1 +pt-query-digest 2.2.2 =cut diff --git a/bin/pt-show-grants b/bin/pt-show-grants index bc7fbec2..19c456ea 100755 --- a/bin/pt-show-grants +++ b/bin/pt-show-grants @@ -2396,6 +2396,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-show-grants 2.2.1 +pt-show-grants 2.2.2 =cut diff --git a/bin/pt-sift b/bin/pt-sift index 786ed1a7..bbbce17e 100755 --- a/bin/pt-sift +++ b/bin/pt-sift @@ -1233,7 +1233,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-sift 2.2.1 +pt-sift 2.2.2 =cut diff --git a/bin/pt-slave-delay b/bin/pt-slave-delay index c0a5d975..583545c8 100755 --- a/bin/pt-slave-delay +++ b/bin/pt-slave-delay @@ -39,7 +39,7 @@ BEGIN { # ########################################################################### { package Percona::Toolkit; -our $VERSION = '2.2.1'; +our $VERSION = '2.2.2'; 1; } @@ -1122,6 +1122,7 @@ if ( PTDEBUG ) { # ########################################################################### { package Lmo::Utils; + use strict; use warnings qw( FATAL all ); require Exporter; @@ -1129,7 +1130,12 @@ our (@ISA, @EXPORT, @EXPORT_OK); BEGIN { @ISA = qw(Exporter); - @EXPORT = @EXPORT_OK = qw(_install_coderef _unimport_coderefs _glob_for _stash_for); + @EXPORT = @EXPORT_OK = qw( + _install_coderef + _unimport_coderefs + _glob_for + _stash_for + ); } { @@ -1313,7 +1319,6 @@ sub meta { return Lmo::Meta->new(class => $class); } - 1; } # ########################################################################### @@ -2750,6 +2755,8 @@ use warnings FATAL => 'all'; use English qw(-no_match_vars); use constant PTDEBUG => $ENV{PTDEBUG} || 0; +use Time::HiRes qw(sleep); + sub new { my ( $class, %args ) = @_; my $self = { @@ -4824,6 +4831,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-slave-delay 2.2.1 +pt-slave-delay 2.2.2 =cut diff --git a/bin/pt-slave-find b/bin/pt-slave-find index d39ad9cb..0aabb79f 100755 --- a/bin/pt-slave-find +++ b/bin/pt-slave-find @@ -1102,6 +1102,7 @@ if ( PTDEBUG ) { # ########################################################################### { package Lmo::Utils; + use strict; use warnings qw( FATAL all ); require Exporter; @@ -1109,7 +1110,12 @@ our (@ISA, @EXPORT, @EXPORT_OK); BEGIN { @ISA = qw(Exporter); - @EXPORT = @EXPORT_OK = qw(_install_coderef _unimport_coderefs _glob_for _stash_for); + @EXPORT = @EXPORT_OK = qw( + _install_coderef + _unimport_coderefs + _glob_for + _stash_for + ); } { @@ -1293,7 +1299,6 @@ sub meta { return Lmo::Meta->new(class => $class); } - 1; } # ########################################################################### @@ -2219,6 +2224,8 @@ sub get_slaves { my $dp = $self->{DSNParser}; my $methods = $self->_resolve_recursion_methods($args{dsn}); + return $slaves unless @$methods; + if ( grep { m/processlist|hosts/i } @$methods ) { my @required_args = qw(dbh dsn); foreach my $arg ( @required_args ) { @@ -4317,6 +4324,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-slave-find 2.2.1 +pt-slave-find 2.2.2 =cut diff --git a/bin/pt-slave-restart b/bin/pt-slave-restart index a20825c8..1e0198c4 100755 --- a/bin/pt-slave-restart +++ b/bin/pt-slave-restart @@ -40,7 +40,7 @@ BEGIN { # ########################################################################### { package Percona::Toolkit; -our $VERSION = '2.2.1'; +our $VERSION = '2.2.2'; 1; } @@ -1274,6 +1274,7 @@ if ( PTDEBUG ) { # ########################################################################### { package Lmo::Utils; + use strict; use warnings qw( FATAL all ); require Exporter; @@ -1281,7 +1282,12 @@ our (@ISA, @EXPORT, @EXPORT_OK); BEGIN { @ISA = qw(Exporter); - @EXPORT = @EXPORT_OK = qw(_install_coderef _unimport_coderefs _glob_for _stash_for); + @EXPORT = @EXPORT_OK = qw( + _install_coderef + _unimport_coderefs + _glob_for + _stash_for + ); } { @@ -1465,7 +1471,6 @@ sub meta { return Lmo::Meta->new(class => $class); } - 1; } # ########################################################################### @@ -2585,6 +2590,8 @@ sub get_slaves { my $dp = $self->{DSNParser}; my $methods = $self->_resolve_recursion_methods($args{dsn}); + return $slaves unless @$methods; + if ( grep { m/processlist|hosts/i } @$methods ) { my @required_args = qw(dbh dsn); foreach my $arg ( @required_args ) { @@ -5766,6 +5773,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-slave-restart 2.2.1 +pt-slave-restart 2.2.2 =cut diff --git a/bin/pt-stalk b/bin/pt-stalk index 5f59ea3b..fee31fa0 100755 --- a/bin/pt-stalk +++ b/bin/pt-stalk @@ -2201,7 +2201,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-stalk 2.2.1 +pt-stalk 2.2.2 =cut diff --git a/bin/pt-summary b/bin/pt-summary index 12339398..d89ef4c6 100755 --- a/bin/pt-summary +++ b/bin/pt-summary @@ -2682,7 +2682,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-summary 2.2.1 +pt-summary 2.2.2 =cut diff --git a/bin/pt-table-checksum b/bin/pt-table-checksum index e4d46500..e620d1f3 100755 --- a/bin/pt-table-checksum +++ b/bin/pt-table-checksum @@ -56,7 +56,7 @@ BEGIN { # ########################################################################### { package Percona::Toolkit; -our $VERSION = '2.2.1'; +our $VERSION = '2.2.2'; 1; } @@ -12385,6 +12385,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-table-checksum 2.2.1 +pt-table-checksum 2.2.2 =cut diff --git a/bin/pt-table-sync b/bin/pt-table-sync index ff8d0773..dca484e9 100755 --- a/bin/pt-table-sync +++ b/bin/pt-table-sync @@ -54,7 +54,7 @@ BEGIN { # ########################################################################### { package Percona::Toolkit; -our $VERSION = '2.2.1'; +our $VERSION = '2.2.2'; 1; } @@ -1137,6 +1137,7 @@ if ( PTDEBUG ) { # ########################################################################### { package Lmo::Utils; + use strict; use warnings qw( FATAL all ); require Exporter; @@ -1144,7 +1145,12 @@ our (@ISA, @EXPORT, @EXPORT_OK); BEGIN { @ISA = qw(Exporter); - @EXPORT = @EXPORT_OK = qw(_install_coderef _unimport_coderefs _glob_for _stash_for); + @EXPORT = @EXPORT_OK = qw( + _install_coderef + _unimport_coderefs + _glob_for + _stash_for + ); } { @@ -1328,7 +1334,6 @@ sub meta { return Lmo::Meta->new(class => $class); } - 1; } # ########################################################################### @@ -6526,6 +6531,8 @@ sub get_slaves { my $dp = $self->{DSNParser}; my $methods = $self->_resolve_recursion_methods($args{dsn}); + return $slaves unless @$methods; + if ( grep { m/processlist|hosts/i } @$methods ) { my @required_args = qw(dbh dsn); foreach my $arg ( @required_args ) { @@ -8237,6 +8244,8 @@ use warnings FATAL => 'all'; use English qw(-no_match_vars); use constant PTDEBUG => $ENV{PTDEBUG} || 0; +use Time::HiRes qw(sleep); + sub new { my ( $class, %args ) = @_; my $self = { @@ -12616,6 +12625,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-table-sync 2.2.1 +pt-table-sync 2.2.2 =cut diff --git a/bin/pt-table-usage b/bin/pt-table-usage index 5b8eff83..a3c81904 100755 --- a/bin/pt-table-usage +++ b/bin/pt-table-usage @@ -7512,6 +7512,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-table-usage 2.2.1 +pt-table-usage 2.2.2 =cut diff --git a/bin/pt-upgrade b/bin/pt-upgrade index ec1ad261..59da636c 100755 --- a/bin/pt-upgrade +++ b/bin/pt-upgrade @@ -60,7 +60,7 @@ BEGIN { # ########################################################################### { package Percona::Toolkit; -our $VERSION = '2.2.1'; +our $VERSION = '2.2.2'; 1; } @@ -2500,6 +2500,32 @@ sub name { return $self->{hostname} || $self->{dsn_name} || 'unknown host'; } +sub remove_duplicate_cxns { + my ($self, %args) = @_; + my @cxns = @{$args{cxns}}; + my $seen_ids = $args{seen_ids} || {}; + PTDEBUG && _d("Removing duplicates from ", join(" ", map { $_->name } @cxns)); + my @trimmed_cxns; + + for my $cxn ( @cxns ) { + my $dbh = $cxn->dbh(); + my $sql = q{SELECT @@server_id}; + PTDEBUG && _d($sql); + my ($id) = $dbh->selectrow_array($sql); + PTDEBUG && _d('Server ID for ', $cxn->name, ': ', $id); + + if ( ! $seen_ids->{$id}++ ) { + push @trimmed_cxns, $cxn + } + else { + PTDEBUG && _d("Removing ", $cxn->name, + ", ID ", $id, ", because we've already seen it"); + } + } + + return \@trimmed_cxns; +} + sub DESTROY { my ($self) = @_; @@ -11142,6 +11168,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-upgrade 2.2.1 +pt-upgrade 2.2.2 =cut diff --git a/bin/pt-variable-advisor b/bin/pt-variable-advisor index e6d9582d..d9d3d2c2 100755 --- a/bin/pt-variable-advisor +++ b/bin/pt-variable-advisor @@ -43,7 +43,7 @@ BEGIN { # ########################################################################### { package Percona::Toolkit; -our $VERSION = '2.2.1'; +our $VERSION = '2.2.2'; 1; } @@ -1126,6 +1126,7 @@ if ( PTDEBUG ) { # ########################################################################### { package Lmo::Utils; + use strict; use warnings qw( FATAL all ); require Exporter; @@ -1133,7 +1134,12 @@ our (@ISA, @EXPORT, @EXPORT_OK); BEGIN { @ISA = qw(Exporter); - @EXPORT = @EXPORT_OK = qw(_install_coderef _unimport_coderefs _glob_for _stash_for); + @EXPORT = @EXPORT_OK = qw( + _install_coderef + _unimport_coderefs + _glob_for + _stash_for + ); } { @@ -1317,7 +1323,6 @@ sub meta { return Lmo::Meta->new(class => $class); } - 1; } # ########################################################################### @@ -6094,6 +6099,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-variable-advisor 2.2.1 +pt-variable-advisor 2.2.2 =cut diff --git a/bin/pt-visual-explain b/bin/pt-visual-explain index 5aef7f2e..30c81023 100755 --- a/bin/pt-visual-explain +++ b/bin/pt-visual-explain @@ -3233,6 +3233,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -pt-visual-explain 2.2.1 +pt-visual-explain 2.2.2 =cut diff --git a/config/deb/changelog b/config/deb/changelog index bcc14263..a8bf2bde 100644 --- a/config/deb/changelog +++ b/config/deb/changelog @@ -1,3 +1,20 @@ +percona-toolkit (2.2.2) unstable; urgency=low + + * Restored --show-all in pt-query-digest + * Cluster nodes can now be autodiscovered in pt-table-checksum + * Fixed bug 1127450: pt-archiver --charset and --bulk-insert fail, may corrupt data + * Fixed bug 1082406: An explicitly set wsrep_node_incoming_address may make SHOW STATUS LIKE 'wsrep_incoming_addresses' return a portless address + * Fixed bug 1099845: pt-table-checksum pxc same_node function incorrectly uses wsrep_sst_receive_address + * Fixed bug 1156901: pt-query-digest --processlist: Duplicate entries for replication thread + * Fixed bug 1160338: pt-query-digest 2.2 prints unwanted debug info on tcpdump parsing errors + * Fixed bug 1160918: pt-query-digest 2.2 prints too many string values + * Fixed bug 1163372: pt-heartbeat --utc --check always returns 0 + * Fixed bug 821502: Some tools don't have --help or --version + * Fixed bug 947893: Tools use @@hostname without /*!50038*/ + * Fixed bug 1156867: pt-stalk prints the wrong variable name in verbose mode when --function is used + + -- Percona Toolkit Developers Fri, 19 Apr 2013 23:23:00 +0000 + percona-toolkit (2.2.1) unstable; urgency=low * Official support for MySQL 5.6 diff --git a/config/sphinx-build/conf.py b/config/sphinx-build/conf.py index 40bdb33b..35c355a8 100644 --- a/config/sphinx-build/conf.py +++ b/config/sphinx-build/conf.py @@ -50,7 +50,7 @@ copyright = u'2013, Percona Ireland Ltd' # The short X.Y version. version = '2.2' # The full version, including alpha/beta/rc tags. -release = '2.2.1' +release = '2.2.2' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/percona-toolkit.pod b/docs/percona-toolkit.pod index 93bd512e..8bcfd3b5 100644 --- a/docs/percona-toolkit.pod +++ b/docs/percona-toolkit.pod @@ -558,6 +558,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA. =head1 VERSION -Percona Toolkit v2.2.1 released 2013-03-14 +Percona Toolkit v2.2.2 released 2013-04-19 =cut diff --git a/docs/release_notes.rst b/docs/release_notes.rst index ec51b547..4ed150a4 100644 --- a/docs/release_notes.rst +++ b/docs/release_notes.rst @@ -1,6 +1,60 @@ Release Notes ************* +v2.2.2 released 2013-04-19 +========================== + +Percona Toolkit 2.2.2 has been released. This is the second release +of the 2.2 series, and aims to fix bugs in the previous release and +provide usability enhacements to the toolkit. + +Users may note the revival of the --show-all option in +pt-query-digest. This had been removed in 2.2.1, but resulted in +the tool's output bloating considerably. + +Meanwhile, pt-table-checksum got a usability enhancement, in the form +of --recursion-method=cluster, which will attempt to autodiscover +cluster nodes, alleviating the need to specify a dsns table. + +The following highlights some of the more interesting and "hot" bugs +in this release: + +* Bug #1127450: pt-archiver --charset and --bulk-insert fail, may corrupt data + +pt-archiver --bulk-insert didn't work with --charset UTF-8. This +revealed a case where the toolkit could corrupt data. This should +now be fixed, but like other UTF-8-related operations, remains +relatively dangerous if using DBD::mysql 3.0007. + +* Bug #1163372: pt-heartbeat --utc --check always returns 0 + +This makes --check and --utc useful. Older releases may be able to +work around this issue by calling the tool with --set-vars "time_zone='+0:00'" + +* Bug #821502: Some tools don't have --help or --version + +pt-align, pt-mext, pt-pmp and pt-sift now have both options. + +This is another solid bug fix release, and all users are encouraged to upgrade. + +Percona Toolkit packages can be downloaded from http://www.percona.com/downloads/percona-toolkit/ or the Percona Software Repositories (http://www.percona.com/software/repositories/). + +Changelog +--------- + +* Restored --show-all in pt-query-digest +* Cluster nodes can now be autodiscovered in pt-table-checksum +* Fixed bug 1127450: pt-archiver --charset and --bulk-insert fail, may corrupt data +* Fixed bug 1082406: An explicitly set wsrep_node_incoming_address may make SHOW STATUS LIKE 'wsrep_incoming_addresses' return a portless address +* Fixed bug 1099845: pt-table-checksum pxc same_node function incorrectly uses wsrep_sst_receive_address +* Fixed bug 1156901: pt-query-digest --processlist: Duplicate entries for replication thread +* Fixed bug 1160338: pt-query-digest 2.2 prints unwanted debug info on tcpdump parsing errors +* Fixed bug 1160918: pt-query-digest 2.2 prints too many string values +* Fixed bug 1163372: pt-heartbeat --utc --check always returns 0 +* Fixed bug 821502: Some tools don't have --help or --version +* Fixed bug 947893: Tools use @@hostname without /*!50038*/ +* Fixed bug 1156867: pt-stalk prints the wrong variable name in verbose mode when --function is used + v2.2.1 released 2013-03-14 ========================== diff --git a/lib/Percona/Toolkit.pm b/lib/Percona/Toolkit.pm index 9716c463..fbeadccc 100644 --- a/lib/Percona/Toolkit.pm +++ b/lib/Percona/Toolkit.pm @@ -19,7 +19,7 @@ # ########################################################################### { package Percona::Toolkit; -our $VERSION = '2.2.1'; +our $VERSION = '2.2.2'; 1; }