使用 dbdeploy.net 管理数据库变更

没有包含数据库的持续集成都是假的。这可不是我说的。
一直以来都没能找到一个理想的数据库变更管理工具。直到转了 java 再回来,才发现 dbdeploy 是有.net 版的。赶紧尝试一下。

一、工具
先是从 sourceForge 上下载了成品,试运行发现找不到依赖的 dll,而且版本也比较老(2013年构建的)。想到要是有源码编译一份就好了。从 github 上搜索 dbdeploy.net,第一个就是,除了源码外还有详细的使用说明,实在太重要了。

把源码拿下来编译(用的 vs2013)也是编译不过,提示找不到依赖包。用 nuget 管理了一下包,终于编译通过。从 Dbdeploy.Console\bin\Debug 下拿到完整的工具。接下来开始使用。

二、配置
根据 github 上的使用说明,运行时可以直接使用命令行,也可以使用配置文件。感觉上还是配置文件更方便管理。在 debug 下创建 run.bat 和 run.config.xml. 两个文件的内容如下:

run.bat
---------------------------------------------------------
dbdeploy.exe --config=run.config.xml
---------------------------------------------------------

run.config.xml
---------------------------------------------------------
<?xml version="1.0" encoding="utf-8" ?>
<!-- Multiple deployments can be executed. -->
<config>
  <dbdeployments>

<!-- Run with all options. -->
    <dbdeploy
        dbms="mysql"
        connectionString="Server=127.0.0.1; port=3306; Initial Catalog=testdb;User Id=root;Password=root"
        scriptDirectory="..\src"
        outputFile="..\target\changes.sql"
        changeLogTableName="changelog"
        autoCreateChangeLogTable="true"
        forceUpdate="false"
        useSqlCmd="true"
        encoding="UTF-8"
        templateDirectory="Resources"
        delimiter=";"
        delimiterType="row"
        lineEnding="LF"
        />
  </dbdeployments>
</config>
---------------------------------------------------------

说明:
1. 数据库是 mysql
2. 所有的数据库变更脚本在 ../src 目录,运行后输出的文件要放置在:../target 目录
3. 由于 dbdeploy 使用一个变更表保存所有的变更历史,因此需要指定这个表名,在这里使用的是 changelog
4. 其它参数比较简单,一看就明白。

创建好目录就可以运行了,我的目录结构如下:
/
    src/
        *.sql     --放置变更的脚本
    target/      -- 输出
    tools/
        Resources/
        dbdeploy.exe
        *.dll
        run.bat
        run.config.xml

三、运行
使用时,运行 run.bat 即可。一方面,它会将变更应用到本地数据库,另一方面,在 target/ 目录下生成 changes.sql, 可当作上线脚本。
第一运行时,报了一个错:"找不到 MysqlData.dll, version=1.0....", 这些数据库驱动是运行时动态加载的。需要将对应的驱动模块放到 tools 目录。从 mysql 官网下载 mysql-connector-net. 把 MysqlData.dll 拿过来,然后编辑 dbproviders.xml, 找到 mysql, 修改对应的内容为:
assemblyName="MySql.Data"

这么做是为了不受 MySqlData.dll 的版本影响,无论什么版本都能加载。

再次运行,没再报错。

四、实践
如何利用工具进行数据库变更管理?
1. 所有结构性变更,配置性变更都记录到脚本中。其中结构性变更位于 DDL.sql 中,配置性变更位于 DML.sql 中。
2. 为了能使用变更顺序地执行,特将变更文件名格式定为:yyyyMMddHHmmss_DML.sql. (DLL类似)
3. 创建辅助脚本,生成变更的文件。在本地创建 createDDLFile.bat 和 createDMLFile.bat. 内容如下:
createDDLFile.bat
---------------------------------------------------------
@echo off

set t=%Time%
if "%t:~0,1%" ==" " (
    set t=0%t:~1%
)
set NO=%Date:~0,4%%Date:~5,2%%Date:~8,2%%t:~0,2%%t:~3,2%%t:~6,2%

set filename=%no%_DDL.sql
set filepath="src\%filename%"

echo "" > %filepath%
echo New File: %filename%
---------------------------------------------------------

时间: 2024-11-20 10:17:35

使用 dbdeploy.net 管理数据库变更的相关文章

Greenplum+Hadoop学习笔记-14-定义数据库对象之创建与管理数据库

6.定义数据库对象 6.1.创建与管理数据库 通过\h命令查看创建数据库的语法,如下所示: testdw-# \h create database Command:     CREATE DATABASE Description: create a new database Syntax: CREATE DATABASE name [ [ WITH ] [ OWNER [=] dbowner ] [ TEMPLATE [=] template ] [ ENCODING [=] encoding

[转]Oracle DB 管理数据库存储结构

? 描述块中表行数据的存储 ? 创建和管理表空间 ? 获取表空间信息 表数据的存储方式 创建表时,还会创建一个用于保存其数据的段.表空间包含一个段集合. 从逻辑上来说,表包含许多行列值.行最终以行片段的形式存储在数据库块中.之所以称其为行片段,是因为在某些情况下可能不会在一个位置存储完整的行.当插入的行太大而无法装入单个块时(链接行),或当更新导致现有行超出当前块的可用空闲空间时(迁移行),就会发生这种情况.当表中的列多于255 列时,也会使用行片段.在这种情况下,这些行片段可能位于同一个块(块

asp.net core系列 30 EF管理数据库架构--必备知识 迁移

原文:asp.net core系列 30 EF管理数据库架构--必备知识 迁移 一.管理数据库架构概述 EF Core 提供两种主要方法来保持 EF Core 模型和数据库架构同步.一是以 EF Core 模型为基准,二是以数据库为基准. (1)如果希望以 EF Core 模型为准,请使用迁移. 对 EF Core 模型进行更改时,此方法会以增量方式将相应架构更改应用到数据库,以使数据库保持与 EF Core 模型兼容.  (2)如果希望以数据库架构为准,请使用反向工程. 使用此方法,可通过将数

Mysql分布式数据库变更自动化部署

Author:skate Time:2015/03/05 MySQL数据库变更自动部署 概述: 这个Mysql数据库发布程序,可以自动.快速.并发的发布数据变更并记录结果.把部署内容从部署server传输到所有部署database并执行部署内容. 本程序主要用于分布式数据库部署,比如把一个部署脚本需要同时部署到多台database上. 测试环境: deploydb: [[email protected] skate]# ll autodeploy total 36 -rw-r--r-- 1 ro

SQL语句基础之 管理数据库,表 和 数据

MySQL中的基本sql语句 MySQL中主要有三个大的对象,第一个是数据库,有了数据库后,我们才能在数据库里面建表,因为Mysql是关系数据库,它的数据都会以记录的形式存到表里,所以第二个是表,然后第三个才是数据.下面我们根据这个关系来学习一下mysql中的sql语句~ Sql语句管理数据库 1.查看Mysql中有哪些数据库 语句:show databases 2.创建一个数据库 语句: create database vmaxtam default character set utf8;--

Linux/CentOS下开启MySQL远程连接,远程管理数据库

当服务器没有运行PHP.没装phpMyAdmin的时候,远程管理MySQL就显得有必要了. 第一步:开启MySQL用户的远程访问权限 mysql -u root -p mysql # 第1个mysql是执行命令,第2个mysql是系统数据名称 在MySQL控制台执行: grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option; # root是用户名,%代表任意主机,'123456'指定的登

8天掌握EF的Code First开发系列之3 管理数据库创建,填充种子数据以及LINQ操作详解

本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LINQ to Entities 使用LINQ to Entities操作实体 LINQ操作 懒加载和预加载 插入数据 更新数据 删除数据 本章小结 本人的实验环境是VS 2013 Update 5,windows 10,MSSQL Server 2008. 上一篇<Code First开发系列之领域建模和管理实体关系>,我们主要介绍了EF中“约定大于配置”的概念,如何创建数据

数据库(SQL Server)管理数据库表~新奇之处

说到“数据库”,我总有一种莫名的感觉,在刚刚接触到的数据库中就让我似懂非懂渡过着,于是思考着.于是在冷静的时空中让我回想到了很多的知识,不知你们是怎样过来的,真心希望我的这篇数据库总结能够让我们都有一个更进步的空间. 就像标题中所说的:“数据库之创建与管理数据库表”,或许说不上新颖之作,但我相信应该有能帮大家解决在学习中运到的一些问题,当然谁都不会是完美,都会有不一样的感触,所以也想借此来和大家多多的交流并分享学习数据库时的郁闷与愉快. 那好,就让我们进入我总结”数据库“时空之境吧!!! 如果说

SQL Server 【附】创建&quot;商品管理数据库&quot;、&quot;学生选课数据库&quot;的SQL语句

附:(创建“商品管理数据库”的SQL语句) --建立"商品管理数据库"数据库-- create database 商品管理数据库 on(name='商品管理数据库_m', filename='D:\商品管理系统\商品管理数据库_m.mdf', size=6mb,filegrowth=1mb,maxsize=unlimited) log on(name='商品管理数据库_l', filename='D:\商品管理系统\商品管理数据库_l.ldf', size=1,filegrowth=1