Database 76

[PostgreSQL] DATABASE 강제 DROP

개요 Database를 복구하다가 문제가 생겼었는데, 복구한 데이터베이스를 지우고 다시 복구하려고 한다. 그런데 DATABASE에 연결한 사용자가 있어 DROP에 실패했다. 강제로 DATABASE를 삭제하는 방법을 적어둔다. DROP DATABASE 데이터베이스를 삭제할 때는 DROP 문을 사용한다. DROP 문은 되돌릴 수 없기 때문에 신중하게 사용해야 한다. DROP DATABASE db_name DROP DATABASE IF EXISTS db_name IF EXESTS를 사용하면 삭제할 데이터베이스가 존재하지 않아서 발생하는 오류를 방지할 수 있다. 데이터베이스 강제 삭제 삭제를 수행하는 사용자가 삭제할 데이터베이스를 사용하고 있는 경우도 포함해서, 삭제하려고 하는 데이터베이스에 연결된 세션이 있으..

Database 2024.01.11

[PostgreSQL] 사용자 비밀번호 변경

개요 PostgreSQL 데이터베이스 전체 덤프를 복원하는 중, 데이터베이스의 기본 사용자인 postgres 계정의 비밀번호가 변경되었다. 변경된 비밀번호를 원래 값으로 원복하려고 한다. 방법을 정리해둔다. ALTER psql로 superuser 권한을 가진 계정에 접속한 뒤, ALTER문을 이용해 비밀번호를 변경한다. psql -U postgres ALTER USER WITH PASSWORD ''; 다만 ALTER 문으로 비밀번호를 변경하면 히스토리 등에 의해 변경한 비밀번호가 남아있을 수 있으니 주의해야 한다. \password psql로 superuser 권한을 가진 계정에 접속한 뒤, 메타 명령어 \password를 이용해 비밀번호를 변경한다. psql -U postgres \password 비밀..

Database 2024.01.04

[PostgreSQL] pg_dumpall - 데이터베이스 백업/복원

개요 PostgreSQL 데이터베이스 내 데이터 전체를 백업하고 복원해야 할 일이 있어 방법을 정리해 둔다. 백업 pg_dumpall은 데이터베이스 클러스터 전체 내용을 덤프 하는 프로그램으로, 클러스터의 각 데이터베이스를 백업하고 role, tablespaces와 같은 클러스터 전체 데이터도 저장한다. 기본 사용법은 아래와 같다. pg_dumpall > pg_dumpall -f pg_dumpall -U -f # 예시 pg_dumpall -U postgres > dumpall_superset_postgres.sql pg_dumpall은 role, tablespaces, 빈 데이터베이스를 재생성하는 명령어를 내보낸 후, 각 데이터베이스에 대한 pg_dump를 호출하는 방식으로 동작한다. 결과 파일은 SQL..

Database 2023.12.29

[PostgreSQL] 사용자 목록 확인

개요 PostgreSQL에서 사용자 목록과 권한을 확인하는 방법을 정리해 둔다. psql 메타 명령어 psql 메타 명령어 \du는 사용자명, 사용자에게 부여된 권한과 소속 그룹 정보를 확인할 수 있다. \du 출력에서 확인할 수 있는 기본 권한(role) 목록은 다음과 같다. 권한 설명 SUPERUSER 데이터베이스에 대한 모든 작업을 허용하는 관리자 권한 CREATEDB 데이터베이스 생성 가능 CREATEROLE 신규 역할 생성 가능 REPLICATION 데이터베이스 복제를 위한 역할. 꽤 높은 권한을 가지고 있어 복제 용도로만 사용하는 것을 권장한다. BYPASSRLS Row 수준 보안 정책 통과 가능. 테이블 덤프 등의 작업 제한용 SQL 데이터베이스 사용자에 대한 정보를 저장하는 PG_USER ..

Database 2023.12.28

[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

[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