绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
生产库大表拆分的需求案例分析
2021-09-08 14:19:21

测试针对表bj_container实施,其他两个表类似。

方案测试流程:
1 创建历史表空间tbs_HIS,给用户授权
create tablespace tbs_HIS DATAFILE '/oradata2/bj111/tbs_HIS01.dbf' size 20g;
alter user user1 quota unlimited on tbs_HIS;

2 使用数据泵导出bj_container相关年份的数据。下面指令需要修改相应修改,这里导出索引,元数据和统计信息,但是数据只是2021年的
导出2021年数据
expdp \'/as sysdba\' directory=dir dumpfile=bj_container_2021.dmp tables=user1.bj_container QUERY=\"WHERE bj_date like \'2021\%\'\"

导出其他年份数据。不导出索引,后续创建索引,这里考虑导入时的索引创建报错,对于21年前的数据我们单独按照年导出,并且不导出索引。

###expdp \'/as sysdba\' directory=dir dumpfile=bj_container_2015.dmp tables=user1.bj_container content=data_only exclude=index QUERY=\"WHERE bj_date like \'2015\%\'\"

expdp \'/as sysdba\' directory=dir dumpfile=bj_container_2015.dmp tables=user1.bj_container exclude=index QUERY=\"WHERE bj_date like \'2015\%\'\"
expdp \'/as sysdba\' directory=dir dumpfile=bj_container_2016.dmp tables=user1.bj_container exclude=index QUERY=\"WHERE bj_date like \'2016\%\'\"
expdp \'/as sysdba\' directory=dir dumpfile=bj_container_2017.dmp tables=user1.bj_container exclude=index QUERY=\"WHERE bj_date like \'2017\%\'\"
expdp \'/as sysdba\' directory=dir dumpfile=bj_container_2018.dmp tables=user1.bj_container exclude=index QUERY=\"WHERE bj_date like \'2018\%\'\"
expdp \'/as sysdba\' directory=dir dumpfile=bj_container_2019.dmp tables=user1.bj_container exclude=index QUERY=\"WHERE bj_date like \'2019\%\'\"
expdp \'/as sysdba\' directory=dir dumpfile=bj_container_2020.dmp tables=user1.bj_container exclude=index QUERY=\"WHERE bj_date like \'2020\%\'\"

3 更改表名字,这里我们讲改表明,使得21年数据导入时,不会冲突,同时消除了不处理21年数据而使用删除数据的方法导致系统压力,因为删除的数据量有2.5亿左右
alter table user1.bj_container rename to user1.bj_container_old;

删除索引,为了避免导入21年数据导致的索引冲突。
drop index user1.IND_bj_container_2;
drop index user1.IND_bj_container_1;


4 导入表 (先导入2021年数据)
2021年数据,此时会创建一个原始表,但是数据只有21年,索引等对象自动导入,操作简单。

impdp \'/as sysdba\' directory=dir dumpfile=bj_container_2021.dmp

其他年份数据,这里只是导入了数据,并且做了rename,表空间做了映射,是出于管理方便。
impdp \'/as sysdba\' directory=dir dumpfile=bj_container_2015.dmp remap_table=bj_container:bj_container_2015 remap_tablespace=tbs:tbs_HIS
impdp \'/as sysdba\' directory=dir dumpfile=bj_container_2016.dmp remap_table=bj_container:bj_container_2016 remap_tablespace=tbs:tbs_HIS
impdp \'/as sysdba\' directory=dir dumpfile=bj_container_2017.dmp remap_table=bj_container:bj_container_2017 remap_tablespace=tbs:tbs_HIS
impdp \'/as sysdba\' directory=dir dumpfile=bj_container_2017.dmp remap_table=bj_container:bj_container_2018 remap_tablespace=tbs:tbs_HIS
impdp \'/as sysdba\' directory=dir dumpfile=bj_container_2019.dmp remap_table=bj_container:bj_container_2019 remap_tablespace=tbs:tbs_HIS
impdp \'/as sysdba\' directory=dir dumpfile=bj_container_2020.dmp remap_table=bj_container:bj_container_2020 remap_tablespace=tbs:tbs_HIS

5
创建索引 由于历史表需要查询,所以之前的索引按照原来的样子重建,索引定义是通过dbms_medatada.get_ddl获得,比较准确。
表bj_container的拆分表创建索引
CREATE INDEX "user1"."IND_bj_container_1_2015" ON "user1"."bj_container_2015" ("bj_date") ;
CREATE INDEX "user1"."IND_bj_container_1_2016" ON "user1"."bj_container_2016" ("bj_date") ;
CREATE INDEX "user1"."IND_bj_container_1_2017" ON "user1"."bj_container_2017" ("bj_date") ;
CREATE INDEX "user1"."IND_bj_container_1_2018" ON "user1"."bj_container_2018" ("bj_date") ;
CREATE INDEX "user1"."IND_bj_container_1_2019" ON "user1"."bj_container_2019" ("bj_date") ;
CREATE INDEX "user1"."IND_bj_container_1_2020" ON "user1"."bj_container_2020" ("bj_date") ;

CREATE INDEX "user1"."IND_bj_container_2_2015" ON "user1"."bj_container_2015" ("HPID") ;
CREATE INDEX "user1"."IND_bj_container_2_2016" ON "user1"."bj_container_2016" ("HPID") ;
CREATE INDEX "user1"."IND_bj_container_2_2017" ON "user1"."bj_container_2017" ("HPID") ;
CREATE INDEX "user1"."IND_bj_container_2_2018" ON "user1"."bj_container_2018" ("HPID") ;
CREATE INDEX "user1"."IND_bj_container_2_2019" ON "user1"."bj_container_2019" ("HPID") ;
CREATE INDEX "user1"."IND_bj_container_2_2020" ON "user1"."bj_container_2020" ("HPID") ;

6 导入后的查询确认

确认表
select table_name,tablespace_name from dba_tables where table_name like 'bj_container%' or table_name like 'HP_CAR%' OR table_name like 'HP_BASIC%' ORDER BY 1;

确认索引
col owner for a20
col table_name for a20
col index_name for a30
set line 120
select owner,table_name,index_name,status from dba_indexes where table_name=upper('bj_container')


原始表索引信息比对,下面查原库
select owner,table_name,index_name,status from dba_indexes where table_name in (upper('bj_container'))


7 一天之后业务确认无误,删除历史表
drop table user1.bj_container;



分享好友

分享这个小栈给你的朋友们,一起进步吧。

Oracle运维新鲜事-技术与管理各占半边天
创建时间:2020-08-04 11:34:57
本技术栈旨在分享技术心得,运维趣事,故障处理经验,调优案例,故障处理涉及集群,DG,OGG,大家生产中遇到的问题基本都会囊括了,我会发布生产库遇到的故障,希望在交流中互助互益,共同提高,也希望大家讨论,如果您有生产中遇到的集群问题,也可以在这里提出来,一起讨论,现实中也帮助不少同学解决了生产库的故障。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • Abraham林老师
    栈主
  • 小雨滴
    嘉宾
  • hawkliu
    嘉宾
  • u_97a59a25246404
    嘉宾

小栈成员

查看更多
  • 栈栈
  • dapan
  • 小菜鸟___
  • hwayw
戳我,来吐槽~