AWS 提供了数据库迁移的服务,叫做 Database Migration Service ( DMS)。 通过这个服务,我们可以实现同样平台的迁移,例如 MySQL 到 MySQL,或者不同平台的迁移,比如 MS SQL 到 Aurora。前者可以直接迁移,后者则需要使用 Schema Converter Tool (SCT)对 Schema进行 转换才能迁移。当然,如果数据库本身很小,那么可能直接手动拷贝的效率会更高了。

AWS 迁移MSSQL 数据库到 Aurora_第1张图片

下面看一个简单的demo。

豆子打算创建一个RDS的 MSSQL 数据库,一个 RDS的 Aurora 数据库。在MSSQL上我会创建一个sample的数据库,然后通过 SCT 进行 Schema 转换,然后通过 DMS 进行数据库的同步迁移。

下面看看具体操作

首先创建 RDS MSSQL 数据库

进入 AWS RDS
AWS 迁移MSSQL 数据库到 Aurora_第2张图片

新建一个 MSSQL 数据库,注意我选择的类型是 SQL Server Standard Edition。DMS不支持 Express版本的迁移。

AWS 迁移MSSQL 数据库到 Aurora_第3张图片

数据库Instance的名字和密码

AWS 迁移MSSQL 数据库到 Aurora_第4张图片

测试的服务器不需要太好,最便宜的就行
AWS 迁移MSSQL 数据库到 Aurora_第5张图片

选择VPC (这里有个坑稍后我会提到)

AWS 迁移MSSQL 数据库到 Aurora_第6张图片

重点,注意看他的价格,一个月要768 美元!!

AWS 迁移MSSQL 数据库到 Aurora_第7张图片

这个是通过下面的价格算出来的。新手做这个实验大概要2个小时左右,两台服务器大概开支会在5刀左右,所以做完了实验一定要记得删除自己的数据库!!

AWS 迁移MSSQL 数据库到 Aurora_第8张图片

数据库创建中

AWS 迁移MSSQL 数据库到 Aurora_第9张图片

我顺便创建了一个安全组,允许我自己的机器访问1433和3306端口 。(目前为止没问题,但是这是第二个坑,后面会有问题)

AWS 迁移MSSQL 数据库到 Aurora_第10张图片

按照上面的操作步骤,我又创建了一个 Aurara的数据库,他会自动创建一个cluster,然后把你新建的成员放在里面(即使只有一个)

最后我的两个RDS的Instance就创建好了。demo1 是 MSSQL,做为我的source,demo2是Aurora,作为destination
AWS 迁移MSSQL 数据库到 Aurora_第11张图片

创建好了以后,我需要生成一些测试用的table和数据。 首先看看 MSSQL的 Endpoint
AWS 迁移MSSQL 数据库到 Aurora_第12张图片

在我的本地电脑上通过MSSQL Management 工具连接。理论上,这一步应该很简单,如果我的安全组策略正确的话。这里我遇见了第一个坑。我的本地电脑网络和AWS VPC直接是 S2S 的连接,然后AWS认为我的计算机属于内网,他很智能地把他的域名解析为内部IP。第一次我测试的时候是把RDS配置在另外一个不同的VPC里面,我的计算机和这个VPC的网络之间并没有路由,也没有配置Gateway,内网访问是不通的,尽管他有一个公网IP,但是AWS自动给我解析为内网IP之后,我的路由会找不到对应的路径导致我始终无法访问。最后我只能重建RDS,然后确保他在的VPC和我的计算机网络之间存在了S2S连接关系。

连接之后,执行SQL脚本,他会创建一堆表,并插入一些测试数据

AWS 迁移MSSQL 数据库到 Aurora_第13张图片

下载安装 Schema Conversion Tool

下一步我们需要在我的电脑上安装 SCT 工具。
在下面的连接上下载SCI,MSSQL 的 JDBC 以及 MySQL的 JDBC

https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Installing.html

然后打开SCT,选择新建一个项目

AWS 迁移MSSQL 数据库到 Aurora_第14张图片

分别连接 MSSQL 和 Aurora
AWS 迁移MSSQL 数据库到 Aurora

AWS 迁移MSSQL 数据库到 Aurora_第15张图片

连接成功
AWS 迁移MSSQL 数据库到 Aurora_第16张图片

勾选我们要迁移的数据库,之后在Action 选择 Create Report

AWS 迁移MSSQL 数据库到 Aurora_第17张图片

他会扫描你的 MSSQL 数据库进行评估是否可以转换。

下面是生成的报告

AWS 迁移MSSQL 数据库到 Aurora_第18张图片

下一步就是进行Schema的转换

AWS 迁移MSSQL 数据库到 Aurora_第19张图片

几秒之后 可以看见Schema已经在Aurora这边生成了

AWS 迁移MSSQL 数据库到 Aurora_第20张图片

配置DMS

登录AWS 控制台 , 选择 Database Migration Service。这里我需要创建一个用来同步的Instance,类似EC2实例,但是由AWS来管理,创建Source Endpoint和 Destination Endpoint,最后创建一个任务来同步。

首先来创建一个 replication instance

AWS 迁移MSSQL 数据库到 Aurora_第21张图片

注意他所选择的VPC Secuirty Group 是我之前创建的,这里其实是有问题的
AWS 迁移MSSQL 数据库到 Aurora_第22张图片

创建完成之后 我们来继续创建Endpoint。

AWS 迁移MSSQL 数据库到 Aurora_第23张图片

Endpoint 创建完之后一定要测试 Connection。
AWS 迁移MSSQL 数据库到 Aurora_第24张图片

创建之后的样子

AWS 迁移MSSQL 数据库到 Aurora_第25张图片

创建好了之后来测试一下,不通!!

AWS 迁移MSSQL 数据库到 Aurora_第26张图片

我在这里卡了至少1个小时。最后发现有3个坑在这里。

首先,我之前配置这个SG的时候,只允许了我本地的机器访问,我的DMS的服务器是不行的,因此这里我们需要把这个DMS的内网IP也加进去;

第二:SG的outbound rule默认是所有都打开的,我无意中进行了限制,因此需要确认outbound rule是放行的

第三:我有一个NACL在这个公网subnet上,因此我还得在NACL上面放行

AWS 迁移MSSQL 数据库到 Aurora_第27张图片

修改我的SG inbound rule 和 outbound rule

AWS 迁移MSSQL 数据库到 Aurora_第28张图片

修改我的NACL

AWS 迁移MSSQL 数据库到 Aurora_第29张图片

再测试一下连接成功

AWS 迁移MSSQL 数据库到 Aurora_第30张图片

最后,我们来创建一个任务进行同步

AWS 迁移MSSQL 数据库到 Aurora_第31张图片

添加一个 selection rule

AWS 迁移MSSQL 数据库到 Aurora_第32张图片

等待2 分钟之后 进度条显示成功

AWS 迁移MSSQL 数据库到 Aurora_第33张图片

MSSQL Management 工具 连接 进入查询一下数据
AWS 迁移MSSQL 数据库到 Aurora_第34张图片

MySQL workbench 连接进入查询一下 数据一致,迁移成功
AWS 迁移MSSQL 数据库到 Aurora_第35张图片