教程:使用自动化工作流从 MySQL 迁移到 Cloud SQL

本教程介绍如何使用 Cloud SQL 自动化迁移工作流将 MySQL 5.7 数据库迁移到 Cloud SQL。它遵循配套文档从 MySQL 迁移到 Cloud SQL 中所述的外部副本提升策略。本教程假设您熟悉 MySQL 的概念,了解 Cloud SQL 的特点和功能,并已阅读概念文档

目标

  • 在 Compute Engine 上部署 MySQL 数据库,使其充当源数据库。
  • 确认是否满足所有 Cloud SQL 迁移前提条件。
  • 使用自动化迁移工作流创建 Cloud SQL 副本。
  • 确认副本数据库在 Cloud SQL 中运行。
  • 将 Cloud SQL 数据库从副本数据库提升为主数据库。
  • 更新应用以使用 Cloud SQL 数据库。
  • 确认主数据库在 Cloud SQL 中运行。

费用

本教程使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用量来估算费用。 Google Cloud 新用户可能有资格申请免费试用

准备工作

  1. 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到“项目选择器”

  3. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  4. 启用 Compute Engine and Cloud SQL API。

    启用 API

架构

您构建的初始架构具有一个基于 MySQL 的 WordPress 应用,该应用使用 Cloud Deployment Manager 进行部署并在 Compute Engine 上运行。虽然本教程使用 Compute Engine 运行源数据库,但您可以使用本教程中的过程从具有公共 IPv4 访问权限的任何位置迁移 MySQL 数据库。这包括本地环境、对接网点和云服务商位置。

首先,请创建一个在 Compute Engine 上运行的应用,该应用使用 MySQL 作为数据库,如下图所示:

启动数据库架构。

然后,您可以使用 mysqldump 命令将 MySQL 数据库复制到 Cloud SQL,如下图所示:

数据库复制架构。

之后,您需要将 Cloud SQL 副本数据库提升为主数据库,并更新应用以使用新的主数据库。迁移后,该架构会使用 Cloud SQL 上托管的数据库。下图显示了使用新 Cloud SQL 数据库的应用:

已迁移的数据库架构。

在 Compute Engine 上部署源 MySQL 数据库

首先,您需要创建一个可迁移到 Cloud SQL 的源 MySQL 数据库。通过任何运行 5.6 或 5.7 版本的 MySQL 数据库,您都可以利用 Cloud SQL 自动化迁移工作流。

使用 Deployment Manager 部署 WordPress

要简化源数据库的部署过程,您需要使用 Google Cloud Marketplace 一键部署解决方案中的 WordPress 安装。WordPress 是一种使用 MySQL 的常见网站创建和内容管理工具。Google Cloud 上提供的一键部署版本使用 MySQL 5.7,因此符合迁移到 Cloud SQL 的要求。

  1. 在 Cloud Console 中,转到 Google 一键部署页面:

    转到 Google 一键部署页面

  2. 点击 WordPress 解决方案。

  3. 点击启动

  4. 填写以下字段:

    1. 部署名称my-wordpress-server
    2. 区域us-east-1b
    3. 管理员电子邮件地址:输入您的电子邮件地址。
    4. 防火墙:确保同时选择了 HTTP 和 HTTPS 选项。
  5. 点击部署

    WordPress 虚拟机安装过程随即开始。几分钟后,Deployment Manager 会显示已部署的 WordPress 虚拟机的详细信息。保存所有这些信息,以便稍后在教程中使用,尤其是有关 MySQL root 用户以及 wordpress 用户名和密码的信息。

  6. 点击网址链接,验证您的 WordPress 网站是否正在运行。

    如果一切正常,您会看到如下输出:

    一键部署 WordPress 首页示例。

向 WordPress 服务器分配 API 范围

如果要在 Compute Engine 虚拟机上完成 WordPress 安装设置,您需要添加 API 范围权限。这样做可以让虚拟机将其数据库导出数据写入 Cloud Storage。Cloud Storage 中的导出数据稍后用于创建 Cloud SQL 副本。

  1. 打开 Cloud Shell:

    打开 Cloud Shell

  2. 关停 WordPress 虚拟机:

    gcloud compute instances stop my-wordpress-server-vm \
        --zone us-east1-b
    

    虚拟机必须处于关停状态,您才能通过 API 范围应用新权限。

    在继续下一步之前,请等待服务器完成关停操作。

  3. 应用新范围以允许虚拟机向 Cloud Storage 写入数据:

    gcloud beta compute instances set-scopes my-wordpress-server-vm \
        --scopes storage-rw \
        --zone us-east1-b
    
  4. 重启虚拟机:

    gcloud compute instances start my-wordpress-server-vm \
        --zone us-east1-b
    

您的虚拟机现可对 Cloud Storage 执行读写操作。

以 WordPress 管理员身份连接并创建帖子

下一步是连接到 WordPress 管理界面以创建新帖,并验证应用和数据库是否正常运行。停止并重启服务器后,您的 IP 地址可能已发生更改,因此您应该验证 WordPress 虚拟机的当前公共 IP 地址。

  1. 验证运行 WordPress 的虚拟机的公共 IP 地址:

    1. 在 Cloud Console 中,转到虚拟机实例页面:

      转到“虚拟机实例”页面

    2. 记下 my-wordpress-server-vm.外部 IP

  2. 验证 WordPress 应用是否正在运行。使用您刚刚获得的外部 IP 地址,通过浏览器转到 WordPress 虚拟机的公共 IP 地址:

    http://your-public-ip
    

    如果 IP 地址正确无误,您会再次看到默认的 WordPress 页面。

  3. 在浏览器中,转到 WordPress 的“管理”页面:

    http://your-public-ip/wp-admin
    
  4. 使用 WordPress 管理员用户和 WordPress 管理员密码登录管理界面。

  5. 点击帖子,然后点击新增

  6. 将帖子命名为 My First Post 并添加一些文字。

  7. 完成后,点击发布,然后再次点击发布进行确认:

    发布您的第一篇帖子。

  8. 点击网址链接,查看新帖。

现在,您已经拥有一个运行 MySQL 5.7 版数据库的 WordPress 虚拟机。

检查 Cloud SQL 迁移前提条件

您必须确保您已满足配置源数据库服务器的前提条件,才能使用自动化迁移工作流迁移到 Cloud SQL。以下各部分将引导您完成此过程,逐一完成各个前提条件。

使用 SSH 连接到虚拟机

您必须在运行 WordPress 的虚拟机上确认前提条件,因此请先连接到虚拟机实例。

  1. 在 Cloud Console 中,转到虚拟机实例页面:

    转到“虚拟机实例”页面

  2. 在虚拟机实例列表中,点击要连接的实例所在行中的 SSH

    使用 SSH 连接到 WordPress 虚拟机。

    Cloud Shell 会打开并授予您对虚拟机的命令行访问权限。

确认所有前提条件

您现已建立通向 WordPress 服务器的命令行连接,可以确保 MySQL 已准备好迁移。

创建复制用户

要支持复制数据库,请在 MySQL 中创建一个复制用户帐号。这样做是为了让您不必在后续步骤中使用 root 用户。

  1. 在 WordPress 虚拟机上,以 root 用户身份连接到 MySQL 数据库:

    mysql -u root -p -h localhost wordpress
    

    出现提示时,输入您之前在 Deployment Manager 中记下的 root 密码。

  2. 连接到 MySQL 数据库时,创建复制用户:

    CREATE USER 'replication'@'%' IDENTIFIED BY 'mysupersecretpassword';
    GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';
    

    您将看到如下所示的输出内容:

    mysql> CREATE USER 'replication'@'%' IDENTIFIED BY 'mysupersecretpassword';
    Query OK, 0 rows affected (0.00 sec)
    mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';
    Query OK, 0 rows affected (0.00 sec)
    
  3. 输入 quit 可退出 mysql 界面。

现在,您已有一个可由 Cloud SQL 自动化迁移工作流使用的复制用户。

更新 MySQL 配置文件

您需要在 MySQL 配置文件中设置四个变量。配置文件位于 /etc/mysql/mysql.conf.d/mysqld.cnf。您需要添加以下值:

  • server-id。必须设置此值才能启用二进制日志。该值必须介于 1 和 (2^32)-1 (4,294,967,295) 之间,且对每个服务器来说必须唯一。在本教程中,您将值设置为 2
  • log-bin。此设置可启用二进制日志,并指明数据库将使用哪个文件名来存储日志。在本教程中,您将值设置为 mysql-bin
  • gtid_mode。此设置允许使用全局事务标识符 (GTID) 来标识事务。此设置还需要包含下一个命令才能正常运作。在本教程中,您将值设置为 on
  • enforce-gtid-consistency。此设置通过仅允许使用 GTID 记录的语句来实现 GTID 一致性。在本教程中,您将值设置为 true

以下步骤介绍了如何为所有四个 MySQL 变量设置值。

  1. 在 WordPress 虚拟机的终端窗口中,设置之前所述的 mysqld.cnf 配置:

    sudo -s
    echo "server-id = 2" >> /etc/mysql/mysql.conf.d/mysqld.cnf
    echo "log-bin = mysql-bin" >> /etc/mysql/mysql.conf.d/mysqld.cnf
    echo "gtid_mode = ON" >> /etc/mysql/mysql.conf.d/mysqld.cnf
    echo "enforce-gtid-consistency = true" >> /etc/mysql/mysql.conf.d/mysqld.cnf
    exit
    
  2. 重启 MySQL 服务器,使命令生效:

    sudo service mysql restart
    
  3. 重新登录 mysql 界面:

    mysql -u root -p -h localhost wordpress
    
  4. 验证重启后是否正确设置了所有变量:

    SELECT @@gtid_mode, @@enforce_gtid_consistency, @@server_id;
    

    您将看到以下输出内容:

    mysql> select @@gtid_mode, @@enforce_gtid_consistency, @@server_id;
    +-------------+----------------------------+-------------+
    | @@gtid_mode | @@enforce_gtid_consistency | @@server_id |
    +-------------+----------------------------+-------------+
    | ON          | ON                         |           2 |
    +-------------+----------------------------+-------------+
    1 row in set (0.00 sec)
    
  5. 输入 quit 以关闭 mysql 界面。

启用对数据库的 IPv4 访问

要使用 Cloud SQL 自动化迁移工作流,您的源数据库必须可通过公共 IPv4 地址访问。由于 WordPress 服务器具有自动分配的公共 IP 地址,因此您可以使用 VPC 防火墙规则允许此连接。

  1. 在 Cloud Shell 中,向您的 WordPress 虚拟机添加新的网络标记:

    gcloud compute instances add-tags my-wordpress-server-vm \
        --tags allowmysql \
        --zone us-east1-b
    
  2. 允许 MySQL 网络流量从公共互联网传入您的虚拟机:

    gcloud compute firewall-rules create "mysql-replication-access" \
        --allow tcp:3306 \
        --target-tags "allowmysql"
    

现在,您已有一条允许端口 3306 上的 MySQL 流量从公共互联网传入 WordPress 虚拟机的防火墙规则。

您可以通过多种方式管理和保护生产数据库。请务必与您的网络和安全管理员联系,以协调使用自动化迁移工作流迁移任何生产数据库的必需访问权限。

一键部署 WordPress 服务器可允许本地网络服务器访问本地数据库。由于您希望通过允许其他数据库连接支持您的迁移,因此需要更新 mysqld.cnf 文件中的 MySQL bind_address 条目以侦听 localhost 以外的端口。

  1. 在 WordPress 虚拟机的终端窗口中,将 MySQL bind_address 值更改为 0.0.0.0

    sudo sed -i 's|bind-address.*|bind-address = 0.0.0.0|' /etc/mysql/mysql.conf.d/mysqld.cnf
    

    这将允许所有可用网络接口上的 MySQL 连接。

  2. 重启 MySQL 数据库,使更改生效:

    sudo service mysql restart
    

创建数据库备份文件

接下来,您需要创建数据库备份文件,以从 Cloud SQL 创建副本。为此,请使用 MySQL mysqldump 命令。

基本数据验证

在创建备份之前,您应该验证 WordPress 数据库中的帖数。这是一种验证是否已成功备份内容的方法。

  1. 使用 SSH 连接到您的 WordPress 服务器。
  2. 计算 wp_posts 表中的行数:

    mysql -u root -p -D wordpress -e "SELECT count(*) from wp_posts"
    

    您将看到类似如下所示的输出:

    SELECT count(*) from wp_posts;
    +----------+
    | count(*) |
    +----------+
    |        6 |
    +----------+
    1 row in set (0.01 sec)
    

现在,您已知道表中的起始行数。

创建数据库备份并将其上传到 Cloud Storage

下一个任务是将备份过程的结果复制到 Cloud Storage 存储分区。

  1. 在 Cloud Shell 中,创建新的 Cloud Storage 存储分区以保存数据库备份:

    gsutil mb gs://${DEVSHELL_PROJECT_ID}-mysqldump/
    

    这将为您的项目创建一个采用唯一名称(基于 Google Cloud 项目 ID)的存储分区,用于存储 mysqldump 文件。

  2. 在 Cloud Console 中,转到虚拟机实例页面:

    转到“虚拟机实例”页面

  3. 在虚拟机实例列表中,点击 WordPress 服务器行中的 SSH 以连接到虚拟机:

    使用 SSH 连接到 WordPress 虚拟机。

  4. 在 WordPress 虚拟机的终端窗口中,创建名为 mybackup1.sql 的备份:

    sudo mysqldump \
        -h localhost -P 3306 -u root -p \
        --databases wordpress \
        --hex-blob --skip-triggers --master-data=1 \
        --order-by-primary --compact --no-autocommit \
        --default-character-set=utf8 \
        --single-transaction --set-gtid-purged=on > mybackup1.sql
    
  5. 输入 MySQL root 密码。

  6. mybackup1.sql 文件复制到您的 Cloud Storage 存储分区:

    sudo gsutil cp ./mybackup1.sql gs://[your_project_name]-mysqldump
    

    您将看到如下所示的输出内容:

    Copying file://./mybackup1.sql [Content-Type=application/x-sql]...
    / [1 files][510.4 KiB/510.4 KiB]
    Operation completed over 1 objects/510.4 KiB.
    

    您现在已将备份文件上传到 Cloud Storage。

使用自动化迁移工作流创建 Cloud SQL 外部副本

现在,您知道了数据库中的行数,并且已有数据库的完整备份,接下来就可以使用自动化迁移工作流在 Cloud SQL 上创建副本数据库了。

  1. 在 Cloud Console 中,转到 Cloud SQL 页面:

    转到 Cloud SQL 页面

  2. 点击迁移数据

  3. 点击开始迁移

  4. 数据源详细信息部分,提供以下值:

    • 数据源名称:源数据库的名称。使用 mywordpress
    • 源的公共 IP 地址:WordPress 虚拟机的外部 IP 地址。在 Deployment Manager 创建服务器时您已获得此值。
    • 源的端口号3306
    • MySQL 复制用户名replication
    • MySQL 复制用户密码mysupersecretpassword
    • 数据库版本5.7
  5. 点击下一步

  6. Cloud SQL 只读副本创建部分,提供以下值:

    • 只读副本实例 ID:Cloud SQL 服务实例的名称。请使用名称 mywordpress-cloudsql
    • 位置:WordPress 虚拟机的创建地区和区域。在本教程中,请使用 us-east1-b
    • 存储类型SSD
    • 存储空间容量10 GB
    • 启用存储空间自动扩容功能:确保已启用此选项。
    • SQL 转储文件:点击浏览并选择您之前创建的存储分区和 mysqldump 文件。
  7. 点击高级设置

  8. 点击 + 添加网络,然后执行以下操作:

    • 将网络命名为 external
    • 网络下,输入 0.0.0.0/0
    • 点击完成

    通过添加 0.0.0.0/0,可以允许公开访问您的外部副本。

  9. 数据库标志下,点击 + 添加一项

  10. 选择标志列表中,执行以下操作:

    1. 选择 sql_mode
    2. 在右侧显示的下拉列表中,选择 ALLOW_INVALID_DATES

    要将 WordPress 数据库迁移到 Cloud SQL,必须使用 sql_mode 标志。

  11. 点击创建

    系统会在后台创建实例。

  12. 数据同步部分,记下传出 IP 地址字段的值。

    您可能需要几分钟时间才能填完此字段。但是,如果您有 IP 地址,则 Cloud SQL 实例已创建。

  13. 点击下一步

  14. 点击完成

自动化迁移工作流开始将数据从 WordPress 虚拟机上的源数据库复制到 Cloud SQL 副本数据库。此过程可能需要一段时间,具体取决于数据库大小、源和目标之间的距离以及主数据库和副本数据库的可用 IOPS。在本例中,您的数据库较小,因此此过程很快。

几分钟后,您会看到数据库名称旁边的一个绿色对勾标记,这表示已启用复制功能。点击您的新数据库,您还会看到已启用复制消息。

控制台会显示已启用复制功能。

这将验证 Cloud SQL 复制操作已成功。

在副本数据库上创建 MySQL 用户帐号

当您将单个数据库作为 MySQL 服务器的一部分迁移时,迁移过程不会迁移数据库本身的用户帐号。为了限制对用户和应用的更改,您应该在 Cloud SQL 副本数据库上重新创建关键帐号。

  1. 在 Cloud Shell 中,重置 Cloud SQL 数据库上的根用户帐号,使用与 WordPress 主数据库相同的根密码。

    gcloud sql users set-password root --host=% \
        --instance=mywordpress-cloudsql \
        --password=primary-root-password
    
  2. 使用与 WordPress 主数据库中的用户名和密码匹配的用户名和密码创建一个 wordpress 用户帐号。

    gcloud sql users create wordpress --host=% \
        --instance=mywordpress-cloudsql \
         --password=your-wordpress-db-password
    

确认副本数据库在 Cloud SQL 中运行

现在您已启用 Cloud SQL 复制,接下来应该验证数据复制。要验证数据复制情况,需要连接到新的 Cloud SQL 数据库,然后使用新内容更新 WordPress 主数据库。如果复制正常,您将看到 Cloud SQL 副本中已更新的数据。

Cloud SQL 中的基本数据验证

以下步骤演示了如何连接到 Cloud SQL 副本数据库。

  1. 在 Cloud Console 中,转到 Cloud SQL 页面。

    转到 Cloud SQL 页面

  2. 点击副本数据库,打开实例详情页面。

  3. 连接到此实例下,点击使用 Cloud Shell 连接

    这将打开 Cloud Shell 并自动将连接 IP 地址添加到防火墙。

  4. ENTER 执行该命令。

  5. 当系统提示您输入密码时,请输入数据库的根用户密码。

    这将建立 MySQL 与 Cloud SQL 副本的连接。

  6. 选择数据库:

    USE wordpress
    
  7. 运行查询以计算数据库 wp_posts 表中的行数:

    SELECT count(*) from wp_posts;
    

    输出与先前输出的行数相匹配:

    mysql> SELECT count(*) from wp_posts;
    +----------+
    | count(*) |
    +----------+
    |        6 |
    +----------+
    1 row in set (0.01 sec)
    

    这可确认在数据库创建期间复制已成功完成。

让此 Cloud Shell 会话保持打开状态,您在后续步骤中需要用到它。

创建新的数据库内容

您现在可以创建一个新的 WordPress 帖子,以向数据库添加上下文。这样就可以验证是否正在将新数据复制到 Cloud SQL。

  1. 在浏览器中,转到 WordPress 实例的“管理”页面:

    http://your-public-ip/wp-admin
    
  2. 使用 WordPress 管理员用户和 WordPress 管理员密码登录管理界面。

  3. 点击帖子,然后点击新增

  4. 将帖子命名为 My Second Post 并添加一些文字。

  5. 点击发布,然后点击发布进行确认:

    发布您的第二篇帖子。

  6. 点击网址链接,查看新帖。

验证主数据库和副本数据库中的行数是否增加

现在,您可以验证主数据库和副本数据库中都已添加了数据。

  1. 使用 SSH 连接到 WordPress 虚拟机。
  2. 运行查询,以计算 wp_posts 表中的行数:

    mysql -u root -p -D wordpress -e "SELECT count(*) from wp_posts"
    

    您将看到如下所示的输出内容:

    SELECT count(*) from wp_posts;
    +----------+
    | count(*) |
    +----------+
    |        8 |
    +----------+
    1 row in set (0.01 sec)
    

    请注意,主数据库上的数据行数已增加。

  3. 打开连接到 Cloud SQL 副本数据库的 Cloud Shell 会话。

  4. 运行查询以计算副本 wp_posts 表中的行数:

    SELECT count(*) from wp_posts;
    

    您将看到如下所示的输出内容:

    Mysql [wordpress]> SELECT count(*) from wp_posts;
    +----------+
    | count(*) |
    +----------+
    |        8 |
    +----------+
    1 row in set (0.01 sec)
    

    如果此输出在原始数据库表和副本数据库表中显示的行数相同,则表示在向数据库添加新内容时复制操作已成功。

将 Cloud SQL 数据库从副本数据库提升为主数据库

现在,您的副本数据库正在 Cloud SQL 中运行并且您已验证复制操作,接下来可以将副本数据库提升为主数据库并完成数据库到 Cloud SQL 的迁移。

停机时间注意事项

每次 MySQL 迁移都会导致一定的数据库停机时间。与自动化迁移工作流相关的停机时间很短,但仍会导致至少几分钟的停机时间。在开始迁移之前,请务必了解您的应用要求、服务等级目标和服务等级协议。

停止主数据库

第一步是停止在 WordPress 虚拟机上运行 MySQL 服务。这将停止对数据库的所有写入,并开始数据库及其连接的所有应用的停机时间段。

  1. 在 WordPress 虚拟机的终端窗口中,停止 MySQL 数据库:

    sudo service mysql stop
    

    您的 MySQL 主数据库现已离线。

  2. 在浏览器中,转到 WordPress 网站:

    现在,您将看到一条确认应用离线的错误消息:

    建立数据库连接时出错。

更新应用端点

在主数据库停止后,您需要更新应用才能使用 Cloud SQL 服务器。此操作可以让您在将副本数据库提升为主数据库之前,确认应用与 Cloud SQL 数据库之间的基本连接。

WordPress 有一个简单的配置文件,您需要更新该文件才能将应用指向 Cloud SQL 副本数据库。

  1. 在 Cloud Console 中,转到 Cloud SQL 页面。

    转到 Cloud SQL 页面

  2. 点击副本数据库,打开实例详情页面。

  3. 复制公共 IP 地址。

  4. 使用 SSH 连接到您的 WordPress 虚拟机。

  5. 在实例的终端中,更新配置文件中目标数据库的地址。将 your-cloud-sql-ip 替换为 Cloud SQL 副本数据库的公共 IP 地址。

    sudo sed -i -e 's/localhost/your-cloud-sql-ip/' /var/www/html/wp-config.php
    

提升副本数据库

您现在已更新应用代码,以支持新的 Cloud SQL 数据库位置。现在,您需要将 Cloud SQL 副本数据库提升为主数据库。将 Cloud SQL 副本数据库提升为主数据库,完成 MySQL 数据库到 Cloud SQL 的迁移

  1. 在 Cloud Console 中,转到 Cloud SQL 页面。

    转到 Cloud SQL 页面

  2. 点击副本数据库,打开实例详情页面。

  3. 点击提升副本数据库按钮:

    将副本数据库提升为主数据库。

  4. 点击确定,开始提升数据库。

几分钟后,数据库将在 Cloud SQL 实例页面中显示为可用。此时,您可以浏览到您的 WordPress 网站,查看该网站是否已恢复在线状态。

清除数据

为避免因本教程中使用的资源导致您的 Google Cloud 帐号产生费用,请执行以下操作。

删除项目

  1. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤