Mysql - 트리거

00_8_3·2023년 9월 13일

MySQL 8.0

목록 보기
4/4

이종 디비간의 동기화

  • 트랜잭션이 commit이 된후 실행됨을 보장하지 않는다.

  • 트랜잭션 롤백되는 경우 트리거도 롤백된다.

설정

aws rds mysql 사용 중이다.

트리거 생성하려면 log_bin_trust_function_creators를 1로 수정하자. (동적 파라미터라 재시작 안해도됨)

참고 : https://repost.aws/ko/knowledge-center/rds-mysql-functions

예)

동일한 트랜잭션에서
post를 생성 할 때
참조 값으로 join 한 결과를(배열) JSON 타입으로 중간 단계의 테이블에
삽입하려고 할 때

post는 생성되었지만 post_tpos(참조 테이블)은 생성되지 않아 null 값이 들어가는 이슈.

코드

  • 트리거 예시 1)
DELIMITER $$
CREATE TRIGGER after_post_tpos_update 
AFTER INSERT ON post_tpos
FOR EACH ROW 
BEGIN

DECLARE _json JSON; -- @ 제거

    SET _json = (SELECT JSON_ARRAYAGG(JSON_OBJECT('id', pt.tpo_id, 'tpo', t.text))
	     FROM post_tpos pt
	     JOIN tpos t ON pt.tpo_id = t.id
	     WHERE pt.post_id = NEW.post_id);

INSERT INTO temp_tpos_json (id, tpos_json) values (NEW.post_id, _json)
 ON DUPLICATE KEY UPDATE tpos_json = _json;

END $$
DELIMITER ;

--

CREATE TABLE temp_tpos_json (
    id INT UNIQUE,
    tpos_json JSON
);

단점
1. FOR EACH ROW bulk insert를 한다고 해도 ROW단위로 갱신을 하기 때문에 비효율적인 문제가 있다.
2. 같이 동기화 할 참조 테이블이 여러개인 경우 트리거가 늘어난다. (설계 복잡도 늘어남)

장점

  1. 비용 절약?

aws rds mysql 에서는 스트림을 지원하지 않음
aws dms를 사용한 cdc 가능하긴 하지만 단일 테이블만 가능하다.
오로라 db를 사용하거나 중간 디비로 다이나모디비를 사용하거나 다른 솔루션들이 있지만
비용 발생을 피하기 위해 트리거로 중간 테이블을 만들어 noSql에 넣을 단일 데이터를 만들수 있다.

진행중

0개의 댓글