176 lines
5.6 KiB
PHP
176 lines
5.6 KiB
PHP
# ==== Overview ====
|
|
#
|
|
# This script works in conjuction with:
|
|
#
|
|
# extra/rpl_tests/rpl_row_jsondiff_[basic|datatypes|...].inc
|
|
# extra/rpl_tests/rpl_row_jsondiff_scenario.inc
|
|
# extra/rpl_tests/rpl_row_jsondiff_exit.inc
|
|
#
|
|
# A .test file in the suite typically does the following:
|
|
#
|
|
# --source extra/rpl_tests/rpl_row_jsondiff_init.inc
|
|
# --source extra/rpl_tests/rpl_row_jsondiff_[basic|datatypes|...]inc
|
|
# --source extra/rpl_tests/rpl_row_jsondiff_exit.inc
|
|
#
|
|
# where:
|
|
# - This 'init' script sets up replication topologies and some configuration.
|
|
# - Each 'basic'/'datatypes'/etc script defines a number of scenarios.
|
|
# - A scenario is executed by invoking the 'scenario' script with appropriate
|
|
# parameters.
|
|
# - The 'exit' script cleans up.
|
|
#
|
|
# ==== Requirements ====
|
|
#
|
|
# This script sets up a replication topology, in order to cover the
|
|
# following configurations and methods to apply rows:
|
|
#
|
|
# - Re-applying partial JSON updates should work in the following
|
|
# cases:
|
|
# - Replication to slave
|
|
# - Chained replication to slave-of-slave
|
|
# - Applying BINLOG 'base64' statements from mysqlbinlog
|
|
# - Applying the decoded pseudo-SQL from mysqlbinlog -v, if
|
|
# re-formatted into correct SQL.
|
|
#
|
|
# - Replication should work with minimal/full row images on
|
|
# master/slave, including the following cases:
|
|
# - minimal->minimal
|
|
# - minimal->full
|
|
# - full->full
|
|
# - full->minimal,
|
|
# - full->minimal->minimal. Note: due to the semantics of
|
|
# binlog_row_image=minimal, the first slave in this configuration
|
|
# does not produce the same after-image as a master having
|
|
# minimal. When the master has full, the slave will include the
|
|
# full after-image even when binlog_row_image=minimal, because it
|
|
# always includes all columns that were specified. Therefore, we
|
|
# also test that replication to the second slave works, to verify
|
|
# that this 'minimal with full after-image' format is correct.
|
|
# Cf. BUG#26258329.
|
|
#
|
|
# Since NOBLOB is similar to MINIMAL for JSON columns, we consider
|
|
# NOBLOB tested due to having tested MINIMAL.
|
|
#
|
|
# - All the above should hold when:
|
|
#
|
|
# - slave_rows_search_algorithms=HASH_SCAN/TABLE_SCAN with and
|
|
# without a primary key
|
|
#
|
|
# - slave_rows_search_algorithms=INDEX_SCAN with a primary key.
|
|
#
|
|
# ==== Usage ====
|
|
#
|
|
# [--let $replace_combination_from= SCOPE.VARIABLE=VALUE[,VALUE[,...]]
|
|
# [--let $replace_combination_to= SCOPE.VARIABLE=VALUE[,VALUE[,...]]
|
|
# --source include/rpl_row_jsondiff_init.inc
|
|
#
|
|
# [set $variables to describe a scenario]
|
|
# --source rpl_row_jsondiff_scenario.inc
|
|
#
|
|
# [set more $variables to describe another scenario]
|
|
# --source rpl_row_jsondiff_scenario.inc
|
|
#
|
|
# ...
|
|
#
|
|
# --source include/rpl_row_jsondiff_exit.inc
|
|
#
|
|
# Parameters:
|
|
# $replace_combination_from, $replace_combination_to
|
|
# If set, this script will source
|
|
# include/begin_replace_combination.inc just after
|
|
# include/rpl_init.inc, and rpl_row_jsondiff_exit.inc will source
|
|
# include/end_replace_combination just before include/rpl_end.inc.
|
|
# See include/begin_replace_combination.inc for details.
|
|
#
|
|
# ==== Implementation ====
|
|
#
|
|
# Setup the following replication topology:
|
|
#
|
|
# master -> slave_1 -> slave_2 -> slave_3 -> slave_4 -> slave_5
|
|
# decoded
|
|
# base64
|
|
#
|
|
# where:
|
|
# - master, slave_1, slave_4, slave_5 use binlog_row_image=MINIMAL
|
|
# - slave_2, slave_3 use binlog_row_image=FULL
|
|
# - row events decoded into SQL by mysqlbinlog will be applied on 'decoded'
|
|
# - BINLOG 'base64' statements generated by mysqlbinlog will be applied on
|
|
# 'base64'
|
|
#
|
|
# Set binlog_row_value_options=PARTIAL_JSON on all servers.
|
|
#
|
|
# ==== References ====
|
|
#
|
|
# WL#2955: RBR replication of partial JSON updates
|
|
|
|
|
|
# ######## CONFIGURE ########
|
|
|
|
--source include/have_log_bin.inc
|
|
|
|
--let $rpl_server_count= 8
|
|
--let $rpl_topology= 1->2->3->4->5->6
|
|
--source include/rpl_init.inc
|
|
--source include/rpl_default_connections.inc
|
|
|
|
if ($replace_combination_from)
|
|
{
|
|
--let $replace_combination_on_all_servers= 1
|
|
# To avoid an error 'ER_RUNNING_APPLIER_PREVENTS_SWITCH_GLOBAL_BINLOG_FORMAT',
|
|
# which will be caused by the following include/begin_replace_combination.inc.
|
|
--source include/rpl_stop_slaves.inc
|
|
--source include/begin_replace_combination.inc
|
|
--source include/rpl_start_slaves.inc
|
|
}
|
|
|
|
|
|
--echo ######## INITIALIZE ########
|
|
|
|
# mysqltest gets confused by dollars, and does not know how to escape them
|
|
--let $dollar_func= CHAR(36)
|
|
--let $dollar= `SELECT $dollar_func`
|
|
--let $master_con= server_1
|
|
--let $slave_1_con= server_2
|
|
--let $slave_2_con= server_3
|
|
--let $slave_3_con= server_4
|
|
--let $slave_4_con= server_5
|
|
--let $slave_5_con= server_6
|
|
--let $base64_con= server_7
|
|
--let $decoded_con= server_8
|
|
|
|
--connection $master_con
|
|
|
|
# Enable PARTIAL_JSON on all servers, set binlog_row_image=MINIMAL on
|
|
# all servers except server_2 and server_3.
|
|
--disable_query_log
|
|
--delimiter |
|
|
let $rpl_sql=
|
|
SET @@SESSION.BINLOG_ROW_IMAGE = MINIMAL;
|
|
SET @@SESSION.BINLOG_ROW_VALUE_OPTIONS = PARTIAL_JSON;
|
|
SET @@GLOBAL.BINLOG_ROW_IMAGE = MINIMAL;
|
|
SET @@GLOBAL.BINLOG_ROW_VALUE_OPTIONS = PARTIAL_JSON;
|
|
|
|
|
--delimiter ;
|
|
--source include/rpl_for_each_server_stmt.inc
|
|
--disable_warnings
|
|
--connection $slave_2_con
|
|
SET @@SESSION.BINLOG_ROW_IMAGE = FULL;
|
|
SET @@GLOBAL.BINLOG_ROW_IMAGE = FULL;
|
|
--connection $slave_3_con
|
|
SET @@SESSION.BINLOG_ROW_IMAGE = FULL;
|
|
SET @@GLOBAL.BINLOG_ROW_IMAGE = FULL;
|
|
--enable_warnings
|
|
--connection $master_con
|
|
--source include/rpl_stop_slaves.inc
|
|
--source include/rpl_start_slaves.inc
|
|
|
|
|
|
# Set 'constant' parameters of rpl_row_jsondiff_scenario.test
|
|
--let $echo_stmt= 1
|
|
--let $echo_decoded_rows= 1
|
|
--let $table= test.t
|
|
--let $scenario_inc= extra/rpl_tests/rpl_row_jsondiff_scenario.inc
|
|
|
|
|
|
--disable_query_log
|