1

我有一个 Oracle 11g 分区表,它有 10 个分区来存储十年的数据,每个分区都在自己的按范围分区的表空间上。每个年分区包含 12 个月分区。

在使用 ora2pg 将所有数据库迁移到 Postgresql 10.7 之前,我想将此表转换为非分区表。

我读过我可以先通过 expdp 备份此表,然后使用 impdp 的 PARTITIONS_OPTIONS 参数选项将其导入。

但是是否也可以将以下语句用作严格等价的?

CREATE TABLE IF NOT EXISTS non_partitioned_table AS SELECT * FROM partitioned_table

我不会丢失任何数据,但是索引呢?

这两个程序之间还有其他区别吗?

4

2 回答 2

1

您发布的语法在 Oracle 中不存在(那里没有if not exists子句)。

因此,你会

create table non_partitioned_table as select * from partitioned_table;

如果名称non_partitioned_table已经存在的对象,该命令将失败。


不会自动创建索引——你必须手动创建它们,但是——无论如何你都会在 PostgreSQL 中这样做,不是吗?为什么要在 Oracle 中打扰,因为您不会将该表用于任何用途(迁移目的除外);对?

于 2022-02-14T07:19:06.813 回答
1

您可以使用 expdp 导出 PARTITION 表。

然后使用 impdp 和 MERGE 选项将其导入回非分区表。如何将数据输入 postgres 取决于您。


expdp TABLES=scott.part_tab USERID="' / as sysdba'" DIRECTORY=test_dir DUMPFILE=part_tab.dmp LOGFILE=part_tab.log


impdp USERID="'/ as sysdba'" TABLES=scott.part_tab DIRECTORY=test_dir DUMPFILE=part_tab.dmp LOGFILE=imp_part_tab.log REMAP_SCHEMA=scott:testuser

于 2022-02-14T09:46:24.917 回答