谁设计的这张表,站出来!!!ORACLE千万数据大表数据增加分区!

106 阅读2分钟

如果大家有幸在大点的银行做过外包,那应该会知道,由于对安全的管控,银行会定期做一些操作扫描风险,包括但不限于:开源组件版本漏洞扫描、数据库扫雷等等。

我们这次的问题就是在行内做数据库扫雷时,暴露出来的问题。行内对数据库的表结构是有明确规范的,数据量超过1000万或者大小超过10G的数据库表是需要进行分区的。本来这个表分区操作应该是在项目架构初期评审出来的,但是还是百密一疏,把他漏掉了。

 

问题:表A数据超过1000w,现在需要对表A进行分区

针对这个问题,我们的解决方案步骤如下:

1. 新建同结构的表B,表B和表A的数据字段保持一致,但是表B新建的时候就需要指定分区

2. 将表A的数据迁移到表B

3. 删除表A

4. 将表B名字修改为A

 

上面的1、3、4步没什么好说的,很简单。重点是第2步的实操。

如果是表A的字段中没有LOB字段,其实我们直接执行以下sql即可:

INSERT INTO B (col1, col2, col3)
SELECT col1,
       col2,
       col3
FROM A;

如果以上SQL执行时间过长,可以适当加where条件,将一个SQL拆分成多次执行。虽然执行次数变多,但是每条SQL的执行时间可控。

但是如果表中带有LOB字段,就会发现上面的SQL执行时间过长。ORACLE本身提供了数据导出数据导入工具,版本10g之前选择exp/imp处理,版本10g之后选择expdp/impdp处理。我的版本是19,那我们采用下面方式:

1,执行数据导出脚本
expdp ${账号}/${密码} directory=${ORACLR目录} tables=${表A} dumpfile=${导出文件文件}.dmp compression=all

参数解释:
-- compression
1)  ALL :对导出的元数据和表数据都进行压缩,得到的导出文件是最小的,耗时也是最长的。
  2) DATA_ONLY :仅对表数据进行压缩,对于大数据量的导出效果明显,会比METADATA_ONLY方式得到更小的压缩文件。
  3)  METADATA_ONLY :仅对元数据进行压缩,而不会对表数据进行压缩,这种压缩执行后效果一般不是很明显,不过速度比较快。
  4)  NONE :不进行任何的压缩,导出后的文件也是最大的。
  5)  DEFAULT :默认方式,即不指定COMPRESSION参数,会采用默认的压缩方式METADATA_ONLY。
2,执行数据导入脚本
impdp ${账号}/${密码} directory=${ORACLR目录} dumpfile=${导出文件文件}.dmp table_exists_action=append REMAP_TABLE=${schema名}.${表A}:${表B} exclude=TABLESPCE

参数解释:
-- table_exists_action
使用impdp完成数据库导入时,若表已经存在,有四种的处理方式:
1)  skip:默认操作
2)  replace:先drop表,然后创建表,最后插入数据
3)  append:在原来数据的基础上增加数据
4)  truncate:先truncate,然后再插入数据

程序员,永不秃头!