迁徙 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,以删除一切辅佐对象。