mariadb/mysql-test/suite/rpl/include/rpl_check_table_consistency.inc
Brandon Nesterenko c132bce1a1 MDEV-20119: Implement the --do-domain-ids, --ignore-domain-ids, and --ignore-server-ids options for mysqlbinlog
New Feature:
============
Extend mariadb-binlog command-line tool to allow for filtering
events using GTID domain and server ids. The functionality mimics
that of a replica server’s DO_DOMAIN_IDS, IGNORE_DOMAIN_IDS, and
IGNORE_SERVER_IDS from CHANGE MASTER TO. For completeness, this
patch additionally adds the option --do-server-ids as an alias for
--server-id, which now accepts a list of server ids instead of a
single one.

Example usage:
  mariadb-binlog --do-domain-ids=2,3,4 --do-server-ids=1,3
  master-bin.000001

Functional Notes:
 1. --do-domain-ids cannot be combined with --ignore-domain-ids
 2. --do-server-ids cannot be combined with --ignore-server-ids
 3. A domain id filter can be combined with a server id filter
 4. When any new filter options are combined with the
--gtid-strict-mode option, events from excluded domains/servers are
not validated.
 5. Domain/server id filters can be combined with GTID ranges (i.e.
specifications of --start-position and --stop-position). However,
because the --stop-position option implicitly undertakes filtering
to only output events within its range of domains, when combined
with --do-domain-ids or --ignore-domain-ids, output will consist of
the intersection between the filters. Specifically, with
--do-domain-ids and --stop-position, only events with domain ids
present in both argument lists will be output. Conversely, with
--ignore-domain-ids and --stop-position, only events with domain ids
present in the --stop-position and absent from the
--ignore-domain-ids options will be output.

Reviewed By
============
Andrei Elkin <andrei.elkin@mariadb.com>
2022-04-19 11:09:24 -06:00

63 lines
1.9 KiB
PHP

# This file provides logic to ensure that all tables in a database are the
# same between two connections.
#
# param $check_db : The name of the database to validate all tables are the
# same within (test by default)
# param $con1 : The connection name of the primary server, defaults to
# master
# param $con2 : The connection name of the replica server, defaults to
# slave
--let $include_filename= rpl_check_table_consistency.inc
--source include/begin_include_file.inc
if (!$con1)
{
--let $con1= master
}
if (!$con2)
{
--let $con2= slave
}
if (!$check_db)
{
--let $check_db= test
}
--connection $con2
--let $n_tables= `select count(*) from information_schema.tables WHERE table_schema = '$check_db'`
--echo # Checking consistency of '$check_db' database tables between $con1 and $con2
--connection $con1
--let $c1_n_tables= `select count(*) from information_schema.tables WHERE table_schema = '$check_db'`
if (`SELECT $c1_n_tables != $n_tables`)
{
die "$con1 had $c1_n_tables tables but $con2 had $n_tables after binlog replay";
}
--echo # Both servers have $n_tables tables
--let $ctr= 1
--echo # Verifying integrity of tables..
while($ctr <= $n_tables)
{
--let $cksum_tbl= query_get_value(SELECT table_name FROM information_schema.tables WHERE table_schema = 'test' ORDER BY table_name ASC, table_name, $ctr)
--connection $con1
--let $c1_cksum= `CHECKSUM TABLE $cksum_tbl`
--connection $con2
--let $c2_cksum= `CHECKSUM TABLE $cksum_tbl`
if ($c1_cksum != $c2_cksum)
{
die "Table $cksum_tbl differs between connections $con1 and $con2";
}
if ($c1_cksum == $c2_cksum)
{
--echo # $cksum_tbl is equivalent on $con1 and $con2
}
--let $ctr= `SELECT $ctr+1`
}
--echo # All tables are consistent
--let $include_filename= rpl_check_table_consistency.inc
--source include/end_include_file.inc