迁徙 Oracle PostgreSQL 到 没有之一! 最好用的工具

引见

ora_migrator是一个用于db_migrator的插件,它经常使用oracle_fdw将 Oracle 数据库迁徙到 PostgreSQL。

请浏览db_migrator文档以失掉经常使用说明;本文仅涵盖插件的设置以及普通文档中未涵盖的其余性能。

除此之外,ora_migrator还提供从 Oracle 到 PostgreSQL 的复制性能,可用于从 Oracle 启动简直零停机时期的迁徙。无关详细信息,请参阅复制。

请留意,由于 Oracle 中的形式称号通常为大写,因此,您须要为db_migrator函数的only_schemas参数,经常使用大写的形式称号。

选项

以下选项可用于db_migrate_prepare、db_migrate_mkforeign和db_migrate:

前提条件

•您须要 PostgreSQL 9.5 或更高版本。

•必定装置oracle_fdw和db_migrator裁减。

•必定为访问的 Oracle 数据库定义好外部主机。

•调用create_oraviews函数以创立外部表的用户,必定具有外部主机的USAGE权限。

•调用create_oraviews函数的用户必定存在用户映射。

•用户映射中经常使用的 Oracle 用户,必定具有读取以下 Oracle 系统视图的权限:您可以选用改为授予用户SELECT ANY DICTIONARY系统权限,它包括了上述一切权限。

•DBA_COL_PRIVS

•DBA_CONS_COLUMNS

•DBA_CONSTRAINTS

•DBA_IND_COLUMNS

•DBA_IND_EXPRESSIONS

•DBA_INDEXES

•DBA_MVIEWS

•DBA_MVIEW_LOGS

•DBA_PROCEDURES

•DBA_SEGMENTS

•DBA_SEQUENCES

•DBA_SOURCE

•DBA_TAB_COLUMNS

•DBA_TAB_PRIVS

•DBA_TABLES

•DBA_TRIGGERS

•DBA_USERS

•DBA_VIEWS

•要经常使用复制,用户必定具有CREATE TABLE和CREATE TRIGGER权限。若要对不属于指定 Oracle 用户的表经常使用复制,该用户必定具有CREATE ANY TABLE、CREATE ANY INDEX、CREATE ANY TRIGGER、DROP ANY TABLE、DROP ANY TRIGGER和SELECT ANY TABLE权限(这是创立、删除日志记载表和触发器所必需的)。

裁减创立的对象

迁徙函数

db_migrator回调函数db_migrator_callback(),前往裁减提供的迁徙函数。无关详细信息,请参阅db_migrator文档。

“元数据视图创立函数”create_oraviews,会在 FDW 阶段创立一些附加对象,这些对象提供了对 Oracle 迁徙有协助的信息:

包定义

packages  package_name  is_body  source 

•is_body,关于包规范定义是FALSE,关于包体定义是TRUE

此视图可用于简化包对象的转换。

segments  segment_name  segment_type  bytes  

该外表关于评价 Oracle 中表和索引的大小最有用。

迁徙老本预算

migration_cost_estimate  task_type task_content task_unit migration_hours   

该视图有助于评价一个 Oracle 数据库的迁徙老本。

其余对象

表函数 oracle_test_table

此函数测试一个 Oracle 表能否存在潜在的迁徙疑问。您必定在db_migrate_prepare之后运转它。

参数为:

•server:Oracle 外部主机的称号

•schema:形式称号

•table_name:表名

•pgstage_schema(自动是pgsql_stage):由db_migrate_prepare创立的 PostgreSQL 阶段的称号。

schema和table_name必定是 PostgreSQL 阶段中与tables表同名的列中的值。

这是一个表函数,前往有疑问的行在 Oracle 中的 ROWID,以及一条形容疑问的信息。

目前测试发现有两个疑问:

•字符串列中的零字节chr(0)

•不在数据库编码中的字符串列中的值

函数 oracle_migrate_test_data

此函数对 PostgreSQL 暂存形式中的一切表调用oracle_test_table,并将结果记载在 FDW 阶段的test_error表中(在清空表后)。

此外,在 FDW 阶段,会有一份失误摘要参与到表test_error_stats中。在清算 Oracle 中的脏数据时,这关于权衡随时期推移的进展十分有用。

该函数会前往遇到的失误总数。

函数参数为:

•server:Oracle 外部主机的称号

•staging_schema(自动是fdw_stage):远程暂存形式的称号

•pgstage_schema(自动是pgsql_stage):由oracle_migrate_prepare创立的 PostgreSQL 阶段的称号。

•only_schemas(自动是NULL):应迁徙到 PostgreSQL 的 Oracle 形式称号数组。假设为 NULL,则会解决除 Oracle 系统形式之外的一切形式。称号必定与它们出如今 Oracle 中的称号相反,通常为大写。

表 oracle_test_table 和 test_error_stats

这些表蕴含运转oracle_migrate_test_data生成的单个结果和汇总结果。

复制函数

函数 oracle_replication_start

此函数在 Oracle 和 PostgreSQL 数据库中创立复制所需的一切对象。PostgreSQL 对象将创立在 Postgres 暂存形式中,Oracle 对象与复制的表位于同一形式中。

此函数应在db_migrate_tables之前调用,并且在启动oracle_replication_start和调用db_migrate_tables之间,不应在 Oracle 上出现任何数据修正活动。

函数参数为:

•server:Oracle 外部主机的称号

•pgstage_schema(自动是pgsql_stage):由oracle_migrate_prepare创立的 PostgreSQL 阶段的称号

该函数创立的对象包括:

•一个 PostgreSQL 外表__ReplicationEnd,该表会显示一个时期戳,保障能早于 Oracle 上最老的生动事务

•一个 PostgreSQL 表__ReplicationStart,用于存储下一次性复制追逐的终点

关于 Postgres 阶段的tables表中设置migrate为TRUE的每个表,将创立以下对象:

•一个 Oracle 表__Log_<tablename>,用于搜集对<tablename>的更改

•一个在<tablename>上方的 Oracle 触发器__Log_<tablename>_TRIG

•Oracle 记载更改的日志表,在 PostgreSQL 上的外表__Log_<schema>/<tablename>

函数 oracle_catchup_table

将特定时时期隔内更改的数据,从 Oracle 表复制到 PostgreSQL。

这要求oracle_replication_start已创立所需的对象,并且数据迁徙已成功。

参数:

•schema:迁徙表的形式

•table_name:迁徙表的称号

•from_ts:复制该时期点的更改

•to_ts:复制该时期点以前(包括该时期点)的更改

这是一个“底层”函数,由oracle_replication_catchup调用;假设要经过为不同的表并发运转它,来并行化追逐义务,则可以经常使用它。

函数 oracle_catchup_sequence

参数:

•schema:迁徙序列的形式

•sequence_name:迁徙序列的称号

•staging_schema(自动是fdw_stage):远程暂存形式的称号

在远程端查问 Oracle 序列的值,并将迁徙的序列设置为该值。

函数 oracle_replication_catchup

复制自上次同步到 PostgreSQL 一切 Oracle 表和序列中的一切更改。

开局时期戳取自__ReplicationStart,完结时期戳取自__ReplicationEnd(蕴含最近的安保时期戳)。成功成功后,复制完结时期将保留到__ReplicationStart,以便下次经常使用。

参数:

•staging_schema(自动是fdw_stage):远程暂存形式的称号

•pgstage_schema(自动是pgsql_stage):由oracle_migrate_prepare创立的 PostgreSQL 阶段的称号

您可以在oracle_replication_start成功后随时调用此函数。

除非数据库中没有触发器或外键解放,否则应在调用此函数时,将性能参数session_replication_role设置为replica。这样就不会触发触发器,并且不会审核外键解放。

oracle_replication_catchup在 Oracle 上经常使用SERIALIZABLE隔离级别,因此它可以看到 Oracle 数据库的固定快照,并且数据在 PostgreSQL 端是分歧的,即使 Oracle 数据库被其余并发的会话修正。

假设要经常使用复制启动凑近零停机时期的迁徙,请在短时期内延续调用两次,并确保在第二次调用时期 Oracle 上没有数据修正活动。第二次追逐成功后,您可以立即将运行程序切换到 PostgreSQL。

函数 oracle_replication_finish

删除 PostgreSQL 和 Oracle 中由oracle_replication_start创立的一切对象。

这可用于在成功从 Oracle 的迁徙后启动清算。

•server:Oracle 外部主机的称号

•pgstage_schema(自动是pgsql_stage):由oracle_migrate_prepare创立的 PostgreSQL 阶段的称号

限度

并非一切 Oracle 分区选项都受ora_migrator允许。PostgreSQL 仅允许列表、哈希和范围分区,不允许其余分区战略。此外,不允许经常使用两列或更多列的分区键启动列表和范围分区。当ora_migrator遇到一个不可迁徙的分区形式时,会将该表迁徙到一个非分区表。

复制

ora_migrator提供了一个从 Oracle 到 PostgreSQL 的方便的基于触发器的复制性能。

这可用于将数据库从 Oracle 迁徙到 PostgreSQL,简直没有停机时期。

操作步骤如下:

•依照db_migrator文档中所述,经过调用db_migrate_prepare和db_migrate_mkforeign来预备迁徙。

•暂停 Oracle 数据库上的一切数据修正活动。这是须要的,由于 Oracle 不允许事务性 DDL。

•而后调用oracle_replication_start以设置一切必需的对象。这将在 Oracle 数据库中创立日志表和触发器。

•而后像平常一样经常使用db_migrate_tables开局数据迁徙。一旦db_migrate_tables启动,Oracle 数据库上的数据修正活动就可以复原。迁徙将经常使用SERIALIZABLE事务隔离级别运转,因此迁徙的数据将是分歧的。请确保 Oracle 上有足够的 UNDO 存储空间,否则数据迁徙或者会失败。

•经常使用db_migrate_constraints迁徙解放和索引;依照db_migrator文档中所述,迁徙其余对象。

•您可以随时调用oracle_replication_catchup,以将更改的数据从 Oracle 传输到 PostgreSQL。这须要为一切受影响的表调用oracle_catchup_table,因此要并行化操作,您可以间接为一切受影响的表调用高层的函数。请留意,追逐时不会清算 Oracle 上的日志表。为防止 PostgreSQL 中的外键解放疑问,请在运转oracle_catchup_table时,确保将性能参数session_replication_role设置为replica。关于凑近零停机时期的迁徙,在 Oracle 数据库上没有数据修正活动时,还必定口头最后一次性oracle_replication_catchup调用。调用后,将运行程序切换到 PostgreSQL。

•要完结复制,请调用oracle_replication_finish。这将会删除为复制创立的一切对象。

•最后,调用db_migrate_finish,以删除一切辅佐对象。

您可能还会对下面的文章感兴趣: