有没有办法从第一代云sql迁移到第二代,只需要很少甚至没有停机时间?
将我的第一代数据库转储大约30分钟后,我将其设置为只读(意味着我的停机时间),我相信导入第二代也需要很长时间。
在升级过程中使用克隆以及升级完成时将差异复制到新数据库会怎么样?
我正在使用AppEngine,因此我正在考虑上传指向第二代数据库的新版本,而旧版本指向克隆。 升级完成后,我将更改版本并运行脚本以复制丢失的数据。
这可行吗?有更好的选择吗?
答案 0 :(得分:0)
我最终做了以下事情:
这是脚本:
#!/bin/sh
DB_IP=127.0.0.1
SQL_FILE_NAME=db-backup.sql
GZ_SQL_FILE_NAME=db-backup.sql.gz
BUCKET_NAME=gs://db-bucket-name
GS_FILE_PTH=$BUCKET_NAME/$GZ_SQL_FILE_NAME
INSTANCE_NAME=1st-gen-instance
NEW_INSTANCE_NAME=2nd-gen-instace
gcloud config set project project-name
gcloud sql instances patch $INSTANCE_NAME --database-flags read_only=on
mysqldump --databases dbname -h $DB_IP -u user --password=password \
--hex-blob --skip-triggers --set-gtid-purged=OFF \
--default-character-set=utf8 > $SQL_FILE_NAME
gzip $SQL_FILE_NAME
gsutil cp -r $GZ_SQL_FILE_NAME $GS_FILE_PTH
SERVICE_ACCOUNT_ADDRESS=$(gcloud sql instances describe $NEW_INSTANCE_NAME | sed -n -e 's/^.*serviceAccountEmailAddress: //p')
gsutil acl ch -u $SERVICE_ACCOUNT_ADDRESS:W $BUCKET_NAME
gsutil acl ch -u $SERVICE_ACCOUNT_ADDRESS:R $GS_FILE_PTH
gcloud sql instances import $NEW_INSTANCE_NAME $GS_FILE_PTH
gsutil acl ch -d $SERVICE_ACCOUNT_ADDRESS:W $BUCKET_NAME
gsutil acl ch -d $SERVICE_ACCOUNT_ADDRESS:R $GS_FILE_PTH