From af337a12e6f084556400fa93c71304ad63f1efa6 Mon Sep 17 00:00:00 2001 From: Igor Pashev Date: Fri, 23 Sep 2016 12:41:01 +0300 Subject: Initial commit --- pkgs/rdsdump/default.nix | 14 ++++++++++ pkgs/rdsdump/rdsdump.bash | 70 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 pkgs/rdsdump/default.nix create mode 100644 pkgs/rdsdump/rdsdump.bash (limited to 'pkgs/rdsdump') diff --git a/pkgs/rdsdump/default.nix b/pkgs/rdsdump/default.nix new file mode 100644 index 0000000..0efe033 --- /dev/null +++ b/pkgs/rdsdump/default.nix @@ -0,0 +1,14 @@ +{ stdenv, bash, ... }: + +stdenv.mkDerivation { + name = "rdsdump"; + buildInputs = [ bash ]; + phases = [ "installPhase" ]; + installPhase = '' + mkdir -p $out/bin + cp -a ${./rdsdump.bash} $out/bin/rdsdump + chmod +x $out/bin/rdsdump + patchShebangs $out/bin/rdsdump + ''; +} + diff --git a/pkgs/rdsdump/rdsdump.bash b/pkgs/rdsdump/rdsdump.bash new file mode 100644 index 0000000..6b8cbf1 --- /dev/null +++ b/pkgs/rdsdump/rdsdump.bash @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +set -euo pipefail + +mysql_args= +mysqldump_args= +master_data=0 +while [ $# -gt 0 ]; do + case $1 in + --host=*|--password=*|--user=*|\ + --defaults-file=*|--defaults-extra-file=*|\ + --ssl=*|--ssl-ca=*|--ssl-key=*|--ssl-cert=*|\ + -h?*|-u?*|-p?*) + mysql_args="$mysql_args $1" + mysqldump_args="$mysqldump_args $1" + shift 1;; + --host|--user|\ + --defaults-file|--defaults-extra-file|\ + --ssl-ca|--ssl-key|--ssl-cert|\ + -h|-u) + mysql_args="$mysql_args $1 $2" + mysqldump_args="$mysqldump_args $1 $2" + shift 2;; + --master-data=*) + master_data=$(echo "$1" | cut -d= -f2) + shift;; + --master-data) + master_data=$2 + shift 2;; + *) + mysqldump_args="$mysqldump_args $1" + shift;; + esac +done + +replica () { + mysql $mysql_args "$@" +} + +start_replication () { + replica -N -e "CALL mysql.rds_start_replication;" >&2 +} + +stop_replication () { + replica -N -e "CALL mysql.rds_stop_replication;" >&2 +} + +trap 'start_replication' EXIT +stop_replication + +if [ "$master_data" -gt 0 ]; then +if [ "$master_data" -eq 2 ]; then + printf '-- ' +fi +replica -e 'SHOW SLAVE STATUS\G' | awk -f <(cat - <<- 'AWK' + /\/ { log_pos = $2 }; + /\/ { log_file = $2 }; + END { + printf "CHANGE MASTER TO MASTER_LOG_FILE='%s', MASTER_LOG_POS=%d;\n", log_file, log_pos + } +AWK +) +fi + +mysqldump $mysqldump_args & +sleep 30 + +start_replication +trap - EXIT + +wait -- cgit v1.2.3