暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 在数据库之间移动历史数据

askTom 2018-08-22
429

问题描述

你好,汤姆

了解如何以自动方式优化将记录 (历史日期) 从生产数据库中的一个表移动到另一个历史数据库中的另一个表。

你能在Oracle分区中支持我吗?
它可以使用交换分区?

谢谢你的支持。

专家解答

分区肯定会成为你的朋友,因为使用常规方法 (插入/删除),虽然可以快速将数据复制到新目标,但从源中删除数据的成本可能非常高,例如

SQL> select count(*) from t;

  COUNT(*)
----------
   3961700

SQL> create table t1 as select * from t where 1=0;

Table created.

SQL> set timing on
SQL> insert /*+ APPEND */ into t1
  2  select * from t;

3961700 rows created.

Elapsed: 00:00:08.60
SQL> commit;

Commit complete.

Elapsed: 00:00:00.00
SQL>
SQL> delete from t;

3961700 rows deleted.

Elapsed: 00:00:29.19


因此,删除成本将近4倍 (在此演示中)。

Exchange分区可能不会在效率方面对您有很大帮助,因为exchange分区的主要好处是数据不会移动,当然,在这种情况下,您实际上 * 希望 * 将数据 (移动到另一个数据库)。

但是我们从上面发送,插入数据并不是特别昂贵,因此,如果我们可以将删除的成本降至最低,那么我们可能会有一个可行的解决方案。例如,下面的演示使用一个年度分区来复制一年的数据,然后在分区级别截断,这比删除效率高得多。

SQL> drop table t purge;

Table dropped.

SQL>
SQL> create table t
  2  partition by range ( created )
  3  (
  4    partition p1 values less than ( date '2018-01-01' ),
  5    partition p2 values less than ( date '2019-01-01' )
  6  )
  7  as select d.* from dba_objects d,
  8   ( select 1 from dual connect by level <= 50 );

Table created.

SQL>
SQL> set timing on
SQL> insert /*+ APPEND */ into t1
  2  select * from t partition (p1 );

3598300 rows created.

Elapsed: 00:00:09.05
SQL> commit;

Commit complete.

Elapsed: 00:00:00.00
SQL> alter table t truncate partition p1;

Table truncated.

Elapsed: 00:00:00.41


如果它很难复制第一个数据,例如,插入是通过网络等,那么另一个探索的选择是可传输表空间。在这种情况下,您可以将数据分区移动到一个新的空表空间中,然后从主表空间分离并附加到历史表空间。

因此,工作流程将遵循以下路线:

-使用 “alter table move partition” 将要存档的分区移动到表空间X中
-使表空间X只读
-用expdp卸载元数据,例如

expdp hr/hr目录 = dir1转储文件 = tts.dmp传输 _ 表空间 = X传输 _ 完整 _ 检查 = 是日志文件 = tts.log

-将X的数据文件复制到历史数据库
-导入元数据

impdp hr/hr目录 = dir1转储文件 = tts.dmp传输 _ 表空间 = X传输 _ 数据文件 = '用户01/数据/tbs6.dbf' 日志文件 = tts.日志

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论