网站首页 > 技术文章 正文
概述
有这么个需求,有一张5000万大表,需要保留最后3个月数据,也就是1000万数据,而这张表使用很频繁,生产环境也是7*24小时不停,如果用分段delete影响的时间太长,所以用了rename切换的方法。这里先在测试数据库做一下演练。
以测试环境BN_SEQUENCE表做测试,数据量大约是6千万。
思路
最近有点喜欢上画图,感觉形象点,可能有点丑,大家不要介意~
实现方案
1、获取A表定义、索引、触发器、外键约束
这里的表定义、索引、主外键实际上用PLSQL就可以直接看到了,所以就不写了,只写了触发器的。
相关sql:
--查看表上触发器定义 SELECT * FROM DBA_TRIGGERS WHERE TABLE_NAME='BN_SEQUENCE'; SELECT DBMS_METADATA.GET_DDL('TRIGGER','CHK_BIU_BN_SEQUENCE','GLOGOWNER') FROM DUAL; SELECT DBMS_METADATA.GET_DDL('TRIGGER','BN_SEQUENCE_PN','GLOGOWNER') FROM DUAL; -- Create table create table BN_SEQUENCE ( BN_RULE_GID VARCHAR2(101 CHAR) not null, BN_CONTEXT VARCHAR2(300 CHAR) not null, BN_SEQUENCE_ID VARCHAR2(50 CHAR) not null, CURVALUE VARCHAR2(50 CHAR), DOMAIN_NAME VARCHAR2(50 CHAR) not null, INSERT_USER VARCHAR2(128 CHAR) not null, INSERT_DATE DATE not null, UPDATE_USER VARCHAR2(128 CHAR), UPDATE_DATE DATE ) tablespace DATA pctfree 10 initrans 1 maxtrans 255 storage ( initial 1 next 1 minextents 1 maxextents unlimited pctincrease 0 ); .....
2、创建B表--BN_SEQUENCE_BAK
--这里只创建表定义,不加约束、索引、触发器、外键 -- Create table create table BN_SEQUENCE_BAK ( BN_RULE_GID VARCHAR2(101 CHAR) not null, BN_CONTEXT VARCHAR2(300 CHAR) not null, BN_SEQUENCE_ID VARCHAR2(50 CHAR) not null, CURVALUE VARCHAR2(50 CHAR), DOMAIN_NAME VARCHAR2(50 CHAR) not null, INSERT_USER VARCHAR2(128 CHAR) not null, INSERT_DATE DATE not null, UPDATE_USER VARCHAR2(128 CHAR), UPDATE_DATE DATE ) tablespace DATA pctfree 10 initrans 1 maxtrans 255 storage ( initial 1 next 1 minextents 1 maxextents unlimited pctincrease 0 );
3、分段insert
为了避免对线上环境的影响,建议分段insert,插入最近3个月的数据。
insert into BN_SEQUENCE_BAK select * from BN_SEQUENCE where update_date >=to_date('2019/08/19 00:00:00', 'yyyy/mm/dd hh24:mi:ss') and update_date <to_date('2019/09/19 14:00:00', 'yyyy/mm/dd hh24:mi:ss'); insert into BN_SEQUENCE_BAK select * from BN_SEQUENCE where update_date >=to_date('2019/07/19 00:00:00', 'yyyy/mm/dd hh24:mi:ss') and update_date <to_date('2019/08/19 00:00:00', 'yyyy/mm/dd hh24:mi:ss'); insert into BN_SEQUENCE_BAK select * from BN_SEQUENCE where update_date >=to_date('2019/06/19 00:00:00', 'yyyy/mm/dd hh24:mi:ss') and update_date <to_date('2019/07/19 00:00:00', 'yyyy/mm/dd hh24:mi:ss'); insert into BN_SEQUENCE_BAK select * from BN_SEQUENCE where update_date >=to_date('2018/06/19 00:00:00', 'yyyy/mm/dd hh24:mi:ss') and update_date <to_date('2019/06/19 00:00:00', 'yyyy/mm/dd hh24:mi:ss');
4、切换表
这里实际上我在生产环境做切换也踏坑了,没考虑到有物化视图这种情况,所以导致切换不了。
alter table BN_SEQUENCE rename to BN_SEQUENCE_ARCH; alter table BN_SEQUENCE_BAK rename to BN_SEQUENCE;
5、数据补录
把前面插入数据后到切换表后的数据做一下补录。
insert into BN_SEQUENCE select * from BN_SEQUENCE_ARCH where update_date >=to_date('2019/09/19 14:00:00', 'yyyy/mm/dd hh24:mi:ss')
6、B表创建索引、触发器
记得需要重命名。
-- Add comments to the table comment on table BN_SEQUENCE is 'This table stores the current sequence value of the business number.'; -- Add comments to the columns comment on column BN_SEQUENCE.BN_RULE_GID is 'BN_RULE_GID contains the unique identifier for the Business Number (BN) rule.'; -- Create/Recreate primary, unique and foreign key constraints alter table BN_SEQUENCE add constraint PK_BN_SEQUENCE primary key (BN_RULE_GID, BN_CONTEXT, BN_SEQUENCE_ID) using index tablespace INDX pctfree 10 initrans 2 maxtrans 255 storage ( initial 1M next 1M minextents 1 maxextents unlimited pctincrease 0 ); alter table BN_SEQUENCE add constraint FK_BN_SEQRULE_GID foreign key (BN_RULE_GID) references BN_RULE (BN_RULE_GID); -- Grant/Revoke object privileges grant select, insert, update, delete on BN_SEQUENCE to APP_USER; grant select on BN_SEQUENCE to APP_USER_SELECT; grant select, insert, update, delete on BN_SEQUENCE to EXT_USER; ....
7、校验数据
结果:数据全部迁移了,保留了去年6月19号到现在的数据,整个过程10分钟
8、drop表
建议保留一段时间后再执行。
觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~
猜你喜欢
- 2024-11-15 无需编程,基于Oracle零代码生成CRUD增删改查RESTful API接口
你 发表评论:
欢迎- 610℃几个Oracle空值处理函数 oracle处理null值的函数
- 602℃Oracle分析函数之Lag和Lead()使用
- 590℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 588℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 582℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 575℃【数据统计分析】详解Oracle分组函数之CUBE
- 564℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 556℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)