oracle生产环境update上亿数据注意事项

一、大量数据执行DML操作基本上只能使用分批提交方式,

直接update table_name set column_name =? where column_name =? 会让数据库temp表空间极高的占用(有人执行过直接update,导致500Gtemp表空间使用完毕都没有执行完)。

记录一个网上抄的SQL留用

/* 使用游标+数组进行更新(BULK COLLECT和FORALL) */
DECLARE
  /* 创建数组:一列多行 */
  TYPE TYPE_INDEX_ID IS TABLE OF PRIMARY_INDEX10.ID%TYPE;
  TYPE TYPE_ID_CARD IS TABLE OF PRIMARY_INDEX10.ID_CARD%TYPE;
  /* 起别名 */
  V_INDEX_ID TYPE_INDEX_ID;
  V_ID_CARD  TYPE_ID_CARD;
  /* 将查询出来的数据放到游标里 */
  CURSOR TEMP_CURSOR IS
    SELECT T2.ID, T2.ID_CARD
      FROM VIRTUAL_CARD10 T1, PRIMARY_INDEX10 T2
     WHERE T1.ID_CARD = T2.ID_CARD
       AND T1.REMARK = '**市****区数据'
       AND T2.REMARK = '**市****区数据';
BEGIN
  OPEN TEMP_CURSOR;
  LOOP
    /* 取得1000行游标数据并放到对应数组中 */
    FETCH TEMP_CURSOR BULK COLLECT
      INTO V_INDEX_ID, V_ID_CARD LIMIT 1000;
    /* 如果没有数据则退出 */
    EXIT WHEN TEMP_CURSOR%NOTFOUND;
    /* 遍历数据 */
    FORALL I IN 1 .. V_INDEX_ID.COUNT-- 或者V_INDEX_ID.FIRST .. V_INDEX_ID.LAST
    /* 业务逻辑 */
      UPDATE VIRTUAL_CARD10
         SET INDEX_ID = V_INDEX_ID(I)
       WHERE ID_CARD = V_ID_CARD(I);
    COMMIT; --提交
  END LOOP;
  CLOSE TEMP_CURSOR;
END;

二、数据链路

需要评估数据链路多久可以消费完数据,别把下游系统弄崩了,之前有个没钱弄机器的甲方,某个同事update几千万数据,数据延迟长达一个星期,小水管一次消费十几条数据。

数据链路有KAFKA、TDMQ、DSG、DATAX之类的,使用oracle可能还有OGG。

三、数据备份

上亿表数据基本上无法全部备份,是真的会遇到甲方要求恢复某一条数据情况,执行操作的时候可以只备份关键字段(包含主键),剩余字段可以根据业务逻辑推测出来。

posted @ 2025-07-22 21:40  捡捡捡  阅读(41)  评论(0)    收藏  举报