141 lines
6.6 KiB
Plaintext
141 lines
6.6 KiB
Plaintext
# WL#6404 - Add rewrite-db option to mysqlbinlog on RBR
|
|
#
|
|
# The test checks the new rewrite-db option for the mysqlbinlog.
|
|
#
|
|
# The test checks the following aspects of the new option:
|
|
|
|
# 1. The valid syntax for the use of the new option and the errors in
|
|
# case the usage is not correct.
|
|
# 2. Apply the new binlog file ( with database rewritten ) to a new database
|
|
# and check if it works.
|
|
#
|
|
# Bug26117735: MYSQLBINLOG READ-FROM-REMOTE-SERVER NOT HONORING REWRITE_DB
|
|
# FILTERING
|
|
#
|
|
# Problem:
|
|
# When running mysqlbinlog with the --read-from-remote-server option,
|
|
# the processing of the binlog entries accepts rewrite_db as an argument, but
|
|
# ignores the rewrite rule. Therefore no filtering is done on the binlog
|
|
# entries, resulting in failures to write data in the target DB.
|
|
#
|
|
# Test case1:
|
|
# Verify that rewrite_db filter works fine when reading binary log from remote
|
|
# server.
|
|
#
|
|
# Test case2:
|
|
# Verify that error scenario is handled properly in a case where rewrite_db
|
|
# filter fails to rewrite the databases.
|
|
#
|
|
# mysqlbinlog should be debug compiled.
|
|
--source include/mysqlbinlog_have_debug.inc
|
|
--source include/have_binlog_format_row.inc
|
|
|
|
RESET MASTER;
|
|
CREATE DATABASE db1;
|
|
USE db1;
|
|
CREATE TABLE t1 (i INT);
|
|
|
|
# Get some INSERT, UPDATE and DELETE ROW events.
|
|
INSERT INTO t1 VALUES(1);
|
|
INSERT INTO t1 VALUES(2);
|
|
UPDATE t1 SET i= i+1;
|
|
DELETE FROM t1 WHERE i=2;
|
|
|
|
--let $MYSQLD_DATADIR= `select @@datadir`
|
|
--exec $MYSQL_BINLOG --force-if-open $MYSQLD_DATADIR/binlog.000001 > $MYSQLTEST_VARDIR/tmp/row_event.sql
|
|
|
|
# Using the new option to apply the row event on some other database (from db1 -> new_db1 in the current case)
|
|
|
|
--echo [Syntax error in the use of the new option: The from database name is missing]
|
|
--error 1
|
|
--exec $MYSQL_BINLOG --force-if-open --rewrite-db="->new_db1" $MYSQLD_DATADIR/binlog.000001 > $MYSQLTEST_VARDIR/tmp/row_event_rewrite.sql
|
|
|
|
--echo [Syntax error in the use of the new option: The '->' is missing]
|
|
--error 1
|
|
--exec $MYSQL_BINLOG --force-if-open --rewrite-db="db1 new_db1" $MYSQLD_DATADIR/binlog.000001 > $MYSQLTEST_VARDIR/tmp/row_event_rewrite.sql
|
|
|
|
--echo [Syntax error in the use of the new option: The to database name is missing]
|
|
--error 1
|
|
--exec $MYSQL_BINLOG --force-if-open --rewrite-db="db1->" $MYSQLD_DATADIR/binlog.000001 > $MYSQLTEST_VARDIR/tmp/row_event_rewrite.sql
|
|
|
|
--echo [VALID SYNTAX,The from->to database names is correctly mentioned]
|
|
--exec $MYSQL_BINLOG --force-if-open --rewrite-db="db1->new_db1" $MYSQLD_DATADIR/binlog.000001 > $MYSQLTEST_VARDIR/tmp/row_event_rewrite.sql
|
|
|
|
--let $binlog_file= query_get_value(SHOW MASTER STATUS, File, 1)
|
|
|
|
# Bug26117735: MYSQLBINLOG READ-FROM-REMOTE-SERVER NOT HONORING REWRITE_DB FILTERING
|
|
--echo [VALID SYNTAX read from remote server ,The from->to database names are correctly mentioned]
|
|
--exec $MYSQL_BINLOG --force-if-open --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT --rewrite-db="db1->new_db1" $binlog_file > $MYSQLTEST_VARDIR/tmp/row_event_from_remote_server_rewrite.sql
|
|
|
|
# BUG26878022: MYSQLBINLOG: ASSERTION `(OLD_MH->M_KEY == KEY) || (OLD_MH->M_KEY == 0)' FAILED
|
|
--echo [VALID SYNTAX read from remote server in raw mode, the from->to database names are correctly mentioned]
|
|
--exec $MYSQL_BINLOG --raw --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT --rewrite-db="db1->new_db1" $binlog_file --result-file=$MYSQLTEST_VARDIR/tmp/
|
|
--exec $MYSQL_BINLOG $MYSQLTEST_VARDIR/tmp/$binlog_file > $MYSQLTEST_VARDIR/tmp/row_event_from_remote_server_rewrite_raw.sql
|
|
|
|
--echo [VALID SYNTAX, but during the application of rewrite_db filter an invalid event is found. Hence mysqlbinlog tool should exit with an appropriate error]
|
|
--echo [ERROR: Got fatal error while applying rewrite db filter.]
|
|
--error 1
|
|
--exec $MYSQL_BINLOG --force-if-open -#d,'simulate_corrupt_event_len' --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT --rewrite-db="db1->new_db1" $binlog_file > $MYSQLTEST_VARDIR/tmp/tmp.sql
|
|
|
|
--echo #Dropping the database db1 and creating the table in the new database new_db1.
|
|
|
|
CREATE DATABASE new_db1;
|
|
DROP DATABASE db1;
|
|
|
|
# The SQL file will be applied but nothing is applied on Database new_db1 since the row event was
|
|
# generated for database db1 and table t1.
|
|
|
|
# With gtid-mode=on we need purge gtid_executed, if not transactions
|
|
# replayed through mysqlbinlog will be skipped.
|
|
RESET MASTER;
|
|
--exec $MYSQL --database=new_db1 --local-infile=1 < $MYSQLTEST_VARDIR/tmp/row_event.sql
|
|
--error ER_NO_SUCH_TABLE
|
|
SELECT * FROM new_db1.t1;
|
|
|
|
# The SQL file should be applied since the row event was extracted using the new mysqlbinlog option.
|
|
|
|
DROP DATABASE db1;
|
|
# With gtid-mode=on we need purge gtid_executed, if not transactions
|
|
# replayed through mysqlbinlog will be skipped.
|
|
RESET MASTER;
|
|
--echo [The event of table db1.t1 has been successfully applied to new_db1.t1]
|
|
--exec $MYSQL --database=new_db1 --local-infile=1 < $MYSQLTEST_VARDIR/tmp/row_event_rewrite.sql
|
|
--let $assert_text= Assert that table new_db1.t1 has one row after applying the sql file.
|
|
--let $assert_cond= `SELECT COUNT(*)=1 from new_db1.t1`
|
|
--source include/assert.inc
|
|
|
|
DROP DATABASE db1;
|
|
DROP DATABASE new_db1;
|
|
CREATE DATABASE new_db1;
|
|
# With gtid-mode=on we need purge gtid_executed, if not transactions
|
|
# replayed through mysqlbinlog will be skipped.
|
|
RESET MASTER;
|
|
--echo [The event of table db1.t1 has been successfully applied to new_db1.t1]
|
|
--exec $MYSQL --database=new_db1 --local-infile=1 < $MYSQLTEST_VARDIR/tmp/row_event_from_remote_server_rewrite.sql
|
|
--let $assert_text= Assert that table new_db1.t1 has one row after applying the sql file.
|
|
--let $assert_cond= `SELECT COUNT(*)=1 from new_db1.t1`
|
|
--source include/assert.inc
|
|
|
|
DROP DATABASE db1;
|
|
DROP DATABASE new_db1;
|
|
CREATE DATABASE new_db1;
|
|
# With gtid-mode=on we need purge gtid_executed, if not transactions
|
|
# replayed through mysqlbinlog will be skipped.
|
|
RESET MASTER;
|
|
--echo [The event of table db1.t1 has been successfully applied to new_db1.t1 from raw mode]
|
|
--exec $MYSQL --database=new_db1 --local-infile=1 < $MYSQLTEST_VARDIR/tmp/row_event_from_remote_server_rewrite_raw.sql
|
|
--let $assert_text= Assert that table new_db1.t1 has one row after applying the sql file from raw binlog dump.
|
|
--let $assert_cond= `SELECT COUNT(*)=1 from new_db1.t1`
|
|
--source include/assert.inc
|
|
|
|
--echo CLEANUP
|
|
|
|
--remove_file $MYSQLTEST_VARDIR/tmp/row_event.sql
|
|
--remove_file $MYSQLTEST_VARDIR/tmp/row_event_rewrite.sql
|
|
--remove_file $MYSQLTEST_VARDIR/tmp/row_event_from_remote_server_rewrite.sql
|
|
--remove_file $MYSQLTEST_VARDIR/tmp/row_event_from_remote_server_rewrite_raw.sql
|
|
--remove_file $MYSQLTEST_VARDIR/tmp/tmp.sql
|
|
--remove_file $MYSQLTEST_VARDIR/tmp/$binlog_file
|
|
DROP DATABASE db1;
|
|
DROP DATABASE new_db1;
|