전체 글
고양이를 좋아하고 뭐든지 공유하는 것을 좋아하는 사람입니다.
-
Aurora MySQL 운영 중 특정 1 건의 Row 데이터를 업데이트했을 경우 Lock으로 인해 데이터가 업데이트되지 않는 문제가 발생했습니다. 어떤 방법으로 XA 트랜잭션을 식별 및 처리하였는지 공유해보겠습니다. 운영 중인 환경은 Aurora 3 버전입니다. 문제 해결을 위해 가장 먼저 실행 중인 프로세스 리스트를 확인해보지만 문제가 될만한 프로세스는 확인되지 않았습니다. 좀 더 세부적인 트랜잭션 확인을 위해 information_schema.INNODB_TRX 테이블을 체크합니다. RUNNING 상태의 트랜잭션이 확인되었으며 1 Row에 대해 Lock이 걸려있는 것을 확인할 수 있었습니다. 다만 tx_mysql_thread_id 값은 0으로 해당 트랜잭션을 소유하고 있는 스레드가 존재하지 않았습니다..
[MySQL] XA 트랜잭션으로 인해 Kill 되지 않는 트랜잭션 이슈Aurora MySQL 운영 중 특정 1 건의 Row 데이터를 업데이트했을 경우 Lock으로 인해 데이터가 업데이트되지 않는 문제가 발생했습니다. 어떤 방법으로 XA 트랜잭션을 식별 및 처리하였는지 공유해보겠습니다. 운영 중인 환경은 Aurora 3 버전입니다. 문제 해결을 위해 가장 먼저 실행 중인 프로세스 리스트를 확인해보지만 문제가 될만한 프로세스는 확인되지 않았습니다. 좀 더 세부적인 트랜잭션 확인을 위해 information_schema.INNODB_TRX 테이블을 체크합니다. RUNNING 상태의 트랜잭션이 확인되었으며 1 Row에 대해 Lock이 걸려있는 것을 확인할 수 있었습니다. 다만 tx_mysql_thread_id 값은 0으로 해당 트랜잭션을 소유하고 있는 스레드가 존재하지 않았습니다..
2022.11.25 -
이번에 Aurora MySQL을 운영하면서 겪기 쉽지 않은 상황을 경험하여 해당 내용을 공유하겠습니다. MySQL innodb 엔진의 경우 innodb_buffer_pool_size 값은 성능에 큰 영향을 미칠 수 있습니다. 서비스에서 운영하는 DB 스펙은 아래와 같습니다. db.r5.4xlarge vCPU 16 / RAM 128 엄청나게 많이 기록되고 있는 Slow Query와 IOPS 수치와 50GB의 가용 메모리... 문제가 있음을 느끼고 버퍼 풀 설정을 확인합니다. 설마 했지만 128 RAM에 innodb_buffer_pool_size 값이 5GB가 박혀있었습니다... 누가 대체 왜... 어떻게 이런 일이 발생했는지 퇴사한 기존 담당자들에게 연락을 해보지만 다들 자기는 하지 않았다는... 제가 이..
[MySQL] 과하게 작게 설정된 innodb_buffer_pool_size이번에 Aurora MySQL을 운영하면서 겪기 쉽지 않은 상황을 경험하여 해당 내용을 공유하겠습니다. MySQL innodb 엔진의 경우 innodb_buffer_pool_size 값은 성능에 큰 영향을 미칠 수 있습니다. 서비스에서 운영하는 DB 스펙은 아래와 같습니다. db.r5.4xlarge vCPU 16 / RAM 128 엄청나게 많이 기록되고 있는 Slow Query와 IOPS 수치와 50GB의 가용 메모리... 문제가 있음을 느끼고 버퍼 풀 설정을 확인합니다. 설마 했지만 128 RAM에 innodb_buffer_pool_size 값이 5GB가 박혀있었습니다... 누가 대체 왜... 어떻게 이런 일이 발생했는지 퇴사한 기존 담당자들에게 연락을 해보지만 다들 자기는 하지 않았다는... 제가 이..
2022.10.31 -
개요 Redshift는 사용자와 권한을 관리하는 방법이 조금 복잡하여 권한 부여 및 삭제에서 삽질한(?) 내용을 공유해보겠습니다. 사용자와 그룹 Redshift에서는 Postgres와 조금 차이가 있는데 접근제어를 위해 role의 개념을 사용하지 않고 사용자와 그룹을 사용합니다. 그리고 아래의 규칙을 가집니다. 사용자만 그룹의 하위에 속할 수 있습니다. 즉, 그룹은 다른 그룹에 속할 수 없습니다. 그룹이 아닌 사용자가 관계를 소유합니다. 사용자와 그룹에 별도로 권한이 부여될 수 있습니다. 사용자는 자신이 속한 그룹의 모든 권한을 자동으로 상속합니다. 계정 계정생성 CREATE USER name [ [ WITH ] option [ ... ] ] where option is CREATEDB | NOCREAT..
[RedShift] 사용자 및 권한 관리 (feat. 계정 삭제시 오류)개요 Redshift는 사용자와 권한을 관리하는 방법이 조금 복잡하여 권한 부여 및 삭제에서 삽질한(?) 내용을 공유해보겠습니다. 사용자와 그룹 Redshift에서는 Postgres와 조금 차이가 있는데 접근제어를 위해 role의 개념을 사용하지 않고 사용자와 그룹을 사용합니다. 그리고 아래의 규칙을 가집니다. 사용자만 그룹의 하위에 속할 수 있습니다. 즉, 그룹은 다른 그룹에 속할 수 없습니다. 그룹이 아닌 사용자가 관계를 소유합니다. 사용자와 그룹에 별도로 권한이 부여될 수 있습니다. 사용자는 자신이 속한 그룹의 모든 권한을 자동으로 상속합니다. 계정 계정생성 CREATE USER name [ [ WITH ] option [ ... ] ] where option is CREATEDB | NOCREAT..
2022.07.22 -
개요 MySQL의 복제 데이터 포맷에는 어떤 방식이 있는지 알아보고 간단한 테스트를 통해 유의점을 확인해보겠습니다. 복제 포맷 MySQL의 복제 포맷에는 Statement, Row, Mixed 3가지 형태가 있습니다. Statement 방식은 MySQL 바이너리 로그 도입 당시부터 존재한 복제 포맷이며 5.7.7 이후 버전 부터는 Row 형태가 기본 포맷으로 변경되었습니다. Statement : 명령문 기반의 로깅 방식 Row : 행 기반의 데이터 로깅 방식 Mixed : Statement와 Row의 장점을 혼합한 로깅 방식 Statement 기반 바이너리 로그 포맷 Statement 방식의 경우 실행된 SQL 문을 그대로 바이너리 로그에 저장하는 방식입니다. 다수의 데이터가 수정된 경우에도 단순히 쿼리..
[MySQL] 복제 구성을 위한 바이너리 로깅 형식개요 MySQL의 복제 데이터 포맷에는 어떤 방식이 있는지 알아보고 간단한 테스트를 통해 유의점을 확인해보겠습니다. 복제 포맷 MySQL의 복제 포맷에는 Statement, Row, Mixed 3가지 형태가 있습니다. Statement 방식은 MySQL 바이너리 로그 도입 당시부터 존재한 복제 포맷이며 5.7.7 이후 버전 부터는 Row 형태가 기본 포맷으로 변경되었습니다. Statement : 명령문 기반의 로깅 방식 Row : 행 기반의 데이터 로깅 방식 Mixed : Statement와 Row의 장점을 혼합한 로깅 방식 Statement 기반 바이너리 로그 포맷 Statement 방식의 경우 실행된 SQL 문을 그대로 바이너리 로그에 저장하는 방식입니다. 다수의 데이터가 수정된 경우에도 단순히 쿼리..
2022.06.03 -
개요 Docker-Compose로 간단하게 MySQL 테스트 환경을 구성해보도록 하겠습니다. 사전에 Docker 및 Docker-Compose에 대한 이해가 필요합니다. 테스트 환경 Centos7 Docker 20.10.14 Docker-compose 1.29.2 구성 docker 구성을 위한 디렉토리를 생성합니다. $ mkdir mysql_test $ cd mysql_test 컨테이너 내의 파일을 동기화할 디렉토리를 mysql_test 하위에만들어 줍니다. $ mkdir db -- my.cnf 파일 관리를 위한 디렉토리 $ mkdir db/conf.d -- mysql Data를 저장할 디렉토리 $ mkdir db/data docker-compose.yml mysql_test 디렉토리 하위에 docker..
[MySQL] Docker-compose를 이용한 초간단 서버 구성개요 Docker-Compose로 간단하게 MySQL 테스트 환경을 구성해보도록 하겠습니다. 사전에 Docker 및 Docker-Compose에 대한 이해가 필요합니다. 테스트 환경 Centos7 Docker 20.10.14 Docker-compose 1.29.2 구성 docker 구성을 위한 디렉토리를 생성합니다. $ mkdir mysql_test $ cd mysql_test 컨테이너 내의 파일을 동기화할 디렉토리를 mysql_test 하위에만들어 줍니다. $ mkdir db -- my.cnf 파일 관리를 위한 디렉토리 $ mkdir db/conf.d -- mysql Data를 저장할 디렉토리 $ mkdir db/data docker-compose.yml mysql_test 디렉토리 하위에 docker..
2022.05.20 -
개요 MS-SQL에서는 클러스터 인덱스가 없는 힙 테이블이란 개념이 존재했었는데 MySQL은 테이블 생성 시 내부적으로 클러스터 인덱스가 생성되어 어떤 경우에 해당 인덱스가 생성되는지 알아보겠습니다. 클러스터 인덱스가 없는 테이블 생성 MySQL의 InnoDB의 경우 Primary Key. 즉 클러스터 인덱스가 없는 테이블을 생성할 경우 칼럼이 NOT NULL로 구성된 UNIQUE KEY가 있을 경우 클러스터로 사용합니다. 별도의 키가 없을 경우에는 GEN_CLUST_INDEX라는 이름의 클러스터 인덱스가 생성됩니다. 해당 인덱스는 6바이트 크기로 물리적으로 저장된 순서로 인덱스 값이 부여됩니다. case1. 인덱스 미생성 시 CREATE TABLE non_index( col1 int(11) NULL, ..
[MySQL] 클러스터 인덱스 미생성 테이블개요 MS-SQL에서는 클러스터 인덱스가 없는 힙 테이블이란 개념이 존재했었는데 MySQL은 테이블 생성 시 내부적으로 클러스터 인덱스가 생성되어 어떤 경우에 해당 인덱스가 생성되는지 알아보겠습니다. 클러스터 인덱스가 없는 테이블 생성 MySQL의 InnoDB의 경우 Primary Key. 즉 클러스터 인덱스가 없는 테이블을 생성할 경우 칼럼이 NOT NULL로 구성된 UNIQUE KEY가 있을 경우 클러스터로 사용합니다. 별도의 키가 없을 경우에는 GEN_CLUST_INDEX라는 이름의 클러스터 인덱스가 생성됩니다. 해당 인덱스는 6바이트 크기로 물리적으로 저장된 순서로 인덱스 값이 부여됩니다. case1. 인덱스 미생성 시 CREATE TABLE non_index( col1 int(11) NULL, ..
2022.05.19