mysql 54

[MySQL] 별칭 (Alias)

개요 SQL에서 테이블이나 컬럼에 대해 별칭을 지정하여 간단히 참조할 수 있다는 건 데이터베이스를 알고 있는 사람에게는 기본적인 지식이라고 할 수 있다. 하지만 나는 SELECT나 FROM 절 외의 다른 절에서도 참조할 수 있다는 걸 잘 기억하지 못하기 때문에 굳이 적어둔다. 별칭 SELECT 문에서는 키워드 AS를 사용해 별칭을 부여할 수 있다. 별칭은 표현식의 컬럼 이름이나 GROUP BY, ORDER BY, HAVING 절 등에서 사용할 수 있다. SELECT FLOOR(PRICE / 10000) * 10000 AS PRICE_GROUP, COUNT(1) AS `PRODUCTS` FROM PRODUCT GROUP BY PRICE_GROUP ORDER BY PRICE_GROUP 별칭은 컬럼 뿐만 아니..

Database 2023.12.20

[MySQL] 집계 함수 ALL, ANY 구현

개요 Python에는 여러 데이터에 대한 참, 거짓을 판단할 때 사용할 수 있는 all, any 함수가 존재한다. 참고 : 2022.10.08 - [Python] any/all - 여러 요소의 참/거짓 확인 비슷한 방식으로 MySQL에서 SQL을 이용해 그룹 별 여러 데이터에 대한 참, 거짓을 판단하고 싶다. 방법을 알아보자. 참고로 Subquery로 제공되는 ALL, ANY가 아니다. 예시 테이블 | month | day | amount | | ----- | --- | ------ | | 1 | 3 | 9000 | | 1 | 5 | 8000 | | 3 | 15 | 20000 | | 6 | 14 | 110123 | | 6 | 18 | 3000 | | 12 | 20 | 101000 | | 12 | 25 |..

Database 2023.11.20

[MySQL] INSERT ~ ON DUPLICATE KEY UPDATE (insert or update)

UPSERT UPDATE, INSERT의 합성어로, 테이블에 추가하고자 하는 데이터의 기준 값이 데이블에 없으면 데이터를 추가하고 있으면 데이터를 갱신하는 것을 의미한다. 즉, INSERT OR UPDATE라고 할 수 있다. 데이터베이스 엔진마다 지원 여부와 문법이 다른데, MySQL은 INSERT ~ ON DUPLICATE KEY UPDATE 문으로 지원한다. INSERT ~ ON DUPLICATE KEY UPDATE INSERT INTO table(key1, key2, col1, col2) VALUES(val1, val2, val3, val4) ON DUPLICATE KEY UPDATE col1 = val3, col2 = val4; INSERT문에 ON DUPLICATE KEY UPDATE을 지정하면..

Database 2023.11.16

[MySQL] SELECT FOR UPDATE

개요 하나의 트랜잭션 내에서 데이터를 쿼리 한 후 관련 데이터를 삽입하거나 갱신하는 경우, 일반적인 SELECT 문은 충분한 보호를 제공하지 않는다. 쿼리 한 데이터와 동일한 데이터를 다른 트랜잭션에서 갱신하거나 삭제할 수 있기 때문에 추가적인 안정성이 필요하다. SELECT FOR UPDATE는 이러한 동시성 문제를 해결하기 위해 InnoDB가 제공하는 locking read 방법 중 하나다. Locking Read InnoDB 테이블에 대해나 잠금 작업을 수행하는 SELECT 문이다. SELECT ~ FOR UPDATE 또는 SELECT ~ LOCK IN SHARE 문 두 가지가 해당된다. locking read는 교착 상태를 발생시킬 수 있으므로 사용에 주의해야 한다. SELECT FOR UPDAT..

Database 2023.10.24

[MySQL] mysql-client login-path 설정

개요 MySQL Client로 접속할 때 접속 정보를 지정해야 하는데 매번 접속 정보를 입력하는 건 번거로운 일이다. 특히 -p 옵션을 사용해 비밀번호를 입력한다면 민감 정보가 불필요하게 노출될 수 있다. 이러한 문제를 해결하기 위해 MySQL 접속 정보를 저장하는 mysql_config_editor을 사용할 수 있는데, 이 글에서는 mysql_config_editor를 이용해 mysql에 하는 방법을 적어둔다. 기존 접속 방법 2022.12.12 - [MySQL] 접속 명령어 기본적으로 mysql 클라이언트를 이용하면 다음과 같은 정보를 지정하여 접속한다. mysql -u -p -h -P 3306 mysql_config_editor 사용 mysql_config_editor은 mysql-client를 사..

Database 2023.10.02

[AWS] RDS MySQL - binlog 기반 인스턴스 간 복제

개요 RDS 백업 등을 위한 복제 방법은 여러 가지가 존재하는데, 이 글에서는 RDS 인스턴스 설정 변경 및 교체가 필요해 binlog 기반으로 서로 다른 RDS 간 복제 설정을 해보려고 한다. 진행 방식은 크게 다음과 같다. 1. 원본 인스턴스 binlog 사용 여부 확인 및 보존 기간 설정 2. 읽기 전용 복제본에서 복제 시작점 확인 3. 복제 인스턴스에서 원본 인스턴스 복제 설정 및 시작 binlog 기반 복제를 사용하면 교차 계정/교차 리전 간 복제, on-prem과 AWS 간 복제, mysql과 aurora 간의 복제 등등을 수행할 수 있다. 원본 인스턴스 설정 복제할 원본 인스턴스가 binlog를 사용하고 있는지 확인하고, 외부 인스턴스가 binlog를 사용할 수 있도록 관련 설정을 변경한다...

AWS 2023.09.29

[AWS] RDS - You are not using binary logging

개요 바이너리 로그에는 테이블 생성 작업이나 테이블 데이터 변경과 같은 데이터베이스 변경을 설명하는 이벤트가 포함된다. RDS 복제 등의 작업을 하고자 바이너리 로그를 확인하려고 했더니, 다음과 같이 수행되지 않았다. 바이너리 로그 파일 확인 SHOW BINARY LOGS; -- 또는 SHOW MASTER LOGS; 실행 결과 어떻게 하면 binlog를 활성화할 수 있을까? 확인해 본다. 해결 찾아보니 AWS RDS는 biglog 활성화 방식을 자동 백업의 활성화 여부로 제한하고 있는 것 같다. 공식 문서에 따르면 자동 백업 기능은 MySQL에 대해 바이너리 로깅을 설정할지 아니면 해제할지를 결정한다고 한다. 백업 기능을 활성화해 보고 정말 binlog이 확인되는지 살펴본다. 백업 기능 활성화 1. 작업..

AWS 2023.09.28

[MySQL] SHOW GRANTS - 계정 권한 확인

개요 Airflow와 같은 서비스의 버전을 업그레이드하다 보면 서비스가 사용하는 RDB의 스키마가 변경되는 경우가 있어 DB에 대한 DDL (CREATE, ALTER, DROP, TRUNCATE) 권한이 필요할 수 있다. 현재 DB 계정에게 부여된 권한을 확인해본다. 사용자 조회 권한을 확인할 사용자를 확인한다. SELECT host, user FROM mysql.user; | host | user | | --------- | ---------------- | | localhost | mysql.infoschema | | localhost | mysql.session | | localhost | mysql.sys | | localhost | root | | localhost | test | test@lo..

Database 2023.09.19

[MySQL] NOT NULL 날짜 데이터 조회 시 NULL로 보이는 경우

현상 다음과 같이 정의된 테이블이 있다고 하자. CREATE TABLE test ( id int NOT NULL, diagnosis_date datetime NOT NULL DEFAULT current_timestamp, PRIMARY KEY (id, diagnosis_date) ); 스키마에 의하면 diagnosis_date가 NOT NULL인데 데이터를 조회하면 아래와 같이 NULL로 세팅된 데이터가 존재했다. SELECT diagnosis_date FROM test WHERE diagnosis_date IS NULL; 원인 사용하고 있는 Tool이 유효하지 않은 날짜 데이터를 처리하는 방식에 의한 결과일 수 있다. 이런 경우 mysql client를 이용하면 좀더 명확하게 확인할 수 있다. mysq..

Database 2023.07.31

[MySQL] 일반 사용자 비밀번호 변경

개요 DBA로부터 애플리케이션 서비스용 MySQL 계정을 발급받았는데 초기 비밀번호가 임의로 생성한 비밀번호인지 기억하기 힘든 조합으로 되어있다. 비밀번호를 변경해서 사용해도 된다고 하니 직접 변경을 해보려고 한다. MySQL 버전은 8.0.32이다. SET PASSWORD SET PASSWORD문은 MySQL 사용자 계정에 암호를 할당한다. 암호는 명시적으로 지정하거나 MySQL에 의해 임의로 생성할 수 있다. 비밀번호를 변경할 때 REPLACE절을 사용해 현재 암호를 확인하거나 RETAIN절로 보조 암호를 관리할 수 도 있다. SET PASSWORD [FOR user] auth_option [REPLACE 'current_auth_string'] [RETAIN CURRENT PASSWORD] auth..

Database 2023.07.25