aboutsummaryrefslogtreecommitdiff
path: root/pkgs/rdsdump
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2016-09-23 12:41:01 +0300
committerIgor Pashev <pashev.igor@gmail.com>2016-09-23 12:41:49 +0300
commitaf337a12e6f084556400fa93c71304ad63f1efa6 (patch)
treead5125cbfb2e812f4a507b182b875526b2a2d0e9 /pkgs/rdsdump
downloadnixsap-af337a12e6f084556400fa93c71304ad63f1efa6.tar.gz
Initial commit
Diffstat (limited to 'pkgs/rdsdump')
-rw-r--r--pkgs/rdsdump/default.nix14
-rw-r--r--pkgs/rdsdump/rdsdump.bash70
2 files changed, 84 insertions, 0 deletions
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'
+ /\<Exec_Master_Log_Pos\>/ { log_pos = $2 };
+ /\<Relay_Master_Log_File\>/ { 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