在 Oracle 中从头开始重新分区 table
Re-partition table from scratch, in Oracle
如何在 Oracle 数据库中对现有的 table 重新分区?
例如,在 MySQL 中,您可以简单地使用 ALTER TABLE
从头开始重新定义分区:
/* MySQL code, not Oracle DB */
ALTER TABLE t1
PARTITION BY HASH(id)
PARTITIONS 8;
我用谷歌搜索了一段时间,但在 Oracle 中找不到任何提供此功能的东西。
但它必须以某种方式成为可能,因为它是持续分区管理的基本功能。
就我而言,我正在构建历史快照 table,按快照日期范围进行分区。
每天,我都需要为新的一天添加一个分区,而且还要合并旧的快照分区,因为我们只保留以前 quarters/years.
的每月快照
从头开始重新定义整个分区配置使得这非常简单,我认为这样的功能将在任何顶级数据库产品中提供。
您在这里有两个独立的任务:
- 改变现有 table 的分区(非分区 -> 散列分区、散列分区 -> 范围分区等),这就是你的
alter table
语句正在做的事情。 不确定它是如何在 MySQL 的幕后实现的,但在 Oracle 中,无论好坏,都不可能使用单个 alter table
。相反, 您有两个选择:a) 无聊,创建一个新的分区 table,将数据复制到那里,然后交换 tables,以及 b) 使用 DBMS_REDEFINITION
包,本质上是 Oracle 尝试将 (a) 包装在一次调用中。
- 正在进行的分区管理,即添加、移动、重命名、拆分和合并table 的分区,已经 以某种方式分区。
alter table
完全支持这一点。请参阅 ALTER TABLE reference(向下滚动查看合并示例)。
更新:
我的观点是正确的,它们 added 12.2 中相应的 ALTER TABLE
功能,并且它也存在于最新版本(18c、19c)中。话虽如此,在许多情况下,使用该功能并不是一个好主意。
为什么?因为在更改 table 分区时可以在线完成(不阻止任何 DML),但即便如此它也不是仅元数据操作 - Oracle 必须物理移动数据。 ALTER TABLE
本身是原子的 - 这意味着,您不能重新启动或暂停操作,它要么作为一个整体完成,要么作为一个整体回滚。
现在,考虑一下。事实上 table 在我维护的系统中每天包含大约 40 亿行。目前 table 的总大小约为 40TB。如果我决定使用单个 ALTER TABLE
命令更改分区,那么移动这些数据量将花费不确定的时间(我说的是几天或更长时间),在此期间阻止任何 DDL 操作,并且可能需要大量时间温度 space。如果出现故障,我唯一的选择就是重新开始。
过了某个点之后,这个选项就变得不可行了。
正如 Kiril 在他的回答中所说,如果您只想添加分区,您可以手动添加,或者使用 INTERVAL 分区模型。
如果您要对现有的未分区 table 进行分区,这取决于您的版本,在最新版本 (19c) 中,您可以对任一分区执行 alter table ... 分区a 'normal' table,或更改已分区的分区方法。请参阅文档 here。您还可以使用合并分区选项对旧分区进行每月分区,而不是每天(在文档的同一页上)。
如何在 Oracle 数据库中对现有的 table 重新分区?
例如,在 MySQL 中,您可以简单地使用 ALTER TABLE
从头开始重新定义分区:
/* MySQL code, not Oracle DB */
ALTER TABLE t1
PARTITION BY HASH(id)
PARTITIONS 8;
我用谷歌搜索了一段时间,但在 Oracle 中找不到任何提供此功能的东西。
但它必须以某种方式成为可能,因为它是持续分区管理的基本功能。
就我而言,我正在构建历史快照 table,按快照日期范围进行分区。
每天,我都需要为新的一天添加一个分区,而且还要合并旧的快照分区,因为我们只保留以前 quarters/years.
的每月快照
从头开始重新定义整个分区配置使得这非常简单,我认为这样的功能将在任何顶级数据库产品中提供。
您在这里有两个独立的任务:
- 改变现有 table 的分区(非分区 -> 散列分区、散列分区 -> 范围分区等),这就是你的
alter table
语句正在做的事情。不确定它是如何在 MySQL 的幕后实现的,但在 Oracle 中,无论好坏,都不可能使用单个您有两个选择:a) 无聊,创建一个新的分区 table,将数据复制到那里,然后交换 tables,以及 b) 使用alter table
。相反,DBMS_REDEFINITION
包,本质上是 Oracle 尝试将 (a) 包装在一次调用中。 - 正在进行的分区管理,即添加、移动、重命名、拆分和合并table 的分区,已经 以某种方式分区。
alter table
完全支持这一点。请参阅 ALTER TABLE reference(向下滚动查看合并示例)。
更新:
我的观点是正确的,它们 added 12.2 中相应的 ALTER TABLE
功能,并且它也存在于最新版本(18c、19c)中。话虽如此,在许多情况下,使用该功能并不是一个好主意。
为什么?因为在更改 table 分区时可以在线完成(不阻止任何 DML),但即便如此它也不是仅元数据操作 - Oracle 必须物理移动数据。 ALTER TABLE
本身是原子的 - 这意味着,您不能重新启动或暂停操作,它要么作为一个整体完成,要么作为一个整体回滚。
现在,考虑一下。事实上 table 在我维护的系统中每天包含大约 40 亿行。目前 table 的总大小约为 40TB。如果我决定使用单个 ALTER TABLE
命令更改分区,那么移动这些数据量将花费不确定的时间(我说的是几天或更长时间),在此期间阻止任何 DDL 操作,并且可能需要大量时间温度 space。如果出现故障,我唯一的选择就是重新开始。
过了某个点之后,这个选项就变得不可行了。
正如 Kiril 在他的回答中所说,如果您只想添加分区,您可以手动添加,或者使用 INTERVAL 分区模型。 如果您要对现有的未分区 table 进行分区,这取决于您的版本,在最新版本 (19c) 中,您可以对任一分区执行 alter table ... 分区a 'normal' table,或更改已分区的分区方法。请参阅文档 here。您还可以使用合并分区选项对旧分区进行每月分区,而不是每天(在文档的同一页上)。