aws 提供了rds这样传统的关系型数据库,也提供了dynamodb这样的nosql 数据库。那么问题来了,如何把现有的数据库迁移到aws上呢?
当然,数据库本身就提供了备份和还原的功能,我们完全可以手动拷贝备份到对应的服务器上然后进行还原的操作。这种操作对于相同平台的数据库来说还是比较方便的,但是如果涉及到不同的数据库平台,那就比较麻烦了。
aws本身就提供了一个数据库迁移的服务,叫做 database migration service ( dms)。 通过这个服务,我们可以实现同类型迁移 (homogenous migration),例如 oracle 到 oracle,或者混杂迁移(heterogeneous migration) ,比如 oracle 到 ms sql。对于混杂迁移来说,我们需要使用 schema converter tool (sct)对 schema进行 转换才能迁移。
下面看一个简单的demo,如何把一个现有的microsoft sql 数据库转换到aws的 aurora 数据库。
豆子打算创建一个rds的 mssql 数据库,一个 rds的 aurora 数据库。在mssql上我会创建一些样本数据,然后通过 sct 进行 schema 转换,最后通过 dms 进行数据库的同步进行迁移。值得一提的是,dms支持从 rds到rds, ec2 到 rds 甚至 本地数据库 到 rds 的各种转换。
下面看看具体操作。在操作过程中,豆子因为实验环境的缘故,遇见了一些坑,会尽量列出来,避免再次发生。
进入 aws rds 控制界面
新建一个 mssql 数据库,注意我选择的类型是 sql server standard edition。很不幸的是,dms不支持 express版本的迁移。
输入数据库instance的名字和密码
测试的服务器不需要太好,最便宜的就行
选择vpc (这里有个坑稍后我会提到)
重点,注意看他的价格,一个月要768 美元!!
这个是通过下面的价格算出来的。新手做这个实验大概要2个小时,两台服务器大概开支会在5刀左右,所以做完了实验一定要记得删除自己的数据库!!
数据库创建中
我顺便创建了一个安全组,允许我自己的机器访问1433和3306端口 。(目前为止没问题,但是这是第二个坑,后面会有问题)
重复上面的操作步骤,我又创建了一个 aurara的数据库,他会自动创建一个cluster,然后把你新建的成员放在里面(即使只有一个)
最后我的两个rds的instance就创建好了。demo1 是 mssql,做为我的数据库源,demo2是aurora,作为数据库目标
创建好了数据库以后,我还需要生成一些测试用的table和数据。 下面看看如何从本机连接数据库。
首先看看 mssql的 endpoint
在我的本地电脑上通过mssql management 工具连接。理论上,这一步应该很简单,如果我的安全组策略正确的话。这里我遇见了第一个坑。我的账号里面有多个vpc的网络,而我的本地网络和aws 某一个vpc之间已经存在了 s2s v-p-n 的连接,因而aws会认为我的计算机属于内网,他很智能地把他的域名解析为内部ip。事实上,我的计算机和这个测试的vpc的网络之间并没有路由,也没有配置gateway,内网访问是不通的,尽管他有一个公网ip,但是aws自动给我解析为内网ip之后,我的路由会找不到对应的路径导致我始终无法访问。最后我只能重建rds,然后确保他在的vpc和我的计算机网络之间存在了s2s连接关系。
连接之后,执行我的测试sql脚本,他会创建一堆表,并插入一些测试数据
下一步我们需要在我的电脑上安装 sct 工具。
在下面的连接上下载sci,mssql 的 jdbc 以及 mysql的 jdbc
https://docs.aws.amazon.com/schemaconversiontool/latest/userguide/chap_installing.html
然后打开sct,选择新建一个项目
分别连接 mssql 和 aurora
连接成功
勾选我们要迁移的数据库,之后在action 选择 create report
他会扫描你的 mssql 数据库进行评估是否可以转换。
下面是生成的报告
如果报告没有问题,下一步就是进行schema的转换了, 选择 action- convert schema
几秒之后 可以看见schema已经在aurora这边生成了
最后一大块的操作是配置dms。 登录aws 控制台 , 选择 database migration service。这个服务里面,我需要创建三个东西:
一个用来同步的instance,类似ec2实例,但是它是由aws来管理的
创建source endpoint和 destination endpoint
创建一个任务来同步。
首先来创建一个 replication instance ( 同步实例)
注意他所选择的vpc secuirty group 是我之前创建的,这里其实是有问题的
创建完成之后 我们来继续创建endpoint。
endpoint 创建完之后一定要测试 connection。
创建之后的样子
创建好了之后来测试一下,不通!!
我在这里卡了至少1个小时。最后发现有3个坑在这里。
首先,我之前配置这个sg的时候,只允许了我本地的机器访问,我的dms的服务器是不行的,因此这里我们需要把这个dms的内网ip也加进去;
第二:sg的outbound rule默认是所有都打开的,我无意中进行了限制,因此需要确认outbound rule是放行的
第三:我有一个nacl在这个公网subnet上,因此我还得在nacl上面放行
获取dms 同步服务器的ip
修改安全组的出入规则
修改我的nacl的出入规则
再测试一下连接成功
最后,我们来创建一个任务进行同步
添加一个 selection rule
等待2 分钟之后 进度条显示成功
mssql management 工具 连接我的源数据库, 进入查询一下数据
mysql workbench 连接进入我的目标数据库,查询一下 数据一致,迁移成功!
再次友情提醒,实验成功了记得删掉服务器,aws的收费还是很贵的。