DB
-
데이터베이스를 Docker 환경에서 운영하면 안되는 이유DB 2021. 11. 7. 21:39
Docker와 같은 컨테이너 기술에서 컨테이너는 stateless하다고 가정한다. 즉, 실행 중에 컨테이너에 지속적으로 유지되어야 할 데이터를 저장해서는 안 된다. 컨테이너는 함수와 같이 취급되어야 한다. Docker 자체가 stateful한 서비스를 위해 설계된 것이 아니며, 컨테이너가 제거될 때 컨테이너 실행 중에 생성된 데이터도 제거된다. 또한 쿠버네티스와 같은 오케스트레이션 도구는 트래픽에 따라 컨테이너를 생성하고 삭제할 수 있다. 같은 이미지로 같은 컨테이너를 생성하더라도, 데이터베이스의 경우 각 컨테이너의 데이터가 다르면 트래픽 분산을 하는 의미가 없어진다. 만약 하나의 컨테이너만 운영한다면, 트래픽 분산이 불가능하다. 물론 Docker 볼륨 등을 이용하여 지속적으로 데이터를 유지할 수 있다...
-
PostgreSQL 외부 접속 허용 및 IP주소 제한DB 2021. 11. 7. 00:23
클라우드 인스턴스에서 PostgreSQL의 포트를 열어놓고 외부 접속을 허용했더니, 디도스 비슷한 트래픽 공격으로 서버 메모리가 치솟은 경험이 있다. 이 때문에 외부 접속은 허용하되, IP주소로 제한을 걸어서 특정 사용자만 외부에서 접근할 수 있도록 정책을 바꾸었다. 해당 설정 방법에 대해 공유한다. 요약부터 하면, postgresql.conf 파일에서 외부 모든 아이피의 접속을 허용하고, pg_hba.conf 파일에서 허용할 아이피를 제한한다. 이게 일반적인 설정 방법이다. 먼저 pg_hba.conf 파일을 열어서 수정한다. (파일 위치: /etc/postgresql/버전/main/pg_hba.conf) vim /etc/postgresql/버전/main/pg_hba.conf 문서 제일 하단 IPv4 l..
-
다중 태그 검색 SQL문DB 2021. 10. 31. 21:39
post 테이블과 tag 테이블이 있고, 두 테이블을 매핑하는 post_tag_relation이라는 테이블이 있다고 가정한다. 사용자가 여러 개의 태그를 모두 가지고 있는 포스팅만을 조회한다고 할 때의 SQL 문은 아래와 같다. SELECT post_id FROM post_tag_relation WHERE tag_id IN (SELECT id FROM tag WHERE name IN ('tag1','tag2')) GROUP BY post_id HAVING COUNT(tag_id) >= 2; 위의 SQL문을 조금 더 최적화하려면, 서브쿼리를 조인으로 바꾸면 된다. left outer join이 서브쿼리보다 빠르기 때문이다. (출처: https://stackoverflow.com/questions/25771..
-
Ubuntu에서 PostgreSQL 설치 및 데이터 저장 위치 변경하기DB 2021. 10. 26. 22:27
먼저 아래 명령어를 통해 PostgreSQL을 설치한다. sudo apt update sudo apt upgrade -y sudo apt install postgresql-12 위 명령어는 아래 공식 문서에서 확인하였다. https://www.postgresql.org/download/linux/ubuntu/ PostgreSQL: Linux downloads (Ubuntu) Linux downloads (Ubuntu) PostgreSQL is available in all Ubuntu versions by default. However, Ubuntu "snapshots" a specific version of PostgreSQL that is then supported throughout the life..
-
데이터베이스별 boolean 데이터 타입(PostgreSQL, MySQL, Oracle)DB 2021. 10. 15. 23:06
boolean 타입의 데이터를 저장할 때 항상 0과 1, 'Y'와 'N' 등의 값으로 대체해서 저장하곤 했다. 나는 주로 PostgreSQL을 사용하는데, 문득 boolean 데이터 타입은 진짜 없을까? 하고 찾아보게 되었다. PostgreSQL 결론은 PostgreSQL은 boolean 데이터 타입을 지원한다. 스펙은 아래와 같다. 데이터 타입 이름 boolean 데이터 타입 사이즈 1 byte true로 인식되는 값 't', 'true', 'y', 'yes', 'on', '1' false로 인식되는 값 'f', 'false', 'n', 'no', 'off', '0' 공백은 무시되며, 대소문자도 무시된다. 공식 문서 상으로는 TRUE와 FALSE라는 예약어 사용을 권장하고 있다. select 문으로 b..
-
PostgreSQL timestamp vs timestamptzDB 2021. 10. 14. 23:28
PostgreSQL에서 날짜와 시간을 표현하는 데이터 타입은 6가지가 있다. 하지만 그 중에서 날짜와 시간을 한번에 표현할 수 있는 데이터 타입은 timestamp와 timestamptz 2가지밖에 없다. timestamptz는 이름에서 알 수 있듯이 timestamp에 추가로 타임존 정보를 가지고 있는 것처럼 보인다. 그러나 두 가지 데이터 타입의 길이는 모두 8 byte이다. 즉, timestamptz가 더 많은 데이터를 가지고 있지 "않다"는 뜻이다. SELECT pg_column_size('2000-01-01 00:00:00 +00:00'::timestamp) as "timestamp byte size", pg_column_size('2000-01-01 00:00:00 +00:00'::timest..
-
[SQL] UPDATE 시 LIKE 조건에 컬럼 이름 사용하기DB 2021. 7. 12. 01:26
행정구역 이름이 들어있는 컬럼의 값을 데이터 정합성을 위해 행정구역 코드로 변경해야 했다. 같은 행정구역이어도 다른 값이 들어오는 경우가 있었기 때문이다. 예를 들자면 "경기도"를 뜻하는 데이터가 "경기도"와 "경기" 두 가지로 들어오는 것이다. 이에 행정구역 테이블의 행정구역 코드 컬럼과 LIKE 조건을 통해서 UPDATE를 하였다. 이 때 구글링을 통해 찾아 사용한 SQL문은 아래와 같다. 가정 1. user라는 테이블은 city라는 컬럼을 가지고 있고, 해당 컬럼에 행정구역 이름 데이터가 들어있다. 2. city라는 테이블은 city_code와 city_name 컬럼을 가지며, 행정구역 코드와 행정구역 이름 데이터가 들어있다. 사용한 DBMS는 PostgreSQL이다. update user set ..
-
[SQL] UPDATE 시 ROW_NUMBER() 함수 사용하기DB 2021. 7. 3. 16:44
데이터가 이미 들어있는 테이블을 장고 ORM에 쓰려고 하는데 PK로 지정된 컬럼이 없다는 오류가 발생했다. 그래서 급하게 id 컬럼을 추가하고 ROW_NUMBER() 함수를 통해 id 값을 업데이트하였다. 이 때 구글링으로 찾아서 사용한 SQL문은 아래와 같다. 가정 1. a라는 테이블에 이름과 전화번호 컬럼이 존재한다. 2. 이름을 오름차순으로, 이름이 같은 경우에는 전화번호를 오름차순으로 해서 행 번호를 id 컬럼 값으로 UPDATE한다. 사용한 DBMS는 PostgreSQL이다. UPDATE a SET id = x.id FROM (SELECT name , phone_number , ROW_NUMBER() OVER (ORDER BY name, phone_number) AS id FROM a ORDER..