diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/mariadb-push-replica.sh | 147 |
1 files changed, 117 insertions, 30 deletions
diff --git a/src/mariadb-push-replica.sh b/src/mariadb-push-replica.sh index 5e18757..a7345dc 100755 --- a/src/mariadb-push-replica.sh +++ b/src/mariadb-push-replica.sh | |||
@@ -61,36 +61,44 @@ show_hostnames() | |||
61 | 61 | ||
62 | check_db() | 62 | check_db() |
63 | { | 63 | { |
64 | show_hostnames | 64 | ls -lFC --color /var/lib/mysql |
65 | mariadb --skip-reconnect -t <<END | 65 | mariadb -t "$@" <<. |
66 | select user(), @@hostname, @@server_id, @@gtid_slave_pos, @@sql_log_bin; | 66 | select |
67 | END | 67 | user() |
68 | , @@hostname | ||
69 | , @@server_id | ||
70 | , @@gtid_slave_pos | ||
71 | , @@sql_log_bin | ||
72 | ; | ||
73 | select | ||
74 | @@hostname | ||
75 | , schema_name as 'database' | ||
76 | from | ||
77 | information_schema.schemata | ||
78 | ; | ||
79 | . | ||
68 | } | 80 | } |
69 | 81 | ||
70 | create_backup() | 82 | create_backup() |
71 | { | 83 | { |
84 | mostly_silent_unless_error create_backup_verbose "$@" | ||
85 | } | ||
86 | |||
87 | create_backup_verbose() | ||
88 | { | ||
72 | set -e | 89 | set -e |
73 | mariabackup_target_dir=/var/mariadb/backup | 90 | mariabackup_target_dir=/var/mariadb/backup |
74 | binlog_info_file=$mariabackup_target_dir/xtrabackup_binlog_info | 91 | binlog_info_file=$mariabackup_target_dir/xtrabackup_binlog_info |
75 | [ -e "$binlog_info_file" ] && return | 92 | [ -e "$binlog_info_file" ] && return |
76 | mkdir -p "$mariabackup_target_dir" | 93 | mkdir -p "$mariabackup_target_dir" |
77 | marialog=$(mktemp) | 94 | set -- \ |
78 | e=0 | ||
79 | (set -- \ | ||
80 | -u root \ | 95 | -u root \ |
81 | --target-dir="$mariabackup_target_dir" | 96 | --target-dir="$mariabackup_target_dir" \ |
82 | exec >"$marialog" 2>&1 | 97 | "$@" |
83 | set -x | 98 | set -x |
84 | mariabackup --backup --rsync "$@" | 99 | mariabackup --backup --rsync "$@" |
85 | mariabackup --prepare "$@") || e=$? | 100 | mariabackup --prepare "$@" |
86 | if [ "$e" = 0 -a -e "$binlog_info_file" ] | 101 | [ -e "$binlog_info_file" ] |
87 | then | ||
88 | tail -v -n2 "$marialog" >&2 | ||
89 | rm "$marialog" | ||
90 | else | ||
91 | cat "$marialog" >&2 | ||
92 | false | ||
93 | fi | ||
94 | } | 102 | } |
95 | 103 | ||
96 | delete_backup() | 104 | delete_backup() |
@@ -128,13 +136,13 @@ restore_from_backup() | |||
128 | { | 136 | { |
129 | mariabackup_target_dir=/var/mariadb/backup | 137 | mariabackup_target_dir=/var/mariadb/backup |
130 | set -e | 138 | set -e |
131 | |||
132 | # stop_database_server_and_remove_database_files | ||
133 | |||
134 | set -- \ | 139 | set -- \ |
140 | --force-non-empty-directories \ | ||
135 | -u root \ | 141 | -u root \ |
136 | --target-dir="$mariabackup_target_dir" | 142 | --target-dir="$mariabackup_target_dir" |
137 | if silent_unless_error mariabackup --move-back "$@" | 143 | set -- "$@" |
144 | if mostly_silent_unless_error \ | ||
145 | mariabackup --move-back "$@" | ||
138 | then | 146 | then |
139 | # Can't believe mariabackup | 147 | # Can't believe mariabackup |
140 | # is so primitive as to | 148 | # is so primitive as to |
@@ -163,6 +171,23 @@ silent_unless_error() | |||
163 | return $r | 171 | return $r |
164 | } | 172 | } |
165 | 173 | ||
174 | mostly_silent_unless_error() | ||
175 | { | ||
176 | echo "+ $*" >&2 | ||
177 | set -- "$(mktemp)" "$@" | ||
178 | if | ||
179 | "${@:2}" >"$1" 2>&1 | ||
180 | then | ||
181 | tail -n3 "$1" >&2 | ||
182 | local r=0 | ||
183 | else | ||
184 | local r=$? | ||
185 | cat "$1" >&2 | ||
186 | fi | ||
187 | rm "$1" | ||
188 | return $r | ||
189 | } | ||
190 | |||
166 | enable_replication() | 191 | enable_replication() |
167 | { | 192 | { |
168 | primary_host=$1 | 193 | primary_host=$1 |
@@ -251,29 +276,91 @@ set global server_id = $chosen_id; | |||
251 | END | 276 | END |
252 | } | 277 | } |
253 | 278 | ||
279 | mariadb_list_databases() | ||
280 | { | ||
281 | mariadb -Bsss "$@" <<. | ||
282 | select | ||
283 | schema_name | ||
284 | from | ||
285 | information_schema.schemata; | ||
286 | . | ||
287 | } | ||
288 | |||
289 | list_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 | |||
298 | mariabackup_create_replica_databases() | ||
299 | { | ||
300 | run_primary create_backup | ||
301 | run_primary send_backup "$replica_host" | ||
302 | run_replica stop_database_server_and_remove_database_files | ||
303 | run_replica restore_from_backup | ||
304 | } | ||
305 | |||
306 | mariadbdump_create_replica_databases() | ||
307 | { | ||
308 | list_databases_needed_on_replica | ||
309 | comm -13 -- \ | ||
310 | <(list_databases_needed_on_replica | tee /dev/stderr) \ | ||
311 | <(printf '%s\n' "$@") | ||
312 | } | ||
313 | |||
254 | main() | 314 | main() |
255 | { | 315 | { |
256 | set -e | 316 | set -e |
257 | check_input | 317 | check_input |
258 | run_primary set_server_id | 318 | run_primary set_server_id |
259 | run_both check_db | 319 | run_both list_databases |
260 | : showvars replica | 320 | |
321 | # run_primary check_db | ||
322 | # run_replica check_db | ||
323 | # showvars replica | ||
261 | 324 | ||
262 | run_primary create_replication_user \ | 325 | run_primary create_replication_user \ |
263 | "$replica_host" \ | 326 | "$replica_host" \ |
264 | "$replication_user" \ | 327 | "$replication_user" \ |
265 | "$replication_password" | 328 | "$replication_password" |
266 | run_primary create_backup | 329 | |
267 | run_primary send_backup "$replica_host" | 330 | # mariadbdump_create_replica |
268 | run_replica restore_from_backup | 331 | run_both list_databases |
332 | mariabackup_create_replica_databases | ||
333 | run_both list_databases | ||
334 | |||
335 | run_replica check_db | ||
269 | run_replica enable_replication \ | 336 | run_replica enable_replication \ |
270 | "$primary_host" \ | 337 | "$primary_host" \ |
271 | "$replication_user" \ | 338 | "$replication_user" \ |
272 | "$replication_password" | 339 | "$replication_password" |
273 | run_replica check_db | 340 | run_both list_databases |
274 | : run_primary delete_backup | 341 | } |
275 | run_primary check_db | 342 | |
343 | cleanup_after_test() | ||
344 | { | ||
345 | run_primary delete_backup || true | ||
276 | } | 346 | } |
277 | 347 | ||
348 | list_databases() | ||
349 | { | ||
350 | mariadb -t "$@" <<. | ||
351 | select | ||
352 | @@hostname, | ||
353 | @@server_id, | ||
354 | schema_name as 'database' | ||
355 | from | ||
356 | information_schema.schemata | ||
357 | ; | ||
358 | . | ||
359 | } | ||
360 | |||
361 | if true | ||
362 | then | ||
363 | cleanup_after_test | ||
364 | fi | ||
278 | main "$@" | 365 | main "$@" |
279 | exit $? | 366 | exit $? |