Merge pull request #788 from percona/PT-2264_pt-query-digest_Pipeline_process_11_--output_slowlog_caused_an_error_Wide_character

PT-2264 - pt-query-digest Pipeline process 11 (--output slowlog) caused an error: Wide character
This commit is contained in:
Sveta Smirnova
2024-03-29 10:48:16 +03:00
committed by GitHub
26 changed files with 924 additions and 581 deletions

View File

@@ -1611,21 +1611,48 @@ sub get_dbh {
if ( $cxn_string =~ m/mysql/i ) {
my $sql;
if ( my ($charset) = $cxn_string =~ m/charset=([\w]+)/ ) {
my ($charset) = $cxn_string =~ m/charset=([\w]+)/;
if ( $charset ) {
$sql = qq{/*!40101 SET NAMES "$charset"*/};
PTDEBUG && _d($dbh, $sql);
eval { $dbh->do($sql) };
if ( $EVAL_ERROR ) {
die "Error setting NAMES to $charset: $EVAL_ERROR";
}
PTDEBUG && _d('Enabling charset for STDOUT');
if ( $charset eq 'utf8' ) {
binmode(STDOUT, ':utf8')
or die "Can't binmode(STDOUT, ':utf8'): $OS_ERROR";
}
else {
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
if ( $EVAL_ERROR ) {
die "Cannot get MySQL version: $EVAL_ERROR";
}
else {
binmode(STDOUT) or die "Can't binmode(STDOUT): $OS_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;
$charset = $character_set_server;
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 '$character_set_server'") };
if ( $EVAL_ERROR ) {
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
}
}
}
}
PTDEBUG && _d('Enabling charset for STDOUT');
if ( $charset && $charset =~ m/^utf8/ ) {
binmode(STDOUT, ':utf8')
or die "Can't binmode(STDOUT, ':utf8'): $OS_ERROR";
binmode(STDERR, ':utf8')
or die "Can't binmode(STDERR, ':utf8'): $OS_ERROR";
}
else {
binmode(STDOUT) or die "Can't binmode(STDOUT): $OS_ERROR";
}
if ( my $vars = $self->prop('set-vars') ) {
@@ -1651,28 +1678,6 @@ sub get_dbh {
. ": $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: ',
$dbh,