从PostgreSQL到Microsoft SQL Server的数据库迁移

数据库的迁移包括数据库模式(DDL)、数据与服务器端的业务逻辑的迁移。

因项目甲方需要,将原先使用的PostgreSQL数据库换成Microsoft SQL Server数据库。

PostgreSQL数据库使用的9.4版本。Microsoft SQL Server使用的是2012Express版本。业务逻辑代码是使用了spring boot + mybatis实现对数据库的连接管理和操作。

基本的方法就是5步:

1)将PostgreSQL数据库的表结构和数据转储为SQL文件,使用了Navicat软件实现。

2)修改SQL文件,将其修正为Microsoft SQL Server数据库可识别的SQL文件。

3)在Microsoft SQL Server数据库中执行SQL文件实现数据库的表结构和数据的恢复。

4)配置Microsoft SQL Server的端口和TCP/IP等内容。

5)在代码中修改数据库的驱动库,添加Microsoft SQL Server的依赖。

接下来是详细的对每一步做一个说明:

1)将PostgreSQL数据库的表结构和数据转储为SQL文件,使用了Navicat软件实现:

因为项目比较简单的原因,这次数据库迁移一共只涉及到了16张表和数据,没有序列,表与表之间只存在一些外键约束。通过Navicat生成的PostgreSQL数据库的sql文件是无法直接用来恢复Microsoft SQL Server数据库的,所以就需要进行第二步操作。

2)修改SQL文件,将其修正为Microsoft SQL Server数据库可识别的SQL文件:

在我这么简单的数据库的基础上,需要修改sql文件有10个地方。

(1)注释dorp和comment:因为是恢复一个空的数据库,所以不用先使用dorp来删除原先的表。PostgreSQL数据库和Microsoft SQL Server数据库的备注风格不一样,所以需要注释掉comment。

(2)删除"public".:PostgreSQL数据库生成的表名都是"public".+“表名”,所以需要删除"public".。

(3)删除 COLLATE "default":PostgreSQL数据库中varchar(225)后面都会加上COLLATE "default",具体做什么的,我也是一知半解,COLLATE代表字符集?和使用索引有关系,Microsoft SQL Server数据库是否需要也不清楚,先删为敬。

(4)int4转换int:Microsoft SQL Server数据库中只有int。

(5)int2转换int:Microsoft SQL Server数据库中只有int。

(6)删除WITH (OIDS=FALSE):PostgreSQL数据库会使用WITH (OIDS=TRUE )来给新表中的每一行都分配一个 OID(对象标识符),FALSE则不分配。

(7)将varchar(65533)大于8000的替换成8000:Microsoft SQL Server数据库中varchar最大为8000。

(8)将RESTRICT换成CASCADE:不知道为啥RESTRICT就会有错,也没有管逻辑,就直接改成了CASCADE。

(9)将timestamp(6)换成DateTime2:PostgreSQL数据库中使用timestamp(6),Microsoft SQL Server数据库中使用DataTime2,更换完后,需要注意数据精度问题。

(10)将bool型改为bit(t和f也要改):PostgreSQL数据库中的bool变量在Microsoft SQL Server数据库中是bit,同时数据内容也发生变化,PostgreSQL数据库中的数据t和f也要换成Microsoft SQL Server数据库中的1和0。

至此,修改后的sql文件可以被Microsoft SQL Server数据库识别并还原生成Microsoft SQL Server的数据库表。

PS:在表、数据和约束如此之少的情况下,一步一步手动修改操作,虽然还有使用文本编辑器中的替换操作,也费了不少的时间,私以为可以写一个通用的修改程序,代替手工的操作,迫于时间问题,暂时搁浅,有兴趣的coder可以交流学习讨论一下。还有就是备注也没有添加上去,还没考虑怎么实现快速添加。

3)在Microsoft SQL Server数据库中执行SQL文件实现数据库的表结构和数据的恢复:

这里就是把修改完的sql文件放入Microsoft SQL Server数据库中执行即可。

PS:这样生成的数据库就没有再手动修改了,简单的运行了业务程序还没有发现什么问题,后期如果还有什么问题,会更新至博客。若有别的coder发现问题,欢迎讨论。

PS:在安装Microsoft SQL Server数据库时还遇到了一个问题:

和vs2010冲突了,解决办法看到这个网址:https://sqlserver-help.com/2011/12/08/help-getting-visual-studio-service-pack-error-while-installing-sql-server-2012-release-candidate-0-rc0/(母鸡可以看不,截点图)

从PostgreSQL到Microsoft SQL Server的数据库迁移_第1张图片

然后就是装这个,我装了还报错了,没解决。这个网址好像解决了。

从PostgreSQL到Microsoft SQL Server的数据库迁移_第2张图片

最后,我是直接暴力的把vs2010删了(都用vs2013了)。

4)配置Microsoft SQL Server的端口和TCP/IP等内容:

我是已经改好业务逻辑代码进行连接,发现不OK,没有配置端口和TCP/IP,参见这个blog:https://blog.csdn.net/niaonao/article/details/53897486。

5)在代码中修改数据库的驱动库,添加Microsoft SQL Server的依赖:

因为使用了mybatis,所以只用添加Microsoft SQL Server数据库的依赖并将PostgreSQL数据库的驱动换成Microsoft SQL Server数据库的驱动,不需要额外的业务代码的修改,sql语句的修改。

可以参考这篇blog:http://www.500li.cn/2018/06/12/sprint-bootmybatissqlserver/。

PS:添加了依赖,更换数据库驱动后,使用maven下载失败,找了下问题,重新下载了相应的库包,可以解决com.microsoft.sqlserver:sqljdbc4:jar:4.0丢失的问题。参考blog:https://blog.csdn.net/zhang289202241/article/details/68062631。

至此,运行就成功啦。

我是在自己的主机上实现了数据库的迁移,我还需要将其备份在放置服务器上,放在服务器上的时候也遇到了一些问题,服务器上有多个版本的数据库时会造成数据库服务启动的失败,需要升级。以及服务器上的数据库的端口,TCP/IP需要开放。还有就是备份和还原需要注意是否是同位机器。

就酱~遇到问题再做更新!祝大家换库顺利。

你可能感兴趣的:(数据库,数据库)