From fc787c8fb83821138915049e64c01eb4ad1060d7 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 14 Feb 2024 12:23:06 -0500 Subject: omfg replication actually works --- src/mariadb-push-replica.sh | 192 ++++++++++++++++++++++++++++++-------------- 1 file changed, 131 insertions(+), 61 deletions(-) diff --git a/src/mariadb-push-replica.sh b/src/mariadb-push-replica.sh index 56a3b42..7d92859 100755 --- a/src/mariadb-push-replica.sh +++ b/src/mariadb-push-replica.sh @@ -198,16 +198,18 @@ mostly_silent_unless_error() mariadb_install_replication_credentials() { set -e - tee /dev/stderr <&2 - mariadb -Bsss "$@" <<. + mariadb --skip-reconnect -Bsss "$@" <<. select schema_name from @@ -409,43 +460,30 @@ mariadb_scan_databases() choose_mariadbdump_target_databases() { - declare -n target_databases="$1" + declare -n _target_db_array="$1" shift if [ $# = 0 ] then - target_databases=() - [ ${#primary_dbs_not_on_replica[@]} -gt 0 ] || return 0 - printf "Missing on ${replica_host}: %s\n" \ - "${primary_dbs_not_on_replica[@]}" >&2 - [ "$SEND_ALL_MARIADB_DATABASES" ] || return 0 - target_databases=("${primary_dbs_not_on_replica[@]}") + if [ ${#primary_dbs_not_on_replica[@]} -gt 0 ] + then + printf "Missing on ${replica_host}: %s\n" \ + "${primary_dbs_not_on_replica[@]}" >&2 + fi + + if [ "$SEND_ALL_MARIADB_DATABASES" ] + then + _target_db_array=("${primary_dbs_not_on_replica[@]}") + else + _target_db_array=() + fi else - save_array target_databases from lines \ + save_array _target_db_array from lines \ <(intersection_lines \ <(printarray primary_dbs_not_on_replica) \ <(printlines "$@" | sort -u)) fi } -mariadbdump_transfer_missing_databases() -{ - mariadbdump_transfer_databases \ - "$replica_host" \ - "${to_replicate[@]}" -} - -mariadbdump_transfer_databases() -{ - [ $# -ge 2 ] || return 0 - run_primary \ - send_mariadb_dump "$1" \ - --master-data \ - --apply-slave-statements \ - --gtid \ - --single-transaction \ - --databases "${@:2}" -} - intersection_lines() { comm -12 -- "$1" "$2" @@ -465,6 +503,7 @@ main() check_input run_both set_server_id + run_both mariadb_enable_semi_sync # run_primary check_db # run_replica check_db @@ -482,7 +521,8 @@ main() "$replication_user" \ "$replication_password" run_primary \ - send_mariadb_dump "$replica_host" \ + send_mariadb_dump \ + "$replica_host" \ --master-data \ --apply-slave-statements \ --gtid \ @@ -490,6 +530,34 @@ main() --databases "${to_replicate[@]}" run_replica list_databases fi + #run_replica mariadb <<< 'show slave status\G' + #run_primary mariadb <<< 'show master status\G' + #run_replica showvars + #run_replica mariadb <<< 'show slave status\G' + gtid=$(run_primary mariadb --skip-reconnect -sssB <<< \ + 'select @@gtid_binlog_pos;') + [ "$gtid" ] && run_replica wait_on_gtid "$gtid" +} + +wait_on_gtid() +{ + local gtid="$1" + mariadb -t <<. +select + @@hostname +, @@gtid_slave_pos as 'slave gtid' +, '$gtid' as 'master gtid' +; +stop slave ; +stop slave io_thread ; +start slave ; +start slave io_thread ; +. + mariadb -t -v <<. +select + master_gtid_wait('$gtid') +; +. } cleanup_after_test() @@ -504,12 +572,14 @@ select @@hostname , @@server_id , count(schema_name) as 'databases' +, user() as 'login' , @@gtid_slave_pos +, @@gtid_binlog_pos from information_schema.schemata -; +\G select - schema_name as 'database' + schema_name as 'database name' from information_schema.schemata ; -- cgit v1.2.3