Commit 28ce5ab2 authored by Sven Sandberg's avatar Sven Sandberg

Bug#35807 - INSTALL PLUGIN replicates row-based, but not stmt-based

INSTALL PLUGIN and UNINSTALL PLUGIN worked with statement-based and
mixed-mode replication only, but not with row-based replication.

There is no statement-based replication of these statements.
But there was row-based replication of the inserts and deletes
to and from the mysql.plugin table.

The fix is to suppress binlogging during insert and delete to
and from the mysql.plugin table.
parent 1b107a59
stop slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
Verify that example engine is not installed.
SELECT * FROM INFORMATION_SCHEMA.ENGINES WHERE ENGINE='EXAMPLE';
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
Get binlog position before install plugin.
Install example engine.
INSTALL PLUGIN example SONAME 'ha_example.so';
Get binlog position after install plugin.
Compute the difference of the binlog positions.
Should be zero as install plugin should not be replicated.
Delta
0
Verify that example engine is installed.
SELECT * FROM INFORMATION_SCHEMA.ENGINES WHERE ENGINE='EXAMPLE';
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
EXAMPLE YES Example storage engine NO NO NO
connection slave: Verify that example engine is not installed.
SELECT * FROM INFORMATION_SCHEMA.ENGINES WHERE ENGINE='EXAMPLE';
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
connection master: Uninstall example engine.
Get binlog position before uninstall plugin.
UNINSTALL PLUGIN example;
Get binlog position after uninstall plugin.
Compute the difference of the binlog positions.
Should be zero as uninstall plugin should not be replicated.
Delta
0
Verify that example engine is not installed.
SELECT * FROM INFORMATION_SCHEMA.ENGINES WHERE ENGINE='EXAMPLE';
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
End of test
#
# Bug#35807 - INSTALL PLUGIN replicates row-based, but not stmt-based
#
# The test verifies that INSTALL PLUGIN and UNINSTALL PLUGIN
# work with replication.
#
# The test tries to install and uninstall a plugin on master,
# and verifies that it does not affect the slave,
# and that it does not add anything to the binlog.
--source include/not_embedded.inc
--source include/have_log_bin.inc
# Dynamic loading of Example does not work on Windows currently.
--source include/not_windows.inc
--source include/have_example_plugin.inc
# Initialize replication.
--source include/master-slave.inc
--echo Verify that example engine is not installed.
SELECT * FROM INFORMATION_SCHEMA.ENGINES WHERE ENGINE='EXAMPLE';
--echo Get binlog position before install plugin.
let $before_pos = query_get_value("SHOW MASTER STATUS", Position, 1);
--echo Install example engine.
INSTALL PLUGIN example SONAME 'ha_example.so';
--echo Get binlog position after install plugin.
let $after_pos = query_get_value("SHOW MASTER STATUS", Position, 1);
--echo Compute the difference of the binlog positions.
--echo Should be zero as install plugin should not be replicated.
--disable_query_log
eval SELECT $after_pos - $before_pos AS Delta;
--enable_query_log
--echo Verify that example engine is installed.
SELECT * FROM INFORMATION_SCHEMA.ENGINES WHERE ENGINE='EXAMPLE';
# Wait for slave to catch up with master.
sync_slave_with_master;
#
--echo connection slave: Verify that example engine is not installed.
connection slave;
SELECT * FROM INFORMATION_SCHEMA.ENGINES WHERE ENGINE='EXAMPLE';
#
--echo connection master: Uninstall example engine.
connection master;
--echo Get binlog position before uninstall plugin.
let $before_pos = query_get_value("SHOW MASTER STATUS", Position, 1);
UNINSTALL PLUGIN example;
--echo Get binlog position after uninstall plugin.
let $after_pos = query_get_value("SHOW MASTER STATUS", Position, 1);
--echo Compute the difference of the binlog positions.
--echo Should be zero as uninstall plugin should not be replicated.
--disable_query_log
eval SELECT $after_pos - $before_pos AS Delta;
--enable_query_log
--echo Verify that example engine is not installed.
SELECT * FROM INFORMATION_SCHEMA.ENGINES WHERE ENGINE='EXAMPLE';
# Wait for slave to catch up with master.
sync_slave_with_master;
#
# Cleanup
--source include/master-slave-end.inc
--echo End of test
......@@ -1662,11 +1662,18 @@ bool mysql_install_plugin(THD *thd, const LEX_STRING *name, const LEX_STRING *dl
goto deinit;
}
/*
We do not replicate the INSTALL PLUGIN statement. Disable binlogging
of the insert into the plugin table, so that it is not replicated in
row based mode.
*/
tmp_disable_binlog(thd);
table->use_all_columns();
restore_record(table, s->default_values);
table->field[0]->store(name->str, name->length, system_charset_info);
table->field[1]->store(dl->str, dl->length, files_charset_info);
error= table->file->ha_write_row(table->record[0]);
reenable_binlog(thd);
if (error)
{
table->file->print_error(error, MYF(0));
......@@ -1731,7 +1738,15 @@ bool mysql_uninstall_plugin(THD *thd, const LEX_STRING *name)
HA_READ_KEY_EXACT))
{
int error;
if ((error= table->file->ha_delete_row(table->record[0])))
/*
We do not replicate the UNINSTALL PLUGIN statement. Disable binlogging
of the delete from the plugin table, so that it is not replicated in
row based mode.
*/
tmp_disable_binlog(thd);
error= table->file->ha_delete_row(table->record[0]);
reenable_binlog(thd);
if (error)
{
table->file->print_error(error, MYF(0));
DBUG_RETURN(TRUE);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment