polardbxengine/mysql-test/extra/rpl_tests/rpl_row_jsondiff_init.inc

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