summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/mariadb-push-replica.sh119
1 files changed, 84 insertions, 35 deletions
diff --git a/src/mariadb-push-replica.sh b/src/mariadb-push-replica.sh
index a7345dc..7134864 100755
--- a/src/mariadb-push-replica.sh
+++ b/src/mariadb-push-replica.sh
@@ -33,7 +33,13 @@ then
33fi 33fi
34 34
35primary_host=$(hostname --fqdn) 35primary_host=$(hostname --fqdn)
36replica_host=${1:-$default_replica_host} 36if [ $# = 0 ]
37then
38 replica_host=$default_replica_host
39else
40 replica_host=${1:-$default_replica_host}
41 shift
42fi
37replication_user=replication 43replication_user=replication
38 44
39run_primary() 45run_primary()
@@ -114,7 +120,7 @@ send_backup()
114 rsync -zaR -- /./"${mariabackup_target_dir#/}" "$1":/ 120 rsync -zaR -- /./"${mariabackup_target_dir#/}" "$1":/
115} 121}
116 122
117stop_database_server_and_remove_database_files() 123stop_mariadb_server_and_remove_database_files()
118{ 124{
119 livedb=/var/lib/mysql 125 livedb=/var/lib/mysql
120 set -e 126 set -e
@@ -136,6 +142,7 @@ restore_from_backup()
136{ 142{
137 mariabackup_target_dir=/var/mariadb/backup 143 mariabackup_target_dir=/var/mariadb/backup
138 set -e 144 set -e
145 stop_mariadb_server_and_remove_database_files
139 set -- \ 146 set -- \
140 --force-non-empty-directories \ 147 --force-non-empty-directories \
141 -u root \ 148 -u root \
@@ -188,7 +195,7 @@ mostly_silent_unless_error()
188 return $r 195 return $r
189} 196}
190 197
191enable_replication() 198enable_replication_via_mariabackup_xtra_info()
192{ 199{
193 primary_host=$1 200 primary_host=$1
194 replication_user=$2 201 replication_user=$2
@@ -286,57 +293,99 @@ from
286. 293.
287} 294}
288 295
289list_databases_needed_on_replica()
290{
291 set -- "$(mktemp)" "$(mktemp)"
292 run_primary mariadb_list_databases | sort -u >"$1"
293 run_replica mariadb_list_databases | sort -u >"$2"
294 comm -23 -- "$1" "$2"
295 rm -- "$1" "$2"
296}
297
298mariabackup_create_replica_databases() 296mariabackup_create_replica_databases()
299{ 297{
300 run_primary create_backup 298 run_primary create_backup
301 run_primary send_backup "$replica_host" 299 run_primary send_backup "$replica_host"
302 run_replica stop_database_server_and_remove_database_files
303 run_replica restore_from_backup 300 run_replica restore_from_backup
301 run_primary create_replication_user \
302 "$replica_host" \
303 "$replication_user" \
304 "$replication_password"
305 run_replica enable_replication_via_mariabackup_xtra_info \
306 "$primary_host" \
307 "$replication_user" \
308 "$replication_password"
309}
310
311printlines()
312{
313 printf '%s\n' "$@"
314}
315
316printarray()
317{
318 declare -n _PRINTARRAY_VARNAME="$1"
319 printf '%s\n' "${_PRINTARRAY_VARNAME[@]}"
320}
321
322# Call run_replica from here to avoid
323# piping the database back to caller
324# unnecessarily
325send_mariadb_dump()
326{
327 (set -x
328 mariadb-dump "${@:2}") |
329 replica_host="$1" run_replica pipe_into_mariadb
304} 330}
305 331
306mariadbdump_create_replica_databases() 332pipe_into_mariadb()
307{ 333{
308 list_databases_needed_on_replica 334 pv -f | mariadb
309 comm -13 -- \ 335}
310 <(list_databases_needed_on_replica | tee /dev/stderr) \ 336
311 <(printf '%s\n' "$@") 337mariadbdump_transfer_missing_databases()
338{
339 declare -a primary_dbs
340 mapfile -t primary_dbs < \
341 <(</dev/null run_primary \
342 mariadb_list_databases | sort -u)
343
344 declare -a replica_dbs
345 mapfile -t replica_dbs < \
346 <(</dev/null run_replica \
347 mariadb_list_databases | sort -u)
348
349 declare -a dbs_missing_from_replica
350 mapfile -t dbs_missing_from_replica < \
351 <(comm -23 -- \
352 <(printarray primary_dbs) \
353 <(printarray replica_dbs))
354
355 declare -a to_replicate
356 if [ $# = 0 ]
357 then
358 to_replicate=("${dbs_missing_from_replica[@]}")
359 else
360 mapfile -t to_replicate < \
361 <(comm -12 -- \
362 <(printarray dbs_missing_from_replica) \
363 <(printlines "$@"))
364 fi
365 if [ ${#to_replicate[@]} -gt 0 ]
366 then
367 run_primary \
368 send_mariadb_dump "$replica_host" \
369 --master-data \
370 --gtid \
371 --single-transaction \
372 --databases "${to_replicate[@]}"
373 fi
312} 374}
313 375
314main() 376main()
315{ 377{
316 set -e 378 set -e
317 check_input 379 check_input
380
318 run_primary set_server_id 381 run_primary set_server_id
319 run_both list_databases
320 382
321 # run_primary check_db 383 # run_primary check_db
322 # run_replica check_db 384 # run_replica check_db
323 # showvars replica 385 # showvars replica
324 386
325 run_primary create_replication_user \ 387 mariadbdump_transfer_missing_databases "$@"
326 "$replica_host" \ 388 run_replica list_databases
327 "$replication_user" \
328 "$replication_password"
329
330 # mariadbdump_create_replica
331 run_both list_databases
332 mariabackup_create_replica_databases
333 run_both list_databases
334
335 run_replica check_db
336 run_replica enable_replication \
337 "$primary_host" \
338 "$replication_user" \
339 "$replication_password"
340 run_both list_databases 389 run_both list_databases
341} 390}
342 391
@@ -358,7 +407,7 @@ from
358. 407.
359} 408}
360 409
361if true 410if false
362then 411then
363 cleanup_after_test 412 cleanup_after_test
364fi 413fi