diff --git a/.travis.yml b/.travis.yml index e8b540837..ef07336ab 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,7 @@ matrix: - brew install moreutils - brew install shellcheck - brew install jq + - brew install pigz script: make test - os: linux dist: trusty @@ -24,4 +25,5 @@ matrix: - moreutils - fakeroot - jq + - pigz script: debuild -uc -us diff --git a/bin/ghe-backup b/bin/ghe-backup index 05dca06cc..2f94cb408 100755 --- a/bin/ghe-backup +++ b/bin/ghe-backup @@ -200,10 +200,15 @@ is_binary_backup(){ echo "Backing up MySQL database ..." bm_start "ghe-export-mysql" -echo 'set -o pipefail; ghe-export-mysql | gzip' | +export_command="ghe-export-mysql" +if ! is_binary_backup; then + # binary backup is already compressed + export_command+=" | pigz" +fi +echo "set -o pipefail; $export_command" | ghe-ssh "$GHE_HOSTNAME" -- /bin/bash > mysql.sql.gz || failures="$failures mysql" if is_binary_backup; then - touch mysql-binary-backup-sentinel + echo "NO_ADDITIONAL_COMPRESSION" > mysql-binary-backup-sentinel fi bm_end "ghe-export-mysql" diff --git a/share/github-backup-utils/ghe-restore-mysql b/share/github-backup-utils/ghe-restore-mysql index 4c8cec9e4..bbcf3ab9a 100755 --- a/share/github-backup-utils/ghe-restore-mysql +++ b/share/github-backup-utils/ghe-restore-mysql @@ -28,11 +28,6 @@ ghe_remote_version_required "$GHE_HOSTNAME" # The directory holding the snapshot to restore snapshot_dir="$GHE_DATA_DIR/$GHE_RESTORE_SNAPSHOT" -cleanup() { - ghe-ssh "$GHE_HOSTNAME" -- "sudo rm -rf $GHE_REMOTE_DATA_USER_DIR/tmp/mysql.sql.gz" -} -trap 'cleanup' INT TERM EXIT - # Check if the backup is binary by looking up the sentinel file is_binary_backup(){ test -f $snapshot_dir/mysql-binary-backup-sentinel @@ -43,12 +38,33 @@ is_binary_backup_feature_on(){ ghe-ssh "$GHE_HOSTNAME" ghe-config --true "mysql.backup.binary" } +if ghe-ssh "$GHE_HOSTNAME" test -f /etc/github/cluster ; then + ghe_mysql_master=$(ghe-ssh "$GHE_HOSTNAME" ghe-config "cluster.mysql-master") + if [ -z $ghe_mysql_master ]; then + ghe_mysql_master=$GHE_HOSTNAME + else + port=$(ssh_port_part "$GHE_HOSTNAME") + ghe_mysql_master=$ghe_mysql_master${port:+:$port} + fi +else + ghe_mysql_master=$GHE_HOSTNAME +fi + if is_binary_backup_feature_on; then # Feature "mysql.backup.binary" is on, which means new backup scripts are available if is_binary_backup; then - IMPORT_MYSQL=ghe-import-mysql-xtrabackup + # Check if the decompress needed by looking into the sentinel file + # In 2.19.5 we compress the binary backup twice + if [ "$(cat $snapshot_dir/mysql-binary-backup-sentinel)" = "NO_ADDITIONAL_COMPRESSION" ]; then + IMPORT_MYSQL=ghe-import-mysql-xtrabackup + GHE_RESTORE_HOST=$ghe_mysql_master + else + IMPORT_MYSQL="unpigz | ghe-import-mysql-xtrabackup" + GHE_RESTORE_HOST=$ghe_mysql_master + fi else - IMPORT_MYSQL=ghe-import-mysql-mysqldump + IMPORT_MYSQL="unpigz | ghe-import-mysql-mysqldump" + GHE_RESTORE_HOST=$GHE_HOSTNAME fi else # We do not allow to restore binary backup without "mysql.backup.binary" set @@ -57,16 +73,22 @@ else exit 2 else # legacy mode - IMPORT_MYSQL=ghe-import-mysql + IMPORT_MYSQL="unpigz | ghe-import-mysql-mysqldump" + GHE_RESTORE_HOST=$GHE_HOSTNAME fi fi -ghe-ssh "$GHE_HOSTNAME" -- "sudo mkdir -p '$GHE_REMOTE_DATA_USER_DIR/tmp'" 1>&3 +cleanup() { + ghe-ssh "$GHE_RESTORE_HOST" -- "sudo rm -rf $GHE_REMOTE_DATA_USER_DIR/tmp/mysql.sql.gz" +} +trap 'cleanup' INT TERM EXIT + +ghe-ssh "$GHE_RESTORE_HOST" -- "sudo mkdir -p '$GHE_REMOTE_DATA_USER_DIR/tmp'" 1>&3 # Transfer MySQL data from the snapshot to the GitHub instance. -cat $snapshot_dir/mysql.sql.gz | ghe-ssh "$GHE_HOSTNAME" -- "sudo dd of=$GHE_REMOTE_DATA_USER_DIR/tmp/mysql.sql.gz >/dev/null 2>&1" +cat $snapshot_dir/mysql.sql.gz | ghe-ssh "$GHE_RESTORE_HOST" -- "sudo dd of=$GHE_REMOTE_DATA_USER_DIR/tmp/mysql.sql.gz >/dev/null 2>&1" # Import the database -echo "gunzip -cd $GHE_REMOTE_DATA_USER_DIR/tmp/mysql.sql.gz | $IMPORT_MYSQL" | ghe-ssh "$GHE_HOSTNAME" -- /bin/bash 1>&3 +echo "cat $GHE_REMOTE_DATA_USER_DIR/tmp/mysql.sql.gz | $IMPORT_MYSQL" | ghe-ssh "$GHE_RESTORE_HOST" -- /bin/bash 1>&3 bm_end "$(basename $0)"