Ora2Pg 配置与使用

原文地址:http://ora2pg.darold.net/documentation.html

Ora2Pg 的配置非常简单,最简单的情况下,只需要设置要导出 Oracle 数据库和导出类型,分分钟即可完成。

本文档还包含以下内容:

  • 选择导出指定表和/或字段。
  • 导出时重命名表和/或字段。
  • 选择导出指定的数据,可以为每个表添加一个 WHERE 过滤条件。
  • 在数据加载过程中,延迟数据库约束验证。
  • 对导出数据进行压缩,节省磁盘占用。
  • 更多其他选项。

数据库迁移的所有控制选项使用一个名为 ora2pg.conf 的文件进行配置。该文件中的每个配置项占用一行,由一个大写的配置名称加上空格以及一个值组成。以 # 开始的行表示注释。

配置选项没有顺序之分,选项的值在读取配置文件时进行设置。

对于只能设置一个值的配置选项,允许在配置文件中多次出现,但是只有最后一个配置值会生效。对于可以指定多个值的配置选项, 如果出现了多个配置,相应的值都会生效。如果使用 IMPORT 指令加载其他配置文件,文件中的内容将会添加到 IMPORT 指令所在的位置,所以最好在配置文件的最后导入其他文件。

通过命令行选项指定的值将会覆盖配置文件中的相应值。

使用 Ora2Pg

默认情况下,Ora2Pg 将会查找配置文件 /etc/ora2pg/ora2pg.conf;如果存在该文件,只需要执行以下命令:

/usr/local/bin/ora2pg

对于 Windows™ 系统,可以运行 perl 程序 bin 目录下的 ora2pg.bat 文件。Windows™ 用户可以在 C:\ora2pg 目录中找到一个配置模板文件。

如果想要使用其他的配置文件,只需要在命令行中指定即可:

/usr/local/bin/ora2pg -c /etc/ora2pg/new_ora2pg.conf

以下是使用 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 发送转换后的数据的速度。不会写入任何数据。

参考 http://ora2pg.darold.net/ 上的完整文档或者使用’man 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 代码以添加自定义的选项。

注意,更新 Oracle 数据库的统计信息可能会提高数据迁移的性能:

BEGIN
  DBMS_STATS.GATHER_SCHEMA_STATS
  DBMS_STATS.GATHER_DATABASE_STATS 
  DBMS_STATS.GATHER_DICTIONARY_STATS
END;

生成迁移模板

使用选项 --project_base 和 --init_project 可以创建一个导出 Oracle 数据库的项目模板,包含各种目录结构,一个配置文件,以及一个用于导出所有对象的脚本。以下是一个使用示例:

ora2pg --project_base /app/migration/ --init_project test_project
Creating project test_project.
/app/migration/test_project/
        schema/
                dblinks/
                directories/
                functions/
                grants/
                mviews/
                packages/
                partitions/
                procedures/
                sequences/
                synonyms/
                tables/
                tablespaces/
                triggers/
                types/
                views/
        sources/
                functions/
                mviews/
                packages/
                partitions/
                procedures/
                triggers/
                types/
                views/
        data/
        config/
        reports/
 
Generating generic configuration file
Creating script export_schema.sh to automate all exports.
Creating script import_all.sh to automate all imports.

示例生成了一个通用的配置文件,只需要在其中指定 Oracle 数据库连接信息;同时还生成了一个脚本文件 export_schema.sh。目录 sources/ 用于存储 Oracle 源代码,schema/ 用于存储导入 PostgreSQL 的代码。目录 reports/ 用于存储迁移成本评估生成的 html 报告。

如果想要使得自定义的默认配置文件,使用 -c 选项指定该文件的路径。Rename it with .dist suffix if you want ora2pg to apply the generic configuration values otherwise,the configuration file will be copied untouched.

配置好 Oracle 数据库连接之后,可以执行 export_schema.sh 脚本从导出各种对象类型,将输出的 DDL 文件写入 schema/ 下的子目录中。在导出完成之后,脚本将会给出用于导出数据的命令;可以在完成并验证模式对象导入之后导出相应的数据。

可以通过手动导入生成的 DDL 文件,也可以使用另一个脚本 import_all.sh 执行交互式导入。

Oracle 数据库连接配置

以下 5 个配置选项可以用于设置 Oracle 数据库连接。

ORACLE_HOME
用于设置环境变量 ORACLE_HOME, DBD::Oracle 模块使用该变量查找 Oracle 共享库。

ORACLE_DSN
设置标准 DBI DSN 格式的数据源名称。例如:

dbi:Oracle:host=oradb_host.myhost.com;sid=DB_SID;port=1521

或者:

dbi:Oracle:DB_SID

对于第二种方式,需要在 $ORACLE_HOME/network/admin/tnsnames.ora 文件或者环境变量 TNS_ADMIN 指定目录下的 tnsnames.ora 文件中定义 SID。

对于 MySQL,DSN 的定义如下:

dbi:mysql:host=192.168.1.10;database=sakila;port=3306

其中的 ‘sid’ 换成了 ‘database’。

ORACLE_USERORACLE_PWD
这两个选项用于指定连接 Oracle 数据库的用户名和密码。需要注意的是,如果可以的话最好使用 Oracle 超级管理员身份进行连接,避免数据库扫描时的访问权限问题,确保不会漏掉任何内容。

USER_GRANTS
如果使用普通用户连接 Oracle 数据库,并且该用户没有访问 DBA_… 表的权限,将该参数设置为 1。脚本将会使用 ALL_… 表。

警告:如果使用 GRANT 导出类型,必须将该选项设置为 0,否决脚本无法导出。

TRANSACTION
该选项用于修改数据导出事务的默认隔离级别。现在默认的设置是序列化事务隔离级别,用于保证导出数据的一致性。以下是一些支持的设置:

readonly: 'SET TRANSACTION READ ONLY',readwrite: 'SET TRANSACTION READ WRITE',serializable: 'SET TRANSACTION ISOLATION LEVEL SERIALIZABLE'
committed: 'SET TRANSACTION ISOLATION LEVEL READ COMMITTED',

6.2 版本之前的默认隔离级别为 READ ONLY,但是这种设置在某些情况下会破坏数据一致性,因此现在的默认设置为SERIALIZABLE。

INPUT_FILE
该参数不是用于设置 Oracle 数据库连接,它指定了一个输入文件,并且禁用了 Oracle 数据库连接。将该参数设置为一个包含了 Oracle PL/SQL 代码(例如函数、过程或者包)的文件,可以阻止 Ora2Pg 连接 Oracle 数据库,而是从该文件 and just apply his conversion tool to the content of the file. 该选项可以用于大部分的导出类型:TABLE、TRIGGER、PROCEDURE、VIEW、FUNCTION 或者 PACKAGE等。

ORA_INITIAL_COMMAND
该选项用于建立 Oracle 数据库连接后,执行一个初始化命令。例如在读取对象信息之前关闭访问限制策略,或者设置某些会话参数。该选项支持多次设置。

Oracle 数据加密传输

如果 Oracle 客户端配置了加密连接,DBD:Oracle 也会使用该加密方式进行连接和数据传输。例如,将以下内容添加到 Oracle 客户端配置文件(sqlnet.or 或 .sqlnet):

# Configure encryption of connections to Oracle
SQLNET.ENCRYPTION_CLIENT = required
SQLNET.ENCRYPTION_TYPES_CLIENT = (AES256,RC4_256)
SQLNET.CRYPTO_SEED = 'should be 10-70 random characters'

如果设置了上述加密传输,任何使用 Oracle 客户端连接到数据库的工具都会使用这种加密方式。

例如,Perl 的 DBI 模块通过DBD-Oracle 连接 Oracle 数据库,后者使用 Oracle 客户端连接数据库。如果 Oracle 客户端配置了加密连接,Perl 同样使用加密的方式连接 Oracle 数据库。

连接测试

设置好 Oracle 数据库的 DSN 之后,可以执行以下命令测试数据库的连接:

ora2pg -t SHOW_VERSION -c config/ora2pg.conf

以上命令将会显示 Oracle 数据库的版本。

故障解决

如果 output.sql 文件中只导出了关于 Pg 事务的头部和尾部信息,可能的原因有两个。ora2pg 脚本输出了一个 ORA-XXX 错误,意味着 DSN 或者用户名/密码错误,检查相关设置后再次运行脚本。脚本没有任何出错信息,但是输出文件为空:用户缺少访问数据库对象的权限。尝试使用超级用户连接 Oracle,或者检查 USER_GRANTS 选项,以及后文中的 SCHEMA 选项。

LOGFILE
默认情况下,所有的消息都会发送到标准输出。如果为该选项指定一个文件路径,所有的输出信息将会追加到该文件中。

未完,待续。。。

人生本来短暂,你又何必匆匆!点个赞再走吧!

相关文章

文章浏览阅读773次,点赞6次,收藏9次。【代码】c# json字符...
文章浏览阅读8.7k次,点赞2次,收藏17次。此现象一般定位到远...
文章浏览阅读2.8k次。mysql脚本转化为oracle脚本_mysql建表语...
文章浏览阅读2.2k次。cx_Oracle报错:cx_Oracle DatabaseErr...
文章浏览阅读1.1k次,点赞38次,收藏35次。本文深入探讨了Or...
文章浏览阅读1.5k次。默认自动收集统计信息的时间为晚上10点...