使用goose让数据库迁移更加轻松

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 使用goose让数据库迁移更加轻松

前言

在开发到发布的过程中,数据库的迁移是一件较为繁琐的事,而goose的出现,让数据库的迁移变得很轻松。

我们只需要简单的一句goose up 就能将数据库重新部署,一句goose down 就能将原有的数据库清除,是不是感觉很easy!

安装

go get bitbucket.org/liamstask/goose/cmd/goose

安装完成后可以运行goose 查看是否安装成功。

如果提示 command not found: goose 你可以查看一下你的$GOPATH/bin 下有没有goose的binary文件,如果有那么安装成功了,只是PATH中没把这个路径添加进去。

设置~/.bash_profileGOPATH/bin 加入PATH即可,类似如下。

export GOPATH=/Users/go   
export GOBIN=/Users/go/bin
export PATH=$PATH:$GOBIN

配置

在安装完成后,你就可以在你的项目中配置goose了。

1.首先,在你的项目下需要一个db的文件夹,并且在文件夹的下面有一个数据库配置文件dbconf.yml(当然,该文件夹 也可以用-path来指定,只要该文件夹下有数据库配置文件dbconf.yml即可)。

2.配置dbconf.yml的内容。 一个简单的dbconf.yml文件的格式如下所示:

development:
    driver: postgres
    open: user=liam dbname=tester sslmode=disable

这里的driveropen是直接通过go的database/sql 库去与数据库交互。driver即数据库驱动,常见的驱动(sqlite,mysql,postgres)database/sql都支持,其他驱动稍后也有介绍。 open即数据库连接参数,常见的数据库操作实例如下:

# sqlite 配置
driver : sqlite
open : ./my_test_sqlite.sdb  # sqlite数据库路径
# postgres 配置
driver : postgres
open : user=postgres password=123456 dbname=test sslmode=disable 
# mysql 配置
driver : mysql
open : user:password@tcp(localhost:3306)/dbname?charset=utf8

而这里development 是你可用自己可以指定的一个环境名字。假如你在开发的时候和正式发布的时候数据库的环境并不相同,你就可以很轻松的用这个关键来分开部署。

实例如下,在开发过程中使用development标识,在生产环境中用production标识,两种情况的数据库环境不相同:

development:
    driver: postgres
    open: user=postgres  dbname=test sslmode=disable 
production:
    driver: postgres
    open:  user=myusername password=112233 dbname=mytest sslmode=disable

上面例子很明显的看到,两个环境下的数据库连接是不同的。在具体的使用时我们就可以用-env来制定具体的环境。有关其使用,后面有介绍。

其他驱动

除了常见的sqlite,mysql,postgres三个驱动外,goose还可以使用一些支持database/sql的驱动。这时就需要一个import pathknown dialect了,如下所示:

customdriver:
    driver: custom
    open: custom open string
    import: github.com/custom/driver
    dialect: mysql

因为在SQL中编写的迁移由goose二进制直接执行,所以只有编译到goose中的驱动程序才可以用于这些迁移。

使用

在完成文件夹的创建以及数据库配置文件的参数设置后,就可已使用goose迁移你的数据库了。

Create

创建一个迁移语句,你可以选择使用go或者sql来创建。 例如,我需要创建一个基础的数据库脚本。

# 使用golang迁移
goose create basic_go 
# 创建成功, 输出
goose: created goose/db/migrations/20161130232822_basic_go.go
# 或者使用 sql脚本
goose create basic_sql sql
# 创建成功, 输出
goose: created goose/db/migrations/20161130232902_basic_sql.sql

执行goose 相关命令的目录与db目录应该同一层。

我们可以查看文件。创建的go脚本如下:

package main
import (
    "database/sql"
)
// Up is executed when this migration is applied
func Up_20161129103859(txn *sql.Tx) {
}
// Down is executed when this migration is rolled back
func Down_20161129103859(txn *sql.Tx) {
}

创建的sql脚本如下:

-- +goose Up
-- SQL in section 'Up' is executed when this migration is applied
-- +goose Down
-- SQL section 'Down' is executed when this migration is rolled back
数据库迁移语句就可以写在Up与Down有关区域内。

在其中写上需要的数据库迁移的操作。如下:

  • File:goose/db/migrations/20161130232822_basic_go.go
package main
import (
    "database/sql"
    "fmt"
)
// Up is executed when this migration is applied
func Up_20161130232822(txn *sql.Tx) {
    fmt.Println("Up Out ...")
}
// Down is executed when this migration is rolled back
func Down_20161130232822(txn *sql.Tx) {
    fmt.Println("Down Out ...")
}
  • File: goose/db/migrations/20161130232902_basic_sql.sql
-- +goose Up
-- SQL in section 'Up' is executed when this migration is applied
CREATE TABLE IF NOT EXISTS test (
    id serial,
    con text
);
-- +goose Down
-- SQL section 'Down' is executed when this migration is rolled back
DROP TABLE test;

sql语句以分号结束,不然可能无法识别。

Up

执行goose up就是执行脚本Up区域的内容,所有可用的迁移脚本都将被执行。

在上面的例子中,执行goose up得到结果:

goose: migrating db environment 'development', current version: 0, target: 20161130232902
Up Out ...
OK    20161130232822_basic_go.go
OK    20161130232902_basic_sql.sql

到数据库查看,表格已经创建好了。当然,上面说的指定环境,此时就可以指定了,如果不指定默认就是development,在真正产的时候,我们可以如下使用:

goose -env production up
# 结果
goose: migrating db environment 'production', current version: 0, target: 20161130232902
Up Out ...
OK    20161130232822_basic_go.go
OK    20161130232902_basic_sql.sql

在实际生产的时候,我们也可以指定执行某一个脚本,如下所示:

# 再创建一个脚本
goose create add_cloumn sql
# 结果
goose: created /Users/trustasia/dev/go/src/demo_mi/goose/db/migrations/20161130235504_add_cloumn.sql
# 写上迁移语句
-- +goose Up
-- SQL in section 'Up' is executed when this migration is applied
ALTER TABLE test ADD  new_con text;
-- +goose Down
-- SQL section 'Down' is executed when this migration is rolled back
ALTER TABLE test DROP COLUMN new_con;
# 指定脚本迁移
goose goose up add_cloumn
# 结果
goose: migrating db environment 'development', current version: 20161130232902, target: 20161130235504
OK    20161130235504_add_cloumn.sq

Down

执行goose down 向前回滚一个版本。

在上面的例子中,我们回滚。

goose down
# 结果
goose: migrating db environment 'development', current version: 20161130235504, target: 20161130232902
OK    20161130235504_add_cloumn.sql

我们也可以指定环境,或指定脚本来回滚。

# 指定生产环境回滚
goose  -env production down
# 结果
goose: migrating db environment 'production', current version: 20161130232902, target: 20161130232822
OK    20161130232902_basic_sql.sql
# 制定版本回滚
goose down basic_sql  
# 结果
goose: migrating db environment 'development', current version: 20161130232902, target: 20161130232822
OK    20161130232902_basic_sql.sql

redo

向上回滚一个版本,然后重新执行一次上次的操作。

goose redo
goose: migrating db environment 'development', current version: 20161130232822, target: 0
Down Out ...
OK    20161130232822_basic_go.go
goose: migrating db environment 'development', current version: 0, target: 20161130232822
Up Out ...
OK    20161130232822_basic_go.go

status

查看当前所有的迁移执行状态。

goose status
goose: status for environment 'development'
    Applied At                  Migration
    =======================================
    Thu Dec  1 09:25:17 2016 -- 20161130232822_basic_go.go
    Pending                  -- 20161130232902_basic_sql.sql
    Pending                  -- 20161130235504_add_cloumn.sql
# 查看production环境下的
goose -env production status
goose: status for environment 'production'
    Applied At                  Migration
    =======================================
    Wed Nov 30 23:51:00 2016 -- 20161130232822_basic_go.go
    Pending                  -- 20161130232902_basic_sql.sql
    Pending                  -- 20161130235504_add_cloumn.sql

dbversion

查看当前数据库版本。

goose dbversion
goose: dbversion 20161130232822

总结与注意事项

  1. up,down区域脚本对应goose up,goose down;
  2. 可用-env指定数据库环境,-path指定包含数据库信息的路径;
  3. 数据库语句以分号介绍,不可缺少;
  4. 复杂的函数语句写在-- +goose StatementBegin-- +goose StatementEnd之间,例下面的如创建函数。
-- +goose Up
-- +goose StatementBegin
CREATE OR REPLACE FUNCTION histories_partition_creation( DATE, DATE )
returns void AS $$
DECLARE
  create_query text;
BEGIN
  FOR create_query IN SELECT
      'CREATE TABLE IF NOT EXISTS histories_'
      || TO_CHAR( d, 'YYYY_MM' )
      || ' ( CHECK( created_at >= timestamp '''
      || TO_CHAR( d, 'YYYY-MM-DD 00:00:00' )
      || ''' AND created_at < timestamp '''
      || TO_CHAR( d + INTERVAL '1 month', 'YYYY-MM-DD 00:00:00' )
      || ''' ) ) inherits ( histories );'
    FROM generate_series( $1, $2, '1 month' ) AS d
  LOOP
    EXECUTE create_query;
  END LOOP;  -- LOOP END
END;         -- FUNCTION END
$$
language plpgsql;
-- +goose StatementEnd


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
8
分享
相关文章
数据库运维:mysql 数据库迁移方法-mysqldump
本文介绍了MySQL数据库迁移的方法与技巧,重点探讨了数据量大小对迁移方式的影响。对于10GB以下的小型数据库,推荐使用mysqldump进行逻辑导出和source导入;10GB以上可考虑mydumper与myloader工具;100GB以上则建议物理迁移。文中还提供了统计数据库及表空间大小的SQL语句,并讲解了如何使用mysqldump导出存储过程、函数和数据结构。通过结合实际应用场景选择合适的工具与方法,可实现高效的数据迁移。
106 1
【瑶池数据库训练营及解决方案本周精选(探索PolarDB,参与RDS迁移、连接训练营)】(5.30-6.8)
本周精选聚焦数据库迁移训练营、快速连接云数据库RDS训练营及智能多模态搜索解决方案。为用户提供模拟教程与实战演练,学习RDS MySQL实例连接与数据管理技能,助力企业智能化发展。每周解锁数据库实战新场景,抓紧时间,精彩不容错过!
【瑶池数据库动手活动及话题本周精选(体验ADB、 SelectDB,参与 RDS 迁移训练营)】(4.21-4.27)
本文为 “瑶池数据库动手活动及话题精选” 系列第一期,聚焦 SelectDB 日志分析、AnalyticDB Zero-ETL 集成、RDS 迁移训练营三大实战,设积分、实物等多重奖励,同步开启话题互动。点击链接参与,每周解锁数据库实战新场景。
用 YashanDB Migration Platform,数据库迁移不再是“高风险动作”
数据库迁移一直是企业信息化中的难题,耗时长、风险高。YashanDB Migration Platform(YMP)提供一站式解决方案,涵盖评估、改写、迁移与校验全流程。其核心能力包括SQL自动适配、智能对象迁移、高性能数据通道及数据对比校验,显著降低人力成本与业务风险。适合从Oracle、MySQL等迁移到YashanDB的企业,以及需异构整合或国产化替代的集团、政府和国企项目。YMP不仅是工具,更是推动数据库国产化的关键平台。
MySQL数据库上云迁移
本文介绍了将数据库迁移到RDS for Mysql的两种主要方法:停服迁移和不停服迁移。停服迁移适合可短暂中断服务的场景,通过mysqldump或DTS完成;不停服迁移适用于需保持业务连续性的场景,推荐使用DTS实现结构、全量及增量数据迁移。文中详细列出了每种方法的具体操作步骤,帮助企业根据需求选择合适的迁移方案。
MySQL数据库上云迁移
【瑶池数据库动手活动及话题本周精选(体验ADB、 SelectDB,参与 RDS 迁移训练营)】(4.28-5.4)
本文为“瑶池数据库动手活动及话题精选”系列第二期,聚焦SelectDB日志分析、AnalyticDB Zero - ETL集成、RDS迁移训练营三大实战,设积分、实物等多重奖励,同步开启话题互动。上一期活动反响热烈,错过的朋友别再犹豫!点击链接参与,每周解锁数据库实战新场景,抓紧时间,精彩不容错过!
担心YashanDB异构数据库迁移踩“坑”?听听大咖们怎么说
文章围绕异构数据库迁移展开,探讨了避免数据丢失、保障数据完整性、注意兼容性、提升迁移效率、做好反向演练等问题。包括迁移前完整性检查与备份,YashanDB 从内核设计和配套工具保障数据,对兼容性进行大量测试,通过合理评估和技术手段提升迁移效率,以及处理回退等内容。
迁移方案详解 | 使用YMP从异构数据库迁移到YashanDB
迁移方案详解 | 使用YMP从异构数据库迁移到YashanDB
崖山异构数据库迁移利器YMP初体验-Oracle迁移YashanDB
文章是作者小草对崖山异构数据库迁移利器 YMP 的初体验分享,包括背景、YMP 简介、体验环境说明、YMP 部署(含安装前准备、安装、卸载、启动与停止)、数据迁移及遇到的问题与解决过程。重点介绍了 YMP 功能、部署的诸多细节和数据迁移流程,还提到了安装和迁移中遇到的问题及解决办法。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问