mirror of
https://github.com/percona/percona-toolkit.git
synced 2026-05-16 01:07:12 +08:00
PT-101 Fixed --slave-user in pt-table-checksum
This commit is contained in:
+22
-8
@@ -3565,8 +3565,10 @@ sub get_slaves {
|
||||
my $o = $self->{OptionParser};
|
||||
|
||||
$self->recurse_to_slaves(
|
||||
{ dbh => $dbh,
|
||||
dsn => $dsn,
|
||||
{ dbh => $dbh,
|
||||
dsn => $dsn,
|
||||
slave_user => $o->got('slave-user') ? $o->get('slave-user') : '',
|
||||
slave_password => $o->got('slave-password') ? $o->get('slave-password') : '',
|
||||
callback => sub {
|
||||
my ( $dsn, $dbh, $level, $parent ) = @_;
|
||||
return unless $level;
|
||||
@@ -3621,9 +3623,11 @@ sub _resolve_recursion_methods {
|
||||
sub recurse_to_slaves {
|
||||
my ( $self, $args, $level ) = @_;
|
||||
$level ||= 0;
|
||||
my $dp = $self->{DSNParser};
|
||||
my $dp = $self->{DSNParser};
|
||||
my $recurse = $args->{recurse} || $self->{OptionParser}->get('recurse');
|
||||
my $dsn = $args->{dsn};
|
||||
my $dsn = $args->{dsn};
|
||||
my $slave_user = $args->{slave_user} || '';
|
||||
my $slave_password = $args->{slave_password} || '';
|
||||
|
||||
my $methods = $self->_resolve_recursion_methods($dsn);
|
||||
PTDEBUG && _d('Recursion methods:', @$methods);
|
||||
@@ -3632,14 +3636,24 @@ sub recurse_to_slaves {
|
||||
return;
|
||||
}
|
||||
|
||||
my $slave_dsn = $dsn;
|
||||
if ($slave_user) {
|
||||
$slave_dsn->{u} = $slave_user;
|
||||
PTDEBUG && _d("Using slave user $slave_user on ".$slave_dsn->{h}.":".$slave_dsn->{P});
|
||||
}
|
||||
if ($slave_password) {
|
||||
$slave_dsn->{p} = $slave_password;
|
||||
PTDEBUG && _d("Slave password set");
|
||||
}
|
||||
|
||||
my $dbh;
|
||||
eval {
|
||||
$dbh = $args->{dbh} || $dp->get_dbh(
|
||||
$dp->get_cxn_params($dsn), { AutoCommit => 1 });
|
||||
PTDEBUG && _d('Connected to', $dp->as_string($dsn));
|
||||
$dp->get_cxn_params($slave_dsn), { AutoCommit => 1 });
|
||||
PTDEBUG && _d('Connected to', $dp->as_string($slave_dsn));
|
||||
};
|
||||
if ( $EVAL_ERROR ) {
|
||||
print STDERR "Cannot connect to ", $dp->as_string($dsn), "\n"
|
||||
print STDERR "Cannot connect to ", $dp->as_string($slave_dsn), "\n"
|
||||
or die "Cannot print: $OS_ERROR";
|
||||
return;
|
||||
}
|
||||
@@ -3672,7 +3686,7 @@ sub recurse_to_slaves {
|
||||
PTDEBUG && _d('Recursing from',
|
||||
$dp->as_string($dsn), 'to', $dp->as_string($slave));
|
||||
$self->recurse_to_slaves(
|
||||
{ %$args, dsn => $slave, dbh => undef, parent => $dsn }, $level + 1 );
|
||||
{ %$args, dsn => $slave, dbh => undef, parent => $dsn, slave_user => $slave_user, $slave_password => $slave_password }, $level + 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+22
-8
@@ -166,8 +166,10 @@ sub get_slaves {
|
||||
my $o = $self->{OptionParser};
|
||||
|
||||
$self->recurse_to_slaves(
|
||||
{ dbh => $dbh,
|
||||
dsn => $dsn,
|
||||
{ dbh => $dbh,
|
||||
dsn => $dsn,
|
||||
slave_user => $o->got('slave-user') ? $o->get('slave-user') : '',
|
||||
slave_password => $o->got('slave-password') ? $o->get('slave-password') : '',
|
||||
callback => sub {
|
||||
my ( $dsn, $dbh, $level, $parent ) = @_;
|
||||
return unless $level;
|
||||
@@ -222,9 +224,11 @@ sub _resolve_recursion_methods {
|
||||
sub recurse_to_slaves {
|
||||
my ( $self, $args, $level ) = @_;
|
||||
$level ||= 0;
|
||||
my $dp = $self->{DSNParser};
|
||||
my $dp = $self->{DSNParser};
|
||||
my $recurse = $args->{recurse} || $self->{OptionParser}->get('recurse');
|
||||
my $dsn = $args->{dsn};
|
||||
my $dsn = $args->{dsn};
|
||||
my $slave_user = $args->{slave_user} || '';
|
||||
my $slave_password = $args->{slave_password} || '';
|
||||
|
||||
my $methods = $self->_resolve_recursion_methods($dsn);
|
||||
PTDEBUG && _d('Recursion methods:', @$methods);
|
||||
@@ -233,14 +237,24 @@ sub recurse_to_slaves {
|
||||
return;
|
||||
}
|
||||
|
||||
my $slave_dsn = $dsn;
|
||||
if ($slave_user) {
|
||||
$slave_dsn->{u} = $slave_user;
|
||||
PTDEBUG && _d("Using slave user $slave_user on ".$slave_dsn->{h}.":".$slave_dsn->{P});
|
||||
}
|
||||
if ($slave_password) {
|
||||
$slave_dsn->{p} = $slave_password;
|
||||
PTDEBUG && _d("Slave password set");
|
||||
}
|
||||
|
||||
my $dbh;
|
||||
eval {
|
||||
$dbh = $args->{dbh} || $dp->get_dbh(
|
||||
$dp->get_cxn_params($dsn), { AutoCommit => 1 });
|
||||
PTDEBUG && _d('Connected to', $dp->as_string($dsn));
|
||||
$dp->get_cxn_params($slave_dsn), { AutoCommit => 1 });
|
||||
PTDEBUG && _d('Connected to', $dp->as_string($slave_dsn));
|
||||
};
|
||||
if ( $EVAL_ERROR ) {
|
||||
print STDERR "Cannot connect to ", $dp->as_string($dsn), "\n"
|
||||
print STDERR "Cannot connect to ", $dp->as_string($slave_dsn), "\n"
|
||||
or die "Cannot print: $OS_ERROR";
|
||||
return;
|
||||
}
|
||||
@@ -273,7 +287,7 @@ sub recurse_to_slaves {
|
||||
PTDEBUG && _d('Recursing from',
|
||||
$dp->as_string($dsn), 'to', $dp->as_string($slave));
|
||||
$self->recurse_to_slaves(
|
||||
{ %$args, dsn => $slave, dbh => undef, parent => $dsn }, $level + 1 );
|
||||
{ %$args, dsn => $slave, dbh => undef, parent => $dsn, slave_user => $slave_user, $slave_password => $slave_password }, $level + 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+22
-8
@@ -3835,8 +3835,10 @@ sub get_slaves {
|
||||
my $o = $self->{OptionParser};
|
||||
|
||||
$self->recurse_to_slaves(
|
||||
{ dbh => $dbh,
|
||||
dsn => $dsn,
|
||||
{ dbh => $dbh,
|
||||
dsn => $dsn,
|
||||
slave_user => $o->got('slave-user') ? $o->get('slave-user') : '',
|
||||
slave_password => $o->got('slave-password') ? $o->get('slave-password') : '',
|
||||
callback => sub {
|
||||
my ( $dsn, $dbh, $level, $parent ) = @_;
|
||||
return unless $level;
|
||||
@@ -3891,9 +3893,11 @@ sub _resolve_recursion_methods {
|
||||
sub recurse_to_slaves {
|
||||
my ( $self, $args, $level ) = @_;
|
||||
$level ||= 0;
|
||||
my $dp = $self->{DSNParser};
|
||||
my $dp = $self->{DSNParser};
|
||||
my $recurse = $args->{recurse} || $self->{OptionParser}->get('recurse');
|
||||
my $dsn = $args->{dsn};
|
||||
my $dsn = $args->{dsn};
|
||||
my $slave_user = $args->{slave_user} || '';
|
||||
my $slave_password = $args->{slave_password} || '';
|
||||
|
||||
my $methods = $self->_resolve_recursion_methods($dsn);
|
||||
PTDEBUG && _d('Recursion methods:', @$methods);
|
||||
@@ -3902,14 +3906,24 @@ sub recurse_to_slaves {
|
||||
return;
|
||||
}
|
||||
|
||||
my $slave_dsn = $dsn;
|
||||
if ($slave_user) {
|
||||
$slave_dsn->{u} = $slave_user;
|
||||
PTDEBUG && _d("Using slave user $slave_user on ".$slave_dsn->{h}.":".$slave_dsn->{P});
|
||||
}
|
||||
if ($slave_password) {
|
||||
$slave_dsn->{p} = $slave_password;
|
||||
PTDEBUG && _d("Slave password set");
|
||||
}
|
||||
|
||||
my $dbh;
|
||||
eval {
|
||||
$dbh = $args->{dbh} || $dp->get_dbh(
|
||||
$dp->get_cxn_params($dsn), { AutoCommit => 1 });
|
||||
PTDEBUG && _d('Connected to', $dp->as_string($dsn));
|
||||
$dp->get_cxn_params($slave_dsn), { AutoCommit => 1 });
|
||||
PTDEBUG && _d('Connected to', $dp->as_string($slave_dsn));
|
||||
};
|
||||
if ( $EVAL_ERROR ) {
|
||||
print STDERR "Cannot connect to ", $dp->as_string($dsn), "\n"
|
||||
print STDERR "Cannot connect to ", $dp->as_string($slave_dsn), "\n"
|
||||
or die "Cannot print: $OS_ERROR";
|
||||
return;
|
||||
}
|
||||
@@ -3942,7 +3956,7 @@ sub recurse_to_slaves {
|
||||
PTDEBUG && _d('Recursing from',
|
||||
$dp->as_string($dsn), 'to', $dp->as_string($slave));
|
||||
$self->recurse_to_slaves(
|
||||
{ %$args, dsn => $slave, dbh => undef, parent => $dsn }, $level + 1 );
|
||||
{ %$args, dsn => $slave, dbh => undef, parent => $dsn, slave_user => $slave_user, $slave_password => $slave_password }, $level + 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4117,8 +4117,10 @@ sub get_slaves {
|
||||
my $o = $self->{OptionParser};
|
||||
|
||||
$self->recurse_to_slaves(
|
||||
{ dbh => $dbh,
|
||||
dsn => $dsn,
|
||||
{ dbh => $dbh,
|
||||
dsn => $dsn,
|
||||
slave_user => $o->got('slave-user') ? $o->get('slave-user') : '',
|
||||
slave_password => $o->got('slave-password') ? $o->get('slave-password') : '',
|
||||
callback => sub {
|
||||
my ( $dsn, $dbh, $level, $parent ) = @_;
|
||||
return unless $level;
|
||||
@@ -4173,9 +4175,11 @@ sub _resolve_recursion_methods {
|
||||
sub recurse_to_slaves {
|
||||
my ( $self, $args, $level ) = @_;
|
||||
$level ||= 0;
|
||||
my $dp = $self->{DSNParser};
|
||||
my $dp = $self->{DSNParser};
|
||||
my $recurse = $args->{recurse} || $self->{OptionParser}->get('recurse');
|
||||
my $dsn = $args->{dsn};
|
||||
my $dsn = $args->{dsn};
|
||||
my $slave_user = $args->{slave_user} || '';
|
||||
my $slave_password = $args->{slave_password} || '';
|
||||
|
||||
my $methods = $self->_resolve_recursion_methods($dsn);
|
||||
PTDEBUG && _d('Recursion methods:', @$methods);
|
||||
@@ -4184,14 +4188,24 @@ sub recurse_to_slaves {
|
||||
return;
|
||||
}
|
||||
|
||||
my $slave_dsn = $dsn;
|
||||
if ($slave_user) {
|
||||
$slave_dsn->{u} = $slave_user;
|
||||
PTDEBUG && _d("Using slave user $slave_user on ".$slave_dsn->{h}.":".$slave_dsn->{P});
|
||||
}
|
||||
if ($slave_password) {
|
||||
$slave_dsn->{p} = $slave_password;
|
||||
PTDEBUG && _d("Slave password set");
|
||||
}
|
||||
|
||||
my $dbh;
|
||||
eval {
|
||||
$dbh = $args->{dbh} || $dp->get_dbh(
|
||||
$dp->get_cxn_params($dsn), { AutoCommit => 1 });
|
||||
PTDEBUG && _d('Connected to', $dp->as_string($dsn));
|
||||
$dp->get_cxn_params($slave_dsn), { AutoCommit => 1 });
|
||||
PTDEBUG && _d('Connected to', $dp->as_string($slave_dsn));
|
||||
};
|
||||
if ( $EVAL_ERROR ) {
|
||||
print STDERR "Cannot connect to ", $dp->as_string($dsn), "\n"
|
||||
print STDERR "Cannot connect to ", $dp->as_string($slave_dsn), "\n"
|
||||
or die "Cannot print: $OS_ERROR";
|
||||
return;
|
||||
}
|
||||
@@ -4224,7 +4238,7 @@ sub recurse_to_slaves {
|
||||
PTDEBUG && _d('Recursing from',
|
||||
$dp->as_string($dsn), 'to', $dp->as_string($slave));
|
||||
$self->recurse_to_slaves(
|
||||
{ %$args, dsn => $slave, dbh => undef, parent => $dsn }, $level + 1 );
|
||||
{ %$args, dsn => $slave, dbh => undef, parent => $dsn, slave_user => $slave_user, $slave_password => $slave_password }, $level + 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+22
-8
@@ -10452,8 +10452,10 @@ sub get_slaves {
|
||||
my $o = $self->{OptionParser};
|
||||
|
||||
$self->recurse_to_slaves(
|
||||
{ dbh => $dbh,
|
||||
dsn => $dsn,
|
||||
{ dbh => $dbh,
|
||||
dsn => $dsn,
|
||||
slave_user => $o->got('slave-user') ? $o->get('slave-user') : '',
|
||||
slave_password => $o->got('slave-password') ? $o->get('slave-password') : '',
|
||||
callback => sub {
|
||||
my ( $dsn, $dbh, $level, $parent ) = @_;
|
||||
return unless $level;
|
||||
@@ -10508,9 +10510,11 @@ sub _resolve_recursion_methods {
|
||||
sub recurse_to_slaves {
|
||||
my ( $self, $args, $level ) = @_;
|
||||
$level ||= 0;
|
||||
my $dp = $self->{DSNParser};
|
||||
my $dp = $self->{DSNParser};
|
||||
my $recurse = $args->{recurse} || $self->{OptionParser}->get('recurse');
|
||||
my $dsn = $args->{dsn};
|
||||
my $dsn = $args->{dsn};
|
||||
my $slave_user = $args->{slave_user} || '';
|
||||
my $slave_password = $args->{slave_password} || '';
|
||||
|
||||
my $methods = $self->_resolve_recursion_methods($dsn);
|
||||
PTDEBUG && _d('Recursion methods:', @$methods);
|
||||
@@ -10519,14 +10523,24 @@ sub recurse_to_slaves {
|
||||
return;
|
||||
}
|
||||
|
||||
my $slave_dsn = $dsn;
|
||||
if ($slave_user) {
|
||||
$slave_dsn->{u} = $slave_user;
|
||||
PTDEBUG && _d("Using slave user $slave_user on ".$slave_dsn->{h}.":".$slave_dsn->{P});
|
||||
}
|
||||
if ($slave_password) {
|
||||
$slave_dsn->{p} = $slave_password;
|
||||
PTDEBUG && _d("Slave password set");
|
||||
}
|
||||
|
||||
my $dbh;
|
||||
eval {
|
||||
$dbh = $args->{dbh} || $dp->get_dbh(
|
||||
$dp->get_cxn_params($dsn), { AutoCommit => 1 });
|
||||
PTDEBUG && _d('Connected to', $dp->as_string($dsn));
|
||||
$dp->get_cxn_params($slave_dsn), { AutoCommit => 1 });
|
||||
PTDEBUG && _d('Connected to', $dp->as_string($slave_dsn));
|
||||
};
|
||||
if ( $EVAL_ERROR ) {
|
||||
print STDERR "Cannot connect to ", $dp->as_string($dsn), "\n"
|
||||
print STDERR "Cannot connect to ", $dp->as_string($slave_dsn), "\n"
|
||||
or die "Cannot print: $OS_ERROR";
|
||||
return;
|
||||
}
|
||||
@@ -10559,7 +10573,7 @@ sub recurse_to_slaves {
|
||||
PTDEBUG && _d('Recursing from',
|
||||
$dp->as_string($dsn), 'to', $dp->as_string($slave));
|
||||
$self->recurse_to_slaves(
|
||||
{ %$args, dsn => $slave, dbh => undef, parent => $dsn }, $level + 1 );
|
||||
{ %$args, dsn => $slave, dbh => undef, parent => $dsn, slave_user => $slave_user, $slave_password => $slave_password }, $level + 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+22
-8
@@ -2272,8 +2272,10 @@ sub get_slaves {
|
||||
my $o = $self->{OptionParser};
|
||||
|
||||
$self->recurse_to_slaves(
|
||||
{ dbh => $dbh,
|
||||
dsn => $dsn,
|
||||
{ dbh => $dbh,
|
||||
dsn => $dsn,
|
||||
slave_user => $o->got('slave-user') ? $o->get('slave-user') : '',
|
||||
slave_password => $o->got('slave-password') ? $o->get('slave-password') : '',
|
||||
callback => sub {
|
||||
my ( $dsn, $dbh, $level, $parent ) = @_;
|
||||
return unless $level;
|
||||
@@ -2328,9 +2330,11 @@ sub _resolve_recursion_methods {
|
||||
sub recurse_to_slaves {
|
||||
my ( $self, $args, $level ) = @_;
|
||||
$level ||= 0;
|
||||
my $dp = $self->{DSNParser};
|
||||
my $dp = $self->{DSNParser};
|
||||
my $recurse = $args->{recurse} || $self->{OptionParser}->get('recurse');
|
||||
my $dsn = $args->{dsn};
|
||||
my $dsn = $args->{dsn};
|
||||
my $slave_user = $args->{slave_user} || '';
|
||||
my $slave_password = $args->{slave_password} || '';
|
||||
|
||||
my $methods = $self->_resolve_recursion_methods($dsn);
|
||||
PTDEBUG && _d('Recursion methods:', @$methods);
|
||||
@@ -2339,14 +2343,24 @@ sub recurse_to_slaves {
|
||||
return;
|
||||
}
|
||||
|
||||
my $slave_dsn = $dsn;
|
||||
if ($slave_user) {
|
||||
$slave_dsn->{u} = $slave_user;
|
||||
PTDEBUG && _d("Using slave user $slave_user on ".$slave_dsn->{h}.":".$slave_dsn->{P});
|
||||
}
|
||||
if ($slave_password) {
|
||||
$slave_dsn->{p} = $slave_password;
|
||||
PTDEBUG && _d("Slave password set");
|
||||
}
|
||||
|
||||
my $dbh;
|
||||
eval {
|
||||
$dbh = $args->{dbh} || $dp->get_dbh(
|
||||
$dp->get_cxn_params($dsn), { AutoCommit => 1 });
|
||||
PTDEBUG && _d('Connected to', $dp->as_string($dsn));
|
||||
$dp->get_cxn_params($slave_dsn), { AutoCommit => 1 });
|
||||
PTDEBUG && _d('Connected to', $dp->as_string($slave_dsn));
|
||||
};
|
||||
if ( $EVAL_ERROR ) {
|
||||
print STDERR "Cannot connect to ", $dp->as_string($dsn), "\n"
|
||||
print STDERR "Cannot connect to ", $dp->as_string($slave_dsn), "\n"
|
||||
or die "Cannot print: $OS_ERROR";
|
||||
return;
|
||||
}
|
||||
@@ -2379,7 +2393,7 @@ sub recurse_to_slaves {
|
||||
PTDEBUG && _d('Recursing from',
|
||||
$dp->as_string($dsn), 'to', $dp->as_string($slave));
|
||||
$self->recurse_to_slaves(
|
||||
{ %$args, dsn => $slave, dbh => undef, parent => $dsn }, $level + 1 );
|
||||
{ %$args, dsn => $slave, dbh => undef, parent => $dsn, slave_user => $slave_user, $slave_password => $slave_password }, $level + 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+22
-8
@@ -2683,8 +2683,10 @@ sub get_slaves {
|
||||
my $o = $self->{OptionParser};
|
||||
|
||||
$self->recurse_to_slaves(
|
||||
{ dbh => $dbh,
|
||||
dsn => $dsn,
|
||||
{ dbh => $dbh,
|
||||
dsn => $dsn,
|
||||
slave_user => $o->got('slave-user') ? $o->get('slave-user') : '',
|
||||
slave_password => $o->got('slave-password') ? $o->get('slave-password') : '',
|
||||
callback => sub {
|
||||
my ( $dsn, $dbh, $level, $parent ) = @_;
|
||||
return unless $level;
|
||||
@@ -2739,9 +2741,11 @@ sub _resolve_recursion_methods {
|
||||
sub recurse_to_slaves {
|
||||
my ( $self, $args, $level ) = @_;
|
||||
$level ||= 0;
|
||||
my $dp = $self->{DSNParser};
|
||||
my $dp = $self->{DSNParser};
|
||||
my $recurse = $args->{recurse} || $self->{OptionParser}->get('recurse');
|
||||
my $dsn = $args->{dsn};
|
||||
my $dsn = $args->{dsn};
|
||||
my $slave_user = $args->{slave_user} || '';
|
||||
my $slave_password = $args->{slave_password} || '';
|
||||
|
||||
my $methods = $self->_resolve_recursion_methods($dsn);
|
||||
PTDEBUG && _d('Recursion methods:', @$methods);
|
||||
@@ -2750,14 +2754,24 @@ sub recurse_to_slaves {
|
||||
return;
|
||||
}
|
||||
|
||||
my $slave_dsn = $dsn;
|
||||
if ($slave_user) {
|
||||
$slave_dsn->{u} = $slave_user;
|
||||
PTDEBUG && _d("Using slave user $slave_user on ".$slave_dsn->{h}.":".$slave_dsn->{P});
|
||||
}
|
||||
if ($slave_password) {
|
||||
$slave_dsn->{p} = $slave_password;
|
||||
PTDEBUG && _d("Slave password set");
|
||||
}
|
||||
|
||||
my $dbh;
|
||||
eval {
|
||||
$dbh = $args->{dbh} || $dp->get_dbh(
|
||||
$dp->get_cxn_params($dsn), { AutoCommit => 1 });
|
||||
PTDEBUG && _d('Connected to', $dp->as_string($dsn));
|
||||
$dp->get_cxn_params($slave_dsn), { AutoCommit => 1 });
|
||||
PTDEBUG && _d('Connected to', $dp->as_string($slave_dsn));
|
||||
};
|
||||
if ( $EVAL_ERROR ) {
|
||||
print STDERR "Cannot connect to ", $dp->as_string($dsn), "\n"
|
||||
print STDERR "Cannot connect to ", $dp->as_string($slave_dsn), "\n"
|
||||
or die "Cannot print: $OS_ERROR";
|
||||
return;
|
||||
}
|
||||
@@ -2790,7 +2804,7 @@ sub recurse_to_slaves {
|
||||
PTDEBUG && _d('Recursing from',
|
||||
$dp->as_string($dsn), 'to', $dp->as_string($slave));
|
||||
$self->recurse_to_slaves(
|
||||
{ %$args, dsn => $slave, dbh => undef, parent => $dsn }, $level + 1 );
|
||||
{ %$args, dsn => $slave, dbh => undef, parent => $dsn, slave_user => $slave_user, $slave_password => $slave_password }, $level + 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+22
-8
@@ -6645,8 +6645,10 @@ sub get_slaves {
|
||||
my $o = $self->{OptionParser};
|
||||
|
||||
$self->recurse_to_slaves(
|
||||
{ dbh => $dbh,
|
||||
dsn => $dsn,
|
||||
{ dbh => $dbh,
|
||||
dsn => $dsn,
|
||||
slave_user => $o->got('slave-user') ? $o->get('slave-user') : '',
|
||||
slave_password => $o->got('slave-password') ? $o->get('slave-password') : '',
|
||||
callback => sub {
|
||||
my ( $dsn, $dbh, $level, $parent ) = @_;
|
||||
return unless $level;
|
||||
@@ -6701,9 +6703,11 @@ sub _resolve_recursion_methods {
|
||||
sub recurse_to_slaves {
|
||||
my ( $self, $args, $level ) = @_;
|
||||
$level ||= 0;
|
||||
my $dp = $self->{DSNParser};
|
||||
my $dp = $self->{DSNParser};
|
||||
my $recurse = $args->{recurse} || $self->{OptionParser}->get('recurse');
|
||||
my $dsn = $args->{dsn};
|
||||
my $dsn = $args->{dsn};
|
||||
my $slave_user = $args->{slave_user} || '';
|
||||
my $slave_password = $args->{slave_password} || '';
|
||||
|
||||
my $methods = $self->_resolve_recursion_methods($dsn);
|
||||
PTDEBUG && _d('Recursion methods:', @$methods);
|
||||
@@ -6712,14 +6716,24 @@ sub recurse_to_slaves {
|
||||
return;
|
||||
}
|
||||
|
||||
my $slave_dsn = $dsn;
|
||||
if ($slave_user) {
|
||||
$slave_dsn->{u} = $slave_user;
|
||||
PTDEBUG && _d("Using slave user $slave_user on ".$slave_dsn->{h}.":".$slave_dsn->{P});
|
||||
}
|
||||
if ($slave_password) {
|
||||
$slave_dsn->{p} = $slave_password;
|
||||
PTDEBUG && _d("Slave password set");
|
||||
}
|
||||
|
||||
my $dbh;
|
||||
eval {
|
||||
$dbh = $args->{dbh} || $dp->get_dbh(
|
||||
$dp->get_cxn_params($dsn), { AutoCommit => 1 });
|
||||
PTDEBUG && _d('Connected to', $dp->as_string($dsn));
|
||||
$dp->get_cxn_params($slave_dsn), { AutoCommit => 1 });
|
||||
PTDEBUG && _d('Connected to', $dp->as_string($slave_dsn));
|
||||
};
|
||||
if ( $EVAL_ERROR ) {
|
||||
print STDERR "Cannot connect to ", $dp->as_string($dsn), "\n"
|
||||
print STDERR "Cannot connect to ", $dp->as_string($slave_dsn), "\n"
|
||||
or die "Cannot print: $OS_ERROR";
|
||||
return;
|
||||
}
|
||||
@@ -6752,7 +6766,7 @@ sub recurse_to_slaves {
|
||||
PTDEBUG && _d('Recursing from',
|
||||
$dp->as_string($dsn), 'to', $dp->as_string($slave));
|
||||
$self->recurse_to_slaves(
|
||||
{ %$args, dsn => $slave, dbh => undef, parent => $dsn }, $level + 1 );
|
||||
{ %$args, dsn => $slave, dbh => undef, parent => $dsn, slave_user => $slave_user, $slave_password => $slave_password }, $level + 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+22
-18
@@ -83,8 +83,10 @@ sub get_slaves {
|
||||
my $o = $self->{OptionParser};
|
||||
|
||||
$self->recurse_to_slaves(
|
||||
{ dbh => $dbh,
|
||||
dsn => $dsn,
|
||||
{ dbh => $dbh,
|
||||
dsn => $dsn,
|
||||
slave_user => $o->got('slave-user') ? $o->get('slave-user') : '',
|
||||
slave_password => $o->got('slave-password') ? $o->get('slave-password') : '',
|
||||
callback => sub {
|
||||
my ( $dsn, $dbh, $level, $parent ) = @_;
|
||||
return unless $level;
|
||||
@@ -161,36 +163,41 @@ sub _resolve_recursion_methods {
|
||||
sub recurse_to_slaves {
|
||||
my ( $self, $args, $level ) = @_;
|
||||
$level ||= 0;
|
||||
my $dp = $self->{DSNParser};
|
||||
my $dp = $self->{DSNParser};
|
||||
my $recurse = $args->{recurse} || $self->{OptionParser}->get('recurse');
|
||||
my $dsn = $args->{dsn};
|
||||
my $dsn = $args->{dsn};
|
||||
my $slave_user = $args->{slave_user} || '';
|
||||
my $slave_password = $args->{slave_password} || '';
|
||||
|
||||
# Re-resolve the recursion methods for each slave. In most cases
|
||||
# it won't change, but it could if one slave uses standard port (3306)
|
||||
# and another does not.
|
||||
my $methods = $self->_resolve_recursion_methods($dsn);
|
||||
PTDEBUG && _d('Recursion methods:', @$methods);
|
||||
if ( lc($methods->[0]) eq 'none' ) {
|
||||
# https://bugs.launchpad.net/percona-toolkit/+bug/987694
|
||||
PTDEBUG && _d('Not recursing to slaves');
|
||||
return;
|
||||
}
|
||||
|
||||
my $slave_dsn = $dsn;
|
||||
if ($slave_user) {
|
||||
$slave_dsn->{u} = $slave_user;
|
||||
PTDEBUG && _d("Using slave user $slave_user on ".$slave_dsn->{h}.":".$slave_dsn->{P});
|
||||
}
|
||||
if ($slave_password) {
|
||||
$slave_dsn->{p} = $slave_password;
|
||||
PTDEBUG && _d("Slave password set");
|
||||
}
|
||||
|
||||
my $dbh;
|
||||
eval {
|
||||
$dbh = $args->{dbh} || $dp->get_dbh(
|
||||
$dp->get_cxn_params($dsn), { AutoCommit => 1 });
|
||||
PTDEBUG && _d('Connected to', $dp->as_string($dsn));
|
||||
$dp->get_cxn_params($slave_dsn), { AutoCommit => 1 });
|
||||
PTDEBUG && _d('Connected to', $dp->as_string($slave_dsn));
|
||||
};
|
||||
if ( $EVAL_ERROR ) {
|
||||
print STDERR "Cannot connect to ", $dp->as_string($dsn), "\n"
|
||||
print STDERR "Cannot connect to ", $dp->as_string($slave_dsn), "\n"
|
||||
or die "Cannot print: $OS_ERROR";
|
||||
return;
|
||||
}
|
||||
|
||||
# SHOW SLAVE HOSTS sometimes has obsolete information. Verify that this
|
||||
# server has the ID its master thought, and that we have not seen it before
|
||||
# in any case.
|
||||
my $sql = 'SELECT @@SERVER_ID';
|
||||
PTDEBUG && _d($sql);
|
||||
my ($id) = $dbh->selectrow_array($sql);
|
||||
@@ -207,13 +214,10 @@ sub recurse_to_slaves {
|
||||
return;
|
||||
}
|
||||
|
||||
# Call the callback!
|
||||
$args->{callback}->($dsn, $dbh, $level, $args->{parent});
|
||||
|
||||
if ( !defined $recurse || $level < $recurse ) {
|
||||
|
||||
# Find the slave hosts. Eliminate hosts that aren't slaves of me (as
|
||||
# revealed by server_id and master_id).
|
||||
my @slaves =
|
||||
grep { !$_->{master_id} || $_->{master_id} == $id } # Only my slaves.
|
||||
$self->find_slave_hosts($dp, $dbh, $dsn, $methods);
|
||||
@@ -222,7 +226,7 @@ sub recurse_to_slaves {
|
||||
PTDEBUG && _d('Recursing from',
|
||||
$dp->as_string($dsn), 'to', $dp->as_string($slave));
|
||||
$self->recurse_to_slaves(
|
||||
{ %$args, dsn => $slave, dbh => undef, parent => $dsn }, $level + 1 );
|
||||
{ %$args, dsn => $slave, dbh => undef, parent => $dsn, slave_user => $slave_user, $slave_password => $slave_password }, $level + 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
BEGIN {
|
||||
die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
|
||||
unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
|
||||
unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
|
||||
};
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
use English qw(-no_match_vars);
|
||||
use Test::More;
|
||||
|
||||
use PerconaTest;
|
||||
use Sandbox;
|
||||
use SqlModes;
|
||||
require "$trunk/bin/pt-table-checksum";
|
||||
|
||||
my $dp = new DSNParser(opts=>$dsn_opts);
|
||||
my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp);
|
||||
my $dbh = $sb->get_dbh_for('master');
|
||||
|
||||
if ( !$dbh ) {
|
||||
plan skip_all => 'Cannot connect to sandbox master';
|
||||
}
|
||||
else {
|
||||
plan tests => 2;
|
||||
}
|
||||
|
||||
# The sandbox servers run with lock_wait_timeout=3 and it's not dynamic
|
||||
# so we need to specify --set-vars innodb_lock_wait_timeout=3 else the tool will die.
|
||||
# And --max-load "" prevents waiting for status variables.
|
||||
my $master_dsn = 'h=127.1,P=12345,u=msandbox,p=msandbox,D=test';
|
||||
my @args = ($master_dsn, qw(--replicate test.checksums -d test --slave-user slave_user --slave-password slave_password --ignore-databases mysql));
|
||||
my $output;
|
||||
|
||||
# Create a new user that is going to be replicated on slaves.
|
||||
# After that, stop replication, delete the user from the master just to ensure that
|
||||
# on the master we are using the sandbox user, and start relication again to run
|
||||
# the tests
|
||||
$sb->do_as_root("slave1", q/GRANT REPLICATION CLIENT ON *.* TO 'slave_user'@'localhost' IDENTIFIED BY 'slave_password'/);
|
||||
$sb->do_as_root("slave1", q/GRANT ALL ON *.* TO 'slave_user'@'localhost'/);
|
||||
$sb->do_as_root("slave1", q/FLUSH PRIVILEGES/);
|
||||
|
||||
$sb->do_as_root("slave2", q/GRANT REPLICATION CLIENT ON *.* TO 'slave_user'@'localhost' IDENTIFIED BY 'slave_password'/);
|
||||
$sb->do_as_root("slave2", q/GRANT ALL ON *.* TO 'slave_user'@'localhost'/);
|
||||
$sb->do_as_root("slave2", q/FLUSH PRIVILEGES/);
|
||||
|
||||
$sb->wait_for_slaves();
|
||||
|
||||
# Run these commands inside issue_1651002.sql to delete the sandbox user ONLY from master
|
||||
# These command must be in the .sql file because all of them need to run in the same session
|
||||
# set sql_log_bin=0;
|
||||
# DROP USER 'slave_user';
|
||||
# set sql_log_bin=1;
|
||||
$sb->load_file('master', 't/pt-table-checksum/samples/issue_1651002.sql');
|
||||
# Ensure we cannot connect to slaves using standard credentials
|
||||
# Since slave2 is a slave of slave1, removing the user from the slave1 will remove
|
||||
# the user also from slave2
|
||||
$sb->do_as_root("slave1", q/DROP USER 'msandbox'@'%'/);
|
||||
$sb->do_as_root("slave1", q/FLUSH PRIVILEGES/);
|
||||
|
||||
|
||||
$output = output(
|
||||
sub { pt_table_checksum::main(@args) },
|
||||
stderr => 1,
|
||||
);
|
||||
is(
|
||||
PerconaTest::count_checksum_results($output, 'rows'),
|
||||
6,
|
||||
"Large BLOB/TEXT/BINARY Checksum"
|
||||
);
|
||||
|
||||
# Restore privilegs for the other test files
|
||||
$sb->do_as_root("master", q/GRANT ALL PRIVILEGES ON *.* TO 'msandbox'@'%' IDENTIFIED BY 'msandbox'/);
|
||||
$sb->do_as_root("master", q/FLUSH PRIVILEGES/);
|
||||
|
||||
$sb->do_as_root("slave1", q/GRANT ALL PRIVILEGES ON *.* TO 'msandbox'@'%' IDENTIFIED BY 'msandbox'/);
|
||||
$sb->do_as_root("slave1", q/FLUSH PRIVILEGES/);
|
||||
# #############################################################################
|
||||
# Done.
|
||||
# #############################################################################
|
||||
diag("Stopping the sandbox to leave a clean sandbox for the next test file");
|
||||
$sb->do_as_root("slave1", q/DROP USER 'slave_user'@'localhost'/);
|
||||
$sb->do_as_root("slave1", q/FLUSH PRIVILEGES/);
|
||||
|
||||
$sb->wipe_clean($dbh);
|
||||
|
||||
ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
|
||||
|
||||
exit;
|
||||
@@ -0,0 +1,55 @@
|
||||
|
||||
create database if not exists test;
|
||||
use test;
|
||||
|
||||
drop table if exists test1;
|
||||
drop table if exists test2;
|
||||
drop table if exists checksums;
|
||||
|
||||
CREATE TABLE checksums (
|
||||
db CHAR(64) NOT NULL,
|
||||
tbl CHAR(64) NOT NULL,
|
||||
chunk INT NOT NULL,
|
||||
chunk_time FLOAT NULL,
|
||||
chunk_index VARCHAR(200) NULL,
|
||||
lower_boundary TEXT NULL,
|
||||
upper_boundary TEXT NULL,
|
||||
this_crc CHAR(40) NOT NULL,
|
||||
this_cnt INT NOT NULL,
|
||||
master_crc CHAR(40) NULL,
|
||||
master_cnt INT NULL,
|
||||
ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (db, tbl, chunk),
|
||||
INDEX ts_db_tbl (ts, db, tbl)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
create table test1(
|
||||
a int not null,
|
||||
b char(2) not null,
|
||||
primary key(a, b)
|
||||
) ENGINE=INNODB;
|
||||
|
||||
create table test2(
|
||||
a int not null,
|
||||
b char(2) not null,
|
||||
primary key(a, b)
|
||||
) ENGINE=INNODB;
|
||||
|
||||
insert into test1 values(1, 'en'), (2, 'ca');
|
||||
|
||||
drop table if exists test3, test4;
|
||||
create table test3 (
|
||||
id int not null primary key,
|
||||
name varchar(255)
|
||||
);
|
||||
create table test4 (
|
||||
id int not null primary key,
|
||||
name varchar(255)
|
||||
);
|
||||
insert into test3(id, name) values(15034, '51707'),(1, '001');
|
||||
insert into test4(id, name) values(15034, '051707'),(1, '1');
|
||||
|
||||
-- set sql_log_bin=0;
|
||||
-- DROP USER 'slave_user';
|
||||
-- set sql_log_bin=1;
|
||||
-- FLUSH PRIVILEGES;
|
||||
Reference in New Issue
Block a user