스키마, Table 생성 및 파티셔닝 설정
스키마 생성
- 현재 연결된 데이터베이스에 스키마 생성
1
CREATE SCHEMA {SCHEMA_NAME}
pg_
로 시작하는 스키마명 사용 불가- CREATE 권한이거나 슈퍼 유저일 경우 스키마 생성 가능
table 생성
timestamp
기준으로 partition 설정한 table 생성1 2 3 4 5
CREATE TABLE {TABLE_ID} ( idx serial, {COLUMN_NAME} {DATA_TYPE}, timestamp TIMESTAMP ) partition by range(timestamp);
파티셔닝 설정
- partition 설정 위한
pg_partman
확장 사용 적용1
CREATE EXTENSION pg_partman SCHEMA public;
- table 생성 확인
original_table
orders
old_nonpartitioned_table
part_config
part_config_sub
spatial_ref_sys
template_public_original_table
- table 생성 확인
- partition 적용 - partition 사용할 메인 table 생성
1 2 3 4 5 6
CREATE TABLE {TABLE_ID} ( idx serial, {COLUMN_NAME} {DATA_TYPE}, {COLUMN_NAME} {DATA_TYPE}, timestamp TIMESTAMP ) partition by range(timestamp);
- partition 적용 - Index 생성
1
CREATE INDEX ON {SCHEMA_NAME}.{TABLE_ID} (idx, timestamp);
- 추후 생성되는 partition에 자동 적용
- partition 적용 - table에 partition 적용
1 2 3
SELECT {SCHEMA_NAME}.create_parent('{SCHEMA_NAME}.{TABLE_ID}', 'timestamp', 'native', 'daily', p_template_table:= '{SCHEMA_NAME}.{TABLE_ID}', p_premake := 15, p_start_partition := (CURRENT_TIMESTAMP)::text); UPDATE {SCHEMA_NAME}.part_config SET retention_keep_table = false, retention = '6 month' WHERE parent_table = '{SCHEMA_NAME}.{TABLE_ID}';
{SCHEMA_NAME}.{TABLE_ID}
- partition 기준 table
timestamp
- partition 기준 column
- partition 타입
native
선언적 partition (파티셔닝 관리 용이. 속도 상승 및 partition pruning 자동)partman
상속 partition (구버전, table 따로 관리, index, vaacuum 등 개별 table로 구분)
daily
- partition 기준 시간
retention
- table 유지 시간
retention_keep_table
- true 삭제된 table 유지, false 삭제된 table 완전 삭제
p_premake
- partition 생성 table 개수
p_start_partition
- partition 시작지점
- partition 적용 - partition table 생성
1
CREATE TABLE {SCHEMA_NAME}.{TABLE_ID}_p2022_09_01 PARTITION OF {SCHEMA_NAME}.{TABLE_ID} FOR VALUES FROM ('2022-09-01 00:00:00') TO ('2022-09-02 00:00:00');
- 하루 단위로 partition 테이블 생성
- partition 자동 관리 설정
- partition 자동 관리, 특정 Table 지정 가능
1 2
SELECT run_maintenance(); SELECT run_maintenance('{SCHEMA_NAME}.{TABLE_ID}');
- 특정 table 지정 가능 (PostgreSQL 직접 실행, GCP CloudSQL 적용 안됨)
- time 기준 table 자동 생성
1
SELECT partition_data_time('{SCHEMA_NAME}.{TABLE_ID}');
- 데이터 없으면 table 생성 불가, GCP CloudSQL 적용 가능)
- time 기준 table 자동 삭제
1
SELECT drop_partition_time('{SCHEMA_NAME}.{TABLE_ID}')
retention
옵션 값으로 table 삭제, GCP CloudSQL 적용 가능)
- partition 자동 관리, 특정 Table 지정 가능
인덱싱 설정
btree 인덱싱
- single coulmn 인덱싱 설정
1
CREATE INDEX {INDEX_NAME} ON only {SCHEMA_NAME}.{TABLE_ID} USING btree({COLUMN_NAME});
- 인덱싱 삭제
1
DROP INDEX {INDEX_NAME};
Table 및 Coulmn 수정/삭제
table 및 coulmn 변경
- coulmn 명 변경
1
ALTER TABLE {TABLE_ID} RENAME COLUMN {SRC_COLUMN} TO {TGT_COLUMN};
- table 명 변경
1
ALTER TABLE {SCHEMA_NAME}.{SRC_TABLE_ID} RENAME TO {TGT_TABLE_ID};
- coulmn 데이터 타입 변경
1
ALTER TABLE {SCHEMA_NAME}.{TABLE_ID} ALTER COLUMN {COLUMN_NAME} TYPE {DATA_TYPE};
- coulmn 추가
1 2
ALTER TABLE {SCHEMA_NAME}.{TABLE_ID} ADD {COLUMN_NAME} {DATA_TYPE} NULL; ALTER TABLE {SCHEMA_NAME}.{TABLE_ID} ADD {COLUMN_NAME} {DATA_TYPE} NULL, ADD {COLUMN_NAME} {DATA_TYPE} NULL;
table 및 coulmn 삭제
- coulmn 삭제
1 2
ALTER TABLE {SCHEMA_NAME}.{TABLE_ID} DROP COLUMN {COLUMN_NAME}; ALTER TABLE {SCHEMA_NAME}.{TABLE_ID} DROP COLUMN {COLUMN_NAME}, DROP COLUMN {COLUMN_NAME};
- table 데이터 삭제
1
TRUNCATE TABLE {SCHEMA_NAME}.{TABLE_ID};
데이터 조회
조회
- 테이블 전체 데이터 조회
1 2 3
SELECT * FROM {TABLE_ID} LIMIT 100; -- 해당 테이블 데이터 100개 조회 SELECT * FROM {TABLE_ID} ORDER BY {COLUMN_NAME} DESC -- 정렬 기준 칼럼에 대해 내림차순 조회 SELECT * FROM {TABLE_ID} ORDER BY {COLUMN_NAME} ASC -- 정렬 기준 칼럼에 대해 오름차순 조회
- 테이블 인덱스 정보 조회
1
SELECT * FROM pg_catalog.pg_indexes WHERE tablename = '{TABLE_ID}';
계정 설정
계정 생성
- 현재 사용자 정보 확인
1
SELECT * FROM PG_USER;
- 계정 생성
1
CREATE USER {USER_ID} PASSWORD '{USER_PASSWORD}';
- 유저 생성 확인
1
SELECT * FROM pg_user WHERE usename IN ('{USER_ID}');
계정 및 비밀번호 수정
- 계정명 수정
1
ALTER USER {USER_ID} WITH PASSWORD '{USER_PASSWORD}';
- 비밀번호 수정
1
ALTER USER {USER_ID} WITH PASSWORD '{USER_PASSWORD}';
권한 설정
DB 권한
Grantor
- 권한을 부여한 role
Grantee
- 권한을 부여받은 role
Table_schema
- schema명
Table_name
- table명
Privilege_type
- 권한의 유형
Is_grantable
- 권한을 줄 수 있을 경우 YES, 아닐 경우 NO
- 권한 확인
1
SELECT * FROM information_schema.role_table_grants WHERE grantee ='{USER_ID}'
- DB 접근 권한 할당
1
GRANT CONNECT ON DATABASE {DB_NAME} TO {USER_ID};
schema 권한 설정
- schema 모든 권한 할당
1
GRANT ALL ON SCHEMA {SCHEMA_NAME} TO {USER_ID};
- schema 엑세스 권한 할당
1
GRANT USAGE ON SCHEMA {SCHEMA_NAME} TO {USER_ID};
- schema SELECT 권한 할당
1 2 3
GRANT SELECT ON ALL TABLES IN SCHEMA {SCHEMA_NAME} TO {USER_ID}; -- Single Schema GRANT SELECT ON ALL TABLES IN SCHEMA {SCHEMA_NAME_1}, {SCHEMA_NAME_2} TO {USER_ID}; -- Multi Schema
table 권한 설정
- 앞으로 생길 table에 all 권한
1 2 3
ALTER DEFAULT PRIVILEGES IN SCHEMA {SCHEMA_NAME} GRANT ALL PRIVILEGES ON TABLES TO {USER_ID}; -- Single Schema ALTER DEFAULT PRIVILEGES IN SCHEMA {SCHEMA_NAME_1}, {SCHEMA_NAME_2} GRANT ALL PRIVILEGES ON TABLES TO {USER_ID}; -- Multi Schema
- table SELECT 권한 할당
1
GRANT SELECT ON TABLE {SCHEMA_NAME}.{TABLE_ID} TO {USER_ID};
- 앞으로 생길 table에 SELECT 권한
1 2 3
ALTER DEFAULT PRIVILEGES IN SCHEMA {SCHEMA_NAME} GRANT SELECT ON TABLES TO {USER_ID}; -- Single Schema ALTER DEFAULT PRIVILEGES IN SCHEMA {SCHEMA_NAME_1}, {SCHEMA_NAME_2} GRANT SELECT ON TABLES TO {USER_ID}; -- Multi Schema
- 특정 table 권한
1
GRANT ALL ON TABLE {SCHEMA_NAME}.{TABLE_NAME} TO {USER_ID};
전체 권한 설정
- all 권한
1 2 3 4 5
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA {SCHEMA_NAME} TO {USER_ID}; GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA {SCHEMA_NAME} TO {USER_ID}; ALTER DEFAULT PRIVILEGES GRANT USAGE ON SEQUENCES TO {USER_ID};
프로세스 확인
프로세스 kill
- 특정 프로세스 kill
1 2
SELECT * FROM pg_stat_activity WHERE state = 'active'; SELECT pg_cancel_backend({PROCESS_ID});