Postgres 数据库转移到 MSSQL 2012 手记

本文记录了从Postgres数据库向MSSQL2012迁移数据的过程。通过对比三种方法——备份恢复、直连读取及DTS批量迁移,详细解析每种方案的优劣,并最终确定采用DTS分段迁移配合T-SQL数据提取的方法。



Postgres数据库数据转移到 MSSQL 2012


刚从澳门一家酒店做了个酒店系统数据转移,从Postgres数据库里转移数据到我们的威望酒店管理系统(Microwin Property Management System)的MS SQL 2012里,在这里记录下步骤,以便以后用,分析对方的数据结构是件痛苦的事情,在转移数据花时间最多的步骤。




环境参数: Postgres数据库安装在Linux下,Postgres版本是7.4, 数据库的大小有5G左右,最大一个数据表的行数超过400万行。MSSQL 2012 安装在Windows 2008 server 下,繁体系统,我做转移的系统是Windows XP SP3 简体系统,为什么要说我做转移时是简体系统呢,因为在做转移时如果没有选择好ODBC的Driver会出现乱码,


因为只有3个小时的时间做转换数据,所以前期准备工作要做好,保证转移过来的数据要正确,而不能影响正常的工作。


前提准备连接PostgreSQL 数据库:


Windows怎么连接到Linux下的Postgres数据库上,直接从官网上下载PSQLODBC安装到Windows上用ODBC方式连接到Linux下的Postgres数据库上,
这样的连接数据库就解决了,安装PSQLODBC后会在ODBC数据源管理器里有两个驱动程式,PostgreSQL ANSI 和 PostgreSQL Unicode ,刚开始我是用PostgreSQL Unicode这个来连接到PostgreSQL 的,但发现读出来的数据中文会乱码,在繁体XP里也是乱码,但用PostgreSQL ANSI这个繁体中文就没有问题,但简体中文又出现乱码,最后只能繁体中文和简体中文分别转移了。




第一种备份恢复方法:
在我的XP上安装从Postgres 官网上下载下来的Windows 版本的 Postgres 8.4 ,恢复从Linux下备份的Postgres数据库来做转移数据,但恢复过来的数据不但中文是乱码,重要的是大表的数据(超过100万级的数据行)没有恢复进来,到现在也没有搞清楚这是什么问题,所以就放弃这个方法。

第二种直连方法:
直接用MSSQL的sp_addlinkedserver 连接到PostgreSQL ,真接读取数据到暂时数据库,再做数据转换到我们的威望酒店系统,当时想是服务器对服务器直接读写应该很快,但试后发现很慢,远远超过5小时间,所以这种方法也放弃了,如果数据少的话这种方法是可以用的。


sp_addLinkedserver方法使用如下:

先建立一个能读取PostgreSQL 数据库的用户和密码一样的用户在MSSQL 数据库上。

sp_dropserver 'sourceDB'

EXEC master.dbo.sp_addlinkedserver @server = N'sourceDB', @srvproduct=N'PostgreSQL ANSI', 
   @provider=N'MSDASQL', @provstr=N'Driver=PostgreSQL ANSI;uid=username;pwd=password;Server=ipaddress;database=databasename;'


exec sp_droplinkedsrvlogin @rmtsrvname = 'sourceDB' ,    @locallogin =null


/* For security reasons the linked server remote logins password is changed with ######## */
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'sourcdDB', @useself=N'True',@locallogin=NULL,@rmtuser='username',@rmtpassword='password'


--在MSSQL上读取PostgreSQL那边的数据表
SELECT * FROM OpenQuery(sourceDB, 'SELECT * From information_schema.tables')

--在MSSQL上读取PostgreSQL那边的指定数据表的数据
select * from "sourceDB"."databasename"."public"."tablename"




第三种DTS方法(分两大步):
第一步: 在MSSQL建立一下新的数据库,用DTS(也就是MSSQL提供的导出/导入数据服务)把Postgres数据库全部数据转移到新的MSSQL数据库里,在选择源数据库时最好用PostgreSQL ANSI ODBC驱动程式,否则会出现中文乱码,但奇怪是的,MSSQL 2012 提供的DTS不能读取Postgres的数据结构,但MSSQL 2000提供的DTS是可以的,所以说有时不是版本越高就越好,能用才是好工具啊,所以我就用2000提供的DTS工具想把PostgreSQL数据库的数据先转移到mssql 2012 ,但在转移大数据表的时候会出现 Out of memory 信息,但我的XP已经是 4G 内存了,32位的系统最大了,但还是不能转移大数据表的数据,我发现数据行大行50万以上就会出现out of memory 信息,所以最后只能编程方法来把数据分成30万行左右一次转移,用DTS保存下来的DTS包,用VB6编程把数据提取30万行左右一次一次转移大数据表,其它少于30万的数据直接用DTS来转移,做好程式安装到繁体和简体系统电脑里分别进行,如果可以的话安装多台机器来运行会更快点,这个方法我用1个半小时就转移完我要的数据到MSSQL的暂时数据库了。

第二步: 用了数据在同一个服务器后,读取就方便和快捷了,在新的MSSQL数据库里再根据数据结构用T-SQL提取数据需要的数据到我们的酒店系统的数据里,由于两个数据库的数据表结构不一样所以这步在同一个SQL服务器里的不同数据库做比较方便,根据数据结构不同写不同的SQL语句进行读取及写入。这个步骤大概也花了一小时间左右,当然根据服务的性能不同时间也会不同的。



结论: 我经常要转移数据到我们的威望酒店系统(Microwin Property Management System),所以也经常做不同数据库间的转移数据, 以前大部分是同类型的数据库转移,这次是不同数据库和不同系统所以做起来比较麻烦,所以记下来以后参考,大家用更好方法来信分享一下。


 

### 三级标题:是否可以使用 MySQL 驱动连接 PostgreSQL 数据库 不可以使用 MySQL 的 JDBC 驱动来连接 PostgreSQL 数据库。不同的数据库系统具有不同的协议和通信机制,因此每种数据库都需要使用其专用的 JDBC 驱动程序来建立连接。例如,PostgreSQL 使用 `org.postgresql.Driver` 作为其 JDBC 驱动类,而 MySQL 使用的是 `com.mysql.cj.jdbc.Driver`。两者之间不能互相替代 [^2]。 在实际开发中,例如在 IntelliJ IDEA 中配置 PostgreSQL 数据库时,必须为项目添加 PostgreSQL 的 JDBC 驱动,而不是使用其他数据库的驱动 [^2]。如果尝试使用 MySQL 驱动连接 PostgreSQL,将导致连接失败,并抛出 `ClassNotFoundException` 或 `SQLException` 等异常。 例如,连接 PostgreSQL 的标准 JDBC 代码如下: ```java Class.forName("org.postgresql.Driver"); Connection conn = DriverManager.getConnection( "jdbc:postgresql://localhost:5432/mydb", "user", "password"); ``` 如果将上述代码中的 `org.postgresql.Driver` 替换为 MySQL 的驱动类名,即使 URL 格式和数据库地址正确,程序也无法成功连接到 PostgreSQL 数据库。 --- ### 三级标题:数据库驱动的适配性问题 数据库驱动不仅决定了能否建立连接,还影响后续的 SQL 执行、事务管理以及特定数据库功能的支持。例如,在 Quartz 框架中,若从 MySQL 切换到 PostgreSQL,除了更改数据库连接信息外,还需要修改 `org.quartz.jobStore.driverDelegateClass` 参数为 `org.quartz.impl.jdbcjobstore.PostgreSQLDelegate`,以适配 PostgreSQL 的特定行为 [^3]。这进一步说明,不同数据库之间不仅驱动不同,其内部实现机制也存在差异,不能混用驱动。 --- ### 三级标题:如何正确选择数据库驱动 为了确保数据库连接的稳定性和功能性,开发者应根据所使用的数据库系统选择对应的 JDBC 驱动: - PostgreSQL:`org.postgresql.Driver` - MySQL:`com.mysql.cj.jdbc.Driver` - Oracle:`oracle.jdbc.driver.OracleDriver` - SQL Server:`com.microsoft.sqlserver.jdbc.SQLServerDriver` 每种数据库驱动都封装了与对应数据库通信的底层逻辑,包括协议解析、数据类型换、连接管理等。因此,使用错误的驱动将导致连接失败或功能异常。 --- ### 三级标题:代码示例 —— 正确连接 PostgreSQL 的方式 ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class PostgreSQLJDBC { public static void main(String[] args) { Connection conn = null; try { Class.forName("org.postgresql.Driver"); conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/testdb", "postgres", "password"); System.out.println("Connected to the PostgreSQL server successfully."); } catch (SQLException | ClassNotFoundException e) { System.out.println("Failed to connect to the PostgreSQL server."); e.printStackTrace(); } finally { if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值