| #!/bin/bash |
| # Copyright 2016 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style |
| # license that can be found in the LICENSE file or at |
| # https://developers.google.com/open-source/licenses/bsd |
| |
| # The existing replicas all have this prefix: |
| REPLICA_PREFIX="replica" |
| |
| # The new replicas made from the restored primary will have this prefix: |
| NEW_REPLICA_PREFIX="replica-1" |
| |
| CLOUD_PROJECT="monorail-staging" |
| |
| DRY_RUN=true |
| |
| echo Restoring backups to primary for ${CLOUD_PROJECT}. Dry run: ${DRY_RUN} |
| echo This will delete all read replicas with the prefix "${REPLICA_PREFIX}" |
| echo and create a new set of replicas with the prefix "${NEW_REPLICA_PREFIX}" |
| echo |
| echo Checking for existing read replicas to delete: |
| |
| EXISTING_REPLICAS=($(gcloud sql instances list --project=${CLOUD_PROJECT} | grep ${REPLICA_PREFIX}- | awk '{print $1}')) |
| |
| if [ ${#EXISTING_REPLICAS[@]} -eq 0 ]; then |
| echo No replicas found with prefix ${REPLICA_PREFIX} |
| echo List instances to find the replica prefix by running: |
| echo gcloud sql instances list --project=${CLOUD_PROJECT} |
| exit 1 |
| fi |
| |
| echo Deleting ${#EXISTING_REPLICAS[@]} existing replicas found with the prefix ${REPLICA_PREFIX} |
| |
| for r in "${EXISTING_REPLICAS[@]}"; do |
| echo Deleting ${r} |
| cmd="gcloud sql instances delete ${r} --project=${CLOUD_PROJECT}" |
| echo ${cmd} |
| if [ ${DRY_RUN} == false ]; then |
| ${cmd} |
| fi |
| done |
| |
| echo Checking for available backups: |
| |
| DUE_TIMES=($(gcloud sql backups list --instance primary --project=${CLOUD_PROJECT} | grep SUCCESSFUL | awk '{print $1}')) |
| |
| for index in ${!DUE_TIMES[*]}; do |
| echo "[${index}] ${DUE_TIMES[${index}]}" |
| done |
| |
| echo "Choose one of the above due_time values." |
| echo "NOTE: selecting anything besides 0 will require you to manually" |
| echo "complete the rest of the restore process." |
| echo "Recover from date [0: ${DUE_TIMES[0]}]:" |
| read DUE_TIME_INDEX |
| |
| DUE_TIME=${DUE_TIMES[${DUE_TIME_INDEX}]} |
| |
| cmd="gcloud sql backups restore ${DUE_TIME} --project=${CLOUD_PROJECT} --restore-instance=primary" |
| echo ${cmd} |
| if [ ${DRY_RUN} == false ]; then |
| ${cmd} |
| fi |
| |
| if [ "${DUE_TIME_INDEX}" -ne "0" ]; then |
| echo "You've restored an older-than-latest backup. Please contact speckle-oncall@" |
| echo "to request an on-demand backup of the primary before attempting to restart replicas," |
| echo "which this script does not do automatically in this case." |
| echo "run 'gcloud sql instances create' commands to create new replicas manually after" |
| echo "you have confirmed with speckle-oncall@ the on-demand backup is complete." |
| echo "Exiting" |
| exit 0 |
| fi |
| |
| echo "Finding restore operation ID..." |
| |
| RESTORE_OP_IDS=($(gcloud sql operations list --instance=primary --project=${CLOUD_PROJECT} | grep RESTORE_VOLUME | awk '{print $1}')) |
| |
| # Assume the fist RESTORE_VOLUME is the operation we want; they're listed in reverse chronological order. |
| echo Waiting on restore operation ID: ${RESTORE_OP_IDS[0]} |
| |
| if [ ${DRY_RUN} == false ]; then |
| gcloud sql operations wait ${RESTORE_OP_IDS[0]} --project=${CLOUD_PROJECT} |
| fi |
| |
| echo Restore is finished on primary. Now create the new set of read replicas with the new name prefix ${NEW_REPLICA_PREFIX}: |
| |
| TIER=($(gcloud sql instances describe primary --project=${CLOUD_PROJECT} | grep tier | awk '{print $2}')) |
| |
| for i in {00..09}; do |
| cmd="gcloud sql instances create ${NEW_REPLICA_PREFIX}-${i} --master-instance-name=primary --project=${CLOUD_PROJECT} --tier=${TIER} --region=us-central1" |
| echo ${cmd} |
| if [ ${DRY_RUN} == false ]; then |
| ${cmd} |
| fi |
| done |
| |
| echo If the replica creation steps above did not succeed due to authentication |
| echo errors, you may need to retry them manually. |
| echo |
| echo |
| echo Backup restore is nearly complete. Check the instances page on developer console to see when |
| echo all of the replicas are "Runnable" status. Until then, you may encounter errors in issue search. |
| echo In the mean time: |
| echo - edit settings.py to change the db_replica_prefix variable to be "${NEW_REPLICA_PREFIX}-" |
| echo Then either "make deploy_prod" or "make deploy_staging" for search to pick up the new prefix. |
| echo Then set the newly deploy version for besearch and besearch2 on the dev console Versons page. |
| echo Follow-up: |
| echo - Submit the change. |
| echo - Delete old versions of besearch because they run up the GAE bill. |