mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-03 02:55:57 +00:00
Compare commits
5 Commits
PT-1398_pt
...
PT-2016-pt
Author | SHA1 | Date | |
---|---|---|---|
![]() |
6c608c45eb | ||
![]() |
8dff9b3026 | ||
![]() |
60f4caeb9d | ||
![]() |
951a333c81 | ||
![]() |
0d2c48456f |
@@ -2280,12 +2280,14 @@ report_jemalloc_enabled() {
|
||||
done
|
||||
|
||||
if [ $GENERAL_JEMALLOC_STATUS -eq 1 ]; then
|
||||
JEMALLOC_LOCATION=$(find /usr/lib64/ /usr/lib/x86_64-linux-gnu /usr/lib -name "libjemalloc.*" 2>/dev/null | head -n 1)
|
||||
if [ -z "$JEMALLOC_LOCATION" ]; then
|
||||
echo "Jemalloc library not found"
|
||||
else
|
||||
echo "Using jemalloc from $JEMALLOC_LOCATION"
|
||||
fi
|
||||
for pid in $(pidof mysqld); do
|
||||
JEMALLOC_LOCATION=$(strings /proc/${pid}/environ | grep jemalloc)
|
||||
if [ -z "$JEMALLOC_LOCATION" ]; then
|
||||
echo "Jemalloc library for process ${pid} not found"
|
||||
else
|
||||
echo "Process with PID ${pid} is using jemalloc from $JEMALLOC_LOCATION"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
}
|
||||
|
62
bin/pt-stalk
62
bin/pt-stalk
@@ -822,7 +822,7 @@ collect() {
|
||||
|
||||
local mysql_version="$(awk '/^version[^_]/{print substr($2,1,3)}' "$d/$p-variables")"
|
||||
|
||||
local mysql_error_log="$(awk '/^log_error /{print $2}' "$d/$p-variables")"
|
||||
local mysql_error_log="$(awk '/^log_error/{print $2}' "$d/$p-variables")"
|
||||
if [ -z "$mysql_error_log" -a "$mysqld_pid" ]; then
|
||||
mysql_error_log="$(ls -l /proc/$mysqld_pid/fd | awk '/ 2 ->/{print $NF}')"
|
||||
fi
|
||||
@@ -833,10 +833,10 @@ collect() {
|
||||
tail -f "$mysql_error_log" >"$d/$p-log_error" &
|
||||
tail_error_log_pid=$!
|
||||
|
||||
$CMD_MYSQLADMIN $EXT_ARGV
|
||||
$CMD_MYSQLADMIN $EXT_ARGV debug
|
||||
else
|
||||
log "Could not find the MySQL error log"
|
||||
fi
|
||||
fi
|
||||
if [ "${mysql_version}" '>' "5.1" ]; then
|
||||
local mutex="SHOW ENGINE INNODB MUTEX"
|
||||
else
|
||||
@@ -869,12 +869,7 @@ collect() {
|
||||
local strace_pid=$!
|
||||
fi
|
||||
|
||||
local cnt=$(($OPT_RUN_TIME / $OPT_SLEEP_COLLECT))
|
||||
|
||||
$CMD_MYSQLADMIN $EXT_ARGV ext -i$OPT_SLEEP_COLLECT -c$cnt >>"$d/$p-mysqladmin" &
|
||||
local mysqladmin_pid=$!
|
||||
|
||||
if [ ! "$OPT_MYSQL_ONLY" ]; then
|
||||
if [ ! "$OPT_MYSQL_ONLY" ]; then
|
||||
ps -eaF >> "$d/$p-ps" &
|
||||
top -bn${OPT_RUN_TIME} >> "$d/$p-top" &
|
||||
|
||||
@@ -887,9 +882,10 @@ collect() {
|
||||
if [ "$CMD_DMESG" ]; then
|
||||
local UPTIME=`cat /proc/uptime | awk '{ print $1 }'`
|
||||
local START_TIME=$(echo "$UPTIME 60" | awk '{print ($1 - $2)}')
|
||||
$CMD_DMESG | perl -ne 'm/\[\s*(\d+)\./; if ($1 > '${START_TIME}') { print }' >> "$d/$p-dmesg" &
|
||||
$CMD_DMESG | perl -ne 'm/\[\s*(\d+)\./; if ($1 > '${START_TIME}') { print }' >> "$d/$p-dmesg" &
|
||||
fi
|
||||
|
||||
local cnt=$(($OPT_RUN_TIME / $OPT_SLEEP_COLLECT))
|
||||
if [ "$CMD_VMSTAT" ]; then
|
||||
$CMD_VMSTAT $OPT_SLEEP_COLLECT $cnt >> "$d/$p-vmstat" &
|
||||
$CMD_VMSTAT $OPT_RUN_TIME 2 >> "$d/$p-vmstat-overall" &
|
||||
@@ -902,7 +898,10 @@ collect() {
|
||||
$CMD_MPSTAT -P ALL $OPT_SLEEP_COLLECT $cnt >> "$d/$p-mpstat" &
|
||||
$CMD_MPSTAT -P ALL $OPT_RUN_TIME 1 >> "$d/$p-mpstat-overall" &
|
||||
fi
|
||||
fi
|
||||
|
||||
$CMD_MYSQLADMIN $EXT_ARGV ext -i$OPT_SLEEP_COLLECT -c$cnt >>"$d/$p-mysqladmin" &
|
||||
local mysqladmin_pid=$!
|
||||
fi
|
||||
|
||||
local have_lock_waits_table=""
|
||||
$CMD_MYSQL $EXT_ARGV -e "SHOW TABLES FROM INFORMATION_SCHEMA" \
|
||||
@@ -917,7 +916,7 @@ collect() {
|
||||
local ps_instrumentation_enabled=$($CMD_MYSQL $EXT_ARGV -e 'SELECT ENABLED FROM performance_schema.setup_instruments WHERE NAME = "transaction";' \
|
||||
| sed "2q;d" | sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/')
|
||||
|
||||
if [ !$ps_instrumentation_enabled = "yes" ]; then
|
||||
if [ $ps_instrumentation_enabled != "yes" ]; then
|
||||
log "Performance Schema instrumentation is disabled"
|
||||
fi
|
||||
|
||||
@@ -956,12 +955,12 @@ collect() {
|
||||
(echo $ts; df -k) >> "$d/$p-df" &
|
||||
(echo $ts; netstat -antp) >> "$d/$p-netstat" &
|
||||
(echo $ts; netstat -s) >> "$d/$p-netstat_s" &
|
||||
fi
|
||||
($CMD_MYSQL $EXT_ARGV -e "SHOW FULL PROCESSLIST\G") \
|
||||
fi
|
||||
(echo $ts; $CMD_MYSQL $EXT_ARGV -e "SHOW FULL PROCESSLIST\G") \
|
||||
>> "$d/$p-processlist" &
|
||||
if [ "$have_lock_waits_table" ]; then
|
||||
(lock_waits) >>"$d/$p-lock-waits" &
|
||||
(transactions) >>"$d/$p-transactions" &
|
||||
(echo $ts; lock_waits) >>"$d/$p-lock-waits" &
|
||||
(echo $ts; transactions) >>"$d/$p-transactions" &
|
||||
fi
|
||||
|
||||
if [ "${mysql_version}" '>' "5.6" ] && [ $ps_instrumentation_enabled == "yes" ]; then
|
||||
@@ -969,10 +968,10 @@ collect() {
|
||||
fi
|
||||
|
||||
if [ "${mysql_version}" '>' "5.6" ]; then
|
||||
(ps_prepared_statements) >> "$d/$p-prepared-statements" &
|
||||
(echo $ts; ps_prepared_statements) >> "$d/$p-prepared-statements" &
|
||||
fi
|
||||
|
||||
slave_status "$d/$p-slave-status" "${mysql_version}"
|
||||
slave_status "$d/$p-slave-status" "${mysql_version}"
|
||||
|
||||
curr_time=$(date +'%s')
|
||||
done
|
||||
@@ -1077,7 +1076,7 @@ lock_waits() {
|
||||
LEFT JOIN INFORMATION_SCHEMA.PROCESSLIST AS p ON p.id = b.trx_mysql_thread_id
|
||||
ORDER BY wait_time DESC\G"
|
||||
$CMD_MYSQL $EXT_ARGV -e "$sql2"
|
||||
}
|
||||
}
|
||||
|
||||
transactions() {
|
||||
$CMD_MYSQL $EXT_ARGV -e "SELECT SQL_NO_CACHE * FROM INFORMATION_SCHEMA.INNODB_TRX ORDER BY trx_id\G"
|
||||
@@ -1126,8 +1125,8 @@ rocksdb_status() {
|
||||
}
|
||||
|
||||
ps_locks_transactions() {
|
||||
local outfile=$1
|
||||
|
||||
local outfile=$1
|
||||
|
||||
$CMD_MYSQL $EXT_ARGV -e 'select @@performance_schema' | grep "1" &>/dev/null
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
@@ -1163,27 +1162,28 @@ slave_status() {
|
||||
local outfile=$1
|
||||
local mysql_version=$2
|
||||
|
||||
local sql="SHOW SLAVE STATUS\G"
|
||||
echo -e "\n$sql\n" >> $outfile
|
||||
$CMD_MYSQL $EXT_ARGV -e "$sql" >> $outfile
|
||||
if [ "${mysql_version}" '>' "5.6" ]; then
|
||||
if [ "${mysql_version}" '<' "5.7" ]; then
|
||||
local sql="SHOW SLAVE STATUS\G"
|
||||
echo -e "\n$sql\n" >> $outfile
|
||||
$CMD_MYSQL $EXT_ARGV -e "$sql" >> $outfile
|
||||
else
|
||||
local sql="SELECT * FROM performance_schema.replication_connection_configuration JOIN performance_schema.replication_applier_configuration USING(channel_name)\G"
|
||||
echo -e "\n$sql\n" >> $outfile
|
||||
$CMD_MYSQL $EXT_ARGV -e "$sql" >> $outfile
|
||||
|
||||
sql="SELECT * FROM performance_schema.replication_connection_status\G"
|
||||
sql="SELECT * FROM replication_connection_status\G"
|
||||
echo -e "\n$sql\n" >> $outfile
|
||||
$CMD_MYSQL $EXT_ARGV -e "$sql" >> $outfile
|
||||
|
||||
sql="SELECT * FROM performance_schema.replication_applier_status JOIN performance_schema.replication_applier_status_by_coordinator USING(channel_name)\G"
|
||||
sql="SELECT * FROM replication_applier_status JOIN replication_applier_status_by_coordinator USING(channel_name)\G"
|
||||
echo -e "\n$sql\n" >> $outfile
|
||||
$CMD_MYSQL $EXT_ARGV -e "$sql" >> $outfile
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
|
||||
collect_mysql_variables() {
|
||||
local outfile=$1
|
||||
local outfile=$1
|
||||
|
||||
local sql="SHOW GLOBAL VARIABLES"
|
||||
echo -e "\n$sql\n" >> $outfile
|
||||
@@ -1192,11 +1192,11 @@ collect_mysql_variables() {
|
||||
sql="select * from performance_schema.variables_by_thread order by thread_id, variable_name;"
|
||||
echo -e "\n$sql\n" >> $outfile
|
||||
$CMD_MYSQL $EXT_ARGV -e "$sql" >> $outfile
|
||||
|
||||
|
||||
sql="select * from performance_schema.user_variables_by_thread order by thread_id, variable_name;"
|
||||
echo -e "\n$sql\n" >> $outfile
|
||||
$CMD_MYSQL $EXT_ARGV -e "$sql" >> $outfile
|
||||
|
||||
|
||||
sql="select * from performance_schema.status_by_thread order by thread_id, variable_name; "
|
||||
echo -e "\n$sql\n" >> $outfile
|
||||
$CMD_MYSQL $EXT_ARGV -e "$sql" >> $outfile
|
||||
|
@@ -3456,7 +3456,7 @@ sub set_src {
|
||||
}
|
||||
elsif ( lc $src eq 'right' ) {
|
||||
$self->{src_db_tbl} = $self->{right_db_tbl};
|
||||
$self->{dst_db_tbl} = $self->{left_db_tbl};
|
||||
$self->{dst_db_tbl} = $self->{left_db_tbl};
|
||||
}
|
||||
else {
|
||||
die "src argument must be either 'left' or 'right'"
|
||||
@@ -3592,13 +3592,14 @@ sub make_UPDATE {
|
||||
my $types = $self->{tbl_struct}->{type_for};
|
||||
return "UPDATE $self->{dst_db_tbl} SET "
|
||||
. join(', ', map {
|
||||
my $is_hex = ($types->{$_} || '') =~ m/^0x[0-9a-fA-F]+$/i;
|
||||
my $is_char = ($types->{$_} || '') =~ m/char|text|enum/i;
|
||||
my $is_float = ($types->{$_} || '') =~ m/float|double/i;
|
||||
$self->{Quoter}->quote($_)
|
||||
. '='
|
||||
. $self->{Quoter}->quote_val(
|
||||
$row->{$_},
|
||||
is_char => $is_char,
|
||||
is_char => $is_char && !$is_hex,
|
||||
is_float => $is_float,
|
||||
);
|
||||
} grep { !$in_where{$_} } @cols)
|
||||
@@ -3622,7 +3623,7 @@ sub make_REPLACE {
|
||||
|
||||
sub make_row {
|
||||
my ( $self, $verb, $row, $cols ) = @_;
|
||||
my @cols;
|
||||
my @cols;
|
||||
if ( my $dbh = $self->{fetch_back} ) {
|
||||
my $where = $self->make_where_clause($row, $cols);
|
||||
my $sql = $self->make_fetch_back_query($where);
|
||||
@@ -3636,37 +3637,44 @@ sub make_row {
|
||||
}
|
||||
my $q = $self->{Quoter};
|
||||
my $type_for = $self->{tbl_struct}->{type_for};
|
||||
|
||||
return "$verb INTO $self->{dst_db_tbl}("
|
||||
. join(', ', map { $q->quote($_) } @cols)
|
||||
. ') VALUES ('
|
||||
. join(', ',
|
||||
map {
|
||||
my $is_hex = ($type_for->{$_} || '') =~ m/^0x[0-9a-fA-F]+$/i;
|
||||
my $is_char = ($type_for->{$_} || '') =~ m/char|text|enum/i;
|
||||
my $is_float = ($type_for->{$_} || '') =~ m/float|double/i;
|
||||
$q->quote_val(
|
||||
$row->{$_},
|
||||
is_char => $is_char,
|
||||
is_char => $is_char && !$is_hex,
|
||||
is_float => $is_float,
|
||||
)
|
||||
} @cols)
|
||||
. ')';
|
||||
|
||||
}
|
||||
|
||||
sub make_where_clause {
|
||||
my ( $self, $row, $cols ) = @_;
|
||||
my @clauses = map {
|
||||
my $col = $_;
|
||||
$col = $self->{Quoter}->quote($col);
|
||||
|
||||
my $val = $row->{$_};
|
||||
my $sep = defined $val ? '=' : ' IS ';
|
||||
my $is_char = ($self->{tbl_struct}->{type_for}->{$_} || '') =~ m/char|text|enum/i;
|
||||
my $is_float = ($self->{tbl_struct}->{type_for}->{$_} || '') =~ m/float|double/i;
|
||||
$self->{Quoter}->quote($_) . $sep . $self->{Quoter}->quote_val($val,
|
||||
my $is_crc32 = ($self->{tbl_struct}->{type_for}->{$_} || '') =~ m/binary|text|blob/i;
|
||||
$col = "CRC32($col)" if ($is_crc32);
|
||||
$col . $sep . $self->{Quoter}->quote_val($val,
|
||||
is_char => $is_char,
|
||||
is_float => $is_float);
|
||||
} @$cols;
|
||||
return join(' AND ', @clauses);
|
||||
}
|
||||
|
||||
|
||||
sub get_changes {
|
||||
my ( $self ) = @_;
|
||||
return %{$self->{changes}};
|
||||
@@ -3676,7 +3684,7 @@ sub get_changes {
|
||||
sub sort_cols {
|
||||
my ( $self, $row ) = @_;
|
||||
my @cols;
|
||||
if ( $self->{tbl_struct} ) {
|
||||
if ( $self->{tbl_struct} ) {
|
||||
my $pos = $self->{tbl_struct}->{col_posn};
|
||||
my @not_in_tbl;
|
||||
@cols = sort {
|
||||
@@ -3691,7 +3699,7 @@ sub sort_cols {
|
||||
1;
|
||||
}
|
||||
}
|
||||
keys %$row;
|
||||
sort keys %$row;
|
||||
push @cols, @not_in_tbl if @not_in_tbl;
|
||||
}
|
||||
else {
|
||||
@@ -4933,7 +4941,7 @@ sub make_row_checksum {
|
||||
my $query;
|
||||
if ( !$args{no_cols} ) {
|
||||
$query = join(', ',
|
||||
map {
|
||||
map {
|
||||
my $col = $_;
|
||||
if ( $col =~ m/\+ 0/ ) {
|
||||
my ($real_col) = /^(\S+)/;
|
||||
@@ -4943,6 +4951,10 @@ sub make_row_checksum {
|
||||
my ($real_col) = m/TRIM\(([^\)]+)\)/;
|
||||
$col .= " AS $real_col";
|
||||
}
|
||||
elsif ( $col =~ m/CRC32/ ) {
|
||||
my ($real_col) = m/CRC32\(([^\)]+)\)/;
|
||||
$col .= " AS $real_col";
|
||||
}
|
||||
$col;
|
||||
} @cols)
|
||||
. ', ';
|
||||
|
@@ -326,13 +326,14 @@ sub make_UPDATE {
|
||||
my $types = $self->{tbl_struct}->{type_for};
|
||||
return "UPDATE $self->{dst_db_tbl} SET "
|
||||
. join(', ', map {
|
||||
my $is_hex = ($types->{$_} || '') =~ m/^0x[0-9a-fA-F]+$/i;
|
||||
my $is_char = ($types->{$_} || '') =~ m/char|text|enum/i;
|
||||
my $is_float = ($types->{$_} || '') =~ m/float|double/i;
|
||||
$self->{Quoter}->quote($_)
|
||||
. '='
|
||||
. $self->{Quoter}->quote_val(
|
||||
$row->{$_},
|
||||
is_char => $is_char,
|
||||
is_char => $is_char && !$is_hex,
|
||||
is_float => $is_float,
|
||||
);
|
||||
} grep { !$in_where{$_} } @cols)
|
||||
@@ -407,11 +408,12 @@ sub make_row {
|
||||
. ') VALUES ('
|
||||
. join(', ',
|
||||
map {
|
||||
my $is_char = ($type_for->{$_} || '') =~ m/char|text/i;
|
||||
my $is_hex = ($type_for->{$_} || '') =~ m/^0x[0-9a-fA-F]+$/i;
|
||||
my $is_char = ($type_for->{$_} || '') =~ m/char|text|enum/i;
|
||||
my $is_float = ($type_for->{$_} || '') =~ m/float|double/i;
|
||||
$q->quote_val(
|
||||
$row->{$_},
|
||||
is_char => $is_char,
|
||||
is_char => $is_char && !$is_hex,
|
||||
is_float => $is_float,
|
||||
)
|
||||
} @cols)
|
||||
@@ -431,18 +433,22 @@ sub make_row {
|
||||
sub make_where_clause {
|
||||
my ( $self, $row, $cols ) = @_;
|
||||
my @clauses = map {
|
||||
my $col = $_;
|
||||
$col = $self->{Quoter}->quote($col);
|
||||
|
||||
my $val = $row->{$_};
|
||||
my $sep = defined $val ? '=' : ' IS ';
|
||||
my $is_char = ($self->{tbl_struct}->{type_for}->{$_} || '') =~ m/char|text/i;
|
||||
my $is_char = ($self->{tbl_struct}->{type_for}->{$_} || '') =~ m/char|text|enum/i;
|
||||
my $is_float = ($self->{tbl_struct}->{type_for}->{$_} || '') =~ m/float|double/i;
|
||||
$self->{Quoter}->quote($_) . $sep . $self->{Quoter}->quote_val($val,
|
||||
my $is_crc32 = ($self->{tbl_struct}->{type_for}->{$_} || '') =~ m/binary|text|blob/i;
|
||||
$col = "CRC32($col)" if ($is_crc32);
|
||||
$col . $sep . $self->{Quoter}->quote_val($val,
|
||||
is_char => $is_char,
|
||||
is_float => $is_float);
|
||||
} @$cols;
|
||||
return join(' AND ', @clauses);
|
||||
}
|
||||
|
||||
|
||||
# Sub: get_changes
|
||||
# Get a summary of changes made.
|
||||
#
|
||||
|
@@ -308,6 +308,9 @@ sub make_row_checksum {
|
||||
elsif ( $args{trim} && $type =~ m/varchar/ ) {
|
||||
$result = "TRIM($result)";
|
||||
}
|
||||
elsif ( $type =~ m/binary|text|blob/ ) {
|
||||
$result = "CRC32($result)";
|
||||
}
|
||||
$result;
|
||||
}
|
||||
grep {
|
||||
@@ -335,6 +338,10 @@ sub make_row_checksum {
|
||||
my ($real_col) = m/TRIM\(([^\)]+)\)/;
|
||||
$col .= " AS $real_col";
|
||||
}
|
||||
elsif ( $col =~ m/CRC32/ ) {
|
||||
my ($real_col) = m/CRC32\(([^\)]+)\)/;
|
||||
$col .= " AS $real_col";
|
||||
}
|
||||
$col;
|
||||
} @cols)
|
||||
. ', ';
|
||||
|
@@ -52,7 +52,8 @@ collect() {
|
||||
local mysqld_pid=""
|
||||
# Get pidof mysqld.
|
||||
if [ ! "$OPT_MYSQL_ONLY" ]; then
|
||||
mysqld_pid=$(_pidof mysqld | awk '{print $1; exit;}')
|
||||
port=$(mysql -ss -e 'SELECT @@port')
|
||||
mysqld_pid=$(lsof -i ":${port}" | grep -i listen | cut -f 3 -d" ")
|
||||
fi
|
||||
|
||||
# Get memory allocation info before anything else.
|
||||
|
@@ -201,19 +201,6 @@ wsrep_cluster_size 100
|
||||
HandlerSocket NoSQL | Not Supported
|
||||
Fast Hash UDFs | Unknown
|
||||
# Percona XtraDB Cluster #####################################
|
||||
Cluster Name | pt_sandbox_cluster
|
||||
Cluster Address | gcomm://
|
||||
Cluster Size | 3
|
||||
Cluster Nodes | 192.168.0.100,192.168.0.100,192.168.0.100
|
||||
Node Name | 12345
|
||||
Node Status | Primary
|
||||
SST Method | rsync
|
||||
Slave Threads | 2
|
||||
Ignore Split Brain | false
|
||||
Ignore Quorum | false
|
||||
gcache Size | 128M
|
||||
gcache Directory | /tmp/12345/data/
|
||||
gcache Name | /tmp/12345/data//galera.cache
|
||||
# Plugins ####################################################
|
||||
InnoDB compression | ACTIVE
|
||||
# Query cache ################################################
|
||||
|
@@ -167,7 +167,6 @@ wsrep_local_index 4000000000000 45000000
|
||||
HandlerSocket NoSQL | Not Supported
|
||||
Fast Hash UDFs | Unknown
|
||||
# Percona XtraDB Cluster #####################################
|
||||
wsrep_on | OFF
|
||||
# Plugins ####################################################
|
||||
InnoDB compression | ACTIVE
|
||||
# Query cache ################################################
|
||||
|
@@ -43,7 +43,7 @@ else {
|
||||
|
||||
my $output;
|
||||
my $cnf = '/tmp/12345/my.sandbox.cnf';
|
||||
my @args = ('-F', $cnf, 'h=127.1,P=12345', 'P=2900', qw(-d bidi --bidirectional));
|
||||
my @args = ('-F', $cnf, 'h=127.1,P=12345', 'P=2900', qw(-d bidi --bidirectional --no-version-check));
|
||||
|
||||
$sb->wipe_clean($c1_dbh);
|
||||
$sb->wipe_clean($r1_dbh);
|
||||
|
@@ -24,7 +24,8 @@ if ( !$master_dbh ) {
|
||||
plan skip_all => 'Cannot connect to sandbox master';
|
||||
}
|
||||
else {
|
||||
plan tests => 2;
|
||||
plan skip_all => 'This test is freezing';
|
||||
#plan tests => 2;
|
||||
}
|
||||
|
||||
$sb->wipe_clean($master_dbh);
|
84
t/pt-table-sync/pt-2016.t
Normal file
84
t/pt-table-sync/pt-2016.t
Normal file
@@ -0,0 +1,84 @@
|
||||
#!/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";
|
||||
};
|
||||
|
||||
binmode(STDIN, ':utf8') or die "Can't binmode(STDIN, ':utf8'): $OS_ERROR";
|
||||
binmode(STDOUT, ':utf8') or die "Can't binmode(STDOUT, ':utf8'): $OS_ERROR";
|
||||
|
||||
use strict;
|
||||
use utf8;
|
||||
use Encode qw(decode encode);
|
||||
use warnings FATAL => 'all';
|
||||
use English qw(-no_match_vars);
|
||||
use Test::More;
|
||||
|
||||
use PerconaTest;
|
||||
use Sandbox;
|
||||
require "$trunk/bin/pt-table-sync";
|
||||
|
||||
my $dp = new DSNParser(opts=>$dsn_opts);
|
||||
my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp);
|
||||
my $master_dbh = $sb->get_dbh_for('master');
|
||||
my $slave1_dbh = $sb->get_dbh_for('slave1');
|
||||
my $slave2_dbh = $sb->get_dbh_for('slave2');
|
||||
|
||||
if ( !$master_dbh ) {
|
||||
plan skip_all => 'Cannot connect to sandbox master';
|
||||
}
|
||||
elsif ( !$slave1_dbh ) {
|
||||
plan skip_all => 'Cannot connect to sandbox slave1';
|
||||
}
|
||||
elsif ( !$slave1_dbh ) {
|
||||
plan skip_all => 'Cannot connect to sandbox slave2';
|
||||
}
|
||||
else {
|
||||
plan tests => 3;
|
||||
}
|
||||
|
||||
|
||||
my ($output, $status);
|
||||
my @args = ('h=127.0.0.1,P=12346,u=msandbox,p=msandbox,D=test,t=test2', '--sync-to-master',
|
||||
'--chunk-size=1', '--hex-blob', '--execute');
|
||||
|
||||
# use lib/samples dir since the main change is in DSNParser
|
||||
$sb->load_file('master', "t/pt-table-sync/samples/pt-2016.sql");
|
||||
|
||||
$sb->wait_for_slaves();
|
||||
|
||||
$slave1_dbh->do("UPDATE test.test2 SET col3='bbb'");
|
||||
$slave1_dbh->do("FLUSH TABLES");
|
||||
|
||||
# 1
|
||||
($output, $status) = full_output(
|
||||
sub { pt_table_sync::main(@args) },
|
||||
);
|
||||
|
||||
is(
|
||||
$status,
|
||||
2, # exit_status = 2 -> there were differences
|
||||
"PT-2016 table-sync CRC32 in key - Exit status",
|
||||
);
|
||||
|
||||
# 2
|
||||
my $want = {
|
||||
col1 => 1,
|
||||
col2 => 'aaa',
|
||||
col3 => 'aaa'
|
||||
};
|
||||
my $row = $slave1_dbh->selectrow_hashref("SELECT col1, col2, col3 FROM test.test2");
|
||||
is_deeply(
|
||||
$row,
|
||||
$want,
|
||||
"PT-2016 table-sync CRC32 in key - Master was updated",
|
||||
) or diag("Want '".($want||"")."', got '".($row->{col3}||"")."'");
|
||||
|
||||
# #############################################################################
|
||||
# Done.
|
||||
# #############################################################################
|
||||
$sb->wipe_clean($master_dbh);
|
||||
ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
|
||||
exit;
|
12
t/pt-table-sync/samples/pt-2016.sql
Normal file
12
t/pt-table-sync/samples/pt-2016.sql
Normal file
@@ -0,0 +1,12 @@
|
||||
DROP DATABASE IF EXISTS test;
|
||||
|
||||
CREATE DATABASE test;
|
||||
|
||||
CREATE TABLE test.test2 (
|
||||
col1 INT NOT NULL,
|
||||
col2 TEXT NOT NULL,
|
||||
col3 VARCHAR(5) NOT NULL,
|
||||
UNIQUE KEY (col1, col2(3))
|
||||
);
|
||||
|
||||
INSERT INTO test.test2 VALUES(1,'aaa','aaa');
|
Reference in New Issue
Block a user