从MySQL数据库迁移到AWS DynamoDB

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 思路

  1. 初始数据库连接和DynamoDB client

  2. 读取MySQL数据库

  3. 获取每个数据库中MySQL数据表

  4. 将数据表结构转为DynamoDB结构(字段,类型)

  • 获取表字段并判断表字段是否为主键
  1. 创建DynamoDB表:

    • 定义DynamoDB表名称:mysql数据库名_数据表

    • 创建DynamoDB表

  2. 循环获取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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值