[原创]从Oracle和Microsoft Sql Server迁移到PostgreSQL Plus Advanced Server

时间:2023-03-08 15:36:51
[原创]从Oracle和Microsoft Sql Server迁移到PostgreSQL Plus Advanced Server

一、了解PPAS的迁移方式
1、在线迁移和离线迁移
使用Migration Studio或Migration Toolkit直接向PPAS数据库进行对象定义和数据表中数据的迁移称为在线迁移,生成要迁移对象的脚本,在随后的某一时刻在PPAS中执行这些脚本用来恢复对象定义称为离线迁移。

2、迁移过程
1)明确需要对哪些数据库对象和数据进行迁移;
2)了解在迁移过程中可能遇到的问题;
3)准备迁移环境,安装必要的软件,建立好服务器之间的连接;
4)迁移过程中,如果有大量数据需要进行处理,那么应在移动数据前先迁移模式中的对象定义(DDL),并验证DDL的迁移结果,并解决所有出现的问题;
5)对数据进行迁移;
6)确认数据迁移结果,并解决在迁移结果概要中所报告的问题;
7)对应用程序进行转换,使应用程序可以在PPAS环境中运行;
8)进行系统性能测试,对新数据库服务器进行性能调整

二、一个简单的迁移实例
1、准备实验环境
PPAS9.2,RHEL6.3 64bit,Oracle 10g 10.2.0.1/4

安装Oracle
Oracle版本:10.2.0.1
全局数据库名:oraedb SID:oraedb
IP:192.168.1.115
监听端口:1521

安装PPAS
PPAS版本:9.2.1.3
IP地址:192.168.1.221
其他默认安装

第三方驱动下载地址
http://www.enterprisedb.com/downloads/third-party-jdbc-drivers
2、准备jdbc驱动
挂载光盘或ISO镜像文件作源mount -o loop -t iso9660 /home/rhel_6_3_64bit.iso /mnt/cdrom
在PPAS主机上配置好redhat的yum源之后安装jdk
[root@rhel home]# yum install java-1.6.0-openjdk
[root@rhel home]# java -version
我安装的Oracle版本是10.2.0.1,PPAS主机上的jdk版本是1.6.0_24,在Oracle官方网站下载对应的jdbc驱动。关于jdbc驱动驱动包的名称和它们的作用:
classes12.jar  - JDK 1.2 和 JDK 1.3下使用
classes12_g.jar - 和classes12.jar相同, 但是包中的类使用"javac -g"命令编译,包含调试信息.
classes12dms.jar - 和classes12.jar相同, 但是包含一些附加的代码支持Oracle Dynamic Monitoring Service.
classes12dms_g.jar - 和 classes12dms.jar相同,但是包中的类使用"javac -g"编译,包含调试信息.
ojdbc14.jar - JDK 1.4下使用
ojdbc14_g.jar - 和ojdbc14.jar相同,但是包中的类使用"javac -g"编译,包含调试信息.
ocrs12.jar - 引入了javax.sql.rowset接口, 如CachedRowSet 和 WebRowSet. 可以在 JDK 1.2, 1.3, 和 1.4下使用.
orai18n.jar - 使用在JDK 1.2, 1.3 和 1.4下的NLS(National Language Support,国家语言支持)类.这个jar包替换了老的nls_charset jar/zip 文件.
他们在Oracle安装目录中的具体地址:/oracle/product/10.2.0/db_1/jdbc,oracle的官方网站,sun官方站点都有。
Java是可以向下兼容的,使用JDK1.6,用classes12.jar是可以使用的,当然用ojdbc14.jar 更没问题,但是如果JDK是1.3,那么只能用classes12.jar。
将JDBC驱动复制到PPAS的以下目录中:
[root@rhel ~]# cp ~/*.jar /opt/PostgresPlus/9.2AS/jre/lib/ext/
[root@rhel ~]# ls /opt/PostgresPlus/9.2AS/jre/lib/ext/

3、从Oracle10g迁移到PPAS-9.2
Migration Tookit的可执行文件为安装目录下bin中的runMTK。
4、编辑tookit.properties文件
[root@rhel ~]# vim /opt/PostgresPlus/9.2AS/etc/toolkit.properties
以下是文件内容:
SRC_DB_URL=jdbc:oracle:thin:@192.168.1.115:1521:oraedb
SRC_DB_USER=scott
SRC_DB_PASSWORD=TIGER

TARGET_DB_URL=jdbc:edb://localhost:5444/oraedb
TARGET_DB_USER=scott
TARGET_DB_PASSWORD=TIGER
5、给准备迁移的模式的用户赋予dba角色并执行迁移动作
我这里测试是用scott用户,首先在Oracle中临时给scott用户赋予所有权限
SQL> grant dba to scott;
创建与准备迁移的Oracle模式所有者相同的用户,本例为scott;

6、迁移
[root@rhel bin]# ./runMTK.sh -users scott scott

至此,oracle10g向PPAS9.2的迁移操作成功!

三、PPAS与Oracle在dblink下的迁移
1、环境准备:
ppas9.2.1.3:
ip:192.168.1.111

oracle10g 10.2.0.1
ip:192.168.1.115

2、创建dblink
这里要创建的是oci-dblink,首先配置PPAS的OCI库。先从oracle官网下载instance client 11,解压后放在/opt/目录中。
修改目录的所有者为enterprisedb:
[root@edbserver opt]# chown -R enterprisedb.enterprisedb instantclient_11_2/
建名称为libclntsh.so的软连接指向libclntsh.so.11.1
[root@edbserver opt]# ln -s /opt/instantclient_11_2/libclntsh.so.11.1 /opt/instantclient_11_2/libclntsh.so
在迁移时可能会遇到错误ERROR: unable to load OCI library: libnnz11.so: cannot open shared object file: No such file or directory,复制libnnz11.so到系统lib64目录去便可以解决。
[root@edbserver bin]# cp /opt/instantclient_11_2/libnnz11.so /lib64/

从oracle数据库服务器复制tnsnames.ora文件到instance client目录
[root@edbserver ~]# scp root@192.168.1.115:/oracle/product/10.2/db_1/network/admin/tnsnames.ora /opt/instantclient_11_2/network/admin/
编辑root用户的bashrc文件
[root@edbserver ~]# vim ~/.bashrc
加入Oracle相关的环境变量并使之生效
export ORACLE_HOME=/opt/instantclient_11_2  
export PATH=$PATH:$ORACLE_HOME
export TNS_ADMIN=$ORACLE_HOME/network/admin  
export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH
[root@edbserver ~]# source ~/.bashrc
[root@edbserver ~]# echo $ORACLE_HOME
运行sqlplus进行测试
[root@edbserver instantclient_11_2]# sqlplus scott/tiger@192.168.1.115:/oraedb
这时sqlplus连接Oracle数据库已经成功。

3、编辑postgresql.conf文件
[root@edbserver ~]# vim /opt/PostgresPlus/9.2AS/data/postgresql.conf
修改oracle_home参数的值为oci库所在位置:/opt/instantclient_11_2,这个参数仅仅在使用oracle oci才有用。
编辑完之后需要做一次重启操作:
[root@edbserver opt]# /etc/init.d/ppas-9.2 restart

4、使用psql创建dblink
[root@edbserver ~]# psql -U enterprisedb
edb=# CREATE PUBLIC DATABASE LINK edblinkora CONNECT TO scott IDENTIFIED BY 'tiger' USING oci '//192.168.1.115/oraedb';
其中,edblinkora是dblink的名称,oracle为scott用户,密码tiger,使用oci,最后是连接oracle数据库的连接字符串。提示“CREATE DATABASE LINK”表明dblink已经创建成功。

5、测试dblink
[root@edbserver ~]# psql -U enterprisedb  
edb=# select * from dept@edblinkora;

以上是PPAS与Oracle的DBLINK,下面准备迁移

6、将jdbc驱动copy到PPAS的驱动目录
[oracle@oraserver lib]$ scp /oracle/product/10.2/db_1/jdbc/lib/ojdbc14.jar root@192.168.1.111:/opt/PostgresPlus/9.2AS/jre/lib/ext/
这里需要注意一点:在复制oracle的jdbc驱动时,不要用*.*全部复制,应该需要哪一个就复制哪一个,否则会有错误Exception in thread "main" java.lang.NoClassDefFoundError: oracle/dms/instrument/ExecutionContextForJDBC。在这里我只需要ojdbc14.jar这一个jar包。

7、编辑toolkit.properties文件
[root@rhel ~]# vim /opt/PostgresPlus/9.2AS/etc/toolkit.properties
以下是文件内容:
SRC_DB_URL=jdbc:oracle:thin:@192.168.1.115:1521:oraedb
SRC_DB_USER=scott
SRC_DB_PASSWORD=tiger

TARGET_DB_URL=jdbc:edb://localhost:5444/oraedb
TARGET_DB_USER=enterprisedb
TARGET_DB_PASSWORD=000000

8、开始迁移
[root@edbserver ~]# cd /opt/PostgresPlus/9.2AS/bin
[root@edbserver bin]# ./runMTK.sh -users scott -copyViaDBLinkOra scott

四、Microsoft SQL Server向PPAS的迁移
(本次实验使用的是MS SQL Server2005与2008)
1、编辑tookit.properties文件
[root@rhel ~]# vi /opt/PostgresPlus/9.2AS/etc/toolkit.properties
SRC_DB_URL=jdbc:jtds:sqlserver://192.168.1.65:53024/bookmanage
SRC_DB_USER=sa
SRC_DB_PASSWORD=111111

TARGET_DB_URL=jdbc:edb://localhost:5444/bookmanage
TARGET_DB_USER=enterprisedb
TARGET_DB_PASSWORD=111111

2、准备驱动
下载jtds驱动并放置在/opt/PostgresPlus/9.2AS/jre/lib/ext/目录中。
下载地址:http://sourceforge.net/projects/jtds/
这里使用的数据库是SQL Server2005,经过测试,使用jtds-1.2.6版本驱动可以正常迁移。

3、迁移
[root@RHEL bin]# ./runMTK.sh -sourcedbtype sqlserver -targetSchema enterprisedb dbo
-targetSchema为ppas中的目标模式名称,但不能选择information_schema、dbo、sys 或 pg_catalog 作为目标架构。

-sourcedbtype的值默认为oracle,这里使用sqlserver,所以需要显式的指定-sourcedbtype的值。

4、对MS SQL Server的迁移的建议
目前测试过程中发现MS SQL Server的数据类型有money建议修改为numeric(12,4)。

五、迁移相关参数补充
linux下./runMTK.sh的基本参数
./runMTK.sh schema_name
schema_name参数是在源数据库中需要迁移的模式名称,在runMTK命令中必须至少包含一个schema_name的参数

-sourcedbtype db_type
指定源数据库类型,db_type的值:mysql,oracle,sqlserver,sybase

-offlineMigration
离线迁移
[root@rhel ~]# mkdir /opt/mtk/
[root@rhel ~]# ./runMTK.sh -users scott -offlineMigration /opt/mtk scott

-schemaOnly和-dataOnly
在缺省情况下,当迁移模式时,Migration tookit同时导入数据和对象定义(DDL),如果想只导入数据或对象定义(DDL),可以使用这两个参数。

还有其他的迁移选项开关,可以参考PPAS官方文档《Postgres_Plus_Migration_Guide_9_2.pdf》。