diff options
author | Sachin Kumar <sachin.setiya@mariadb.com> | 2021-05-24 11:23:03 +0100 |
---|---|---|
committer | Sachin Kumar <sachin.setiya@mariadb.com> | 2021-05-27 06:35:37 +0100 |
commit | 6b79bd2b5081a61903f66bc21d079d0eb07227e3 (patch) | |
tree | c4f31e597ab4a26f47d94f186361c24bb2f2f3fc /sql/sql_class.h | |
parent | 5c75ba9cadc7877e91d6b712f157ff5623c09c60 (diff) | |
download | mariadb-git-bb-10.2-24667.tar.gz |
MDEV-24667 LOAD DATA INFILE/inserted rows not written to binlogbb-10.2-24667
Problem:- In master slave replication , when master is using statement format
and slave is using mixed format, sometime we can have binlog which is not
written. For example LOAD DATA INFILE is a unsafe statement , it is logged as
a row format, and if it is on temporary table , it wont be logged. If the
next statement is copy data from the tmp table to normal table, it is logged
as a statement format on the slave , because it thinks this statement is
unsafe. As we can see we did not log LOAD DATA INFILE and we simply logging
insert into from * into statement format , we have effectively lost the
tmp table data.
Solution:- On master in mixed format if tmp table is created thd->temporary_tables
is set to not null. This will make THD::reset_for_next_command to not change
the binlog format back to stmt. So till the tmp table exist all the logs will
be written in row format. On master THD::has_thd_temporary_tables() is used
to determine whether we have temporary tables or not. But this does not work
for the slave , slave shifts temporary tables from thd->temporary_tables to
rgi_slave->rli->save_temporary_tables, so this will make has_thd_temporary_tables()
check to return false on slave. So instead of this function I am calling
has_temporary_tables() , which also checks slave thread tmp tables.
Diffstat (limited to 'sql/sql_class.h')
-rw-r--r-- | sql/sql_class.h | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/sql/sql_class.h b/sql/sql_class.h index 50ab3c56ca9..795e6a5e8b2 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -3899,13 +3899,13 @@ public: */ DBUG_PRINT("debug", ("temporary_tables: %s, in_sub_stmt: %s, system_thread: %s", - YESNO(has_thd_temporary_tables()), YESNO(in_sub_stmt), + YESNO(has_temporary_tables()), YESNO(in_sub_stmt), show_system_thread(system_thread))); if (in_sub_stmt == 0) { if (wsrep_binlog_format() == BINLOG_FORMAT_ROW) set_current_stmt_binlog_format_row(); - else if (!has_thd_temporary_tables()) + else if (!has_temporary_tables()) set_current_stmt_binlog_format_stmt(); } DBUG_VOID_RETURN; |