mirror of
https://github.com/MariaDB/server.git
synced 2025-02-04 21:02:17 +01:00
87ee1e75bc
MDEV-29533 Crash when MariaDB is replica of MySQL 8.0 MySQL 8.0 has added the following new events in the MySQL binary log PARTIAL_UPDATE_ROWS_EVENT TRANSACTION_PAYLOAD_EVENT HEARTBEAT_LOG_EVENT_V2 - PARTIAL_UPDATE_ROWS_EVENT is used by MySQL to generate update statements using JSON_SET, JSON_REPLACE and JSON_REMOVE to make update of JSON columns more efficient. These events can be disabled by setting 'binlog-row-value-options=""' - TRANSACTION_PAYLOAD_EVENT is used by MySQL to signal that a row event is compressed. It an be disably by setting 'binlog_transaction_compression=0'. - HEARTBEAT_LOG_EVENT_V2 is written to the binary log many times per seconds. It can be ignored by the server. What this patch does: - If PARTIAL_UPDATE_ROWS_EVENT or TRANSACTION_PAYLOAD_EVENT is found, the server will stop with an error message of how to disable the MySQL server to generate such events. - HEARTBEAT_LOG_EVENT_V2 events are ignored. - mariadb-binlog will write the name of the new events. - mariadb-binlog will stop if PARTIAL_UPDATE_ROWS_EVENT or TRANSACTION_PAYLOAD_EVENT is found, unless --force is given. - Fixes a crash in mariadb-binlog if a character set unknown to MariaDB is found. (MDEV-29533) From Kristian Nielsen: - Add test case for MySQL 8.0 to MariaDB replication and fixed a a small typo in post_header_len initialization. Reviewer: knielsen@mariadb.org
121 lines
4.2 KiB
Text
121 lines
4.2 KiB
Text
--source include/have_innodb.inc
|
|
--source include/have_binlog_format_row.inc
|
|
--source include/master-slave.inc
|
|
|
|
# Test some replication events from MySQL 8.0 to MariaDB.
|
|
# Works by copying in a binlog generated by MySQL 8.0.
|
|
# The binlog was generated by the following test case. Note that after
|
|
# re-generating this, values for Master_log_pos below may need updating, check
|
|
# mysqlbinlog for the correct new values.
|
|
#
|
|
# The latin1 character set is needed since MariaDB currently does not support
|
|
# the default MySQL character set. The binlog_format=statement is needed due to
|
|
# missing support for the JSON type in row events. These can be removed once
|
|
# support is added in MariaDB.
|
|
#
|
|
# --source include/not_group_replication_plugin.inc
|
|
# --source include/have_binlog_format_row.inc
|
|
# --source include/master-slave.inc
|
|
#
|
|
# --connection master
|
|
# SET NAMES 'latin1';
|
|
# SET SESSION collation_server= 'latin1_swedish_ci';
|
|
# CREATE TABLE t1 (a INT PRIMARY KEY, b INT, c VARCHAR(1024)) ENGINE=InnoDB CHARACTER SET latin1;
|
|
# INSERT INTO t1 VALUES (1, 0, '');
|
|
# BEGIN;
|
|
# INSERT INTO t1 VALUES (2, 0, 'hulu');
|
|
# INSERT INTO t1 VALUES (3, 0, 'bulu');
|
|
# COMMIT;
|
|
# INSERT INTO t1 VALUES (4, 0, 'skip');
|
|
#
|
|
# SET SESSION binlog_transaction_compression= 1;
|
|
# BEGIN;
|
|
# --disable_query_log
|
|
# --let $i= 0
|
|
# while ($i < 100) {
|
|
# eval INSERT INTO t1 VALUES ($i+1000, $i, CONCAT("--", $i, "--", REPEAT("\\/", 100), "--"));
|
|
# inc $i;
|
|
# }
|
|
# --enable_query_log
|
|
# COMMIT;
|
|
# SET SESSION binlog_transaction_compression= default;
|
|
#
|
|
# INSERT INTO t1 VALUES (5, 0, 'after compressed');
|
|
# SET SESSION binlog_row_value_options= PARTIAL_JSON;
|
|
# CREATE TABLE t2 (a INT PRIMARY KEY, b JSON) ENGINE=InnoDB;
|
|
# SET SESSION binlog_format=statement;
|
|
# INSERT INTO t2 VALUES (1, CONCAT('{"a": "hulu", "b": "', REPEAT("[zyzzy]", 100), '", "c": "bulu"}'));
|
|
# SET SESSION binlog_format=row;
|
|
# UPDATE t2 SET b=JSON_REPLACE(b, '$.b', REPEAT("oOo", 50));
|
|
# SET SESSION binlog_row_value_options= DEFAULT;
|
|
# --sync_slave_with_master
|
|
#
|
|
# --connection master
|
|
# SET sql_log_bin= 0;
|
|
# FLUSH BINARY LOGS;
|
|
# SET sql_log_bin= 1;
|
|
# DROP TABLE t1, t2;
|
|
# --source include/rpl_end.inc
|
|
|
|
|
|
--connection slave
|
|
--source include/stop_slave.inc
|
|
|
|
--connection master
|
|
--let $datadir= `SELECT @@datadir`
|
|
--let $rpl_server_number= 1
|
|
--source include/rpl_stop_server.inc
|
|
|
|
# Copy in the MySQL 8.0 generated binlog.
|
|
--remove_file $datadir/master-bin.000001
|
|
--copy_file $MYSQL_TEST_DIR/std_data/mdev35643_mysql_80_binlog.000001 $datadir/master-bin.000001
|
|
|
|
--source include/rpl_start_server.inc
|
|
|
|
--save_master_pos
|
|
|
|
--connection slave
|
|
CHANGE MASTER TO Master_log_file='master-bin.000001', Master_log_pos=4, Master_use_gtid=No;
|
|
START SLAVE IO_THREAD;
|
|
--source include/wait_for_slave_io_to_start.inc
|
|
# The position 1178 is the start of: INSERT INTO t1 VALUES (4, 0, 'skip');
|
|
# After that comes unknown MySQL 8.0 events, which we test error for below.
|
|
START SLAVE UNTIL Master_log_file='master-bin.000001', Master_log_pos= 1178;
|
|
SELECT MASTER_POS_WAIT('master-bin.000001', 1178, 60);
|
|
SELECT * FROM t1 ORDER BY a;
|
|
|
|
--source include/wait_for_slave_sql_to_stop.inc
|
|
|
|
START SLAVE;
|
|
--let $slave_sql_errno= 1594
|
|
--source include/wait_for_slave_sql_error.inc
|
|
|
|
STOP SLAVE IO_THREAD;
|
|
--source include/wait_for_slave_io_to_stop.inc
|
|
# The position 2298 is the start of: INSERT INTO t1 VALUES (5, 0, 'after compressed');
|
|
CHANGE MASTER TO Master_log_file='master-bin.000001', Master_log_pos=2297;
|
|
START SLAVE IO_THREAD;
|
|
START SLAVE SQL_THREAD;
|
|
--source include/wait_for_slave_io_to_start.inc
|
|
--let $slave_sql_errno= 1594
|
|
--source include/wait_for_slave_sql_error.inc
|
|
|
|
SELECT * FROM t1 ORDER BY a;
|
|
SELECT * FROM t2 ORDER BY a;
|
|
|
|
STOP SLAVE IO_THREAD;
|
|
--source include/wait_for_slave_io_to_stop.inc
|
|
# Restart replication after the MySQL 8.0 file.
|
|
CHANGE MASTER TO Master_log_file='master-bin.000002', Master_log_pos=4;
|
|
START SLAVE IO_THREAD;
|
|
START SLAVE SQL_THREAD;
|
|
--source include/wait_for_slave_io_to_start.inc
|
|
--source include/wait_for_slave_sql_to_start.inc
|
|
--sync_with_master
|
|
|
|
DROP TABLE t1, t2;
|
|
CALL mtr.add_suppression('TRANSACTION_PAYLOAD_EVENT event. You can avoid this event by specifying');
|
|
CALL mtr.add_suppression('PARTIAL_UPDATE_ROWS_EVENT event. You can avoid this event by specifying');
|
|
|
|
--connection master
|
|
--source include/rpl_end.inc
|