-- 락 걸린 테이블 확인
SELECT
    DO.OBJECT_NAME
  , DO.OWNER
  , DO.OBJECT_TYPE
  , DO.OWNER
  , VO.XIDUSN
  , VO.SESSION_ID
  , VO.LOCKED_MODE
FROM
    V$LOCKED_OBJECT VO
  , DBA_OBJECTS DO
WHERE VO.OBJECT_ID = DO.OBJECT_ID
;


-- 해당 테이블에 락이 걸렸는지 확인
SELECT
  A.SID
  , A.SERIAL#
  , B.TYPE
  , C.OBJECT_NAME
FROM
    V$SESSION A
  , V$LOCK B
  , DBA_OBJECTS C
WHERE A.SID = B.SID
  AND B.ID1 = C.OBJECT_ID
  AND B.TYPE='TM'
  AND C.OBJECT_NAME IN (${위 쿼리에서 가져온 OBJECT_NAME});


-- 락 발생 사용자, SQL, OBJECT 조회
SELECT
  DISTINCT X.SESSION_ID
  , A.SERIAL#
  , D.OBJECT_NAME
  , A.MACHINE
  , A.TERMINAL
  , A.PROGRAM
  , B.ADDRESS
  , B.PIECE
  , B.SQL_TEXT
FROM
    V$LOCKED_OBJECT X
  , V$SESSION A
  , V$SQLTEXT B
  , DBA_OBJECTS D
WHERE X.SESSION_ID = A.SID
  AND X.OBJECT_ID = D.OBJECT_ID
  AND A.SQL_ADDRESS = B.ADDRESS 
ORDER BY B.ADDRESS, B.PIECE;


-- 현재 접속자의 SQL 확인 
SELECT
    DISTINCT A.SID
  , A.SERIAL#
  , A.MACHINE
  , A.TERMINAL
  , A.PROGRAM
  , B.ADDRESS
  , B.PIECE
  , B.SQL_TEXT
FROM
    V$SESSION A
  , V$SQLTEXT B
WHERE A.SQL_ADDRESS = B.ADDRESS
ORDER BY A.SID, A.SERIAL#, B.ADDRESS, B.PIECE;


-- 락 세션 죽이기위한 sid 와 serial
SELECT
    A.SID
  , A.SERIAL#
  , A.SID || ', ' || A.SERIAL#
FROM
    V$SESSION A
  , V$LOCK B
  , DBA_OBJECTS C
WHERE A.SID = B.SID
  AND B.ID1 = C.OBJECT_ID
  AND B.TYPE = 'TM'
-- AND C.OBJECT_NAME IN ('${락 걸린 테이블 명}');


-- 해당 세선 kill
SELECT
    DISTINCT X.SESSION_ID
  , A.SERIAL#
  , D.OBJECT_NAME
  , A.MACHINE
  , A.TERMINAL
  , A.PROGRAM
  , A.LOGON_TIME
  , 'ALTER SYSTEM KILL SESSION '''||A.SID||', '||A.SERIAL#||''';'
FROM
    GV$LOCKED_OBJECT X
  , GV$SESSION A
  , DBA_OBJECTS D
WHERE X.SESSION_ID = A.SID
  AND X.OBJECT_ID = D.OBJECT_ID
ORDER BY LOGON_TIME
;


-- 최근 실행된 쿼리 찾기
SELECT 
    SQL_FULLTEXT
  , SQL_ID
  , PARSING_SCHEMA_NAME
  , SERVICE
  , MODULE
  , FIRST_LOAD_TIME
  , LAST_LOAD_TIME
FROM V$SQL
WHERE 1 = 1
  AND PARSING_SCHEMA_NAME = '${스키마 명}'
  AND SERVICE = '${서비스 명}'
ORDER BY LAST_LOAD_TIME DESC
;


-- 최근 실행된 쿼리에 바인팅 변수 찾기
SELECT
    NAME
  , POSITION
  , DATATYPE_STRING
  , VALUE_STRING 
FROM V$SQL_BIND_CAPTURE
WHERE 1=1
  AND SQL_ID = '${위 쿼리에서 가져온 SQL_ID}'
;

SELECT * FROM V$SQL;

SELECT 
  last_active_time
  ,parsing_schema_name
  ,sql_text 
FROM v$sqlarea
WHERE 
  parsing_schema_name <> 'SYS'
  AND parsing_schema_name <> 'SYSMAN'
  AND parsing_schema_name <> 'DBSNMP'
  AND parsing_schema_name <> 'MDSYS'
  AND parsing_schema_name <> 'EXFSYS'
ORDER BY 
  last_active_time DESC;

 

 

안타깝게도 어떤 쿼리가 락을 걸었는지는 알기 쉽지 않다.

특히나 Oracle DB S/W update를 주기적으로 하지 않는다면 유지보수가 쉽지 않다.

728x90
반응형

'Database' 카테고리의 다른 글

[DB] INDEX REBUILD  (0) 2021.01.07
[DBeaver - cubrid] DBeaver Cubrid UTF-8 문제  (1) 2020.12.07
[SQL] 계층 쿼리  (0) 2020.10.19
[MongoDB] 설치하기 (MacOS)  (0) 2020.05.18
[SQL] TIMESTAMP TO MILLIS  (0) 2020.04.09

인덱스 리빌드

DB의 쿼리 수행 속도 저하의 문제 중 하나는 쿼리 튜닝이 문제일 수도 있지만, 인덱스의 밸런스가 깨졌을 경우의 가능성도 있다.
인덱스 밸런스가 깨졌다는게 무슨 의미냐 하면,
DB는 ArrayList와 트리를 합쳐 놓은 구조와 비슷한 B+트리 구조인데, 트리 아래의 데이터들이 무작위로 수정되거나 삭제 되었을 경우 트리 구조가 불균형을 이루게 된다.

이런 경우 인덱스를 재구성 해주면 쿼리 수행 속도를 향상 시킬 수 있다.
(물론 튜닝이 잘 된 쿼리를 짜는게 중요하다.)

오라클의 인덱스 재설정 쿼리는 ALTER INDEX 인덱스명 REBUILD;이고,
인덱스 명을 조회하는 쿼리는 SELECT INDEX_NAME FROM USER_INDEXED;이다.
그리고 인덱스의 데이터 타입이 LOB이라면 인덱스 리빌드는 불가능 하다.

따라서 이 두 쿼리를 조합하고, 조건을 추가하면 리빌드 하는 쿼리는 다음과 같다.

SELECT 'ALTER INDEX '||INDEX_NAME||' REBUILD ;' FROM USER_INDEXES WHERE INDEX_TYPE != 'LOB';

경험상 CUBRID나 TIBERO 도 동일했던 것 같다.

 

참고 : https://docs.oracle.com/database/121/SPATL/alter-index-rebuild.htm#SPATL1017

728x90
반응형

'Database' 카테고리의 다른 글

락 걸린 테이블 확인 및 락 해제  (0) 2022.02.16
[DBeaver - cubrid] DBeaver Cubrid UTF-8 문제  (1) 2020.12.07
[SQL] 계층 쿼리  (0) 2020.10.19
[MongoDB] 설치하기 (MacOS)  (0) 2020.05.18
[SQL] TIMESTAMP TO MILLIS  (0) 2020.04.09

DBeaver로 cubrid 연결하기

dbeaver 설정 파일을 연다.
dbeaver를 기본 설정으로 설치했다면 C:\Program Files\DBeaver에 위치한다.

C:\Program Files\DBeaver

 

마지막 줄에 다음 설정을 넣어준다.

-Dfile.encoding=utf8

dbeaver.ini

 

 

 

아니 근데 국산 DB 좀 안 썼으면 좋겠다.

728x90
반응형

'Database' 카테고리의 다른 글

락 걸린 테이블 확인 및 락 해제  (0) 2022.02.16
[DB] INDEX REBUILD  (0) 2021.01.07
[SQL] 계층 쿼리  (0) 2020.10.19
[MongoDB] 설치하기 (MacOS)  (0) 2020.05.18
[SQL] TIMESTAMP TO MILLIS  (0) 2020.04.09

계층형 쿼리

개발을 하다보면 메뉴구성, 조직도 등 같은 테이블 내에서 계층적으로 데이터를 처리해야 하는 경우가 많다.
자주 사용 되기도 하고, 이번 프로젝트에서 이 부분에 대한 삽질을 많이 했기 때문에 정리를 해본다.
계층형(hirarchical) 구조는 계급적, 수직적인 관계로 2진 트리 관계라고 할 수 있다.
실습은 Oracle emp 를 이용하며 설치 여건이 안되므로 livesql를 이용한다.
사용법은 여기서 보면 된다.

계층 구조와 용어

(계층 구조와 용어 이미지 만들어 올리기.)

  • 노드 (node) : 테이블 상의 각각의 row를 노드라고 한다.
  • 루트 (root) : 트리 구조의 최상위에 있는 노드를 의미한다.
  • 부모 (parent) : 부모노드. 트리 구조에서 상위에 있는 노드를 부모라고 한다.
  • 자식 (child) : 자식노드. 트리 구조에서 하위에 있는 노드를 자식이라고 한다.
  • 리프 (leaf) : 리프노드 혹은 말단노드. 하위에 연결된 노드가 없는, 자식이 없는 노드이다.
  • 레벨 (level) : 트리구조에서 각각의 계층을 의미한다. 루트부터 순차적으로 1씩 올라간다.

SELF JOIN

테이블 개수가 1개이며 각 ROW가 상위 코드로 부모 자식 관계로 연결 되어 셀프 조인을 사용한다.
최상단 노드의 경우 상위 코드가 NULL 이므로 외부 조인도 사용한다.

SELECT
    C.ENAME
    , C.EMPNO
    , P.ENAME AS MGR_NN
FROM
    SCOTT.EMP C
INNER JOIN
    SCOTT.EMP P
ON
    C.MGR = P.EMPNO(+)

결과

ENAME   EMPNO  MGR_NN
- - - - - - - - - - - -
BLAKE   7698    KING
CLARK   7782    KING
JONES   7566    KING
ALLEN   7499    BLAKE
WARD    7521    BLAKE
MARTIN  7654    BLAKE
TURNER  7844    BLAKE
JAMES   7900    BLAKE
MILLER  7934    CLARK
SCOTT   7788    JONES
FORD    7902    JONES
ADAMS   7876    SCOTT
SMITH   7369    FORD
KING    7839     - 

동일한 테이블 EMP 를 각각 C, P 로별칭을 주어 셀프 조인 하였고,
C가 하위 ROW, P가 상위 ROW임을 알 수 있다.
계층적인 결과가 나왔지만, 계층형 구조(TREE)와는 다른 결과이다.


START WITH & CONNECT BY

START WITH ... CONNECT BY 절은 계층형 정보를 표현하기 위한 목적으로 나온 조건이다.

문법

SELECT
    [컬럼 ...]
FROM
    테이블
START WITH [최상위 조건]
CONNECT BY [NOCYCLE] [PRIOR] [계층 구조 조건];

예제

SELECT
    C.ENAME
    , C.EMPNO
    , P.ENAME AS MGR_NN
FROM
    SCOTT.EMP C
INNER JOIN
    SCOTT.EMP P
ON
    C.MGR = P.EMPNO(+)
START WITH C.MGR IS NULL
CONNECT BY PRIOR C.EMPNO = C.MGR

결과

ENAME   EMPNO  MGR_NN
- - - - - - - - - - - -
KING    7839     - 
JONES   7566    KING
SCOTT   7788    JONES
ADAMS   7876    SCOTT
FORD    7902    JONES
SMITH   7369    FORD
BLAKE   7698    KING
ALLEN   7499    BLAKE
WARD    7521    BLAKE
MARTIN  7654    BLAKE
TURNER  7844    BLAKE
JAMES   7900    BLAKE
CLARK   7782    KING
MILLER  7934    CLARK

PRIOR 키워드는 이전 결과의 컬럼을 참조하는 키워드로 현재 행의 MGR을 이전 행의 ENPNO와 연결한다는 의미이다.


LEVEL

계층 레벨(depth level)을 나타낸다.

SELECT
    C.ENAME
    , C.EMPNO
    , P.ENAME AS MGR_NN
    , LEVEL
FROM
    SCOTT.EMP C
INNER JOIN
    SCOTT.EMP P
ON
    C.MGR = P.EMPNO(+)
START WITH C.MGR IS NULL
CONNECT BY PRIOR C.EMPNO = C.MGR;
ENAME  EMPNO  MGR_NN  LEVEL
- - - - - - - - - - - - - - -
KING    7839     -      1
JONES   7566    KING    2
SCOTT   7788    JONES   3
ADAMS   7876    SCOTT   4
FORD    7902    JONES   3
SMITH   7369    FORD    4
BLAKE   7698    KING    2
ALLEN   7499    BLAKE   3
WARD    7521    BLAKE   3
MARTIN  7654    BLAKE   3
TURNER  7844    BLAKE   3
JAMES   7900    BLAKE   3
CLARK   7782    KING    2
MILLER  7934    CLARK   3

레벨별로 들여쓰기를 하면 쿼리 결과 볼때 편하다.

SELECT
    LPAD( ' ', 2 * (LEVEL - 1 ) ) || C.ENAME AS ENAME
    , C.EMPNO
    , P.ENAME AS MGR_NN
    , LEVEL
FROM
    SCOTT.EMP C
INNER JOIN
    SCOTT.EMP P
ON
    C.MGR = P.EMPNO(+)
START WITH C.MGR IS NULL
CONNECT BY PRIOR C.EMPNO = C.MGR;
ENAME       EMPNO  MGR_NN  LEVEL
- - - - - - - - - - - - - - - - -
KING         7839   -        1
  JONES      7566  KING      2
    SCOTT    7788  JONES     3
      ADAMS  7876  SCOTT     4
    FORD     7902  JONES     3
      SMITH  7369  FORD      4
  BLAKE      7698  KING      2
    ALLEN    7499  BLAKE     3
    WARD     7521  BLAKE     3
    MARTIN   7654  BLAKE     3
    TURNER   7844  BLAKE     3
    JAMES    7900  BLAKE     3
  CLARK      7782  KING      2
    MILLER   7934  CLARK     3

ORDER SIBLINGS BY

계층형 쿼리에서 ORDER BY 절을 사용하면 계층의 상관 관계가가 유지되지 않은체 정렬이 되어 버린다.
이 문제로 한참 삽질을 했었는데, ORDER SIBLINGS BY를 사용하면 계층 구조를 유지하면서 정렬을 할 수 있다.

일반 ORDER BY를 사용했을 경우

SELECT
    LPAD( ' ', 2 * (LEVEL - 1 ) ) || C.ENAME AS ENAME
    , C.EMPNO
    , P.ENAME AS MGR_NN
FROM
    SCOTT.EMP C
INNER JOIN
    SCOTT.EMP P
ON
    C.MGR = P.EMPNO(+)
START WITH C.MGR IS NULL
CONNECT BY NOCYCLE PRIOR C.EMPNO = C.MGR
ORDER BY EMPNO;
ENAME         EMPNO  MGR_NN
- - - - - - - - - - - - - - -
      SMITH   7369    FORD
    ALLEN     7499    BLAKE
    WARD      7521    BLAKE
  JONES       7566    KING
    MARTIN    7654    BLAKE
  BLAKE       7698    KING
  CLARK       7782    KING
    SCOTT     7788    JONES
KING          7839     - 
    TURNER    7844    BLAKE
      ADAMS   7876    SCOTT
    JAMES     7900    BLAKE
    FORD      7902    JONES
    MILLER    7934    CLARK

ORDER SIBLINGS BY를 할 경우

SELECT
    C.ENAME
    , C.EMPNO
    , P.ENAME AS MGR_NN
FROM
    SCOTT.EMP C
INNER JOIN
    SCOTT.EMP P
ON
    C.MGR = P.EMPNO(+)
START WITH C.MGR IS NULL
CONNECT BY NOCYCLE PRIOR C.EMPNO = C.MGR
ORDER SIBLINGS BY EMPNO;
ENAME         EMPNO  MGR_NN
- - - - - - - - - - - - - - -
KING          7839   - 
  JONES       7566  KING
    SCOTT     7788  JONES
      ADAMS   7876  SCOTT
    FORD      7902  JONES
      SMITH   7369  FORD
  BLAKE       7698  KING
    ALLEN     7499  BLAKE
    WARD      7521  BLAKE
    MARTIN    7654  BLAKE
    TURNER    7844  BLAKE
    JAMES     7900  BLAKE
  CLARK       7782  KING
    MILLER    7934  CLARK

CONNECT_BY_ISLEAF

계층 구조에서 ROW의 최하위 레벨 여부의 반환이다.
해당 ROW가 말단 노드라면 1 아니라면 0을 반환한다.

SELECT
    LPAD( ' ', 2 * (LEVEL - 1 ) ) || C.ENAME AS ENAME
    , C.EMPNO
    , P.ENAME AS MGR_NN
    , CONNECT_BY_ISLEAF LEAF
FROM
    SCOTT.EMP C
INNER JOIN
    SCOTT.EMP P
ON
    C.MGR = P.EMPNO(+)
START WITH C.MGR IS NULL
CONNECT BY NOCYCLE PRIOR C.EMPNO = C.MGR
ORDER SIBLINGS BY EMPNO;
ENAME        EMPNO  MGR_NN  LEAF
- - - - - - - - - - - - - - - - -
KING          7839   -        0
  JONES       7566  KING      0
    SCOTT     7788  JONES     0
      ADAMS   7876  SCOTT     1
    FORD      7902  JONES     0
      SMITH   7369  FORD      1
  BLAKE       7698  KING      0
    ALLEN     7499  BLAKE     1
    WARD      7521  BLAKE     1
    MARTIN    7654  BLAKE     1
    TURNER    7844  BLAKE     1
    JAMES     7900  BLAKE     1
  CLARK       7782  KING      0
    MILLER    7934  CLARK     1

CONNECT_BY_ROOT

계층구조 쿼리에서 LEVEL이 0인 최상위 로우의 정보를 얻어 올 수 있다.

SELECT
    LPAD( ' ', 2 * (LEVEL - 1 ) ) || C.ENAME AS ENAME
    , C.EMPNO
    , P.ENAME AS MGR_NN
    , CONNECT_BY_ROOT C.ENAME ROOTNANME
FROM
    SCOTT.EMP C
INNER JOIN
    SCOTT.EMP P
ON
    C.MGR = P.EMPNO(+)
START WITH C.MGR IS NULL
CONNECT BY NOCYCLE PRIOR C.EMPNO = C.MGR
ORDER SIBLINGS BY EMPNO;
ENAME        EMPNO  MGR_NN  ROOTNANME
- - - - - - - - - - - - - - - - - - - -
KING          7839   -        KING
  JONES       7566  KING      KING
    SCOTT     7788  JONES     KING
      ADAMS   7876  SCOTT     KING
    FORD      7902  JONES     KING
      SMITH   7369  FORD      KING
  BLAKE       7698  KING      KING
    ALLEN     7499  BLAKE     KING
    WARD      7521  BLAKE     KING
    MARTIN    7654  BLAKE     KING
    TURNER    7844  BLAKE     KING
    JAMES     7900  BLAKE     KING
  CLARK       7782  KING      KING
    MILLER    7934  CLARK     KING

SYS_CONNECT_BY_PATH

계층 구조에서 ROOT노드부터 현제 노드까지의 PATH 정보를 가져올 수 있다.

SELECT
    LPAD( ' ', 2 * (LEVEL - 1 ) ) || C.ENAME AS ENAME
    , C.EMPNO
    , P.ENAME AS MGR_NN
    , SYS_CONNECT_BY_PATH( C.ENAME, '/') PATH
FROM
    SCOTT.EMP C
INNER JOIN
    SCOTT.EMP P
ON
    C.MGR = P.EMPNO(+)
START WITH C.MGR IS NULL
CONNECT BY NOCYCLE PRIOR C.EMPNO = C.MGR
ORDER SIBLINGS BY EMPNO;
ENAME         EMPNO  MGR_NN  PATH
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
KING          7839     -      /KING
  JONES       7566    KING    /KING/JONES
    SCOTT     7788    JONES   /KING/JONES/SCOTT
      ADAMS   7876    SCOTT   /KING/JONES/SCOTT/ADAMS
    FORD      7902    JONES   /KING/JONES/FORD
      SMITH   7369    FORD    /KING/JONES/FORD/SMITH
  BLAKE       7698    KING    /KING/BLAKE
    ALLEN     7499    BLAKE   /KING/BLAKE/ALLEN
    WARD      7521    BLAKE   /KING/BLAKE/WARD
    MARTIN    7654    BLAKE   /KING/BLAKE/MARTIN
    TURNER    7844    BLAKE   /KING/BLAKE/TURNER
    JAMES     7900    BLAKE   /KING/BLAKE/JAMES
  CLARK       7782    KING    /KING/CLARK
    MILLER    7934    CLARK   /KING/CLARK/MILLER
728x90
반응형

'Database' 카테고리의 다른 글

[DB] INDEX REBUILD  (0) 2021.01.07
[DBeaver - cubrid] DBeaver Cubrid UTF-8 문제  (1) 2020.12.07
[MongoDB] 설치하기 (MacOS)  (0) 2020.05.18
[SQL] TIMESTAMP TO MILLIS  (0) 2020.04.09
[PostgreSQL] 랜섬웨어  (0) 2020.03.03

MongoDB 설치하기

NoSQL 을 사용 해보려고 했는데 구글링으로 나오는 방법으론 MacOS Catalina 버전부터는 root 디렉토리가 Read Only 로 바뀌면서 설치 할 수 없게 됬음.
MongoDB의 공식 설명으로 Catalina에서 MongoDB를 설치하려면 다음과 같은 순서로 Terminal 명령을 내리면 됨.
(선수 조건으로 brew가 설치되어 있어야 함.)

Install

    sudo chown -R $(whoami) $(brew --prefix)/*
    brew tap mongodb/brew
    brew install mongodb-community@4.2

세 줄이면 설치가 되는데.. 한참 헤매고 있었음.
뭔가 설치가 안될 땐 공식 문서를 확인 하도록 하자.

구성 파일

설정 파일 /usr/local/etc/mongod.conf
log 파일 /usr/local/var/log/mongodb
저장 경로 /usr/local/var/monogb

(추가) Run MongoDB Community Edition

Run

    brew services start mongodb-community@4.2

Stop

    brew serveced stop mongodb-community@4.2

컴퓨터 실행시 MongoDB 자동 실행 설정

    mongod --config /usr/local/etc/mongd.conf --fork

자동 실행을 중지 시키려면 mongod 에 연결해서 shutdown을 실행하라는데 한두번 테스트 하고 지울거니 패스.
설치하면서 생성된 /usr/local/etc/mongod.conf 파일로 구성 옵션을 설정할 수 있다고 함.

MongoDB가 실행중인지 확인 하려면

    PS AUX | grep -v grep | grep mongod

실행중인 MongoDB에 접속, Mongo Shell을 실행하려면

    mongo
728x90
반응형

'Database' 카테고리의 다른 글

[DBeaver - cubrid] DBeaver Cubrid UTF-8 문제  (1) 2020.12.07
[SQL] 계층 쿼리  (0) 2020.10.19
[SQL] TIMESTAMP TO MILLIS  (0) 2020.04.09
[PostgreSQL] 랜섬웨어  (0) 2020.03.03
[PostgreSQL] sysdate 쓰는법  (0) 2020.02.14

SQL에서 Timestamp 값을 꺼내 와서 시간 값 계산을 해야 할 경우 초나 밀리초로 연산을 하는게 편하다.

다음 쿼리는 Timestamp 형의 값을 초로 변환하여 꺼내오는 쿼리이다.

    SELECT EXTRACT(EPOCH FROM 컬럼명 AT TIME ZONE 'UTC') FROM 테이블;

만약 밀리세컨드로 시간 비교를 해야한다면 1000을 곱해주면 된다.

    SELECT EXTRACT(EPOCH FROM 컬럼명 AT TIME ZONE 'UTC') * 1000 FROM 테이블;

SQL에서 시간 조건을 걸어야 할 경우,
다음과 같이 타임스탬프로 비교 조건을 걸어주면 Query의 속도가 빠르게 나온다.

    AND
          Timestamp컬럼
            BETWEEN TO_TIMESTAMP( '2020-04-08 00:00', 'YYYY-MM-DD HH24:MI' )
            AND     TO_TIMESTAMP( '2020-04-08 23:59', 'YYYY-MM-DD HH24:MI' )
728x90
반응형

'Database' 카테고리의 다른 글

[SQL] 계층 쿼리  (0) 2020.10.19
[MongoDB] 설치하기 (MacOS)  (0) 2020.05.18
[PostgreSQL] 랜섬웨어  (0) 2020.03.03
[PostgreSQL] sysdate 쓰는법  (0) 2020.02.14
[PostgreSQL] Windows에서 Data Directory 변경하기  (0) 2020.01.09

새벽에 PostgreSQL 랜섬웨어를 당했음.ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

겨우 10만원이긴 한데 안에 있는 데이터가 별로 중요한게 아니라 돈을 주진 않았음.ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 후에 DB 로그 보니까 작업 열심히 하고있을 때 그사람도 열심히 공격 준비하고 있었음 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

DB만들때, 계정 이름, 비밀번호 포트 번호는 꼭 Default 값으로 만들지 말자!

 

 

728x90
반응형

'Database' 카테고리의 다른 글

[MongoDB] 설치하기 (MacOS)  (0) 2020.05.18
[SQL] TIMESTAMP TO MILLIS  (0) 2020.04.09
[PostgreSQL] sysdate 쓰는법  (0) 2020.02.14
[PostgreSQL] Windows에서 Data Directory 변경하기  (0) 2020.01.09
[SQL] SET OPERATOR  (0) 2019.12.27

PostgreSQL 에서 sysdate 쓰는법

PostgreSQL에서는

    SELECT SYSDATE()

라는 쿼리문으로 현재 시스템의 시간이 출력되지 않는다.
(오라클에서는 FROM DUAL이 필요하지만 PostgreSQL에서는 필요하지 않다.

PostgreSQL에서 현재 시간을 알기 위해서는

    SELECT NOW();

의 쿼리를 사용하면 된다.

시간의 형식도 가져 오고 싶다면

    TO_CHAR( NOW(), 'YYMMDD')::NUMERIC

와 같이 ::(두개의 세미콜론)과 변환할 타입을 선언해 준다.

728x90
반응형

'Database' 카테고리의 다른 글

[SQL] TIMESTAMP TO MILLIS  (0) 2020.04.09
[PostgreSQL] 랜섬웨어  (0) 2020.03.03
[PostgreSQL] Windows에서 Data Directory 변경하기  (0) 2020.01.09
[SQL] SET OPERATOR  (0) 2019.12.27
[SQL] JOIN  (0) 2019.12.27

PostgreSQL Data Directory 변경하기.

Windows 기반의 로컬 서버와 테스트 서버에서 돌리는 PostgreSQL의 Data 저장경로가 C로 잡혀 있었음.
D 드라이브로 옮길 필요가 있어서 열심히 구글링 했으나,
거의 대부분의 자료가 Linux 기반이고, PostgreSQL의 버젼도 구버젼인 경우가 많아서 내가 정리 해보고자 함.

진행 환경

OS : Windows10, Windows Server 2008 R2 Standard
DB : PostgreSQL 10.10, compiled by Visual C++ build 1800, 64-bit
PostgreSQL 11.5, compiled by Visual C++ build 1914, 64-bit

진행


  1. PostgreSQL 데이터 저장경로 확인

    • SQL Shell을 실행 접속 후, show data_directory; 명령을 내리면 현재 PostgreSQL이 데이터를 저장하는 경로를 알려줌.
     Server [localhost]:
     Database [postgres]:
     Port [5432]:
     Username [postgres]:
     postgres 사용자의 암호:
     psql (10.10)
     도움말을 보려면 "help"를 입력하십시오.
    
     postgres=# show data_directory;
       data_directory
     ---------------------
     C:\Program Files\PostgreSQL\10\data
     (1개 행)
    • 경로 확인후 SQL Shell 종료.

  1. PostgreSQL 서버 종료.

    • PostgreSQL 10버전 이후의 서버 종료방법 찾기도 쉽지 않았음.

    • PowerShell을 관리자 권한으로 실행.

    • PostgreSQL의 설치 경로 하위의 scripts 경로로 들어감.

    • .\serverctl.vbs stop 명령어 실행.

       PS C:\WINDOWS\system32> cd 'C:\Program Files\PostgreSQL\10\scripts'
       PS C:\Program Files\PostgreSQL\10\scripts> .\serverctl.vbs stop
      
       Microsoft (R) Windows Script Host 버전 5.812
       Copyright (C) Microsoft Corporation. All rights reserved.
      
       postgresql-x64-10 - PostgreSQL Server 10 서비스를 멈춥니다..
       postgresql-x64-10 - PostgreSQL Server 10 서비스를 잘 멈추었습니다.

  1. 현재 데이터 저장 경로의 하위 디렉토리를 새 디렉토리로 이동함.

    • 나의 경우는 1에서 확인한 디렉토리에서 D:\dev\postgre\data로 복사.
    • 복사후, data 폴더를 우클릭 -> 속성보기 -> 보안 -> 사용권한이 잘 있는지 확인 해야 함. 일반적으로는 이상 없는듯.
      • 복사후, 이전 경로롸 새 경로의 권한이 같은지, 갖지 않다면 새 경로에 권한 추가를해 줘야 한다.
      • Windows Server 2008 R2 OS로 서버를 돌리는 경우에는 NETWORK SERVICE라는 유져의 접근이 가능해야 함.

  1. 설정 변경

    • 새로 옮긴 경로에서 postmaster.opts 파일(D:\dev\postgre\data\postmaster.opts)을
      텍스트 편집기로 열어서, 다음과 같은 내용으로 변경해줌

       C:/Program Files/PostgreSQL/10/bin/postgres.exe "-D" "D:\dev\postgre\data"

      대충 실행파일 위치와 데이터 저장 위치를 표기하는 듯.


  1. 레지스트리 변경

    • 레지스트리 편집기를 실행 후, 컴퓨터\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\postgresql-x64-10 경로까지 내려감.

    ImagePath를 선택 후 값을 변경해줌.

     "C:\Program Files\PostgreSQL\10\bin\pg_ctl.exe" runservice -N "postgresql-x64-10" -D "D:\dev\postgre\data" -w

    대충 3번과 같은 의미인듯 함.


  1. 서버 재시작.

    • 2에서 실행한 경로에서 .\serverctl.vbs start 명령을 내려주면 됨.
     PS C:\Program Files\PostgreSQL\10\scripts> .\serverctl.vbs start
     Microsoft (R) Windows Script Host 버전 5.812
     Copyright (C) Microsoft Corporation. All rights reserved.
    
     postgresql-x64-10 - PostgreSQL Server 10 서비스를 시작합니다...
     postgresql-x64-10 - PostgreSQL Server 10 서비스가 잘 시작되었습니다.
    • 새 경로에 접속 권한이 없다면 서버 시작이 되지 않으므로 꼭 권한 확인 해야 함.

  1. 경로 확인.

    • 1에서 확인한 방법으로 PostgreSQL의 데이터 저장 경로가 새 경로인지 확인.
     postgres=# show data_directory;
       data_directory
     ---------------------
     D:/dev/postgre/data
     (1개 행)

참고 자료

  • https://confluence.curvc.com/pages/viewpage.action?pageId=10092649
  • https://www.dbrnd.com/2016/08/postgresql-change-or-move-default-data-directory-in-windows-operating-system/
  • https://kugancity.tistory.com/entry/postgreSQL-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC-%EB%B3%80%EA%B2%BD
728x90
반응형

'Database' 카테고리의 다른 글

[PostgreSQL] 랜섬웨어  (0) 2020.03.03
[PostgreSQL] sysdate 쓰는법  (0) 2020.02.14
[SQL] SET OPERATOR  (0) 2019.12.27
[SQL] JOIN  (0) 2019.12.27
[SQL] GROUP  (0) 2019.12.26

 

조인 외에도 테이블 간의 데이터를 조회하는 방법이 있음.
집합 연산자는 SELECT 문을 여러개 연결하여 작성,
각 SELECT 문의 조회 결과를 하나로 합치거나 분리할 수 있음.
즉, 합집합, 교집합, 차집합과 같음.

OPERATOR DESC KIND
UNION 조회 결과의 합집합. 중복행은 1번만 출력. 합집합
UNION ALL 조회 결과의 합집합. 중복되는 행도 출력. 합집합
INTERSET 조회 결과의 교집합. 중복되는 행만 출력. 교집합
MINUS 첫 번째 조회 결과에서 두 번째 조회 결과를 뺀다. 차칩합
SELECT        열 이름
FROM          테이블 이름
집합 연산자   <---  UNION, UNION ALL, INTERSET, MINUS
SELECT        열 이름
FROM          테이블 이름
[ORDER BY     열 이름 [ASC or DESC]]
  • SELECT 문에서 기술한 열과 두 번째 SELECT 문에서 기술한 열은
    왼쪽부터 순서대로 1 : 1로 대응함,
    열 개수와 데이터 타입이 일치해야 함.
    열의 순서가 다르거나 데이터 타입이 일치하지 않으면 에러남.
  • SELECT 문에 대한 연산은 위에서 아래로 수행됨.
  • ORDER BY 절은 SELECT 문의 맨 끝에 기술함.

UNION

SELECT COUNT(*)
FROM
  (
    SELECT  department_id
    FROM    employees
    UNION
    SELECT  department_id
    FROM    departments
    ORDER BY department_id
  );

UNION ALL

SELECT COUNT(*)
FROM
  (
    SELECT  department_id
    FROM    employees
    UNION ALL
    SELECT  department_id
    FROM    departments
    ORDER BY department_id
  );

INTERSECT

SELECT COUNT(*)
FROM
  (
    SELECT  department_id
    FROM    employees
    INTERXECT
    SELECT  department_id
    FROM    departments
    ORDER BY department_id
  );

MINUS

SELECT COUNT(*)
FROM
  (
    SELECT  department_id
    FROM    departments
    MINUS
    SELECT  department_id
    FROM    employees
    ORDER BY department_id;
  );
728x90
반응형

'Database' 카테고리의 다른 글

[PostgreSQL] sysdate 쓰는법  (0) 2020.02.14
[PostgreSQL] Windows에서 Data Directory 변경하기  (0) 2020.01.09
[SQL] JOIN  (0) 2019.12.27
[SQL] GROUP  (0) 2019.12.26
[SQL] 데이터를 가공하기 위한 DB 함수들  (0) 2019.12.26

+ Recent posts