db2数据库一个大表45GB,如何快速清除其中一年前的数据(该表属于业务表,要尽可能的不影响业务)?

最好不要影响业务,如果非要影响业务,如何做到时间最小。

参与132

11同行回答

libai21libai21课题专家组软件架构设计师海通证券
提供两种方案供参考:方案一:时间长,对业务影响小对一年前的数据慢慢的删除,比如每次删除10万条;直到删除干净方案二:时间短,步骤多,对业务有影响1.创建一个新表2.把要保留的数据从原表导出,然后导入到新表中;3.停止应用,对原表改名,然后把新表改为原表;4.将步骤2中导出数据后,新增加的...显示全部

提供两种方案供参考:
方案一:时间长,对业务影响小
对一年前的数据慢慢的删除,比如每次删除10万条;直到删除干净

方案二:时间短,步骤多,对业务有影响
1.创建一个新表
2.把要保留的数据从原表导出,然后导入到新表中;
3.停止应用,对原表改名,然后把新表改为原表;
4.将步骤2中导出数据后,新增加的数据导出,导入到新表中
5.启动应用;

收起
证券 · 2018-01-10
  • 慢慢delete太费时间了,一亿多行的数据。 方案二中导出之前是不是就该停应用?改表名? 否则新插入的数据怎么导出?
    2018-01-11
  • 应该是导出之前停止应用,要不然后面业务新增的数据保存会出错
    2018-01-17
  • 如果只保留一年的数据,且每天的量差不多,可以考虑改成按日期做范围分区表。做DETACH美滋滋
    2018-03-01
  • 分区表之后,直接truncate不需要的分区表
    2020-06-24
topzgmtopzgm课题专家组软件架构设计师People's Bank of China
有一个简单有效的办法,步骤如下:1)从45G大表导出需要的数据到del/ixf文件中: db2 "export to x1.ixf of ... select * from 大表y1 where 保留数据的过滤条件"。2)把del/ixf文件加载到45G大表并且替换掉原来的数据:db2 "load from x1.ixf of ixf ...lobsinfile ... replace ...显示全部

有一个简单有效的办法,步骤如下:
1)从45G大表导出需要的数据到del/ixf文件中: db2 "export to x1.ixf of ... select * from 大表y1 where 保留数据的过滤条件"。
2)把del/ixf文件加载到45G大表并且替换掉原来的数据:db2 "load from x1.ixf of ixf ...lobsinfile ... replace into 大表y1..."或者db2 "import from x1.ixf of ixf ...lobsinfile ... replace into 大表y1..."
该方法优点如下:
1)不影响业务。
2)不需要停应用。
3)耗用时间很短。
4)步骤很少。
5)不需要占用太多的日志磁盘空间。
6)没有table partition也能做。
7)核心业务系统都可以使用该办法。

收起
银行 · 2018-01-10
  • 只要导出,必须停业务或者重命名原表吧? 不然导出、导入过程中产生的新数据怎么弄?
    2018-01-11
  • 一般来说,进行这样的数据清理工作都是在系统闲暇时间窗口进行的,例如银行系统的日终之后就没有写流量了。
    2018-01-11
  • hufeng719  hufeng719回复 topzgm
    我们这是钢铁生产行业,涉及钢材入库,发货等信息,生产不停,业务不能停
    2018-01-11
  • 1)根据我们的实践,"db2 load..."一亿多行记录,大概只需几分钟时间。 2)任何现实世界中的IT系统,都是存在只读不写的时间窗口的,在这个时间点上做是可行的,只是可能需要加班,比如夜深人静的时候。变通来解决问题。
    2018-01-11
  • 总会有个系统闲暇的时间
    2018-01-17
mountainsunmountainsun数据库运维工程师吴江银行
个人从自己的经验来说说,这个除非本身在建表的时候考虑过分区表的事情,不然的确没什么好的方法。1、如果表本身就做了分区表,直接detach一下就可以了,这个不影响业务的,detach出来的表数据也还是存在的,只是表名换掉了。2、如果本身不是分区表,要么按照条件,根据系统设置的活动日...显示全部

个人从自己的经验来说说,这个除非本身在建表的时候考虑过分区表的事情,不然的确没什么好的方法。
1、如果表本身就做了分区表,直接detach一下就可以了,这个不影响业务的,detach出来的表数据也还是存在的,只是表名换掉了。
2、如果本身不是分区表,要么按照条件,根据系统设置的活动日志大小,比如说每次删除10万条,慢慢的删除。这个是不影响业务的,但是在生产环境中,数据库一般是做了归档日志的,因为delete生成的日志很多,要注意文件系统。
3、将需要保留的数据导出ixf格式,将表清空掉,然后再将ixf导入进去。这个会影响业务的。

收起
银行 · 2018-01-10
浏览8564
  • 我之前写过一个存储过程,自动小批量的删除,可以参考这个思路,在系统闲暇的时候操作,只需要指定删除的条目数,每天做个计划调度就可以了。
    2020-06-24
  • DROP PROCEDURE ADMINISTRATOR.DELETE_DATA_INBATCH (BIGINT); CREATE PROCEDURE DELETE_DATA_INBATCH ( IN IN_ID BIGINT) LANGUAGE SQL MODIFIES SQL DATA BEGIN --定义SQLCA变量,用于异常处理和获取上一SQL影响数据量 DECLARE SQLSTATE CHAR(5) DEFAULT '00000'; DECLARE errorLabel CHAR(32) DEFAULT ''; DECLARE ROW_CNT INT DEFAULT 0; -- 异常处理 DECLARE EXIT HANDLER FOR SQLEXCEPTION SIGNAL SQLSTATE value SQLSTATE SET MESSAGE_TEXT = errorLabel; --数据删除循环 REPEAT DELETE FROM (SELECT * FROM interfacemonitor WHERE id<IN_ID FETCH FIRST 2000 ROWS ONLY); --获取DELETE语句的影响数据量,用于循环判断是否删除完毕 GET DIAGNOSTICS ROW_CNT=ROW_COUNT; --提交,将50000数据量落实到数据库,并释放50000个锁 COMMIT; UNTIL ROW_CNT<>100000 END REPEAT; END;
    2020-06-24
DB-TrendSetterDB-TrendSetter联盟成员数据库架构师公司
如果有table partition的话,直接按时间维度detach就行,否则按楼上的建议,慢慢delete显示全部

如果有table partition的话,直接按时间维度detach就行,否则按楼上的建议,慢慢delete

收起
电信运营商 · 2018-01-10
hufeng719hufeng719联盟成员系统工程师某钢铁企业
谢谢各位!我今天重新做了一遍,保留一年的数据:1、首先导出原表test01结构,创建一个新表名test02,创建索引、主键、授权。2、重命名原表test01为test03,重命名test02为test01. 3、导出test03中最近一年的数据,生成ixf文件。4、导入test01表中,用commitcount参数,避免import造成日志...显示全部

谢谢各位!
我今天重新做了一遍,保留一年的数据:
1、首先导出原表test01结构,创建一个新表名test02,创建索引、主键、授权。
2、重命名原表test01为test03,重命名test02为test01.
3、导出test03中最近一年的数据,生成ixf文件。
4、导入test01表中,用commitcount参数,避免import造成日志满。
注意在导入的时候会造成表死锁,影响部分业务查询超时,但不是太严重,导出近半个小时,导入的时候遇到数据库tsm备份超慢,后来停止备份,才恢复速度,总用时近3个小时,如果不是备份影响 应该1.5小时就可以。数据由原来的1亿行缩减为近3000万行。

收起
能源采矿 · 2018-01-12
浏览8358
frogboyfrogboy数据库管理员IBM
你可以直接建立新表,然后用load cursor的方式计算导入你需要的数据所需要的时间 如果3000万数据的话10分钟左右差不多了,在找个时间停10分钟左右的业务导入数据该表名字,这样就不会有影响业务的死锁问题了。...显示全部

你可以直接建立新表,然后用load cursor的方式计算导入你需要的数据所需要的时间 如果3000万数据的话10分钟左右差不多了,在找个时间停10分钟左右的业务导入数据该表名字,这样就不会有影响业务的死锁问题了。

收起
IT咨询服务 · 2018-01-12
浏览8122
stevenweistevenwei研发工程师Microox
建立新表,然后用load cursor的方式计算导入你需要的数据所需要的时间 ,导入,然后建索引等,这样比较快显示全部

建立新表,然后用load cursor的方式计算导入你需要的数据所需要的时间 ,导入,然后建索引等,这样比较快

收起
软件开发 · 2018-01-12
浏览8170
lsxlsx信息技术经理大唐控股
看了上边各位专家的建议,很受启发。感觉如果数据库之前没有做过优化的话,慢点删也是可以接受的。最好不要做ddl操作,虽然快,有可能涉及重绑定等问题。写到这里,请问一下,您确认过这个表和其他数据对象的依赖关系吗?如果能这么肯定,可不可以在这个表上增加一个标志字段,用位图索引,...显示全部

看了上边各位专家的建议,很受启发。感觉如果数据库之前没有做过优化的话,慢点删也是可以接受的。最好不要做ddl操作,虽然快,有可能涉及重绑定等问题。写到这里,请问一下,您确认过这个表和其他数据对象的依赖关系吗?如果能这么肯定,可不可以在这个表上增加一个标志字段,用位图索引,删除时可能快一些。

收起
保险 · 2018-01-12
浏览8320
jileicrmjileicrm数据库管理员中信网络科技股份有限公司
如果是分区表,直接detach就好了。如果非分区表,建一个新表,把急需的数据导入,再改标名。老表再慢慢清理。显示全部

如果是分区表,直接detach就好了。
如果非分区表,建一个新表,把急需的数据导入,再改标名。老表再慢慢清理。

收起
系统集成 · 2018-09-27
浏览7216
mornskymornsky研发工程师某银行
建一个新表,如果应用不需查询已有记录并不会长久锁表,可选业务不多时段,写一个简单SQL,一次将原表改名和新表变原表;如果表总是被锁,则需要短时停应用,可将停启应用和改表写成脚本执行。这样可不停业务或将停顿时间缩至最少。如果应用交易需要查已有记录,则需要将需要的最少已有...显示全部

建一个新表,如果应用不需查询已有记录并不会长久锁表,可选业务不多时段,写一个简单SQL,一次将原表改名和新表变原表;如果表总是被锁,则需要短时停应用,可将停启应用和改表写成脚本执行。这样可不停业务或将停顿时间缩至最少。如果应用交易需要查已有记录,则需要将需要的最少已有记录先导入新表(譬如当天记录),这里需要注意的是如果不停服务导入可能存在改名导入数据时间内数据不全的现象。
在建表改名成功后就可慢慢地在两表间导入需要记录。其余记录如果需要导出备份可慢慢地分日期段执行,否则跳过,最后直接drop表就行了。

收起
银行 · 2018-09-05
浏览7368

提问者

hufeng719
系统工程师某钢铁企业
擅长领域: 数据库存储服务器

问题来自

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2018-01-10
  • 关注会员:14 人
  • 问题浏览:17466
  • 最近回答:2024-02-16
  • X社区推广