mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-27 07:54:58 +00:00
Merge pull request #420 from percona/PT-1760
PT-1760 regression on slave with replication channels
This commit is contained in:
@@ -2406,6 +2406,10 @@ sub parse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($final_props{F}) {
|
||||||
|
%final_props = ( 'F' => $final_props{F} );
|
||||||
|
}
|
||||||
|
|
||||||
return \%final_props;
|
return \%final_props;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2546,6 +2550,7 @@ sub get_dbh {
|
|||||||
|
|
||||||
if ( $cxn_string =~ m/mysql/i ) {
|
if ( $cxn_string =~ m/mysql/i ) {
|
||||||
my $sql;
|
my $sql;
|
||||||
|
|
||||||
if ( my ($charset) = $cxn_string =~ m/charset=([\w]+)/ ) {
|
if ( my ($charset) = $cxn_string =~ m/charset=([\w]+)/ ) {
|
||||||
$sql = qq{/*!40101 SET NAMES "$charset"*/};
|
$sql = qq{/*!40101 SET NAMES "$charset"*/};
|
||||||
PTDEBUG && _d($dbh, $sql);
|
PTDEBUG && _d($dbh, $sql);
|
||||||
@@ -2586,6 +2591,28 @@ sub get_dbh {
|
|||||||
. ": $EVAL_ERROR";
|
. ": $EVAL_ERROR";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL version: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
|
||||||
|
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
|
||||||
|
$dbh->{mysql_enable_utf8} = 1;
|
||||||
|
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
|
||||||
|
"Setting: SET NAMES $character_set_server";
|
||||||
|
PTDEBUG && _d($msg);
|
||||||
|
eval { $dbh->do("SET NAMES 'utf8mb4'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('DBH info: ',
|
PTDEBUG && _d('DBH info: ',
|
||||||
$dbh,
|
$dbh,
|
||||||
@@ -3893,13 +3920,20 @@ sub get_slave_status {
|
|||||||
if (!$self->{channel}) {
|
if (!$self->{channel}) {
|
||||||
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
|
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
|
||||||
}
|
}
|
||||||
|
my $slave_use_channels;
|
||||||
for my $row (@$sss_rows) {
|
for my $row (@$sss_rows) {
|
||||||
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
|
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
|
||||||
|
if ($row->{channel_name}) {
|
||||||
|
$slave_use_channels = 1;
|
||||||
|
}
|
||||||
if ($row->{channel_name} eq $self->{channel}) {
|
if ($row->{channel_name} eq $self->{channel}) {
|
||||||
$ss = $row;
|
$ss = $row;
|
||||||
last;
|
last;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!$ss && $slave_use_channels) {
|
||||||
|
die 'This server is using replication channels but "channel" was not specified on the command line';
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
|
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
|
||||||
die 'This server is using replication channels but "channel" was not specified on the command line';
|
die 'This server is using replication channels but "channel" was not specified on the command line';
|
||||||
@@ -3912,6 +3946,9 @@ sub get_slave_status {
|
|||||||
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
|
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
|
||||||
return $ss;
|
return $ss;
|
||||||
}
|
}
|
||||||
|
if (!$ss && $self->{channel}) {
|
||||||
|
die "Specified channel name is invalid";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');
|
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');
|
||||||
|
@@ -1972,6 +1972,10 @@ sub parse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($final_props{F}) {
|
||||||
|
%final_props = ( 'F' => $final_props{F} );
|
||||||
|
}
|
||||||
|
|
||||||
return \%final_props;
|
return \%final_props;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2153,6 +2157,28 @@ sub get_dbh {
|
|||||||
. ": $EVAL_ERROR";
|
. ": $EVAL_ERROR";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL version: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
|
||||||
|
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
|
||||||
|
$dbh->{mysql_enable_utf8} = 1;
|
||||||
|
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
|
||||||
|
"Setting: SET NAMES $character_set_server";
|
||||||
|
PTDEBUG && _d($msg);
|
||||||
|
eval { $dbh->do("SET NAMES 'utf8mb4'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('DBH info: ',
|
PTDEBUG && _d('DBH info: ',
|
||||||
$dbh,
|
$dbh,
|
||||||
|
@@ -2316,6 +2316,10 @@ sub parse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($final_props{F}) {
|
||||||
|
%final_props = ( 'F' => $final_props{F} );
|
||||||
|
}
|
||||||
|
|
||||||
return \%final_props;
|
return \%final_props;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2497,6 +2501,28 @@ sub get_dbh {
|
|||||||
. ": $EVAL_ERROR";
|
. ": $EVAL_ERROR";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL version: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
|
||||||
|
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
|
||||||
|
$dbh->{mysql_enable_utf8} = 1;
|
||||||
|
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
|
||||||
|
"Setting: SET NAMES $character_set_server";
|
||||||
|
PTDEBUG && _d($msg);
|
||||||
|
eval { $dbh->do("SET NAMES 'utf8mb4'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('DBH info: ',
|
PTDEBUG && _d('DBH info: ',
|
||||||
$dbh,
|
$dbh,
|
||||||
|
@@ -793,6 +793,10 @@ sub parse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($final_props{F}) {
|
||||||
|
%final_props = ( 'F' => $final_props{F} );
|
||||||
|
}
|
||||||
|
|
||||||
return \%final_props;
|
return \%final_props;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -974,6 +978,28 @@ sub get_dbh {
|
|||||||
. ": $EVAL_ERROR";
|
. ": $EVAL_ERROR";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL version: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
|
||||||
|
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
|
||||||
|
$dbh->{mysql_enable_utf8} = 1;
|
||||||
|
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
|
||||||
|
"Setting: SET NAMES $character_set_server";
|
||||||
|
PTDEBUG && _d($msg);
|
||||||
|
eval { $dbh->do("SET NAMES 'utf8mb4'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('DBH info: ',
|
PTDEBUG && _d('DBH info: ',
|
||||||
$dbh,
|
$dbh,
|
||||||
|
26
bin/pt-find
26
bin/pt-find
@@ -204,6 +204,10 @@ sub parse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($final_props{F}) {
|
||||||
|
%final_props = ( 'F' => $final_props{F} );
|
||||||
|
}
|
||||||
|
|
||||||
return \%final_props;
|
return \%final_props;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -385,6 +389,28 @@ sub get_dbh {
|
|||||||
. ": $EVAL_ERROR";
|
. ": $EVAL_ERROR";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL version: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
|
||||||
|
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
|
||||||
|
$dbh->{mysql_enable_utf8} = 1;
|
||||||
|
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
|
||||||
|
"Setting: SET NAMES $character_set_server";
|
||||||
|
PTDEBUG && _d($msg);
|
||||||
|
eval { $dbh->do("SET NAMES 'utf8mb4'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('DBH info: ',
|
PTDEBUG && _d('DBH info: ',
|
||||||
$dbh,
|
$dbh,
|
||||||
|
@@ -1468,6 +1468,10 @@ sub parse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($final_props{F}) {
|
||||||
|
%final_props = ( 'F' => $final_props{F} );
|
||||||
|
}
|
||||||
|
|
||||||
return \%final_props;
|
return \%final_props;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1649,6 +1653,28 @@ sub get_dbh {
|
|||||||
. ": $EVAL_ERROR";
|
. ": $EVAL_ERROR";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL version: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
|
||||||
|
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
|
||||||
|
$dbh->{mysql_enable_utf8} = 1;
|
||||||
|
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
|
||||||
|
"Setting: SET NAMES $character_set_server";
|
||||||
|
PTDEBUG && _d($msg);
|
||||||
|
eval { $dbh->do("SET NAMES 'utf8mb4'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('DBH info: ',
|
PTDEBUG && _d('DBH info: ',
|
||||||
$dbh,
|
$dbh,
|
||||||
|
@@ -465,13 +465,20 @@ sub get_slave_status {
|
|||||||
if (!$self->{channel}) {
|
if (!$self->{channel}) {
|
||||||
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
|
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
|
||||||
}
|
}
|
||||||
|
my $slave_use_channels;
|
||||||
for my $row (@$sss_rows) {
|
for my $row (@$sss_rows) {
|
||||||
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
|
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
|
||||||
|
if ($row->{channel_name}) {
|
||||||
|
$slave_use_channels = 1;
|
||||||
|
}
|
||||||
if ($row->{channel_name} eq $self->{channel}) {
|
if ($row->{channel_name} eq $self->{channel}) {
|
||||||
$ss = $row;
|
$ss = $row;
|
||||||
last;
|
last;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!$ss && $slave_use_channels) {
|
||||||
|
die 'This server is using replication channels but "channel" was not specified on the command line';
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
|
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
|
||||||
die 'This server is using replication channels but "channel" was not specified on the command line';
|
die 'This server is using replication channels but "channel" was not specified on the command line';
|
||||||
@@ -484,6 +491,9 @@ sub get_slave_status {
|
|||||||
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
|
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
|
||||||
return $ss;
|
return $ss;
|
||||||
}
|
}
|
||||||
|
if (!$ss && $self->{channel}) {
|
||||||
|
die "Specified channel name is invalid";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');
|
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');
|
||||||
@@ -2770,6 +2780,10 @@ sub parse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($final_props{F}) {
|
||||||
|
%final_props = ( 'F' => $final_props{F} );
|
||||||
|
}
|
||||||
|
|
||||||
return \%final_props;
|
return \%final_props;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2951,6 +2965,28 @@ sub get_dbh {
|
|||||||
. ": $EVAL_ERROR";
|
. ": $EVAL_ERROR";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL version: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
|
||||||
|
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
|
||||||
|
$dbh->{mysql_enable_utf8} = 1;
|
||||||
|
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
|
||||||
|
"Setting: SET NAMES $character_set_server";
|
||||||
|
PTDEBUG && _d($msg);
|
||||||
|
eval { $dbh->do("SET NAMES 'utf8mb4'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('DBH info: ',
|
PTDEBUG && _d('DBH info: ',
|
||||||
$dbh,
|
$dbh,
|
||||||
|
@@ -214,6 +214,10 @@ sub parse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($final_props{F}) {
|
||||||
|
%final_props = ( 'F' => $final_props{F} );
|
||||||
|
}
|
||||||
|
|
||||||
return \%final_props;
|
return \%final_props;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -395,6 +399,28 @@ sub get_dbh {
|
|||||||
. ": $EVAL_ERROR";
|
. ": $EVAL_ERROR";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL version: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
|
||||||
|
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
|
||||||
|
$dbh->{mysql_enable_utf8} = 1;
|
||||||
|
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
|
||||||
|
"Setting: SET NAMES $character_set_server";
|
||||||
|
PTDEBUG && _d($msg);
|
||||||
|
eval { $dbh->do("SET NAMES 'utf8mb4'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('DBH info: ',
|
PTDEBUG && _d('DBH info: ',
|
||||||
$dbh,
|
$dbh,
|
||||||
|
36
bin/pt-kill
36
bin/pt-kill
@@ -1976,6 +1976,10 @@ sub parse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($final_props{F}) {
|
||||||
|
%final_props = ( 'F' => $final_props{F} );
|
||||||
|
}
|
||||||
|
|
||||||
return \%final_props;
|
return \%final_props;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2157,6 +2161,28 @@ sub get_dbh {
|
|||||||
. ": $EVAL_ERROR";
|
. ": $EVAL_ERROR";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL version: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
|
||||||
|
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
|
||||||
|
$dbh->{mysql_enable_utf8} = 1;
|
||||||
|
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
|
||||||
|
"Setting: SET NAMES $character_set_server";
|
||||||
|
PTDEBUG && _d($msg);
|
||||||
|
eval { $dbh->do("SET NAMES 'utf8mb4'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('DBH info: ',
|
PTDEBUG && _d('DBH info: ',
|
||||||
$dbh,
|
$dbh,
|
||||||
@@ -4171,13 +4197,20 @@ sub get_slave_status {
|
|||||||
if (!$self->{channel}) {
|
if (!$self->{channel}) {
|
||||||
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
|
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
|
||||||
}
|
}
|
||||||
|
my $slave_use_channels;
|
||||||
for my $row (@$sss_rows) {
|
for my $row (@$sss_rows) {
|
||||||
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
|
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
|
||||||
|
if ($row->{channel_name}) {
|
||||||
|
$slave_use_channels = 1;
|
||||||
|
}
|
||||||
if ($row->{channel_name} eq $self->{channel}) {
|
if ($row->{channel_name} eq $self->{channel}) {
|
||||||
$ss = $row;
|
$ss = $row;
|
||||||
last;
|
last;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!$ss && $slave_use_channels) {
|
||||||
|
die 'This server is using replication channels but "channel" was not specified on the command line';
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
|
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
|
||||||
die 'This server is using replication channels but "channel" was not specified on the command line';
|
die 'This server is using replication channels but "channel" was not specified on the command line';
|
||||||
@@ -4190,6 +4223,9 @@ sub get_slave_status {
|
|||||||
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
|
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
|
||||||
return $ss;
|
return $ss;
|
||||||
}
|
}
|
||||||
|
if (!$ss && $self->{channel}) {
|
||||||
|
die "Specified channel name is invalid";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');
|
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');
|
||||||
|
@@ -2226,6 +2226,10 @@ sub parse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($final_props{F}) {
|
||||||
|
%final_props = ( 'F' => $final_props{F} );
|
||||||
|
}
|
||||||
|
|
||||||
return \%final_props;
|
return \%final_props;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2407,6 +2411,28 @@ sub get_dbh {
|
|||||||
. ": $EVAL_ERROR";
|
. ": $EVAL_ERROR";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL version: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
|
||||||
|
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
|
||||||
|
$dbh->{mysql_enable_utf8} = 1;
|
||||||
|
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
|
||||||
|
"Setting: SET NAMES $character_set_server";
|
||||||
|
PTDEBUG && _d($msg);
|
||||||
|
eval { $dbh->do("SET NAMES 'utf8mb4'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('DBH info: ',
|
PTDEBUG && _d('DBH info: ',
|
||||||
$dbh,
|
$dbh,
|
||||||
@@ -4018,7 +4044,7 @@ sub name {
|
|||||||
|
|
||||||
sub description {
|
sub description {
|
||||||
my ($self) = @_;
|
my ($self) = @_;
|
||||||
return sprintf("%s -> %s:%s", $self->name(), $self->{dsn}->{h}, $self->{dsn}->{P} || 'socket');
|
return sprintf("%s -> %s:%s", $self->name(), $self->{dsn}->{h} || 'localhost' , $self->{dsn}->{P} || 'socket');
|
||||||
}
|
}
|
||||||
|
|
||||||
sub get_id {
|
sub get_id {
|
||||||
@@ -4497,13 +4523,20 @@ sub get_slave_status {
|
|||||||
if (!$self->{channel}) {
|
if (!$self->{channel}) {
|
||||||
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
|
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
|
||||||
}
|
}
|
||||||
|
my $slave_use_channels;
|
||||||
for my $row (@$sss_rows) {
|
for my $row (@$sss_rows) {
|
||||||
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
|
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
|
||||||
|
if ($row->{channel_name}) {
|
||||||
|
$slave_use_channels = 1;
|
||||||
|
}
|
||||||
if ($row->{channel_name} eq $self->{channel}) {
|
if ($row->{channel_name} eq $self->{channel}) {
|
||||||
$ss = $row;
|
$ss = $row;
|
||||||
last;
|
last;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!$ss && $slave_use_channels) {
|
||||||
|
die 'This server is using replication channels but "channel" was not specified on the command line';
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
|
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
|
||||||
die 'This server is using replication channels but "channel" was not specified on the command line';
|
die 'This server is using replication channels but "channel" was not specified on the command line';
|
||||||
@@ -4516,6 +4549,9 @@ sub get_slave_status {
|
|||||||
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
|
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
|
||||||
return $ss;
|
return $ss;
|
||||||
}
|
}
|
||||||
|
if (!$ss && $self->{channel}) {
|
||||||
|
die "Specified channel name is invalid";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');
|
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');
|
||||||
@@ -4978,7 +5014,7 @@ sub wait {
|
|||||||
if ( $pr ) {
|
if ( $pr ) {
|
||||||
$pr_callback = sub {
|
$pr_callback = sub {
|
||||||
my ($fraction, $elapsed, $remaining, $eta, $completed) = @_;
|
my ($fraction, $elapsed, $remaining, $eta, $completed) = @_;
|
||||||
my $dsn_name = $worst->{cxn}->name();
|
my $dsn_name = $worst->{cxn}->{dsn_name};
|
||||||
if ( defined $worst->{lag} ) {
|
if ( defined $worst->{lag} ) {
|
||||||
print STDERR "Replica lag is " . ($worst->{lag} || '?')
|
print STDERR "Replica lag is " . ($worst->{lag} || '?')
|
||||||
. " seconds on $dsn_name. Waiting.\n";
|
. " seconds on $dsn_name. Waiting.\n";
|
||||||
@@ -4987,19 +5023,19 @@ sub wait {
|
|||||||
if ($self->{fail_on_stopped_replication}) {
|
if ($self->{fail_on_stopped_replication}) {
|
||||||
die 'replication is stopped';
|
die 'replication is stopped';
|
||||||
}
|
}
|
||||||
print STDERR "Replica $dsn_name is stopped. Waiting.\n";
|
print STDERR "(1) Replica '$dsn_name' is stopped. Waiting.\n";
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
$pr->set_callback($pr_callback);
|
$pr->set_callback($pr_callback);
|
||||||
|
|
||||||
$pr_first_report = sub {
|
$pr_first_report = sub {
|
||||||
my $dsn_name = $worst->{cxn}->name();
|
my $dsn_name = $worst->{cxn}->{dsn_name};
|
||||||
if ( !defined $worst->{lag} ) {
|
if ( !defined $worst->{lag} ) {
|
||||||
if ($self->{fail_on_stopped_replication}) {
|
if ($self->{fail_on_stopped_replication}) {
|
||||||
die 'replication is stopped';
|
die 'replication is stopped';
|
||||||
}
|
}
|
||||||
print STDERR "Replica $dsn_name is stopped. Waiting.\n";
|
print STDERR "(2) Replica $dsn_name is stopped. Waiting.\n";
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
@@ -5009,7 +5045,13 @@ sub wait {
|
|||||||
while ( $oktorun->() && @lagged_slaves ) {
|
while ( $oktorun->() && @lagged_slaves ) {
|
||||||
PTDEBUG && _d('Checking slave lag');
|
PTDEBUG && _d('Checking slave lag');
|
||||||
for my $i ( 0..$#lagged_slaves ) {
|
for my $i ( 0..$#lagged_slaves ) {
|
||||||
my $lag = $get_lag->($lagged_slaves[$i]->{cxn});
|
my $lag;
|
||||||
|
eval {
|
||||||
|
$lag = $get_lag->($lagged_slaves[$i]->{cxn});
|
||||||
|
};
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die $EVAL_ERROR;
|
||||||
|
}
|
||||||
PTDEBUG && _d($lagged_slaves[$i]->{cxn}->name(),
|
PTDEBUG && _d($lagged_slaves[$i]->{cxn}->name(),
|
||||||
'slave lag:', $lag);
|
'slave lag:', $lag);
|
||||||
if ( !defined $lag || $lag > $max_lag ) {
|
if ( !defined $lag || $lag > $max_lag ) {
|
||||||
@@ -8704,6 +8746,7 @@ sub main {
|
|||||||
OptionParser => $o,
|
OptionParser => $o,
|
||||||
DSNParser => $dp,
|
DSNParser => $dp,
|
||||||
Quoter => $q,
|
Quoter => $q,
|
||||||
|
channel => $o->get('channel'),
|
||||||
);
|
);
|
||||||
|
|
||||||
$slaves = $ms->get_slaves(
|
$slaves = $ms->get_slaves(
|
||||||
@@ -8733,7 +8776,7 @@ sub main {
|
|||||||
PTDEBUG && _d('Will use --check-slave-lag to check for slave lag');
|
PTDEBUG && _d('Will use --check-slave-lag to check for slave lag');
|
||||||
my $cxn = $make_cxn->(
|
my $cxn = $make_cxn->(
|
||||||
dsn_string => $o->get('check-slave-lag'),
|
dsn_string => $o->get('check-slave-lag'),
|
||||||
prev_dsn => $cxn->dsn(),
|
#prev_dsn => $cxn->dsn(),
|
||||||
);
|
);
|
||||||
$slave_lag_cxns = [ $cxn ];
|
$slave_lag_cxns = [ $cxn ];
|
||||||
}
|
}
|
||||||
@@ -8741,6 +8784,7 @@ sub main {
|
|||||||
PTDEBUG && _d('Will check slave lag on all slaves');
|
PTDEBUG && _d('Will check slave lag on all slaves');
|
||||||
$slave_lag_cxns = $slaves;
|
$slave_lag_cxns = $slaves;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( $slave_lag_cxns && scalar @$slave_lag_cxns ) {
|
if ( $slave_lag_cxns && scalar @$slave_lag_cxns ) {
|
||||||
if ($o->get('skip-check-slave-lag')) {
|
if ($o->get('skip-check-slave-lag')) {
|
||||||
my $slaves_to_skip = $o->get('skip-check-slave-lag');
|
my $slaves_to_skip = $o->get('skip-check-slave-lag');
|
||||||
@@ -8773,6 +8817,15 @@ sub main {
|
|||||||
print "Not checking slave lag because no slaves were found "
|
print "Not checking slave lag because no slaves were found "
|
||||||
. "and --check-slave-lag was not specified.\n";
|
. "and --check-slave-lag was not specified.\n";
|
||||||
}
|
}
|
||||||
|
# Before starting, check the replication is not using replications channels or that --channel was specified
|
||||||
|
for my $slave (@$slave_lag_cxns) {
|
||||||
|
eval {
|
||||||
|
my $ss = $ms->get_slave_status($slave->{dbh});
|
||||||
|
};
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die $EVAL_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# #####################################################################
|
# #####################################################################
|
||||||
# Check for replication filters.
|
# Check for replication filters.
|
||||||
@@ -8850,6 +8903,7 @@ sub main {
|
|||||||
#TODO REMOVE DEBUG
|
#TODO REMOVE DEBUG
|
||||||
PTDEBUG && _d('2> Cannot connect to', $cxn->name(), ':',
|
PTDEBUG && _d('2> Cannot connect to', $cxn->name(), ':',
|
||||||
$EVAL_ERROR);
|
$EVAL_ERROR);
|
||||||
|
die '2> Cannot connect to '. $cxn->name() . ':' . $EVAL_ERROR;
|
||||||
# Make ReplicaLagWaiter::wait() report slave is stopped.
|
# Make ReplicaLagWaiter::wait() report slave is stopped.
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
@@ -8859,8 +8913,8 @@ sub main {
|
|||||||
$lag = $ms->get_slave_lag($dbh);
|
$lag = $ms->get_slave_lag($dbh);
|
||||||
};
|
};
|
||||||
if ( $EVAL_ERROR ) {
|
if ( $EVAL_ERROR ) {
|
||||||
PTDEBUG && _d('Cannot get lag for', $cxn->name(), ':',
|
PTDEBUG && _d('Cannot get lag for', $cxn->name(), ':', $EVAL_ERROR);
|
||||||
$EVAL_ERROR);
|
die '2> Cannot connect to '. $cxn->name() . ':' . $EVAL_ERROR;
|
||||||
}
|
}
|
||||||
return $lag; # undef if error
|
return $lag; # undef if error
|
||||||
};
|
};
|
||||||
@@ -12055,6 +12109,18 @@ the server very busy, this can cause an outage.
|
|||||||
|
|
||||||
Prompt for a password when connecting to MySQL.
|
Prompt for a password when connecting to MySQL.
|
||||||
|
|
||||||
|
=item --channel
|
||||||
|
|
||||||
|
type: string
|
||||||
|
|
||||||
|
Channel name used when connected to a server using replication channels.
|
||||||
|
Suppose you have two masters, master_a at port 12345, master_b at port 1236 and
|
||||||
|
a slave connected to both masters using channels chan_master_a and chan_master_b.
|
||||||
|
If you want to run pt-table-sync to syncronize the slave against master_a, pt-table-sync
|
||||||
|
won't be able to determine what's the correct master since SHOW SLAVE STATUS
|
||||||
|
will return 2 rows. In this case, you can use --channel=chan_master_a to specify
|
||||||
|
the channel name to use in the SHOW SLAVE STATUS command.
|
||||||
|
|
||||||
=item --charset
|
=item --charset
|
||||||
|
|
||||||
short form: -A; type: string
|
short form: -A; type: string
|
||||||
@@ -13066,7 +13132,7 @@ If password contains commas they must be escaped with a backslash: "exam\,ple"
|
|||||||
|
|
||||||
=item * P
|
=item * P
|
||||||
|
|
||||||
dsn: port; copy: yes
|
dsn: port; copy: no
|
||||||
|
|
||||||
Port number to use for connection.
|
Port number to use for connection.
|
||||||
|
|
||||||
|
@@ -882,6 +882,10 @@ sub parse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($final_props{F}) {
|
||||||
|
%final_props = ( 'F' => $final_props{F} );
|
||||||
|
}
|
||||||
|
|
||||||
return \%final_props;
|
return \%final_props;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1063,6 +1067,28 @@ sub get_dbh {
|
|||||||
. ": $EVAL_ERROR";
|
. ": $EVAL_ERROR";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL version: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
|
||||||
|
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
|
||||||
|
$dbh->{mysql_enable_utf8} = 1;
|
||||||
|
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
|
||||||
|
"Setting: SET NAMES $character_set_server";
|
||||||
|
PTDEBUG && _d($msg);
|
||||||
|
eval { $dbh->do("SET NAMES 'utf8mb4'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('DBH info: ',
|
PTDEBUG && _d('DBH info: ',
|
||||||
$dbh,
|
$dbh,
|
||||||
@@ -10819,13 +10845,20 @@ sub get_slave_status {
|
|||||||
if (!$self->{channel}) {
|
if (!$self->{channel}) {
|
||||||
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
|
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
|
||||||
}
|
}
|
||||||
|
my $slave_use_channels;
|
||||||
for my $row (@$sss_rows) {
|
for my $row (@$sss_rows) {
|
||||||
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
|
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
|
||||||
|
if ($row->{channel_name}) {
|
||||||
|
$slave_use_channels = 1;
|
||||||
|
}
|
||||||
if ($row->{channel_name} eq $self->{channel}) {
|
if ($row->{channel_name} eq $self->{channel}) {
|
||||||
$ss = $row;
|
$ss = $row;
|
||||||
last;
|
last;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!$ss && $slave_use_channels) {
|
||||||
|
die 'This server is using replication channels but "channel" was not specified on the command line';
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
|
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
|
||||||
die 'This server is using replication channels but "channel" was not specified on the command line';
|
die 'This server is using replication channels but "channel" was not specified on the command line';
|
||||||
@@ -10838,6 +10871,9 @@ sub get_slave_status {
|
|||||||
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
|
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
|
||||||
return $ss;
|
return $ss;
|
||||||
}
|
}
|
||||||
|
if (!$ss && $self->{channel}) {
|
||||||
|
die "Specified channel name is invalid";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');
|
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');
|
||||||
|
@@ -1248,6 +1248,10 @@ sub parse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($final_props{F}) {
|
||||||
|
%final_props = ( 'F' => $final_props{F} );
|
||||||
|
}
|
||||||
|
|
||||||
return \%final_props;
|
return \%final_props;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1429,6 +1433,28 @@ sub get_dbh {
|
|||||||
. ": $EVAL_ERROR";
|
. ": $EVAL_ERROR";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL version: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
|
||||||
|
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
|
||||||
|
$dbh->{mysql_enable_utf8} = 1;
|
||||||
|
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
|
||||||
|
"Setting: SET NAMES $character_set_server";
|
||||||
|
PTDEBUG && _d($msg);
|
||||||
|
eval { $dbh->do("SET NAMES 'utf8mb4'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('DBH info: ',
|
PTDEBUG && _d('DBH info: ',
|
||||||
$dbh,
|
$dbh,
|
||||||
|
@@ -1969,6 +1969,10 @@ sub parse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($final_props{F}) {
|
||||||
|
%final_props = ( 'F' => $final_props{F} );
|
||||||
|
}
|
||||||
|
|
||||||
return \%final_props;
|
return \%final_props;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2150,6 +2154,28 @@ sub get_dbh {
|
|||||||
. ": $EVAL_ERROR";
|
. ": $EVAL_ERROR";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL version: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
|
||||||
|
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
|
||||||
|
$dbh->{mysql_enable_utf8} = 1;
|
||||||
|
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
|
||||||
|
"Setting: SET NAMES $character_set_server";
|
||||||
|
PTDEBUG && _d($msg);
|
||||||
|
eval { $dbh->do("SET NAMES 'utf8mb4'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('DBH info: ',
|
PTDEBUG && _d('DBH info: ',
|
||||||
$dbh,
|
$dbh,
|
||||||
|
@@ -1904,6 +1904,10 @@ sub parse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($final_props{F}) {
|
||||||
|
%final_props = ( 'F' => $final_props{F} );
|
||||||
|
}
|
||||||
|
|
||||||
return \%final_props;
|
return \%final_props;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2085,6 +2089,28 @@ sub get_dbh {
|
|||||||
. ": $EVAL_ERROR";
|
. ": $EVAL_ERROR";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL version: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
|
||||||
|
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
|
||||||
|
$dbh->{mysql_enable_utf8} = 1;
|
||||||
|
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
|
||||||
|
"Setting: SET NAMES $character_set_server";
|
||||||
|
PTDEBUG && _d($msg);
|
||||||
|
eval { $dbh->do("SET NAMES 'utf8mb4'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('DBH info: ',
|
PTDEBUG && _d('DBH info: ',
|
||||||
$dbh,
|
$dbh,
|
||||||
@@ -2579,13 +2605,20 @@ sub get_slave_status {
|
|||||||
if (!$self->{channel}) {
|
if (!$self->{channel}) {
|
||||||
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
|
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
|
||||||
}
|
}
|
||||||
|
my $slave_use_channels;
|
||||||
for my $row (@$sss_rows) {
|
for my $row (@$sss_rows) {
|
||||||
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
|
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
|
||||||
|
if ($row->{channel_name}) {
|
||||||
|
$slave_use_channels = 1;
|
||||||
|
}
|
||||||
if ($row->{channel_name} eq $self->{channel}) {
|
if ($row->{channel_name} eq $self->{channel}) {
|
||||||
$ss = $row;
|
$ss = $row;
|
||||||
last;
|
last;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!$ss && $slave_use_channels) {
|
||||||
|
die 'This server is using replication channels but "channel" was not specified on the command line';
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
|
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
|
||||||
die 'This server is using replication channels but "channel" was not specified on the command line';
|
die 'This server is using replication channels but "channel" was not specified on the command line';
|
||||||
@@ -2598,6 +2631,9 @@ sub get_slave_status {
|
|||||||
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
|
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
|
||||||
return $ss;
|
return $ss;
|
||||||
}
|
}
|
||||||
|
if (!$ss && $self->{channel}) {
|
||||||
|
die "Specified channel name is invalid";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');
|
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');
|
||||||
|
@@ -2315,6 +2315,10 @@ sub parse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($final_props{F}) {
|
||||||
|
%final_props = ( 'F' => $final_props{F} );
|
||||||
|
}
|
||||||
|
|
||||||
return \%final_props;
|
return \%final_props;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2496,6 +2500,28 @@ sub get_dbh {
|
|||||||
. ": $EVAL_ERROR";
|
. ": $EVAL_ERROR";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL version: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
|
||||||
|
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
|
||||||
|
$dbh->{mysql_enable_utf8} = 1;
|
||||||
|
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
|
||||||
|
"Setting: SET NAMES $character_set_server";
|
||||||
|
PTDEBUG && _d($msg);
|
||||||
|
eval { $dbh->do("SET NAMES 'utf8mb4'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('DBH info: ',
|
PTDEBUG && _d('DBH info: ',
|
||||||
$dbh,
|
$dbh,
|
||||||
@@ -2990,13 +3016,20 @@ sub get_slave_status {
|
|||||||
if (!$self->{channel}) {
|
if (!$self->{channel}) {
|
||||||
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
|
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
|
||||||
}
|
}
|
||||||
|
my $slave_use_channels;
|
||||||
for my $row (@$sss_rows) {
|
for my $row (@$sss_rows) {
|
||||||
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
|
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
|
||||||
|
if ($row->{channel_name}) {
|
||||||
|
$slave_use_channels = 1;
|
||||||
|
}
|
||||||
if ($row->{channel_name} eq $self->{channel}) {
|
if ($row->{channel_name} eq $self->{channel}) {
|
||||||
$ss = $row;
|
$ss = $row;
|
||||||
last;
|
last;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!$ss && $slave_use_channels) {
|
||||||
|
die 'This server is using replication channels but "channel" was not specified on the command line';
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
|
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
|
||||||
die 'This server is using replication channels but "channel" was not specified on the command line';
|
die 'This server is using replication channels but "channel" was not specified on the command line';
|
||||||
@@ -3009,6 +3042,9 @@ sub get_slave_status {
|
|||||||
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
|
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
|
||||||
return $ss;
|
return $ss;
|
||||||
}
|
}
|
||||||
|
if (!$ss && $self->{channel}) {
|
||||||
|
die "Specified channel name is invalid";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');
|
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');
|
||||||
|
@@ -1504,6 +1504,10 @@ sub parse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($final_props{F}) {
|
||||||
|
%final_props = ( 'F' => $final_props{F} );
|
||||||
|
}
|
||||||
|
|
||||||
return \%final_props;
|
return \%final_props;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1685,6 +1689,28 @@ sub get_dbh {
|
|||||||
. ": $EVAL_ERROR";
|
. ": $EVAL_ERROR";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL version: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
|
||||||
|
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
|
||||||
|
$dbh->{mysql_enable_utf8} = 1;
|
||||||
|
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
|
||||||
|
"Setting: SET NAMES $character_set_server";
|
||||||
|
PTDEBUG && _d($msg);
|
||||||
|
eval { $dbh->do("SET NAMES 'utf8mb4'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('DBH info: ',
|
PTDEBUG && _d('DBH info: ',
|
||||||
$dbh,
|
$dbh,
|
||||||
@@ -5447,13 +5473,20 @@ sub get_slave_status {
|
|||||||
if (!$self->{channel}) {
|
if (!$self->{channel}) {
|
||||||
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
|
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
|
||||||
}
|
}
|
||||||
|
my $slave_use_channels;
|
||||||
for my $row (@$sss_rows) {
|
for my $row (@$sss_rows) {
|
||||||
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
|
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
|
||||||
|
if ($row->{channel_name}) {
|
||||||
|
$slave_use_channels = 1;
|
||||||
|
}
|
||||||
if ($row->{channel_name} eq $self->{channel}) {
|
if ($row->{channel_name} eq $self->{channel}) {
|
||||||
$ss = $row;
|
$ss = $row;
|
||||||
last;
|
last;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!$ss && $slave_use_channels) {
|
||||||
|
die 'This server is using replication channels but "channel" was not specified on the command line';
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
|
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
|
||||||
die 'This server is using replication channels but "channel" was not specified on the command line';
|
die 'This server is using replication channels but "channel" was not specified on the command line';
|
||||||
@@ -5466,6 +5499,9 @@ sub get_slave_status {
|
|||||||
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
|
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
|
||||||
return $ss;
|
return $ss;
|
||||||
}
|
}
|
||||||
|
if (!$ss && $self->{channel}) {
|
||||||
|
die "Specified channel name is invalid";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');
|
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');
|
||||||
|
@@ -2137,7 +2137,10 @@ sub parse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$self->{dsn_props} = \%final_props;
|
if ($final_props{F}) {
|
||||||
|
%final_props = ( 'F' => $final_props{F} );
|
||||||
|
}
|
||||||
|
|
||||||
return \%final_props;
|
return \%final_props;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2319,18 +2322,26 @@ sub get_dbh {
|
|||||||
. ": $EVAL_ERROR";
|
. ": $EVAL_ERROR";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL version: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
if ($self->{dsn_props}->{D} && $self->{dsn_props}->{t}) {
|
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
|
||||||
PTDEBUG && _d("DSN has a schema and table: $self->{dsn_props}->{D}.$self->{dsn_props}->{t}");
|
if ($EVAL_ERROR) {
|
||||||
PTDEBUG && _d("Trying to set the default charset for the connection");
|
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
|
||||||
my (undef, $create_table) = eval { $dbh->selectrow_array("SHOW CREATE TABLE $self->{dsn_props}->{D}.$self->{dsn_props}->{t}") };
|
}
|
||||||
|
|
||||||
if ($create_table && $create_table =~ m/DEFAULT CHARSET=(\S+)\s*/) {
|
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
|
||||||
PTDEBUG && _d("Detected table's character set: $1");
|
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
|
||||||
PTDEBUG && _d("Executing: SET NAMES '$1'");
|
$dbh->{mysql_enable_utf8} = 1;
|
||||||
$dbh->do("SET NAMES '$1'");
|
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
|
||||||
} else {
|
"Setting: SET NAMES $character_set_server";
|
||||||
PTDEBUG && _d("Cannot get the default character set for the table");
|
PTDEBUG && _d($msg);
|
||||||
|
eval { $dbh->do("SET NAMES 'utf8mb4'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6992,13 +7003,20 @@ sub get_slave_status {
|
|||||||
if (!$self->{channel}) {
|
if (!$self->{channel}) {
|
||||||
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
|
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
|
||||||
}
|
}
|
||||||
|
my $slave_use_channels;
|
||||||
for my $row (@$sss_rows) {
|
for my $row (@$sss_rows) {
|
||||||
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
|
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
|
||||||
|
if ($row->{channel_name}) {
|
||||||
|
$slave_use_channels = 1;
|
||||||
|
}
|
||||||
if ($row->{channel_name} eq $self->{channel}) {
|
if ($row->{channel_name} eq $self->{channel}) {
|
||||||
$ss = $row;
|
$ss = $row;
|
||||||
last;
|
last;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!$ss && $slave_use_channels) {
|
||||||
|
die 'This server is using replication channels but "channel" was not specified on the command line';
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
|
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
|
||||||
die 'This server is using replication channels but "channel" was not specified on the command line';
|
die 'This server is using replication channels but "channel" was not specified on the command line';
|
||||||
@@ -7011,6 +7029,9 @@ sub get_slave_status {
|
|||||||
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
|
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
|
||||||
return $ss;
|
return $ss;
|
||||||
}
|
}
|
||||||
|
if (!$ss && $self->{channel}) {
|
||||||
|
die "Specified channel name is invalid";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');
|
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');
|
||||||
|
@@ -156,6 +156,10 @@ sub parse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($final_props{F}) {
|
||||||
|
%final_props = ( 'F' => $final_props{F} );
|
||||||
|
}
|
||||||
|
|
||||||
return \%final_props;
|
return \%final_props;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -337,6 +341,28 @@ sub get_dbh {
|
|||||||
. ": $EVAL_ERROR";
|
. ": $EVAL_ERROR";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL version: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
|
||||||
|
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
|
||||||
|
$dbh->{mysql_enable_utf8} = 1;
|
||||||
|
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
|
||||||
|
"Setting: SET NAMES $character_set_server";
|
||||||
|
PTDEBUG && _d($msg);
|
||||||
|
eval { $dbh->do("SET NAMES 'utf8mb4'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('DBH info: ',
|
PTDEBUG && _d('DBH info: ',
|
||||||
$dbh,
|
$dbh,
|
||||||
|
@@ -879,6 +879,10 @@ sub parse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($final_props{F}) {
|
||||||
|
%final_props = ( 'F' => $final_props{F} );
|
||||||
|
}
|
||||||
|
|
||||||
return \%final_props;
|
return \%final_props;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1060,6 +1064,28 @@ sub get_dbh {
|
|||||||
. ": $EVAL_ERROR";
|
. ": $EVAL_ERROR";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL version: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
|
||||||
|
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
|
||||||
|
$dbh->{mysql_enable_utf8} = 1;
|
||||||
|
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
|
||||||
|
"Setting: SET NAMES $character_set_server";
|
||||||
|
PTDEBUG && _d($msg);
|
||||||
|
eval { $dbh->do("SET NAMES 'utf8mb4'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('DBH info: ',
|
PTDEBUG && _d('DBH info: ',
|
||||||
$dbh,
|
$dbh,
|
||||||
|
@@ -1973,6 +1973,10 @@ sub parse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($final_props{F}) {
|
||||||
|
%final_props = ( 'F' => $final_props{F} );
|
||||||
|
}
|
||||||
|
|
||||||
return \%final_props;
|
return \%final_props;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2154,6 +2158,28 @@ sub get_dbh {
|
|||||||
. ": $EVAL_ERROR";
|
. ": $EVAL_ERROR";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL version: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
|
||||||
|
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
|
||||||
|
$dbh->{mysql_enable_utf8} = 1;
|
||||||
|
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
|
||||||
|
"Setting: SET NAMES $character_set_server";
|
||||||
|
PTDEBUG && _d($msg);
|
||||||
|
eval { $dbh->do("SET NAMES 'utf8mb4'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('DBH info: ',
|
PTDEBUG && _d('DBH info: ',
|
||||||
$dbh,
|
$dbh,
|
||||||
|
@@ -1921,6 +1921,10 @@ sub parse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($final_props{F}) {
|
||||||
|
%final_props = ( 'F' => $final_props{F} );
|
||||||
|
}
|
||||||
|
|
||||||
return \%final_props;
|
return \%final_props;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2102,6 +2106,28 @@ sub get_dbh {
|
|||||||
. ": $EVAL_ERROR";
|
. ": $EVAL_ERROR";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL version: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
|
||||||
|
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
|
||||||
|
$dbh->{mysql_enable_utf8} = 1;
|
||||||
|
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
|
||||||
|
"Setting: SET NAMES $character_set_server";
|
||||||
|
PTDEBUG && _d($msg);
|
||||||
|
eval { $dbh->do("SET NAMES 'utf8mb4'") };
|
||||||
|
if ($EVAL_ERROR) {
|
||||||
|
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('DBH info: ',
|
PTDEBUG && _d('DBH info: ',
|
||||||
$dbh,
|
$dbh,
|
||||||
|
@@ -230,7 +230,7 @@ sub name {
|
|||||||
|
|
||||||
sub description {
|
sub description {
|
||||||
my ($self) = @_;
|
my ($self) = @_;
|
||||||
return sprintf("%s -> %s:%s", $self->name(), $self->{dsn}->{h}, $self->{dsn}->{P} || 'socket');
|
return sprintf("%s -> %s:%s", $self->name(), $self->{dsn}->{h} || 'localhost' , $self->{dsn}->{P} || 'socket');
|
||||||
}
|
}
|
||||||
|
|
||||||
# This returns the server_id.
|
# This returns the server_id.
|
||||||
|
@@ -449,13 +449,20 @@ sub get_slave_status {
|
|||||||
if (!$self->{channel}) {
|
if (!$self->{channel}) {
|
||||||
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
|
die 'This server returned more than one row for SHOW SLAVE STATUS but "channel" was not specified on the command line';
|
||||||
}
|
}
|
||||||
|
my $slave_use_channels;
|
||||||
for my $row (@$sss_rows) {
|
for my $row (@$sss_rows) {
|
||||||
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
|
$row = { map { lc($_) => $row->{$_} } keys %$row }; # lowercase the keys
|
||||||
|
if ($row->{channel_name}) {
|
||||||
|
$slave_use_channels = 1;
|
||||||
|
}
|
||||||
if ($row->{channel_name} eq $self->{channel}) {
|
if ($row->{channel_name} eq $self->{channel}) {
|
||||||
$ss = $row;
|
$ss = $row;
|
||||||
last;
|
last;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!$ss && $slave_use_channels) {
|
||||||
|
die 'This server is using replication channels but "channel" was not specified on the command line';
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
|
if ($sss_rows->[0]->{channel_name} && $sss_rows->[0]->{channel_name} ne $self->{channel}) {
|
||||||
die 'This server is using replication channels but "channel" was not specified on the command line';
|
die 'This server is using replication channels but "channel" was not specified on the command line';
|
||||||
@@ -468,6 +475,9 @@ sub get_slave_status {
|
|||||||
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
|
$ss = { map { lc($_) => $ss->{$_} } keys %$ss }; # lowercase the keys
|
||||||
return $ss;
|
return $ss;
|
||||||
}
|
}
|
||||||
|
if (!$ss && $self->{channel}) {
|
||||||
|
die "Specified channel name is invalid";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');
|
PTDEBUG && _d('This server returns nothing for SHOW SLAVE STATUS');
|
||||||
|
@@ -8,8 +8,8 @@ SET @@GLOBAL.GTID_MODE = ON;
|
|||||||
|
|
||||||
CHANGE MASTER TO master_host='127.0.0.1', master_port=12345, master_user='msandbox', master_password='msandbox', master_auto_position=1 FOR CHANNEL 'masterchan1';
|
CHANGE MASTER TO master_host='127.0.0.1', master_port=12345, master_user='msandbox', master_password='msandbox', master_auto_position=1 FOR CHANNEL 'masterchan1';
|
||||||
|
|
||||||
CHANGE MASTER TO master_host='127.0.0.1', master_port=12346, master_user='msandbox', master_password='msandbox', master_auto_position=1 FOR CHANNEL 'masterchan2';
|
-- CHANGE MASTER TO master_host='127.0.0.1', master_port=12346, master_user='msandbox', master_password='msandbox', master_auto_position=1 FOR CHANNEL 'masterchan2';
|
||||||
|
|
||||||
START SLAVE for channel 'masterchan1';
|
START SLAVE for channel 'masterchan1';
|
||||||
START SLAVE for channel 'masterchan2';
|
-- START SLAVE for channel 'masterchan2';
|
||||||
|
|
||||||
|
@@ -84,6 +84,14 @@ is_deeply(
|
|||||||
'Basic DSN'
|
'Basic DSN'
|
||||||
);
|
);
|
||||||
|
|
||||||
|
is_deeply(
|
||||||
|
$dp->parse('u=a,p=b,F=/something.cnf'),
|
||||||
|
{
|
||||||
|
F => '/something.cnf',
|
||||||
|
},
|
||||||
|
'Read from config overrides other params'
|
||||||
|
);
|
||||||
|
|
||||||
is_deeply(
|
is_deeply(
|
||||||
$dp->parse('S=/tmp/sock'),
|
$dp->parse('S=/tmp/sock'),
|
||||||
{ u => undef,
|
{ u => undef,
|
||||||
@@ -257,7 +265,7 @@ SKIP: {
|
|||||||
is($d->{h}, '127.0.0.1', 'Left hostname alone');
|
is($d->{h}, '127.0.0.1', 'Left hostname alone');
|
||||||
|
|
||||||
my $want = $sandbox_version lt '8.0' ? [ qw(utf8 utf8 utf8) ]: [ qw(utf8mb4 utf8mb4 utf8mb4) ];
|
my $want = $sandbox_version lt '8.0' ? [ qw(utf8 utf8 utf8) ]: [ qw(utf8mb4 utf8mb4 utf8mb4) ];
|
||||||
warn Data::Dumper::Dumper($want);
|
|
||||||
is_deeply(
|
is_deeply(
|
||||||
$dbh->selectrow_arrayref('select @@character_set_client, @@character_set_connection, @@character_set_results'),
|
$dbh->selectrow_arrayref('select @@character_set_client, @@character_set_connection, @@character_set_results'),
|
||||||
$want,
|
$want,
|
||||||
|
@@ -28,7 +28,8 @@ if ( !$master_dbh ) {
|
|||||||
# The sandbox servers run with lock_wait_timeout=3 and it's not dynamic
|
# 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
|
# so we need to specify --set-vars innodb_lock_wait_timeout-3 else the
|
||||||
# tool will die.
|
# tool will die.
|
||||||
my $master_dsn = 'h=127.1,P=12345,u=msandbox,p=msandbox';
|
$master_dbh->do('SET @@collation_server="latin1_swedish_ci"');
|
||||||
|
my $master_dsn = 'h=127.1,P=12345,u=msandbox,p=msandbox,charset=utf8';
|
||||||
my @args = (qw(--set-vars innodb_lock_wait_timeout=3 --alter-foreign-keys-method rebuild_constraints));
|
my @args = (qw(--set-vars innodb_lock_wait_timeout=3 --alter-foreign-keys-method rebuild_constraints));
|
||||||
my $output;
|
my $output;
|
||||||
my $exit_status;
|
my $exit_status;
|
||||||
@@ -47,6 +48,7 @@ $sb->load_file('master', "$sample/long_fk_constraints.sql");
|
|||||||
sub { pt_online_schema_change::main(@args,
|
sub { pt_online_schema_change::main(@args,
|
||||||
"$master_dsn,D=bug1215587,t=Table1",
|
"$master_dsn,D=bug1215587,t=Table1",
|
||||||
"--alter", "ENGINE=InnoDB",
|
"--alter", "ENGINE=InnoDB",
|
||||||
|
"--charset", "utf8",
|
||||||
qw(--execute)) },
|
qw(--execute)) },
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -66,10 +68,10 @@ my @sorted_constraints = sort { @$a[0].@$a[1] cmp @$b[0].@$b[1] } @$constraints;
|
|||||||
is_deeply(
|
is_deeply(
|
||||||
\@sorted_constraints,
|
\@sorted_constraints,
|
||||||
[
|
[
|
||||||
[ 'Table1', '__fkey1a' ],
|
[ 'Table1', '_fkey1a' ],
|
||||||
[ 'Table1', '__fkey_SALES_RECURRING_PROFILE_CUSTOMER_CUSTOMER_ENTITY_ENTITY_I' ],
|
[ 'Table1', '_fkey_SALES_RECURRING_PROFILE_CUSTOMER_CUSTOMER_ENTITY_ENTITY_ID' ],
|
||||||
[ 'Table2', '__fkey2b' ],
|
[ 'Table2', 'fkey2a' ],
|
||||||
[ 'Table2', '_fkey2a' ],
|
[ 'Table2', '_fkey2b' ],
|
||||||
],
|
],
|
||||||
"First run adds or removes underscore from constraint names, accordingly"
|
"First run adds or removes underscore from constraint names, accordingly"
|
||||||
);
|
);
|
||||||
|
Reference in New Issue
Block a user