1. 작업 대상에 대해 임시 테이블 생성

 

CREATE TABLE `tmp_200504` (
  seq  bigint(20) not null,
  endpoint_key bigint(20) not null,  
  del_is char(1) null,
  primary key (seq) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

-- 작업 대상이 되는 row를 임시테이블로 이관

insert into tmp_200504 select sequence, endpoint_key, null from tmp WHERE type = 'test';

 

 

 

2. 프로시저를 생성하여 delete 수행

 

-- mysql delimiter 변경

delimiter ;;

 

 

-- 10000건씩 짤라서 삭제하는 프로시저 생성

CREATE DEFINER=`root`@`localhost` PROCEDURE `delete_batch_job`(in v_limit int)
begin
  declare v_done int default false;
  declare v_count int default 0;
  declare v_num   bigint default 0;
  declare v_seq  bigint(20);
  declare v_endpoint bigint(20);

  declare v_cur1 cursor for (
     select seq, endpoint_key
     from tmp_200504
     where del_is is null and seq <= v_limit
  );
  
  declare continue handler for not found set v_done = TRUE;

  open v_cur1;
  repeat  
  fetch v_cur1 into v_seq, v_endpoint;
  select v_done;
  
  if not v_done then
     set v_count = v_count + 1;
     
     delete from tmp where sequence = v_seq;  
     update tmp_200504 set del_is = 'Y' where seq = v_seq;
     
     if v_count % 1000 = 0 then
        select concat('commit : ', v_count);
        commit;
        select sleep(0.01);
     end if;     
     set v_done = false;
  end if;
  
  
  show warnings;
  until v_done end repeat;
  close v_cur1;
  
  commit;
end;;

 

-- mysql delimiter를 원래대로 변경
delimiter ;

 

 

3.  외부 shell로 배치 형태로 수행

 

for i in (1..100000..1000)

do

    mysql -u root -p   << EOF

 

    call delete_batch_job($i);

 

EOF

 

done

'RDB > MySQL' 카테고리의 다른 글

MySQL 파티션 추가 스크립트  (0) 2020.06.01
MySQL Delete join 구문  (0) 2020.06.01
MySQL 파티션  (0) 2020.04.27
AWS RDS  (0) 2020.03.10
mysql 서버 작업용 임시 스크립트  (0) 2020.02.17

+ Recent posts