데이터베이스 관리 및 복구 기법

특정 시점으로 테이블 데이터 복원

-- 특정 시간대의 데이터 조회
SELECT * FROM target_table AS OF TIMESTAMP TO_TIMESTAMP('2009-12-11 20:53:57', 'YYYY-MM-DD HH24:MI:SS');

-- 특정 시점의 데이터로 새 테이블 생성
CREATE TABLE restored_table AS 
SELECT * FROM target_table AS OF TIMESTAMP TO_TIMESTAMP('2009-12-11 20:53:57', 'YYYY-MM-DD HH24:MI:SS');

락된 테이블 정보 조회

SELECT 
    sess.sid,
    sess.serial#,
    lo.oracle_username,
    lo.os_user_name,
    ao.object_name,
    lo.locked_mode  
FROM v$locked_object lo
JOIN dba_objects ao ON ao.object_id = lo.object_id
JOIN v$session sess ON lo.session_id = sess.sid;

세션 종료를 통한 락 해제

ALTER SYSTEM KILL SESSION '597,5388';

삭제된 테이블 데이터 일괄 복구

SELECT 'FLASHBACK TABLE ' || original_name || ' TO BEFORE DROP;' AS recovery_command
FROM recyclebin 
WHERE original_name LIKE '%GJBB%' 
AND TO_DATE(droptime, 'YYYY-MM-DD HH24:MI:SS') > TO_DATE('2021-07-10:00:00:00', 'YYYY-MM-DD HH24:MI:SS');

테이블스페이스 사용 현황 확인

SELECT 
    a.tablespace_name AS "테이블스페이스명",
    total AS "총 크기",
    free AS "남은 공간",
    (total - free) AS "사용량",
    ROUND(total / (1024 * 1024 * 1024), 2) AS "총 크기(GB)",
    ROUND(free / (1024 * 1024 * 1024), 2) AS "남은 공간(GB)",
    ROUND((total - free) / (1024 * 1024 * 1024), 2) AS "사용량(GB)",
    ROUND((total - free) / total * 100, 2) AS "사용률(%)"
FROM (
    SELECT tablespace_name, SUM(bytes) AS free
    FROM dba_free_space
    GROUP BY tablespace_name
) a
JOIN (
    SELECT tablespace_name, SUM(bytes) AS total
    FROM dba_data_files
    GROUP BY tablespace_name
) b ON a.tablespace_name = b.tablespace_name;

테이블 컬럼 및 주석 정보 조회

SELECT * FROM (
    SELECT 
        t1.table_name,
        t1.column_name,
        t2.comments
    FROM user_tab_columns t1
    LEFT JOIN user_col_comments t2 
        ON t1.table_name = t2.table_name 
        AND t1.column_name = t2.column_name
) 
WHERE table_name LIKE '%T_BYYTKCGL%';

락을 발생시킨 SQL 문장 추적

SELECT 
    l.session_id,
    sid,
    s.serial#,
    l.locked_mode,
    l.oracle_username,
    s.user#,
    l.os_user_name,
    s.machine,
    s.terminal,
    a.sql_text
FROM v$sqlarea a
JOIN v$session s ON s.prev_sql_addr = a.address
JOIN v$locked_object l ON l.session_id = s.sid
ORDER BY sid, s.serial#;

테이블 일괄 삭제 명령어 생성

SELECT REPLACE(TO_CHAR(WM_CONCAT('DROP TABLE ' || table_name)), ',', ';' || CHR(10)) AS drop_commands
FROM user_tab_comments 
WHERE table_name LIKE '%T_WTHDGL%';

PostgreSQL 락 정보 조회

SELECT
    lock.locktype,
    lock.pid,
    lock.mode,
    lock.granted,
    stat.usename,
    stat.query,
    stat.query_start,
    NOW() - stat.query_start AS duration,
    stat.state
FROM pg_locks lock
JOIN pg_stat_activity stat ON lock.pid = stat.pid
WHERE lock.relation = 'T_ZG_QYDS_DSJBXX'::regclass
   OR lock.relation::regclass::text = 'T_ZG_QYDS_DSJBXX'
ORDER BY duration DESC;

PostgreSQL 프로세스 종료

SELECT pg_terminate_backend(70427225441856);

데이터베이스 연결 제한 설정 확인

SELECT name, value, display_value 
FROM v$parameter 
WHERE name IN ('processes', 'sessions', 'transactions');

현재 세션 및 프로세스 수 확인

SELECT '현재 세션 수' AS type, COUNT(*) AS count 
FROM v$session
UNION ALL
SELECT '현재 프로세스 수', COUNT(*) 
FROM v$process;

미해제된 연결 세션 조회

SELECT 
    sid,
    serial#,
    username,
    status,
    machine,
    program,
    osuser,
    logon_time,
    ROUND(last_call_et/60, 2) AS idle_minutes,
    'ALTER SYSTEM KILL SESSION ''' || sid || ',' || serial# || ''' IMMEDIATE;' AS kill_cmd
FROM v$session
WHERE username NOT IN ('SYS', 'SYSTEM', 'DBSNMP') 
    AND username IN ('USR_YJSZCM', 'USR_YJSZJ')
    AND status = 'INACTIVE'
    AND last_call_et > 600
ORDER BY last_call_et DESC;

연결 세션 일괄 종료

BEGIN
    FOR session_rec IN (
        SELECT sid, serial#, username
        FROM v$session
        WHERE username NOT IN ('SYS', 'SYSTEM', 'DBSNMP')
            AND username IN ('USR_YJSZJ')
            AND status = 'INACTIVE'
            AND last_call_et > 600
    ) LOOP
        EXECUTE IMMEDIATE 'ALTER SYSTEM KILL SESSION ''' || session_rec.sid || ',' || session_rec.serial# || ''' IMMEDIATE';
        DBMS_OUTPUT.PUT_LINE('종료됨: ' || session_rec.username || ' - SID=' || session_rec.sid);
    END LOOP;
END;

태그: Oracle PostgreSQL Database Recovery SQL Database Administration

7월 22일 08:11에 게시됨