将MySQL数据库迁移到新版本和云提供商
#database #mysql #aiven #googlecloud

作为广泛使用的开源关系数据库管理系统(RDBMS),MySQL在存储和检索生产中各种应用的数据中起着至关重要的作用。但是,由于潜在的数据丢失,意外的停机时间,技术复杂性或兼容性问题,将MySQL数据库迁移到新服务器或MySQL的不同版本可能是一项艰巨的任务。

在本教程中,我们将迁移一个MySQL数据库从较旧版本迁移到较新版本,并将其迁移到云提供商中。我们将介绍执行此操作所需的常见步骤和配置。

数据库迁移的(隐藏)挑战

数据库迁移是一个复杂而具有挑战性的过程,需要仔细的计划和执行,以确保其正确完成,并且没有任何数据丢失,停机时间或安全风险。这是相关的五个挑战:

  1. 数据丢失:如果未正确执行迁移过程,则可能导致数据丢失,这可能会对依赖数据库的组织产生严重的后果。

  2. 停机时间:在迁移过程中,数据库可能在一段时间内无法使用,这可能会导致应用程序的停机时间。这可能会影响用户体验并造成依赖应用程序的企业的财务损失。

  3. 技术复杂性:迁移数据库需要技术专业知识,它涉及几个复杂的任务,例如创建备份,还原数据库和更新应用程序的配置。

  4. 兼容性问题:迁移到其他系统或平台时,可能与应用程序的当前代码库存在兼容性问题,在迁移可以成功完成之前,可能需要解决这些问题。

  5. 安全风险:迁移数据库也可以引入安全风险,如果无法正确完成,这可能会损害敏感数据的完整性和机密性。

MySQL数据库迁移的类型

您可以使用快照或逻辑复制来迁移MySQL数据库。快照方法对数据库进行了备份并将其还原到目标服务器,逻辑复制将此步骤进一步,并实时复制单个交易。

快照可以更快地用于初始同步,资源密集型较低,更易于设置。但是,它需要更大的停机时间,尤其是对于较大的服务器。

另一方面,

逻辑复制是一种强大的技术,用于复制数据库之间的更改并确保高可用性。尽管它提供了对数据复制的颗粒状控制,但它可能不是大规模或复杂数据库迁移的最佳选择。迁移过程通常需要完整的数据传输,并且逻辑复制可能无法提供与其他方法相同的效率。但是,在迁移过程中需要最小化的操作中的情况下,逻辑复制可以提供允许持续复制交易的优势。

总体而言,尽管快照对于某些方案(例如一次性迁移或灾难恢复设置)有用,但逻辑​​复制可能是持续复制和数据库迁移的更好选择,由于其效率,灵活性和对操作的影响最小。值得注意的是,Aiven平台提供了一个内置数据库迁移工具,该工具使用逻辑复制来在MySQL实例之间迁移数据。

先决条件

要跟随,您需要:

步骤1:计划迁移

在本教程中,我们将将MySQL 5.7服务器迁移到MySQL 8.0服务器。在我的示例中,我们将使用Google Cloud SQL作为源,并将MySQL作为目标。我们将在Aiven控制台内使用内置迁移工具。如果您要迁移到其他提供商,请查看MySQL migration tool-开源工具。

这是您开始MySQL迁移之前要记住的7件事:

  1. 目标MySQL服务不应包含任何数据。
  2. 超级用户的权限必须在源数据库中可用。
  3. 两个数据库都应公开访问。
  4. 应更新或禁用防火墙。
  5. 应在源数据库上启用远程连接。
  6. 应在源数据库上启用GTID。
  7. 逻辑复制特权应在源数据库中授予。

步骤2:准备源数据库并创建备份

如果您已经有一个可用的源MySQL数据库,则可以使用它。如果没有,让我们创建一个新的MySQL数据库,并使用一些示例数据填充它。由于这是一个演示数据库,我们将跳过数据库备份的一部分。

从您的Google Cloud Console中,导航到云SQL ,然后单击创建实例。选择 mySQL ,使用版本5.7,沙盒作为环境以及您首选的云区域。我命名了此实例 Google-montreal-mysql57 ,但您可以根据自己的喜好命名。创建实例后,导航到实例的数据库部分,然后单击创建数据库。您可以命名此数据库 old-mysql57-db 。您还需要一个数据库用户。从用户选项卡中,单击添加用户帐户并创建一个新的数据库用户。请务必记下用户密码,因为您将无法再次查看此信息。我命名了此用户 test-dba-mysql

接下来,让我们连接到此数据库并添加一些示例数据。我将使用 gcloud CLI连接到Google Cloud SQL实例。

首先,您需要对GCLOUD CLI进行身份验证。您需要允许Google Cloud SDK访问您的Google Cloud帐户。

gcloud auth login

确保您使用的是正确的项目ID。您可以使用gcloud config set project PROJECT_ID进行切换,以防您在另一个项目中。

接下来,您将使用新创建的用户连接到Google Cloud SQL实例。请记住要修改实例名称或数据库用户名(如果您的情况有所不同)。

gcloud sql connect google-montreal-mysql57 --user=test-dba-mysql

Google Cloud允许您的IP允许使用输入连接5分钟。此时,您需要输入先前保存的数据库用户密码。连接到数据库实例后,选择预期的数据库。确保使用您选择的数据库名称。

USE OLD-MYSQL57-DB

现在,您可以在此数据库中添加一些示例数据。您可以自己生成本,或可以复制以下SQL语句:

-- Create the first table
CREATE TABLE customers (
  customer_id INTEGER PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  email VARCHAR(50) UNIQUE,
  phone VARCHAR(20),
  address VARCHAR(100)
);

-- Add sample data to the customers table
INSERT INTO customers (customer_id, name, email, phone, address)
VALUES
  (1, 'John Smith', 'john.smith@example.com', '555-1234', '123 Main St'),
  (2, 'Jane Doe', 'jane.doe@example.com', '555-5678', '456 Elm St'),
  (3, 'Bob Johnson', 'bob.johnson@example.com', '555-9012', '789 Oak St');

-- Create the second table
CREATE TABLE orders (
  order_id INTEGER PRIMARY KEY,
  customer_id INTEGER NOT NULL,
  order_date TIMESTAMP NOT NULL,
  total DECIMAL(10,2) NOT NULL,
  FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

-- Add sample data to the orders table
INSERT INTO orders (order_id, customer_id, order_date, total)
VALUES
  (1, 1, '2022-01-01 12:00:00', 50.00),
  (2, 2, '2022-01-02 14:30:00', 100.00),
  (3, 1, '2022-01-03 10:00:00', 25.00),
  (4, 3, '2022-01-04 16:45:00', 75.00);

-- Create the third table
CREATE TABLE products (
  product_id INTEGER PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  price DECIMAL(10,2) NOT NULL
);

-- Add sample data to the products table
INSERT INTO products (product_id, name, price)
VALUES
  (1, 'Widget', 10.00),
  (2, 'Gadget', 20.00),
  (3, 'Doohickey', 5.00);

此迁移的要求之一是应在源数据库上启用GTID。要检查是否启用GTID,请执行:

show global variables like 'gtid_mode';

如果gtid_modeON,则您的配置还可以。否则,您可能需要检查是否禁用了某些备份配置。

此时,您可以执行\q以断开数据库连接。

准备目标数据库

在我的情况下,目标数据库是针对MySQL运行版本8.0的。假设您已经拥有一个Aiven帐户,请导航到Aiven console,然后单击创建服务。选择 mysql 作为服务,选择您的首选云和区域,选择一个服务计划( hobbyist startup-4 将可以做到),然后给予您的MySQL服务名称。我为MySQL Service new-mysql80-db 命名了我的Aiven。单击创建服务,服务创建过程将通过重建 运行 state state。

一旦运行了 new-mysql80-db 服务,您可以从概述页面检查服务URI,主机名,端口和其他连接详细信息。如果已安装了 mySqlsh CLI工具,请确保您与MySQL的Aiven连接有效:

export NEW_DB_URI=YOUR_AIVEN_FOR_MYSQL_SERVICE_URI
mysqlsh --sql $NEW_DB_URI

如果连接成功,您可以执行ctrl+D以关闭连接。

记下 new-mysql80-db 服务的主机名。接下来,您需要它才能找到服务的IP地址。

步骤3:授权网络IP

默认情况下,Google Cloud SQL实例将所有传入的IP地址阻止到数据库实例。为了建立连接,您需要指定CIDR范围,以允许这些范围内的特定IP地址访问您的实例。由于您只需要从一个特定的IP地址(源数据库)连接,因此您可以将其IP地址添加到目标数据库的授权网络列表中。

但是,您只知道MySQL服务的AIND的主机名。使用您从上一节中注意到的主机名来查找MySQL服务AIND的IP地址。

要查找服务的IP地址,请从终端中ping主机名:

ping YOUR_HOSTNAME_HERE

响应将包含与此主机名相对应的IP地址。这是一个例子:

PING dewan-redis-demo-devrel-dewan.aivencloud.com (34.118.135.75): 56 data bytes
64 bytes from 34.118.135.75: icmp_seq=0 ttl=59 time=24.713 ms

在您的Google Cloud SQL实例上,导航到 Connections - > 网络选项卡,然后单击添加网络。使用A /32 CIDR表示法添加AINDER的IP地址。例如,如果IP地址为34.35.36.37,则您将在 network 字段中添加34.35.36.37/32。您可以选择给这个网络一个名称。完成后,点击保存

请记住,如果没有此步骤,某些源数据库可能不允许从目标数据库中传入网络连接。

注意

每当部署新节点时(向上/向下,维护,补丁等),您的MySQL服务的IP地址将更改。静态IP具有与之相关的额外费用,需要设置。

步骤4:启动数据库迁移

从您的MySQL服务概述选项卡中,单击设置迁移并按照这些步骤进行操作。第一步是阅读成功数据库迁移的准则。对于验证步骤,添加源数据库主机名或IP,端口号,数据库用户和密码。对于我的情况,我使用了Google Cloud SQL并使用了实例IP地址而不是主机名。

如果您在迁移的验证步骤中收到以下错误,则可能未授权目标数据库IP。

aiven_mysql_migrate.exceptions.EndpointConnectionException: Connection to source failed: (2003, "Can't connect to MySQL server on 'XX.XXX.XXX.XXX' (timed out)")

Google Cloud SQL还具有一个方便的工具,可以测试 Connections下的源和目标数据库之间的服务连接性 - > 连接测试

验证步骤成功,您可以开始开始迁移。当数据库迁移正在进行中时,以下是要牢记的事情:

  • 请勿写入任何目标数据库表
  • 请勿手动更改源数据库的复制或GTID配置
  • 避免任何可能破坏源和目标数据库之间连接的修改,例如更新防火墙或受信任的来源

步骤5:测试迁移的数据

让我们连接到目标数据库MySQL的Aiven。

mysqlsh --sql $NEW_DB_URI

确保选择 old-mysql57-db

use old-mysql57-db;

列出表以确保所有数据复制。

show tables;

您可以更进一步并检查每个表格以确保所有行正确复制。

步骤6:更新应用程序配置和重定向流量

迁移完成后,您将看到一条消息“恭喜,迁移完成!”。此时,请按照以下步骤:

  1. 停止写入来源数据库
  2. 更新连接设置
  3. 限制公共访问
  4. 关闭连接(单击关闭向导上的连接
  5. 重新启动所有应用程序

下一步

在本教程中,您了解了将MySQL数据库从Google Cloud SQL迁移到MySQL Aiven的。尽管示例数据库可能不像生产中的数据库那样大或复杂,但数据库迁移的基本概念仍然适用。

通常,数据库迁移似乎是一项艰巨的任务,但是有了正确的方法和工具,它可以平稳而有效地完成。通过遵循本教程中概述的最佳实践,您可以确保您的迁移成功,并且在整个过程中您的数据保持安全和安全。彻底测试并仔细监测迁移以最大程度地减少数据丢失或停机的风险很重要。此外,不要忘记更新应用程序的连接字符串并执行任何必要的配置更改,以确保无缝过渡到新数据库。

如果您有任何疑问,请随时在Aiven community forum中询问。

我们还建议以下文档:

如果您喜欢这个博客,let's connect