1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

MDEV-15530: Variable replicate_rewrite_db cannot be found in "show global variables"

- Add `replicate_rewrite_db` status variable, that may accept comma
separated key-value pairs.
- Note that option `OPT_REPLICATE_REWRITE_DB` already existed in `mysqld.h`
  from this commit 23d8586dbf

Reviewer:Brandon Nesterenko <brandon.nesterenko@mariadb.com>
This commit is contained in:
Anel Husakovic
2022-08-09 13:50:12 +02:00
committed by Brandon Nesterenko
parent ccf0e27f28
commit 1a057a923b
30 changed files with 936 additions and 141 deletions

View File

@@ -0,0 +1,163 @@
include/master-slave.inc
[connection master]
#
# MDEV-15530 Variable replicate_rewrite_db cannot be found
# in "show global variables"
#
# Create DBs and verify that slave has to be stopped before setting sys var
connection slave;
select @@session.server_id;
@@session.server_id
2
create database replica_db1;
create database y;
create database test_replica;
SELECT @@GLOBAL.replicate_rewrite_db;
@@GLOBAL.replicate_rewrite_db
primary_db1->replica_db1,x->y
# Ensuring SHOW SLAVE STATUS produces correct value for Replicate_Rewrite_DB...
# ...success
# Create DBs and tables on primary
connection master;
create database primary_db1;
create database x;
use primary_db1;
create table my_table (t int);
insert into my_table values (2),(4);
use x;
create table my_table (t int);
insert into my_table values (654),(532);
include/save_master_gtid.inc
# Check replica
connection slave;
include/sync_with_master_gtid.inc
include/diff_tables.inc [master:primary_db1.my_table,slave:replica_db1.my_table]
include/diff_tables.inc [master:x.my_table,slave:y.my_table]
SELECT @@GLOBAL.replicate_rewrite_db;
@@GLOBAL.replicate_rewrite_db
primary_db1->replica_db1,x->y
show tables from replica_db1;
Tables_in_replica_db1
my_table
select * from replica_db1.my_table;
t
2
4
show tables from y;
Tables_in_y
my_table
select * from y.my_table;
t
654
532
# Set replica sys var replicate_rewrite_db
connection slave;
SET @@GLOBAL.replicate_rewrite_db="test_master->test_replica";
ERROR HY000: This operation cannot be performed as you have a running slave ''; run STOP SLAVE '' first
include/stop_slave.inc
SET @save_replicate_rewrite_db = @@GLOBAL.replicate_rewrite_db;
SELECT @@GLOBAL.replicate_rewrite_db;
@@GLOBAL.replicate_rewrite_db
primary_db1->replica_db1,x->y
SET @@GLOBAL.replicate_rewrite_db="test_master->test_replica";
SELECT @@GLOBAL.replicate_rewrite_db;
@@GLOBAL.replicate_rewrite_db
test_master->test_replica
SHOW DATABASES like 'test_replica';
Database (test_replica)
test_replica
include/start_slave.inc
# Ensuring SHOW SLAVE STATUS produces correct value for Replicate_Rewrite_DB...
# ...success
# Create DB and tables on primary
connection master;
create database test_master;
use test_master;
create table my_table (t int);
insert into my_table values (1),(3);
include/save_master_gtid.inc
# Ensure that the replica receives all of the primary's events without
# error
connection slave;
include/sync_with_master_gtid.inc
Last_SQL_Error =
Last_SQL_Errno = 0
SELECT @@GLOBAL.replicate_rewrite_db;
@@GLOBAL.replicate_rewrite_db
test_master->test_replica
SHOW tables from test_replica;
Tables_in_test_replica
my_table
select * from test_replica.my_table;
t
1
3
include/diff_tables.inc [master:test_master.my_table,slave:test_replica.my_table]
# Update of values on primary for DB not set in replication_rewrite_db
connection master;
use x;
insert into my_table values (314);
select * from my_table;
t
654
532
314
include/save_master_gtid.inc
connection slave;
include/stop_slave.inc
include/reset_slave.inc
include/start_slave.inc
SELECT @@GLOBAL.replicate_rewrite_db;
@@GLOBAL.replicate_rewrite_db
test_master->test_replica
include/sync_with_master_gtid.inc
select * from y.my_table;
t
654
532
# Dynamic updates to the replication filter should be lost after server restart
connection slave;
SELECT @@GLOBAL.replicate_rewrite_db;
@@GLOBAL.replicate_rewrite_db
test_master->test_replica
connection master;
use x;
insert into my_table values (1000);
select * from my_table;
t
654
532
314
1000
include/save_master_gtid.inc
connection slave;
include/stop_slave.inc
include/reset_slave.inc
include/rpl_restart_server.inc [server_number=2]
CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=MASTER_MYPORT, MASTER_USER='root';
connection slave;
include/start_slave.inc
SELECT @@GLOBAL.replicate_rewrite_db;
@@GLOBAL.replicate_rewrite_db
primary_db1->replica_db1,x->y
include/sync_with_master_gtid.inc
select * from y.my_table;
t
654
532
314
1000
# Cleanup
connection master;
drop database test_master;
drop database primary_db1;
drop database x;
include/save_master_gtid.inc
connection slave;
include/sync_with_master_gtid.inc
drop database test_replica;
drop database replica_db1;
drop database y;
include/stop_slave.inc
include/start_slave.inc
include/rpl_end.inc

View File

@@ -0,0 +1,2 @@
"--replicate-rewrite-db=primary_db1->replica_db1"
"--replicate-rewrite-db=x->y"

View File

@@ -0,0 +1,163 @@
-- source include/have_binlog_format_mixed.inc
-- source include/master-slave.inc
# Testing rpl option replicate_rewrite_db
--echo #
--echo # MDEV-15530 Variable replicate_rewrite_db cannot be found
--echo # in "show global variables"
--echo #
--echo # Create DBs and verify that slave has to be stopped before setting sys var
connection slave;
--let $rpl_server_id= `select @@session.server_id`
select @@session.server_id;
# These DBs will be rewrited from opt file
create database replica_db1;
create database y;
# This DB will be rewrited from test case
create database test_replica;
SELECT @@GLOBAL.replicate_rewrite_db;
let $rewrite_db_sss= query_get_value(SHOW SLAVE STATUS, Replicate_Rewrite_DB, 1);
--echo # Ensuring SHOW SLAVE STATUS produces correct value for Replicate_Rewrite_DB...
if (`SELECT strcmp(@@global.replicate_rewrite_db, "$rewrite_db_sss") != 0`)
{
die SHOW SLAVE STATUS Replicate_Rewrite_DB value $rewrite_db_sss does not match variable @@GLOBAL.replicate_rewrite_db;
}
--echo # ...success
--echo # Create DBs and tables on primary
connection master;
--enable_warnings
create database primary_db1;
create database x;
use primary_db1;
create table my_table (t int);
insert into my_table values (2),(4);
use x;
create table my_table (t int);
insert into my_table values (654),(532);
--source include/save_master_gtid.inc
--echo # Check replica
--connection slave
--source include/sync_with_master_gtid.inc
--let $diff_tables=master:primary_db1.my_table,slave:replica_db1.my_table
--source include/diff_tables.inc
--let $diff_tables=master:x.my_table,slave:y.my_table
--source include/diff_tables.inc
SELECT @@GLOBAL.replicate_rewrite_db;
show tables from replica_db1;
select * from replica_db1.my_table;
show tables from y;
select * from y.my_table;
--echo # Set replica sys var replicate_rewrite_db
connection slave;
--error ER_SLAVE_MUST_STOP
SET @@GLOBAL.replicate_rewrite_db="test_master->test_replica";
source include/stop_slave.inc;
SET @save_replicate_rewrite_db = @@GLOBAL.replicate_rewrite_db;
SELECT @@GLOBAL.replicate_rewrite_db;
SET @@GLOBAL.replicate_rewrite_db="test_master->test_replica";
SELECT @@GLOBAL.replicate_rewrite_db;
SHOW DATABASES like 'test_replica';
source include/start_slave.inc;
let $rewrite_db_sss= query_get_value(SHOW SLAVE STATUS, Replicate_Rewrite_DB, 1);
--echo # Ensuring SHOW SLAVE STATUS produces correct value for Replicate_Rewrite_DB...
if (`SELECT strcmp(@@global.replicate_rewrite_db, "$rewrite_db_sss") != 0`)
{
die SHOW SLAVE STATUS Replicate_Rewrite_DB value $rewrite_db_sss does not match variable @@GLOBAL.replicate_rewrite_db;
}
--echo # ...success
--echo # Create DB and tables on primary
connection master;
--enable_warnings
create database test_master;
use test_master;
create table my_table (t int);
insert into my_table values (1),(3);
--source include/save_master_gtid.inc
--echo # Ensure that the replica receives all of the primary's events without
--echo # error
--connection slave
--source include/sync_with_master_gtid.inc
let $error= query_get_value(SHOW SLAVE STATUS, Last_SQL_Error, 1);
--echo Last_SQL_Error = $error
let $errno= query_get_value(SHOW SLAVE STATUS, Last_SQL_Errno, 1);
--echo Last_SQL_Errno = $errno
SELECT @@GLOBAL.replicate_rewrite_db;
SHOW tables from test_replica;
select * from test_replica.my_table;
# Additional check for tables
--let $diff_tables=master:test_master.my_table,slave:test_replica.my_table
--source include/diff_tables.inc
--echo # Update of values on primary for DB not set in replication_rewrite_db
connection master;
use x;
insert into my_table values (314);
select * from my_table;
--source include/save_master_gtid.inc
connection slave;
--source include/stop_slave.inc
--source include/reset_slave.inc
--source include/start_slave.inc
SELECT @@GLOBAL.replicate_rewrite_db;
--source include/sync_with_master_gtid.inc
# This shouldn't get the new values from x DB on master
select * from y.my_table;
--echo # Dynamic updates to the replication filter should be lost after server restart
# Old value
connection slave;
SELECT @@GLOBAL.replicate_rewrite_db;
connection master;
use x;
insert into my_table values (1000);
select * from my_table;
--source include/save_master_gtid.inc
connection slave;
--source include/stop_slave.inc
--source include/reset_slave.inc
--let $rpl_server_number= 2
--source include/rpl_restart_server.inc
--replace_result $MASTER_MYPORT MASTER_MYPORT
eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=$MASTER_MYPORT, MASTER_USER='root';
# New value
connection slave;
--source include/start_slave.inc
SELECT @@GLOBAL.replicate_rewrite_db;
--source include/sync_with_master_gtid.inc
# This should update values with 314 and 1000 from primary
select * from y.my_table;
--echo # Cleanup
connection master;
drop database test_master;
drop database primary_db1;
drop database x;
--source include/save_master_gtid.inc
--connection slave
--source include/sync_with_master_gtid.inc
drop database test_replica;
drop database replica_db1;
drop database y;
source include/stop_slave.inc;
source include/start_slave.inc;
--source include/rpl_end.inc
# end of 10.11 tests