DB
-
DB LockDB 2024. 12. 7. 21:57
실무에서 경험한 DB Lock에 대해 정리한 내용입니다. 평화롭던 어느 날 서비스에서 타임아웃이 떨어지며 장애가 발생했었습니다. 결제 승인 단계에서 데이터베이스에서 조회하는 과정에서 타임아웃이 떨어지며 Null Exception이 발생했습니다. 데이터베이스 idle transaction을 확인했을 때 idle이 full filled 상태였고 DB Lock이라는 결론을 내렸습니다. DB Lock이란데이터베이스는 DB 동시성을 보장하기 위해 트랜잭션에서 Lock을 겁니다. 쉽게 이야기 하자면 데이터를 수정하는 도중에는 수정되고 있는 데이터를 조회할 수 없게 Lock을 걸게 됩니다. UPDATE가 실행되던 중 SELECT가 실행되면 Lock이 걸리게 되고 UPDATE가 끝나면 Lock이 풀리며 Select가..
-
[DB] 스키마 설계 - 식별 비식별 관계DB 2023. 6. 29. 22:31
데이터베이스 설계에서 테이블 간의 관계를 설정할 때 외래키를 사용합니다. A 테이블 ,B 테이블 관계 설정을 하면 부모 테이블과 자식 테이블이 필연적으로 만들어지는데 외래키가 설정되는 테이블을 자식 테이블이라 했을 때 외래키가 자식 테이블에서 PK 또는 FK로 설정할 수 있습니다. PK로 사용 하는것을 식별 관계, FK로 사용하는 것을 비식별 관계라고 합니다. 식별과 비식별 사이에는 차이점이 있습니다. 바로 부모 테이블에 레코드에 종속적이게 되는가! PK 설정인 식별관계에서는 부모 테이블 PK가 존재하지 않으면 자식 테이블을 생성할 수 없지만 FK 설정인 비식별관계에서는 부모 테이블 PK가 존재하지 않아도 자식 테이블의 PK로 생성할 수 있다는 차이입니다. 식별관계로 설정 할 경우 부모 테이블에 의존적이..
-
[DB] MySQL Union에 대해서DB 2023. 6. 22. 00:03
프로젝트를 진행하면서 Union all을 사용하게 되면서 고찰하고 문제점을 개선한 이야기입니다. Union All을 사용하게된 배경 해당 서비스는 혼자 여행할 때 포스트 게시와 여러 명이 동행을 하면서 포스트 게시하는 서비스로 포스트가 저장되는 테이블이 2개 존재했습니다. ( 혼자 할 때, 함께 할 때) 2개의 테이블에서 특정 시간 내에 사용자가 마지막에 게시한 포스트들을 조회해야 했습니다. 두 개의 서브 쿼리와 동행의 연관관계 때문에 여러 번의 조인문이 존재했습니다. 문제는 Union All이었습니다. Union All을 사용하게 되면 두 개의 SELECT문이 하나로 합쳐지면서 인덱스를 타고 조회할 수 없게 됩니다. 데이터 량이 적으면 상관없겠지만 좋은 방법은 아닙니다. 또한 두개의 SELECT문을 메..
-
[Error] DB Event 실행 후 적용 안됨DB 2023. 6. 2. 22:07
이 글은 DB Event를 적용하면서 직면했던 문제와 해결 방법입니다. DB에서 Trigger와 Event를 사용하는 도중 Event 실행 후 쿼리가 테이블에 적용이 안 되는 현상이었습니다. CREATE DEFINER=`user`@`localhost` EVENT `deletepush_00hour` ON SCHEDULE EVERY 1 DAY STARTS '2023-05-09' ON COMPLETION PRESERVE ENABLE COMMENT '' DO BEGIN DELETE FROM XXX; ... ... END 위 SQL은 HeidiSQL에서 생성 user 권한으로 생성한 Event입니다. 위의 이벤트는 테이블을 초기화하는 일을 하는데 Event가 발생하고 테이블이 초기화되지 않았습니다. 자세히 보면 ..
-
[DB] 권한 설정DB 2023. 5. 10. 00:56
데이터 베이스 권한에 대한 이야기 이 글을 프로젝트를 통해 데이터베이스 권한에 대해 공부하고 느낀 점을 정리한 글입니다. 이번 프로젝트에서 AWS host에 Spring 서버들과 데이터 베이스를 배포하게 되었다. 이러한 구조로 데이터베이스에 접근하기 위해서는 WAS 인증을 거치고 API를 통해서 접근할 수 있었다. 그리고 이러한 구조가 DB보안을 생각한 구조였다. DB 권한중 root@127.0.0.1 은 데이터베이스 커넥션에 접근하는 권한중 루트권한을 가진사람은 아이피 127.0.0.1(즉 로컬)만 허용한다는 뜻이다. 팀원들이 개발테스트 과정에는 서버 데이터베이스를 사용하게 해 달라는 요구가 있었다. 테이블이 여러 번 수정되면서 데이터베이스에서 오류가 많았나 보다.. 그래서 외부에서 들어오는 ip를 열..