[toc]

#导入MD文档图片#使用ora2pg迁移Oracle19c到PG13并使用OGG配置实时同步

一、项目目标

1、使用ora2pg迁移Oracle 19.3数据到PG13.2

  • 使用swingbench压测生成oracle数据
  • 部署ora2pg工具,实现Oracle数据迁移到PG数据库

2、配置OGG实时同步并实现告警

  • 部署OGG 19.1,配置实时同步
  • 配置OGG director的监控告警功能
  • 用swingbench压测生成批量事务,测试OGG实时同步功能

二、环境配置

2.1、环境规划

#导入MD文档图片#使用ora2pg迁移Oracle19c到PG13并使用OGG配置实时同步

DG环境规划:

项目 Oracle源库 PG目标库
db 类型 单实例 单实例
db version 19.3.0.0.0 13.2
OS版本 CentOS7.6 64位 CentOS7.6 64位
OS hostname lhrora19c lhrpg13
IP地址 192.168.68.66 192.168.68.67
dbname lhrsdb lhrdb
监听端口 1521 5432
映射的主机端口 1528 25432
SOFT_HOME /opt/oracle/product/19c/dbhome_1 /pg13/pg13
安装用户 oracle pg13
同步用户 SOE soe

软件安装:

主机 需要的软件
源端(192.168.68.66) Oracle 19c database、swingbench、ogg软件
目标端(192.168.68.67) PG 13.2、ora2pg、ogg软件

2.2、申请主机环境

-- 创建本次的网络
docker network create --subnet=192.168.68.0/16 mhalhr
docker network inspect mhalhr

-- 创建Oracle主机,已安装Oracle 19c数据库
docker rm -f lhrora19c
docker run -itd -h lhrora19c --name lhrora19c  \
  -p 11521:1521 -p 15500:5500 -p 15501:5501  -p 13389:3389 \
  --network mhalhr --ip 192.168.68.66 \
  --privileged=true \
  lhrbest/oracle19clhr_rpm_db_12.2.0.3:2.0 init

-- 创建PG主机,已安装PG 13数据库
docker rm -f lhrpg13
docker run -d --name lhrpg13 -h lhrpg13 \
  --net=mhalhr --ip 192.168.68.67 \
  -p 25432:5432  \
  -v /sys/fs/cgroup:/sys/fs/cgroup \
  --privileged=true \
  lhrbest/lhrpgall:1.0 /usr/sbin/init

-- 添加网卡
docker network connect bridge lhrora19c
docker network connect bridge lhrpg13

-- 重启主机
docker restart lhrora19c  lhrpg13

-- 进入主机
docker exec -it lhrora19c bash
docker exec -it lhrpg13 bash

2.3、源端使用swingbench生成压测数据

2.3.1、安装swingbench

下载地址:

http://www.dominicgiles.com/downloads.html

每个swingbench的zip 包里都包含了Linux/Unix 和Windows 文件,所以只需要从官方下载之后,解压缩就可以了。解压之后bin目录下是linux的,winbin目录下是windows的。

需要jdk 1.8环境。


wget https://github.com/domgiles/swingbench-public/releases/download/production/swingbenchlatest.zip
unzip swingbenchlatest.zip -d /usr/local
chown -R oracle.oinstall /usr/local/swingbench/

su - oracle
cat >> ~/.bash_profile <<"EOF"
export JAVA_HOME=/opt/oracle/product/19c/dbhome_1/jdk
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar

export PATH=/usr/local/swingbench/bin:$PATH

EOF

source ~/.bash_profile

2.3.2、使用swingbench生成数据

-- 启动数据库和监听
. oraenv
lhrsdb

lsnrctl start

sqlplus / as sysdba
startup
alter user system identified by lhr;

-- swingbench造数据
oewizard  -s -create -c /usr/local/swingbench/wizardconfigs/oewizard.xml -create \
-version 2.0  -cs //192.168.68.66:1521/lhrsdb -dba "sys as sysdba" -dbap lhr -dt thin \
-ts users -u SOE -p lhr -allindexes  -scale 0.001  -tc 16 -v -cl

-s是静默,-create表示创建数据,-c是指定配置文件,就是oewizard.xml,-version指定swingbench版本,-cs表示数据库连接串,-dba表示连接到oracle数据库的用户,-dbap表示连接到oracle数据库的密码,-dt表示连接类型,-ts是指定表空间为users, -u表示压测的用户,-p表示压测用户的密码,-scale是数据量,1就是1G,0.001就是1Mb数据,-tc 是并发度,-allindexes是支持所有的索引类型,-v显示详细信息,-cl表示运行在字符模式。

数据量:

SYS@lhrsdb> col TABLE_NAME format a30
SYS@lhrsdb> SELECT a.table_name,a.num_rows FROM dba_tables a where a.OWNER='SOE'  ;

TABLE_NAME             NUM_ROWS
-------------------- ----------
CUSTOMERS                  1000
ADDRESSES                  1500
CARD_DETAILS               1500
WAREHOUSES                 1000
ORDER_ITEMS                7168
ORDERS                     1430
INVENTORIES              898934
PRODUCT_INFORMATION        1000
LOGON                      2383
PRODUCT_DESCRIPTIONS       1000
ORDERENTRY_METADATA           0

11 rows selected.

SYS@lhrsdb> select object_type,count(*) from dba_objects where owner='SOE' group by object_type;

OBJECT_TYPE                                      COUNT(*)
---------------------------------------------- ----------
INDEX                                                  27
PACKAGE BODY                                            1
PACKAGE                                                 1
SEQUENCE                                                5
TABLE                                                  11
VIEW                                                    2

6 rows selected.

SYS@lhrsdb> select sum(bytes)/1024/1024 from dba_segments where owner='SOE';

SUM(BYTES)/1024/1024
--------------------
              279.25

三、使用ora2pg迁移Oracle 19.3数据到PG13.2

3.1、Ora2Pg 介绍

3.1.1、Ora2Pg 简介

Ora2Pg 是一个免费的工具,用于将 Oracle 或MySQL数据库迁移到 PostgreSQL 数据库里。它连接到 Oracle或MySQL 数据库,自动扫描并抽取其结构和数据,然后生成用于实现迁移的SQL 脚本,利用该脚本可以将数据库结构和数据加载到 PostgreSQL 数据库中。

最新版的 Ora2Pg 新功能:

- Export full database schema (tables, views, sequences, indexes), with
  unique, primary, foreign key and check constraints.
- Export grants/privileges for users and groups.
- Export range/list partitions and sub partitions.
- Export a table selection (by specifying the table names).
- Export Oracle schema to a PostgreSQL 8.4+ schema.
- Export predefined functions, triggers, procedures, packages and
  package bodies.
- Export full data or following a WHERE clause.
- Full support of Oracle BLOB object as PG BYTEA.
- Export Oracle views as PG tables.
- Export Oracle user defined types.
- Provide some basic automatic conversion of PLSQL code to PLPGSQL.
- Works on any platform.
- Export Oracle tables as foreign data wrapper tables.
- Export materialized view.
- Show a  report of an Oracle database content.
- Migration cost assessment of an Oracle database.
- Migration difficulty level assessment of an Oracle database.
- Migration cost assessment of PL/SQL code from a file.
- Migration cost assessment of Oracle SQL queries stored in a file.
- Generate XML ktr files to be used with Penthalo Data Integrator (Kettle)
- Export Oracle locator and spatial geometries into PostGis.
- Export DBLINK as Oracle FDW.
- Export SYNONYMS as views.
- Export DIRECTORY as external table or directory for external_file extension.
- Full MySQL export just like Oracle database.
- Dispatch a list of SQL orders over multiple PostgreSQL connections
- Perform a diff between Oracle and PostgreSQL database for test purpose.

3.1.2、ora2pg 时允许指定的所有命令行参数

Usage: ora2pg [-dhpqv --estimate_cost --dump_as_html] [--option value]

-a | --allow str  : 指定允许导出的对象列表,使用逗号分隔。也可以与 SHOW_COLUMN 选项一起使用。
-b | --basedir dir: 设置默认的导出目录,用于存储导出结果。
-c | --conf file  : 设置非默认的配置文件,默认配置文件为 /etc/ora2pg/ora2pg.conf。
-d | --debug      : 使用调试模式,输出更多详细信息。
-D | --data_type STR : 通过命令行设置数据类型转换。
-e | --exclude str: 指定导出时排除的对象列表,使用逗号分隔。也可以与 SHOW_COLUMN 选项一起使用。
-h | --help       : 显示帮助信息。
-g | --grant_object type : 导出指定类型的对象上的授权信息,取值参见 GRANT_OBJECT 配置项。
-i | --input file : 指定要导入的 Oracle PL/SQL 代码文件,导入文件时不需要连接到 Oracle 数据库。
-j | --jobs num   : 设置用于发送数据到 PostgreSQL 的并发进程数量。
-J | --copies num : 设置用于从 Oracle 导出数据的并发连接数量。
-l | --log file   : 设置日志文件,默认为 stdout。
-L | --limit num  : 导出数据时,每次写入磁盘之前在内存中缓冲的记录数量,默认值为 10000。
-m | --mysql      : 导出 MySQL 数据库。
-n | --namespace schema : 设置需要导出的 Oracle 模式。
-N | --pg_schema schema : 设置 PostgreSQL 中的搜索路径 search_path。
-o | --out file   : 设置导出的 SQL 文件的存储路径。默认值为当前目录下的 output.sql 文件。
-p | --plsql      : 启用 PLSQL 代码到 PLPGSQL 代码的转换。
-P | --parallel num: 同时导出多个表,设置并发数量。
-q | --quiet      : 不显示进度条。
-s | --source DSN : 设置 Oracle DBI 数据源。
-t | --type export: 设置导出类型。该参数将会覆盖配置文件中的导出类型(TYPE)。
-T | --temp_dir DIR: 为多个同时运行的 ora2pg 脚本指定不同的临时存储目录。
-u | --user name  : 设置连接 Oracle 数据库连接的用户名。也可以使用 ORA2PG_USER 环境变量。
-v | --version    : 显示 Ora2Pg 版本信息并退出。
-w | --password pwd : 设置连接 Oracle 数据库的用户密码。也可以使用 ORA2PG_PASSWD 环境变量。
--forceowner      : 导入数据时,强制 ora2pg 将导入 PostgreSQL 的表和序列的拥有者设置为连接 Oracle 数据库时的用户。如果设置为指定的用户名,所有导入的对象属于该用户。默认情况下,对象的拥有者为连接 Pg 数据库的用户。
--nls_lang code: 设置 Oracle 客户端的 NLS_LANG 编码。
--client_encoding code: 设置 PostgreSQL 客户端编码。
--view_as_table str: 将视图导出为表,多个视图使用逗号分隔。
--estimate_cost   : 在 SHOW_REPORT 结果中输出迁移成本评估信息。
--cost_unit_value minutes: 成本评估单位,使用分钟数表示。默认值为 5 分钟,表示一个 PostgreSQL 专家迁移所需的时间。如果是第一次迁移,可以设置为 10 分钟。
   --dump_as_html     : 生成 HTML 格式的迁移报告,只能与 SHOW_REPORT 选项一起使用。默认的报告是一个简单的文本文件。
   --dump_as_csv      : 与上个参数相同,但是生成 CSV 格式的报告。
   --dump_as_sheet    : 生成迁移评估时,为每个数据库生成一行 CSV 记录。
   --init_project NAME: 创建一个ora2pg 项目目录结构。项目的顶级目录位于根目录之下。
   --project_base DIR : 定义ora2pg 项目的根目录,默认为当前目录。
   --print_header     : 与 --dump_as_sheet 一起使用,输出 CSV 标题信息。
   --human_days_limit num : 设置迁移评估级别从 B 升到 C 所需的人工日数量。默认值为 5 人工日。
   --audit_user LIST  : 设置查询 DBA_AUDIT_TRAIL 表时需要过滤的用户名,多个用户使用逗号分隔。该参数只能用于 SHOW_REPORT 和 QUERY 导出类型。
   --pg_dsn DSN       : 设置在线导入时的 PostgreSQL 数据源。
   --pg_user name     : 设置连接 PostgreSQL 的用户名。
   --pg_pwd password  : 设置连接 PostgreSQL 的用户密码。
   --count_rows       : 在 TEST 方式下执行真实的数据行数统计。
   --no_header        : 在导出文件中不添加 Ora2Pg 头部信息。
   --oracle_speed     : 用于测试 Oracle 发送数据的速度。不会真的处理或者写入数据。
   --ora2pg_speed     : 用于测试 Ora2Pg 发送转换后的数据的速度。不会写入任何数据。

如果执行成功,ora2pg 返回 0;如果出现错误,返回 1 。如果某个子进程被中断,并且用户收到了警告信息:“WARNING: an error occurs during data export. Please check what’s happen.”,ora2pg 将会返回 2 。大多数情况下是内存溢出(OOM)的问题,可以先尝试减小 DATA_LIMIT 参数的值。

对于开发者而言,可以在 ora2pg Perl 脚本中添加自定义的选项;因为 ora2pg.conf 文件中的所有配置选项都会以小写形式传递给新建的 Ora2Pg 对象实例。参考 ora2pg 代码以添加自定义的选项。

3.2、安装Ora2Pg

官网:https://ora2pg.darold.net/

GitHub:https://github.com/darold/ora2pg

文档:https://ora2pg.darold.net/documentation.html

下载:https://sourceforge.net/projects/ora2pg/

为使安装能够顺利通过,在安装 Ora2Pg 之前必须先确保系统已经安装了 Perl 模块以及 DBI、DBD::Oracle 模块。若需要直接导入到 PostgreSQL 则还需要安装 DBD::Pg 模块。


-- 在编译安装了PG的机器上安装ora2pg

-- 安装依赖包,perl版本5.10以上
yum install -y gcc perl-DBD-Pg perl perl-devel perl-DBI  perl-CPAN bzip2  \
perl-ExtUtils-eBuilder perl-ExtUtils-MakeMaker perl-Time-HiRes perl-tests  perf cpan

perl -MCPAN -e 'install DBI'
perl -MCPAN -e 'install DBD::Oracle'
perl -MCPAN -e 'install DBD::Pg'

-- =============安装“DBI”=============

perl -MCPAN -e 'install DBI'

wget http://www.cpan.org/authors/id/T/TI/TIMB/DBI-1.643.tar.gz
tar -zxvf DBI-1.643.tar.gz
cd DBI-1.643
perl Makefile.PL
make &&  make install

-- =============安装“DBD::Oracle”=============
https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html
wget https://download.oracle.com/otn_software/linux/instantclient/211000/oracle-instantclient-jdbc-21.1.0.0.0-1.x86_64.rpm
wget https://download.oracle.com/otn_software/linux/instantclient/211000/oracle-instantclient-devel-21.1.0.0.0-1.x86_64.rpm
wget https://download.oracle.com/otn_software/linux/instantclient/211000/oracle-instantclient-sqlplus-21.1.0.0.0-1.x86_64.rpm
wget https://download.oracle.com/otn_software/linux/instantclient/211000/oracle-instantclient-basic-21.1.0.0.0-1.x86_64.rpm

docker cp oracle-instantclient-basic-21.1.0.0.0-1.x86_64.rpm    lhrpg13:/soft/
docker cp oracle-instantclient-devel-21.1.0.0.0-1.x86_64.rpm    lhrpg13:/soft/
docker cp oracle-instantclient-jdbc-21.1.0.0.0-1.x86_64.rpm lhrpg13:/soft/
docker cp oracle-instantclient-sqlplus-21.1.0.0.0-1.x86_64.rpm  lhrpg13:/soft/
rpm -ivh *.rpm

cat >> /root/.bashrc << "EOF"
export ORACLE_HOME=/usr/lib/oracle/21/client64
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
EOF

source  /root/.bashrc

-- 在线安装
export ORACLE_HOME=/usr/lib/oracle/21/client64
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
perl -MCPAN -e 'install DBD::Oracle'

-- 离线编译安装
wget http://www.cpan.org/authors/id/M/MJ/MJEVANS/DBD-Oracle-1.80.tar.gz
tar -zxvf DBD-Oracle-1.80.tar.gz
cd DBD-Oracle-1.80
perl Makefile.PL
make -j 8 && make install

-- =============安装“DBD::Pg”=============
-- /pg13/pg13/bin/pg_config
perl -MCPAN -e 'install DBD::Pg'

wget http://www.cpan.org/authors/id/T/TU/TURNSTEP/DBD-Pg-3.14.2.tar.gz
export ORACLE_HOME=/usr/lib/oracle/21/client64
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
tar -zxvf DBD-Pg-3.14.2.tar.gz
cd DBD-Pg-3.14.2
perl Makefile.PL  # 输入/pg13/pg13/bin/pg_config
make -j 8 && make install

-- =============安装“ora2pg”=============
wget https://udomain.dl.sourceforge.net/project/ora2pg/21.1/ora2pg-21.1.tar.bz2
-- wget https://codeload.github.com/darold/ora2pg/tar.gz/refs/tags/v21.1
tar xjf ora2pg-21.1.tar.bz2
cd ora2pg-21.1/
perl Makefile.PL
make && make install

[root@lhrpg13 ~]# which ora2pg
/usr/local/bin/ora2pg
[root@lhrpg13 ~]# ora2pg --version
Ora2Pg v21.1

-- 检查所有软件是否已安装
cat > /root/check.pl <<"EOF"
#!/usr/bin/perl
use strict;
use ExtUtils::Installed;
my $inst= ExtUtils::Installed->new();
my @modules = $inst->modules();
foreach(@modules)
{
        my $ver = $inst->version($_) || "???";
        printf("%-12s --  %s\n", $_, $ver);  
}
exit;
EOF

[root@lhrpg13 ~]# perl /root/check.pl 
DBD::Oracle  --  1.80
DBD::Pg      --  3.14.2
DBI          --  1.643
Ora2Pg       --  21.1
Perl         --  5.16.3

3.3、创建配置文件

配置参考: https://ora2pg.darold.net/documentation.html#CONFIGURATION

首先从示例文件复制一份,然后根据实际情况更改配置文件相关参数:

cp /etc/ora2pg/ora2pg.conf.dist /etc/ora2pg/ora2pg.conf

cat /etc/ora2pg/ora2pg.conf.dist  | grep -v ^# | grep -v ^$ >  /etc/ora2pg/ora2pg.conf

[root@lhrpg13 ora2pg]# cat /etc/ora2pg/ora2pg.conf.dist  | grep -v ^# | grep -v ^$ | wc -l
113

大约110多个参数。

3.3.1、导出表结构的配置文件

-- 表结构、约束(主外键等)、索引等
cat > /etc/ora2pg/ora2pg_table_ddl.conf <<"EOF"
ORACLE_HOME        /usr/lib/oracle/21/client64
ORACLE_DSN         dbi:Oracle:host=192.168.68.66;sid=lhrsdb;port=1521
#ORACLE_DSN        dbi:Oracle:tns_ora19c
ORACLE_USER        system
ORACLE_PWD         lhr
SCHEMA             SOE
EXPORT_SCHEMA      1
CREATE_SCHEMA      1
TYPE               TABLE
PG_NUMERIC_TYPE    0
PG_INTEGER_TYPE    1
DEFAULT_NUMERIC    float
SKIP               fkeys checks
#SKIP              keys pkeys ukeys indexes checks
NLS_LANG           AMERICAN_AMERICA.UTF8
OUTPUT_DIR         /tmp
OUTPUT             ora2pg_table_ddl.sql

PG_VERSION         13

EOF

3.3.2、导出其它对象的配置文件


cat > /etc/ora2pg/ora2pg_other_ddl.conf <<"EOF"
ORACLE_HOME        /usr/lib/oracle/21/client64
ORACLE_DSN         dbi:Oracle:host=192.168.68.66;sid=lhrsdb;port=1521
#ORACLE_DSN        dbi:Oracle:tns_ora19c
ORACLE_USER        system
ORACLE_PWD         lhr
SCHEMA             SOE
EXPORT_SCHEMA      1
CREATE_SCHEMA      1
TYPE               PACKAGE,PROCEDURE,TRIGGER,FUNCTION,VIEW,GRANT,SEQUENCE,MVIEW,TYPE,SYNONYM
PG_NUMERIC_TYPE    0
PG_INTEGER_TYPE    1
DEFAULT_NUMERIC    float
SKIP               fkeys
#SKIP              keys pkeys ukeys indexes checks
NLS_LANG           AMERICAN_AMERICA.UTF8
OUTPUT_DIR         /tmp
OUTPUT             ora2pg_other_ddl.sql

PG_VERSION         13

EOF

3.3.3、导出表数据的配置文件

cat > /etc/ora2pg/ora2pg_table_data.conf <<"EOF"
ORACLE_HOME        /usr/lib/oracle/21/client64
ORACLE_DSN         dbi:Oracle:host=192.168.68.66;sid=lhrsdb;port=1521
#ORACLE_DSN        dbi:Oracle:tns_ora19c
ORACLE_USER        system
ORACLE_PWD         lhr
SCHEMA             SOE
TYPE               COPY
PG_NUMERIC_TYPE    0
PG_INTEGER_TYPE    1
DEFAULT_NUMERIC    float
SKIP               fkeys checks
#SKIP              fkeys pkeys ukeys indexes checks
NLS_LANG           AMERICAN_AMERICA.UTF8
OUTPUT_DIR         /tmp
OUTPUT             ora2pg_table_data.sql

PG_DSN             dbi:Pg:dbname=lhrdb;host=192.168.68.67;port=5432
PG_USER            postgres
PG_PWD             lhr
PG_SCHEMA          soe
PG_VERSION         13

EOF