Mysql 谷歌云sql从第一代迁移到第二代,停机时间最少甚至没有

Mysql 谷歌云sql从第一代迁移到第二代,停机时间最少甚至没有,mysql,google-app-engine,google-cloud-platform,google-cloud-sql,Mysql,Google App Engine,Google Cloud Platform,Google Cloud Sql,有没有一种方法可以将第一代云sql迁移到第二代,而停机时间最少甚至没有 在我将第一代数据库设置为只读(这意味着停机)后,转储它大约需要30分钟,我相信导入第二代数据库也需要很长时间 在升级过程中以及升级完成后使用克隆如何将差异复制到新数据库 我正在使用AppEngine,所以我想上传一个指向第二代数据库的新版本,而旧版本指向克隆。 升级完成后,我将更改版本并运行脚本来复制丢失的数据 那行吗?有更好的选择吗?我最后做了以下几点: 创建第二代实例 在计算引擎中创建临时计算机 Ssh到临时机器并获取机

有没有一种方法可以将第一代云sql迁移到第二代,而停机时间最少甚至没有

在我将第一代数据库设置为只读(这意味着停机)后,转储它大约需要30分钟,我相信导入第二代数据库也需要很长时间

在升级过程中以及升级完成后使用克隆如何将差异复制到新数据库

我正在使用AppEngine,所以我想上传一个指向第二代数据库的新版本,而旧版本指向克隆。 升级完成后,我将更改版本并运行脚本来复制丢失的数据


那行吗?有更好的选择吗?

我最后做了以下几点:

  • 创建第二代实例
  • 在计算引擎中创建临时计算机
  • Ssh到临时机器并获取机器的IP:
  • 授予对新数据库实例和旧数据库实例上的IP地址的访问权限
  • 在第1代实例中设置用户和密码(在下面的脚本中输入)
  • 上载配置为使用新的第二代DB的应用程序引擎应用程序的新版本,但不要将其设置为默认版本
  • 在ssh中的临时计算机中编辑并运行下面的脚本
  • 脚本将要求确认只读标志
  • 脚本运行时,数据库将处于只读模式,导致应用程序停机
  • 脚本成功完成后,将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
    

    我最后做了以下几件事:

  • 创建第二代实例
  • 在计算引擎中创建临时计算机
  • Ssh到临时机器并获取机器的IP:
  • 授予对新数据库实例和旧数据库实例上的IP地址的访问权限
  • 在第1代实例中设置用户和密码(在下面的脚本中输入)
  • 上载配置为使用新的第二代DB的应用程序引擎应用程序的新版本,但不要将其设置为默认版本
  • 在ssh中的临时计算机中编辑并运行下面的脚本
  • 脚本将要求确认只读标志
  • 脚本运行时,数据库将处于只读模式,导致应用程序停机
  • 脚本成功完成后,将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
    

    如果您使用Cloud SQL的导出数据操作转储第一代数据库数据,Cloud SQL将使用mysqldump
    --single transaction
    标志,因此您可能不需要将数据库设置为只读,并且您应该获得数据的一致视图。此外,第二代的性能更好,因此可能是导入速度更快,您应该在之前测试。感谢您的回答。文档中说:
    您必须使用mysqldump来执行导出。您无法使用谷歌云平台控制台提供的导出
    ,因此不可能。这里是链接:如果您使用Cloud SQL的导出数据操作转储第一代数据库数据,Cloud SQL它使用mysqldump
    --single transaction
    标志,因此您可能不需要将数据库设置为只读,您应该获得数据的一致视图。此外,第二代的性能更好,因此可能是导入速度更快,您应该在之前测试。感谢您的回答。文档中说:
    您必须使用mysqldump来执行导出。您无法使用谷歌云平台控制台提供的导出
    ,因此不可能。以下是链接: