有没有一种方法可以从第一代云 SQL 迁移到第二代,并且停机时间最短甚至没有?
在我将第一代数据库设置为只读后,转储它大约需要 30 分钟(对我来说这意味着停机时间),我相信导入到第二代数据库也需要很长时间。
在升级过程中使用克隆以及升级完成后将差异复制到新数据库怎么样?
我正在使用 AppEngine,所以我正在考虑上传指向第二代数据库的新版本,而旧版本指向克隆。 升级完成后,我将更改版本并运行脚本来复制丢失的数据。
这行得通吗?还有更好的选择吗?
最佳答案
我最终做了以下事情:
- 创建第二代实例
- 在计算引擎中创建一个临时机器
- 通过 SSH 连接到临时机器并获取机器的 IP:https://askubuntu.com/questions/95910/command-for-determining-my-public-ip
- 在新旧数据库实例上授予对 IP 地址的访问权限
- 在第一代实例中设置用户和密码(在下面的脚本中输入)
- 上传新版本的应用引擎应用,配置为使用新的第二代数据库,但不要将其设置为默认版本
- 在 ssh 的临时机器上编辑并运行下面的脚本
- 脚本会要求确认只读标志
- 当脚本运行时,数据库将处于只读模式,导致您的应用程序停机
- 脚本成功完成后,将应用引擎的默认版本更改为指向使用新的第二代数据库的新版本
- 这给了我们 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
关于mysql - 谷歌云 sql 从第一代迁移到第二代,停机时间最少甚至没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41166472/