ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Error] MySQL : Update 문 실수 시 조치 사항
    Data Engineer 2024. 3. 12. 12:07
    728x90

    혹시 update 문을 실수한 적이 있으신가요?

    전 조건을 잘못 걸어서 DB 내에서 반영되어야 하지 않아야할 행에도 데이터 변경을 가해 문제가 생긴 적이 있었습니다..

    앞으로, 그런 일이 있지 않기 위해서, 오늘은 그 대응법을 공유해보려고 합니다.

     

    저의 환경은 이러했습니다.

    - Cloud : Azure

    - DB 접근 순서 : VM 접속 -> 클라우드 내 Mysql 접속

    - DB Client : DBeaver

     

    먼저, 가장 주의해야할 점은 쿼리를 머릿속으로만 그리지 않고 확인 절차를 거치는 것이 좋습니다.

    이때, 여러 방법이 있는데요.

    1. SELECT 문을 통한 update 쿼리에 영향이 미칠 행 확인

    2. TRANSACTION 실행 후 UPDATE, commit/rollback 지정

    2번 방법에 대해 설명드리겠습니다.

     

    VM 접속

    저는 ssh 방법으로 vm에 접속하였습니다.

    ssh root@(vm 주소 ip)

    MySQL 접속

    접속 후, mysql에 접속합니다.

    mysql -h {hostname} -u {user_id, 저는 root} -p
    > 비밀번호 입력

    이렇게 하게되면, mysql에 접속할 수 있습니다.

    Azure 상 hostname은 Azure Portal -> Mysql 서버 -> Connect -> hostname 항목에서 볼 수 있습니다

     

    Transaction 실행

    mysql > START TRANSACTION;

    트랜잭션을 실행해주면, 이후에 실행할 쿼리가 포함된 트랜잭션을 수동으로 제어할 수 있습니다.

     

    UPDATE 실행

    update INFORMATION info
    set CODE = (select CODE
    from IRIS ris
    where info.REQUEST_DATE = ris.STORED_REQUEST_DATE
    and (ris.REQUEST_DATE between '2024-03-05' and '2024-03-08') and info.CODE = 'A')

    실행 후, SELECT로 원하는 결과가 나오거나 DB Client에서 동일하게 쿼리를 실행해 0 rows affected 메시지가 나오면 잘 마무리된 겁니다.

    COMMIT / ROLLBACK

    mysql > COMMIT; // 원하는 결과가 나왔을 때
    mysql > ROLLBACK; // 원하는 결과가 나오지 않았을 때

    commit을 실행하게 되면 update 쿼리가 db에 반영됩니다.

     

    저의 경우, 다행히 다른 테이블과의 JOIN 연산을 통해 해결이 가능했습니다.

    만약 DELETE, UPDATE를 트랜잭션 제어없이 실행한 실수이고, 트랜잭션 로그 확인이 불가한 상황이라면 해결하기 힘들 것 같습니다...

    이런 경우를 대비해 중요한 변경 이벤트가 있다면 꼭꼭! 트랜잭션 수동 제어를 사용하시기 바랍니다.

    728x90

    'Data Engineer' 카테고리의 다른 글

    GlobalEventBus ?  (0) 2024.05.02
    Nginx  (0) 2024.03.28
    Git action - 이론  (0) 2024.03.08
    App Update  (0) 2024.03.08
    프로메테우스  (0) 2024.03.03
Designed by Tistory.