有没有一种方法可以从第一代云SQL迁移到第二代,而没有停机时间?
倾倒我的第一代DB在我设置为仅阅读(对我来说意味着停机时间)之后,大约需要30个割草机,我相信将导入到第二代也将花费很长时间。
在进行升级时使用克隆又如何使用克隆,升级完成时,将差异复制到新的DB?
我正在使用附录,所以我正在考虑上传一个新版本,该版本指向第二代db时,旧版本指向克隆。升级完成后,我将更改版本并运行一个脚本以复制丢失的数据。
那可以起作用吗?有更好的选择吗?
我最终做了以下操作:
- 创建第二代实例
- 在计算引擎中创建临时机器
- ssh到达温度机并获取机器的IP:https://askubuntu.com/questions/95910/command-for-determining-my-public-ip-ip
- 在新的和旧的DB实例上访问IP地址
- 设置用户和密码在第一代实例中(在下面的脚本中输入)
- 上传您的应用引擎应用程序的新版本,该应用程序配置为使用新的第二代DB,但不要将其设置为默认版本
- 编辑&在ssh 的临时计算机中运行下面的脚本
- 脚本将要求仅确认读取标志
- 脚本运行时,DB将仅在读取模式下,为您的应用程序造成停机时间
- 脚本完成后,成功更改App Engine的默认版本,以指向使用新版本的新版本,该版本使用了新的第二代DB
- 这给了我们15分钟的停机时间
这是脚本:
#!/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