diff --git a/bin/pt-table-checksum b/bin/pt-table-checksum index c783e2bb..3f968fcd 100755 --- a/bin/pt-table-checksum +++ b/bin/pt-table-checksum @@ -8586,6 +8586,22 @@ sub main { ); PTDEBUG && _d(scalar @$slaves, 'slaves found'); + if ( $o->get('check-binlog-format') ) { + my ($master_binlog) = $master_dbh->selectrow_array('SELECT @@binlog_format'); + my $err = ''; + for my $slave_cxn (@$slaves) { + my ($slave_binlog) = $slave_cxn->dbh->selectrow_array('SELECT @@binlog_format'); + if ( $master_binlog ne $slave_binlog ) { + $err .= $master_cxn->name() . " has binlog_format $master_binlog " + . "but its slave " . $slave_cxn->name() . " has format " + . $slave_binlog . ". This can break replication. If you " + . "understand the risks, you can specify " + . "--no-check-binlog-format to avoid this error.\n" + } + } + die $err if $err; + } + if ( $master_cxn->is_cluster_node() && !@$slaves ) { die $master_cxn->name() . " is a cluster node but no other nodes " . "or regular replicas were found. Use --recursion-method=dsn " @@ -10506,6 +10522,12 @@ type: time; default: 1; group: Throttle Sleep time between checks for L<"--max-lag">. +=item --[no]check-binlog-format + +default: yes + +Check that the binlog_format is the same in all servers. + =item --[no]check-plan default: yes diff --git a/t/pt-table-checksum/bugs.t b/t/pt-table-checksum/bugs.t index 7262cdff..7963ca2d 100644 --- a/t/pt-table-checksum/bugs.t +++ b/t/pt-table-checksum/bugs.t @@ -191,6 +191,35 @@ like( "Bug 1016131: ptc should skip tables where all columns are excluded" ); +# ############################################################################# +# pt-table-checksum doesn't warn if binlog_format=row or mixed on slaves +# https://bugs.launchpad.net/percona-toolkit/+bug/938068 +# ############################################################################# + +{ +diag("Adding two new slaves to master"); +local $ENV{BINLOG_FORMAT} = 'ROW'; +diag(`$trunk/sandbox/start-sandbox slave 12348 12345`); +local $ENV{BINLOG_FORMAT} = 'MIXED'; +diag(`$trunk/sandbox/start-sandbox slave 12349 12348`); + +$output = output( sub { pt_table_checksum::main(@args) }, stderr => 1 ); + +my $re = qr/ has binlog_format .*? has format (\S+)\. This can break replication/msi; +like( + $output, + $re, + "Bug 938068: doesn't warn if binlog_format=row or mixed on slaves" +); + +is_deeply( + [ $output =~ /$re/g ], + [ 'ROW', 'MIXED' ], + "...and warns for both level 1 and level 2 slaves" +) or diag($output); + +diag(`$trunk/sandbox/stop-sandbox slave 12348 12349`); +} # ############################################################################# # Done. # #############################################################################