GO语言——实现从MySQL数据库迁移到Amazon DynamoDB
目录
一、前言
博主在学习Go语言,碰巧Leader要求研究一下能不能用脚本方式实现MySQL数据库到DynamoDB的迁移
这篇博文是博主使用Go语言实现的一种简单迁移,因为初学Go语言,代码不是很优美,也没有算法优化。
功能上, 只是简单的把数据一比一的迁移到DynamoDB。并且原MySQL数据库类型,在DynamoDB中都为String类型。
后续有时间会继续优化该程序,也欢迎Go语言的大佬们提出宝贵的修改和优化方案。
1.1 迁移背景
许多公司考虑从MySQL等关系数据库迁移到Amazon DynamoDB
Amazon DynamoDB是一项完全托管、快速、高度可扩展且灵活的NoSQL数据库。DynamoDB可以根据业务需求根据流量增加或减少容量。与典型的基于媒体的RDBMS相比,可以更轻松地优化服务的总成本
1.2 迁移问题
- 由于停机造成的服务中断,尤其是当客户服务必须24/7/365无缝可用时
- RDBMS和DynamoDB的不同键设计
1.3 AWS官方迁移方法
两种基于AWS托管服务的迁移:https://aws.amazon.com/cn/blogs/big-data/near-zero-downtime-migration-from-mysql-to-dynamodb/
学习视频:https://www.youtube.com/watch?v=j88icq7JArI
二、思路与函数
2.1 思路
-
初始数据库连接和DynamoDB client
-
读取MySQL数据库
-
获取每个数据库中MySQL数据表
-
将数据表结构转为DynamoDB结构(字段,类型)
- 获取表字段并判断表字段是否为主键
-
创建DynamoDB表:
-
定义DynamoDB表名称:mysql数据库名_数据表
-
创建DynamoDB表
-
-
循环获取MySQL数据表的数据,加载到DynamoDB
-
获取所有列数据信息,以及行数
-
读取数据表的数据
-
把数据写入DynamoDB
2.2 主函数
main
函数功能为调用其他函数
初始化数据库连接,和初始化Amazon DynamoDB客户端
// 初始化数据库连接
db := Mysql.ConnectDB()
if db == nil {
fmt.Printf("init db failed!\n")
return
}
// 初始DynamoDB client
cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion("ap-southeast-1"))
if err != nil {
log.Fatalf("unable to load SDK config, %v", err)
}
// Using the Config value, create the DynamoDB client
svc := dynamodb.NewFromConfig(cfg)
函数调用
// 1 读取数据库
Mysql.DatabaseInfo(db)
// 2 读取数据表
Mysql.TableInfo(db, database[i])
// 3 获取表字段
Mysql.TableFiledInfo(db, database[i], table[j])
// 4 创建DynamoDB表
DynamoDB.CreateDynamoDB(svc, field, tableName)
// 5.1 获取所有列数据信息,以及行数
Mysql.TableData(db, field, database[i], table[j])
// 5.3 把数据写入DynamoDB
DynamoDB.PutItemDynamoDB(svc , itemMap, tableName)
三、MySQL函数
3.1 查询所有非系统的数据库
在MySQL数据库中,INFORMATION_SCHEMA.TABLES
表存储了MySQL数据库的元数据。
元数据信息主要包括数据库中表信息以及表字段信息,可以从INFORMATION_SCHEMA.TABLES
表中查询数据库信息:
SELECT table_schema databaseName
FROM INFORMATION_SCHEMA.TABLES
WHERE UPPER(table_type)='BASE TABLE'
AND table_schema NOT IN ('mysql','performance_schema','sys')
GROUP BY table_schema
ORDER BY table_schema asc
UPPER(table_type)='BASE TABLE'
只选择基础数据库,在MySQL数据库中,人为创建的数据库都为BASE TABLE
类型。
在MySQL数据库中,数据库mysql,performance_schema,sys
都属于BASE TABLE
类型。但是这三个数据库也是MySQL自带的数据库,不是用户数据库,需要排除。
func DatabaseInfo(db *sql.DB) []string {
sqlStr := `SELECT table_schema databaseName
FROM INFORMATION_SCHEMA.TABLES
WHERE UPPER(table_type)='BASE TABLE'
AND table_schema NOT IN ('mysql','performance_schema','sys')
GROUP BY table_schema
ORDER BY table_schema asc`
rows, err := db.Query(sqlStr)
// 关闭查询
defer rows.Close()
if err != nil