Google 云 sql 从第一代迁移到第二代,停机时间最少甚至没有
Google cloud sql migrate from first generation to second generation with minimal to no downtime
有没有一种方法可以从第一代云 sql 迁移到第二代,并且停机时间最短甚至没有停机时间?
在我将其设置为只读后转储我的第一代数据库大约需要 30 分钟(对我来说这意味着停机时间),我相信导入到第二代数据库也需要很长时间。
在升级过程中以及升级完成后将差异复制到新数据库时使用克隆怎么样?
我正在使用 AppEngine,所以我正在考虑上传指向第二代数据库的新版本,而旧版本指向克隆。
升级完成后,我将更改版本和 运行 一个脚本来复制丢失的数据。
可以吗?还有更好的选择吗?
我最后做了以下事情:
- 创建第 2 代实例
- 在计算引擎中创建一个临时机器
- 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
有没有一种方法可以从第一代云 sql 迁移到第二代,并且停机时间最短甚至没有停机时间?
在我将其设置为只读后转储我的第一代数据库大约需要 30 分钟(对我来说这意味着停机时间),我相信导入到第二代数据库也需要很长时间。
在升级过程中以及升级完成后将差异复制到新数据库时使用克隆怎么样?
我正在使用 AppEngine,所以我正在考虑上传指向第二代数据库的新版本,而旧版本指向克隆。 升级完成后,我将更改版本和 运行 一个脚本来复制丢失的数据。
可以吗?还有更好的选择吗?
我最后做了以下事情:
- 创建第 2 代实例
- 在计算引擎中创建一个临时机器
- 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