原 【DB宝63】项目分享:使用ora2pg迁移Oracle19c到PG13并使用OGG配置实时同步
Tags: Oracle原创PGMySQLOGG监控迁移ora2pg
三、使用ora2pg迁移Oracle 19.3数据到PG13.2
3.1、Ora2Pg 介绍
3.1.1、Ora2Pg 简介
Ora2Pg 是一个免费的工具,用于将 Oracle 或MySQL数据库迁移到 PostgreSQL 数据库里。它连接到 Oracle或MySQL 数据库,自动扫描并抽取其结构和数据,然后生成用于实现迁移的SQL 脚本,利用该脚本可以将数据库结构和数据加载到 PostgreSQL 数据库中。
最新版的 Ora2Pg 新功能:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | - 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 时允许指定的所有命令行参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | 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
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 模块。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | -- 在编译安装了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
首先从示例文件复制一份,然后根据实际情况更改配置文件相关参数:
1 2 3 4 5 6 | 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 |