mirror of
https://github.com/MariaDB/server.git
synced 2025-11-28 17:36:30 +03:00
As reported in MDEV-11969 "there's no way to ditch knowledge" about some domain that is no longer updated on a server. Besides being of annoyance to clutter output in DBA console stale domains can prevent the slave to connect the master as MDEV-12012 witnesses. What domain is obsolete must be evaluated by the user (DBA) according to whether the domain info is still relevant and will the domain ever receive any update. This patch introduces a method to discard obsolete gtid domains from the server binlog state. The removal requires no event group from such domain present in existing binlog files though. If there are any the containing logs must be first PURGEd in order for FLUSH BINARY LOGS DELETE_DOMAIN_ID=(list-of-domains) succeed. Otherwise the command returns an error. The list of obsolete domains can be computed through intersecting two sets - the earliest (first) binlog's Gtid_list and the current value of @@global.gtid_binlog_state - and extracting the domain id components from the intersection list items. The new DELETE_DOMAIN_ID featured FLUSH continues to rotate binlog omitting the deleted domains from the active binlog file's Gtid_list. Notice though when the command is ineffective - that none of requested to delete domain exists in the binlog state - rotation does not occur. Obsolete domain deletion is not harmful for connected slaves as long as master side binlog files *purge* is synchronized with FLUSH-DELETE_DOMAIN_ID. The slaves must have the last event from purged files processed as usual, in order not to bump later into requesting a gtid from a file which was already gone. While the command is not replicated (as ordinary FLUSH BINLOG LOGS is) slaves, even though having extra domains, won't suffer from reconnection errors thanks to master-slave gtid connection protocol allowing the master to be ignorant about a gtid domain. Should at failover such slave to be promoted into master role it may run the ex-master's FLUSH BINARY LOGS DELETE_DOMAIN_ID=(list-of-domains) to clean its own binlog state. NOTES. suite/perfschema/r/start_server_low_digest.result is re-recorded as consequence of internal parser codes changes.
138 lines
4.3 KiB
Plaintext
138 lines
4.3 KiB
Plaintext
# Prove basic properties of
|
|
#
|
|
# FLUSH BINARY LOGS DELETE_DOMAIN_ID = (...)
|
|
#
|
|
# The command removes the supplied list of domains from the current
|
|
# @@global.gtid_binlog_state provided the binlog files do not contain
|
|
# events from such domains.
|
|
|
|
# The test is not format specific. One format is chosen to run it.
|
|
--source include/have_binlog_format_mixed.inc
|
|
|
|
# Reset binlog state
|
|
RESET MASTER;
|
|
|
|
# Empty list is accepted
|
|
FLUSH BINARY LOGS DELETE_DOMAIN_ID = ();
|
|
--echo and the command execution is effective thence rotates binlog as usual
|
|
--source include/show_binary_logs.inc
|
|
|
|
--echo Non-existed domain is warned, the command completes without rotation
|
|
--echo but with a warning
|
|
--let $binlog_pre_flush=query_get_value(SHOW MASTER STATUS, Position, 1)
|
|
FLUSH BINARY LOGS DELETE_DOMAIN_ID = (99);
|
|
--let $binlog_start=$binlog_pre_flush
|
|
--source include/show_binary_logs.inc
|
|
|
|
# Log one event in a specified domain and try to delete the domain
|
|
SET @@SESSION.gtid_domain_id=1;
|
|
SET @@SESSION.server_id=1;
|
|
CREATE TABLE t (a int);
|
|
|
|
--error ER_BINLOG_CANT_DELETE_GTID_DOMAIN
|
|
FLUSH BINARY LOGS DELETE_DOMAIN_ID = (1);
|
|
|
|
# the same error after log rotation
|
|
FLUSH BINARY LOGS;
|
|
--error ER_BINLOG_CANT_DELETE_GTID_DOMAIN
|
|
FLUSH BINARY LOGS DELETE_DOMAIN_ID = (1);
|
|
|
|
# the latest binlog does not really contain any events incl ones from 1-domain
|
|
--let $purge_to_binlog= query_get_value(SHOW MASTER STATUS, File, 1)
|
|
--eval PURGE BINARY LOGS TO '$purge_to_binlog';
|
|
# So now it's safe to delete
|
|
--error 0
|
|
FLUSH BINARY LOGS DELETE_DOMAIN_ID = (1);
|
|
--echo Gtid_list of the current binlog does not contain '1':
|
|
--let $binlog_file=query_get_value(SHOW MASTER STATUS, File, 1)
|
|
--source include/show_gtid_list.inc
|
|
--echo But the previous log's Gtid_list may have it which explains a warning from the following command
|
|
--let $binlog_file=$purge_to_binlog
|
|
--source include/show_gtid_list.inc
|
|
|
|
--echo Already deleted domain in Gtid_list of the earliest log is benign
|
|
--echo but may cause a warning
|
|
--error 0
|
|
FLUSH BINARY LOGS DELETE_DOMAIN_ID = (1);
|
|
|
|
# Few domains delete. The chosen number verifies among others how
|
|
# expected overrun of the static buffers of underlying dynamic arrays is doing.
|
|
--let $domain_cnt=17
|
|
--let $server_in_domain_cnt=3
|
|
--let $domain_list=
|
|
--disable_query_log
|
|
while ($domain_cnt)
|
|
{
|
|
--let servers=$server_in_domain_cnt
|
|
--eval SET @@SESSION.gtid_domain_id=$domain_cnt
|
|
while ($servers)
|
|
{
|
|
--eval SET @@SESSION.server_id=10*$domain_cnt + $servers
|
|
--eval INSERT INTO t SET a=@@SESSION.server_id
|
|
|
|
--dec $servers
|
|
}
|
|
--let $domain_list= $domain_cnt, $domain_list
|
|
|
|
--dec $domain_cnt
|
|
}
|
|
--enable_query_log
|
|
--let $zero=0
|
|
--let $domain_list= $domain_list$zero
|
|
|
|
--error ER_BINLOG_CANT_DELETE_GTID_DOMAIN
|
|
--eval FLUSH BINARY LOGS DELETE_DOMAIN_ID = ($domain_list)
|
|
|
|
# Now satisfy the safety condtion to purge log files containing $domain list
|
|
FLUSH BINARY LOGS;
|
|
--let $purge_to_binlog= query_get_value(SHOW MASTER STATUS, File, 1)
|
|
--eval PURGE BINARY LOGS TO '$purge_to_binlog'
|
|
--error 0
|
|
--eval FLUSH BINARY LOGS DELETE_DOMAIN_ID = ($domain_list)
|
|
--echo Gtid_list of the current binlog does not contain $domain_list:
|
|
--let $binlog_file=query_get_value(SHOW MASTER STATUS, File, 1)
|
|
--source include/show_gtid_list.inc
|
|
|
|
# Show reaction on @@global.gtid_binlog_state not succeeding
|
|
# earlier state as described by the 1st binlog' Gtid_list.
|
|
# Now let it be out-order gtid logged to a domain unrelated to deletion.
|
|
|
|
--let $del_d_id=1
|
|
--eval SET @@SESSION.gtid_domain_id=$del_d_id;
|
|
SET @@SESSION.server_id=1;
|
|
SET @@SESSION.gtid_seq_no=1;
|
|
INSERT INTO t SET a=1;
|
|
SET @@SESSION.server_id=2;
|
|
SET @@SESSION.gtid_seq_no=2;
|
|
INSERT INTO t SET a=2;
|
|
|
|
SET @@SESSION.gtid_domain_id=11;
|
|
SET @@SESSION.server_id=11;
|
|
SET @@SESSION.gtid_seq_no=11;
|
|
INSERT INTO t SET a=11;
|
|
|
|
SET @gtid_binlog_state_saved=@@GLOBAL.gtid_binlog_state;
|
|
FLUSH BINARY LOGS;
|
|
|
|
# Inject out of order for domain '11' before
|
|
SET @@SESSION.gtid_domain_id=11;
|
|
SET @@SESSION.server_id=11;
|
|
SET @@SESSION.gtid_seq_no=1;
|
|
INSERT INTO t SET a=1;
|
|
|
|
SELECT @gtid_binlog_state_saved "as original state", @@GLOBAL.gtid_binlog_state as "out of order for 11 domain state";
|
|
|
|
# to delete '1', first to purge logs containing its events
|
|
--let $purge_to_binlog= query_get_value(SHOW MASTER STATUS, File, 1)
|
|
--eval PURGE BINARY LOGS TO '$purge_to_binlog'
|
|
|
|
--echo the following command succeeds with warnings
|
|
--eval FLUSH BINARY LOGS DELETE_DOMAIN_ID = ($del_d_id)
|
|
|
|
#
|
|
# Cleanup
|
|
#
|
|
|
|
DROP TABLE t;
|
|
RESET MASTER;
|