1. 사전 준비

Oracle 데이터베이스에서 덤프 파일을 특정 스키마에 로드하려면 다음이 필요합니다.

  • Oracle 데이터베이스가 설치 및 실행 중이어야 합니다.
  • impdp 또는 imp 명령어를 실행할 수 있어야 합니다.
  • 대상 스키마(사용자)가 존재해야 합니다.
  • 덤프 파일이 접근 가능한 경로에 존재해야 합니다.

2. 데이터 펌프 임포트(Data Pump Import, impdp)

Oracle Data Pump를 사용하여 특정 스키마에 덤프 파일을 임포트하는 방법을 설명합니다.

2.1 대상 스키마 생성

임포트할 대상 스키마가 존재하지 않는다면 먼저 생성합니다.

CREATE USER target_schema IDENTIFIED BY password;
GRANT CONNECT, RESOURCE TO target_schema;
GRANT DBA TO target_schema; -- 필요시 추가

2.2 데이터 펌프 임포트 실행

다음 명령을 사용하여 특정 스키마로 데이터를 임포트할 수 있습니다.

impdp system/password@DB_SERVICE \
    DIRECTORY=DATA_PUMP_DIR \
    DUMPFILE=exported.dmp \
    REMAP_SCHEMA=source_schema:target_schema \
    LOGFILE=import.log

옵션 설명

  • system/password@DB_SERVICE : 관리자 계정과 접속할 데이터베이스 정보
  • DIRECTORY=DATA_PUMP_DIR : 덤프 파일이 저장된 Oracle 디렉토리 객체
  • DUMPFILE=exported.dmp : 임포트할 덤프 파일
  • REMAP_SCHEMA=source_schema:target_schema : 원본 스키마를 대상 스키마로 변경하여 임포트
  • LOGFILE=import.log : 임포트 로그 파일 생성

TIP: Oracle에서 DATA_PUMP_DIR을 확인하거나 생성하려면 다음 SQL을 실행합니다.

SELECT directory_name, directory_path FROM dba_directories WHERE directory_name = 'DATA_PUMP_DIR';

필요한 경우 다음과 같이 새로운 디렉토리를 생성할 수 있습니다.

CREATE OR REPLACE DIRECTORY DATA_PUMP_DIR AS '/path/to/dump';
GRANT READ, WRITE ON DIRECTORY DATA_PUMP_DIR TO target_schema;

3. 기존 imp 명령어를 이용한 임포트

만약 구버전의 imp 명령어를 사용해야 한다면 다음과 같이 실행할 수 있습니다.

imp system/password@DB_SERVICE FILE=exported.dmp FROMUSER=source_schema TOUSER=target_schema LOG=import.log

이 명령어는 Data Pump를 사용하지 않는 기존 Import 방식이며, REMAP_SCHEMA 대신 FROMUSERTOUSER 옵션을 사용합니다.

4. 임포트 후 데이터 확인

임포트가 완료된 후, 대상 스키마에 정상적으로 데이터가 들어갔는지 확인합니다.

SELECT table_name FROM user_tables;
SELECT COUNT(*) FROM target_schema.some_table;

VM 재기동 후 Oracle 데이터베이스가 정지된 경우, 아래 절차를 따라 리스너 및 SQL*Plus를 이용하여 데이터베이스를 재기동할 수 있습니다.

1. Oracle 프로세스 확인

VM이 재부팅된 후 Oracle 프로세스가 정상적으로 실행되고 있는지 확인합니다.

ps -ef | grep ora

만약 결과가 출력되지 않는다면 Oracle 인스턴스가 정지된 상태입니다.

2. 리스너 상태 확인 및 시작

리스너가 실행 중인지 확인하고, 실행되지 않았다면 시작합니다.

lsnrctl status
lsnrctl start

리스너가 정상적으로 시작되었는지 다시 확인하세요.

3. SQL*Plus를 이용한 Oracle 인스턴스 시작

sqlplus를 실행하여 데이터베이스를 시작합니다.

sqlplus / as sysdba

로그인이 성공하면 아래 명령을 입력하여 데이터베이스를 기동합니다.

startup;

4. 데이터베이스 상태 확인

데이터베이스가 정상적으로 실행 중인지 확인합니다.

SELECT status FROM v$instance;

정상적으로 OPEN 상태가 출력되면 데이터베이스가 기동된 것입니다.

Oracle 데이터베이스에서 ORA-27102: out of memory 오류가 발생하면, 이는 시스템의 공유 메모리(SGA)를 할당할 수 없거나, 운영 체제의 메모리 설정이 부족할 때 발생하는 문제입니다. 주로 Linux 및 Unix 환경에서 발생하며, shmmax, shmall 등의 설정과 관련이 있습니다.

1. 현재 시스템 메모리 상태 확인

먼저, 시스템의 현재 메모리 상태를 확인합니다.

free -m

또는 프로세스별 메모리 사용량을 확인합니다.

ps -eo pid,rss,vsz,args --sort=-vsz | head -10

2. 공유 메모리 설정 확인 및 변경 (Linux)

Linux에서 공유 메모리(shmmax, shmall) 설정이 부족하면 해당 오류가 발생할 수 있습니다. 현재 설정을 확인하려면 다음을 실행하세요.

cat /proc/sys/kernel/shmmax
cat /proc/sys/kernel/shmall

필요한 경우, 설정 값을 늘려야 합니다.

sudo sysctl -w kernel.shmmax=4294967296
sudo sysctl -w kernel.shmall=2097152

설정을 영구적으로 적용하려면 /etc/sysctl.conf 파일을 수정합니다.

sudo nano /etc/sysctl.conf

아래 내용을 추가 또는 수정합니다.

kernel.shmmax=4294967296
kernel.shmall=2097152

이후, 설정을 적용합니다.

sudo sysctl -p

3. HugePages 활성화 (Linux의 경우)

Oracle에서는 HugePages를 활성화하면 메모리 할당이 더 효율적으로 이루어집니다. 현재 설정을 확인하려면 다음 명령어를 실행하세요.

cat /proc/meminfo | grep HugePages

설정을 변경하려면 /etc/sysctl.conf 파일을 수정합니다.

vm.nr_hugepages=2048

이후, 설정을 적용합니다.

sudo sysctl -p

4. SGA 및 PGA 설정 조정

SGA 크기가 시스템 메모리보다 크다면 ORA-27102 오류가 발생할 수 있습니다. 현재 설정을 확인하려면 다음 SQL을 실행합니다.

SHOW PARAMETER sga_max_size;
SHOW PARAMETER sga_target;
SHOW PARAMETER pga_aggregate_target;

필요한 경우 SGA 및 PGA 크기를 줄입니다.

ALTER SYSTEM SET sga_max_size=2G SCOPE=SPFILE;
ALTER SYSTEM SET sga_target=2G SCOPE=SPFILE;
ALTER SYSTEM SET pga_aggregate_target=1G SCOPE=SPFILE;

변경 후, 데이터베이스를 재시작해야 적용됩니다.

shutdown immediate;
startup;

5. Oracle 프로세스 확인 및 정리

이미 실행 중인 Oracle 프로세스가 메모리를 과도하게 점유하고 있는지 확인합니다.

ps -ef | grep ora_

필요한 경우, 불필요한 프로세스를 종료합니다.

kill -9 <PID>

또는 안전하게 데이터베이스를 재시작합니다.

shutdown immediate;
startup;

리스너 상태 확인 및 시작

리스너가 실행되지 않은 경우에도 이 오류가 발생할 수 있습니다. 현재 리스너 상태를 확인하려면 다음 명령어를 실행하세요.

lsnrctl status

리스너가 실행되지 않았다면 아래 명령어로 시작합니다.

lsnrctl start

리스너 설정이 올바른지 확인하려면 listener.ora 파일을 점검해야 합니다. 기본적으로 이 파일은 $ORACLE_HOME/network/admin/ 디렉터리에 위치합니다.


방화벽 및 네트워크 설정 확인

방화벽이 Oracle 리스너(기본 포트: 1521)를 차단하고 있는지 확인합니다.

netstat -tulnp | grep 1521  # 리눅스
netstat -ano | findstr 1521  # 윈도우

필요한 경우 방화벽에서 해당 포트를 허용합니다.

Windows:

netsh advfirewall firewall add rule name="Oracle Listener" dir=in action=allow protocol=TCP localport=1521

Linux:

sudo firewall-cmd --add-port=1521/tcp --permanent
sudo firewall-cmd --reload

ORACLE_SID 환경 변수 확인 및 설정

환경 변수가 올바르게 설정되지 않으면 연결이 실패할 수 있습니다. 현재 설정을 확인하려면 다음 명령어를 실행하세요.

echo %ORACLE_SID%
echo %ORACLE_HOME%

필요한 경우 다음과 같이 설정합니다.

set ORACLE_SID=mydb
set ORACLE_HOME=C:\oracle\product\19c\dbhome_1
set PATH=%ORACLE_HOME%\bin;%PATH%

Windows 환경에서는 시스템 속성에서 환경 변수를 영구적으로 추가할 수도 있습니다.

Oracle 데이터베이스에서 TNS-12541: TNS:no listener 오류가 발생하면, 이는 클라이언트가 데이터베이스 리스너(Listener)에 연결할 수 없음을 의미합니다. 주로 리스너 프로세스가 실행되지 않았거나, 네트워크 설정이 올바르지 않을 때 발생합니다.

1. 리스너 프로세스 상태 확인

먼저, 리스너가 실행 중인지 확인하려면 아래 명령어를 사용하세요.

lsnrctl status

리스너가 실행 중이라면 서비스 상태가 표시되지만, 실행되지 않았다면 TNS:no listener 메시지가 나타날 것입니다.


2. 리스너 시작하기

리스너가 실행되지 않았다면 아래 명령어로 시작할 수 있습니다.

lsnrctl start

리스너가 정상적으로 실행되었는지 다시 확인하려면 다음을 실행하세요.

lsnrctl status

3. listener.ora 설정 확인

리스너 설정 파일(listener.ora)이 올바르게 구성되어 있는지 확인합니다. 기본적으로 이 파일은 $ORACLE_HOME/network/admin/ 디렉터리에 위치합니다.

예제 설정:

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.000.0.000)(PORT = 1521))
    )
  )

파일을 수정한 후에는 반드시 리스너를 다시 시작해야 합니다.

lsnrctl reload

4. 방화벽 및 포트 확인

리스너가 실행 중이어도 네트워크 차단으로 인해 연결되지 않을 수 있습니다. 방화벽에서 1521 포트가 열려 있는지 확인하세요.

netstat -tulnp | grep 1521

필요한 경우 방화벽에서 1521 포트를 허용합니다.

sudo firewall-cmd --add-port=1521/tcp --permanent
sudo firewall-cmd --reload

5. 클라이언트 측 tnsnames.ora 설정 확인

클라이언트에서 사용 중인 tnsnames.ora 파일이 올바르게 설정되어 있는지 확인하세요. 이 파일은 $ORACLE_HOME/network/admin/에 위치합니다.

예제 설정:

MYDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.000.0.000)(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME = mydb)
    )
  )

올바르게 설정되었는지 확인하려면 다음 명령어를 실행해봅니다.

tnsping MYDB

Oracle 데이터베이스에서 ORA-01034: ORACLE not available 오류가 발생하면, 이는 데이터베이스 인스턴스가 실행되지 않았거나, 환경 변수가 올바르게 설정되지 않았을 때 발생하는 문제입니다.

1. 데이터베이스 인스턴스 상태 확인

먼저, 현재 데이터베이스 인스턴스가 실행 중인지 확인합니다.

ps -ef | grep pmon

만약 아무런 결과도 나오지 않는다면, 데이터베이스 인스턴스가 실행되지 않은 것입니다.

또는 SQL*Plus에 접속하여 상태를 확인할 수도 있습니다.

sqlplus / as sysdba

만약 접속이 실패한다면 데이터베이스가 정상적으로 실행되지 않았을 가능성이 높습니다.


2. 데이터베이스 인스턴스 시작

데이터베이스를 실행하려면 sysdba 권한으로 접속 후 아래 명령어를 실행합니다.

sqlplus / as sysdba
STARTUP;

만약 STARTUP 실행 후 오류가 발생하면 alert.log를 확인하여 원인을 분석해야 합니다.

cd $ORACLE_BASE/diag/rdbms/$ORACLE_SID/trace
cat alert_$ORACLE_SID.log

3. ORACLE_SID 환경 변수 확인 및 설정

환경 변수가 올바르게 설정되지 않으면 데이터베이스에 접근할 수 없습니다. 현재 설정을 확인하려면 다음 명령어를 사용하세요.

echo $ORACLE_SID
echo $ORACLE_HOME

필요한 경우 환경 변수를 다시 설정합니다.

export ORACLE_SID=mydb
export ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH

설정 후 다시 데이터베이스를 시작해보세요.

sqlplus / as sysdba
STARTUP;

4. 파일시스템 공간 확인

데이터베이스가 실행되지 않는 원인 중 하나는 파일시스템의 공간 부족일 수 있습니다.

df -h

만약 /u01 또는 데이터파일이 있는 디렉터리에 공간이 부족하다면 불필요한 파일을 정리한 후 다시 데이터베이스를 시작해야 합니다.

Oracle 데이터베이스에서 ORA-12514: TNS:listener does not currently know of service requested 오류가 발생하면, 이는 리스너(Listener)가 특정 데이터베이스 서비스에 대한 정보를 알지 못할 때 발생하는 문제입니다. 일반적으로 데이터베이스가 실행되지 않았거나 리스너가 제대로 설정되지 않았을 때 나타날 수 있습니다.

1. 현재 리스너 상태 확인

먼저, lsnrctl status 명령어를 사용하여 리스너가 실행 중인지 확인합니다.

lsnrctl status

만약 특정 서비스가 등록되어 있지 않다면, 리스너 설정에 문제가 있을 가능성이 큽니다.


2. 데이터베이스 서비스 상태 확인

리스너는 tnsnames.ora 또는 listener.ora 설정을 참조하여 서비스 정보를 찾습니다. 데이터베이스 서비스가 정상적으로 실행 중인지 확인하려면 아래 명령어를 사용하세요.

SELECT name, open_mode FROM v$database;
SELECT name, enabled FROM v$services;

만약 서비스가 비활성화되어 있다면 데이터베이스를 재시작하거나 수동으로 서비스를 등록해야 합니다.


3. 리스너에 서비스 등록 (동적 등록)

데이터베이스를 재시작하여 서비스가 리스너에 자동 등록되도록 할 수 있습니다.

ALTER SYSTEM REGISTER;

또는 리스너를 다시 시작하여 변경 사항을 적용할 수도 있습니다.

lsnrctl stop
lsnrctl start

4. listener.ora 수동 등록 (필요한 경우)

자동 등록이 작동하지 않는 경우, listener.ora 파일에 수동으로 서비스 정보를 추가할 수 있습니다. 예제는 다음과 같습니다.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = mydb)
      (ORACLE_HOME = /u01/app/oracle/product/19c/dbhome_1)
      (SID_NAME = mydb)
    )
  )

파일 수정 후 리스너를 재시작하세요.

lsnrctl reload

Oracle 데이터베이스에서 ORA-28000: the account is locked 오류가 발생하면, 이는 특정 계정이 잠겨(Locked) 있어 로그인이 불가능한 상태임을 의미합니다. 이 오류는 보안 정책에 의해 비밀번호 입력 실패 횟수가 초과되었거나, 계정이 수동으로 잠긴 경우 등에 발생할 수 있습니다.

1. 현재 계정 상태 확인

먼저, 계정이 잠겨 있는지 확인하려면 DBA 권한이 있는 사용자(SYS 또는 SYSTEM)로 로그인한 후 다음 쿼리를 실행합니다.

SELECT username, account_status FROM dba_users WHERE username = '사용자명';

여기서 ACCOUNT_STATUSLOCKED(TIMED) 또는 LOCKED로 표시된다면 계정이 잠긴 상태입니다.


2. 계정 잠금 해제하기

계정을 다시 활성화하려면 아래 명령어를 실행하면 됩니다.

ALTER USER 사용자명 ACCOUNT UNLOCK;

실행 후 다시 SELECT 문으로 계정 상태를 확인하세요.


3. 비밀번호 변경 (필요한 경우)

비밀번호 입력 실패로 인해 계정이 잠긴 경우, 비밀번호 정책에 따라 기존 비밀번호로는 로그인할 수 없을 수도 있습니다. 이 경우 비밀번호를 변경해야 합니다.

ALTER USER 사용자명 IDENTIFIED BY 새비밀번호;

비밀번호 정책을 확인하려면 다음 명령을 실행해보세요.

SELECT * FROM dba_profiles WHERE resource_name = 'FAILED_LOGIN_ATTEMPTS';

이 값이 너무 낮다면 조정이 필요할 수도 있습니다.


4. 비밀번호 입력 실패 허용 횟수 변경 (필요한 경우)

비밀번호 입력 실패 횟수 제한을 변경하려면 아래와 같이 설정할 수 있습니다.

ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS 10;

위 명령은 기본 프로파일의 최대 실패 횟수를 10회로 변경하는 예제입니다.

1. 특정 오브젝트(테이블, 뷰, 인덱스) 검색 (DBA_OBJECTS)

SELECT OBJECT_NAME, OBJECT_TYPE, OWNER, STATUS, CREATED, LAST_DDL_TIME
FROM DBA_OBJECTS
WHERE OBJECT_NAME LIKE '테이블_이름%'
ORDER BY OBJECT_TYPE;

2. 특정 테이블의 컬럼 정보 확인 (DBA_TAB_COLUMNS)

SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, NULLABLE, COLUMN_ID
FROM DBA_TAB_COLUMNS
WHERE TABLE_NAME = '테이블_이름'
ORDER BY COLUMN_ID;

3. 특정 인덱스 정보 조회 (DBA_INDEXES)

-- 인덱스 목록 확인
SELECT INDEX_NAME, TABLE_NAME, UNIQUENESS, STATUS
FROM DBA_INDEXES
WHERE TABLE_NAME = '테이블_이름';

4. 캐시에 로드된 오브젝트 확인 (V$DB_OBJECT_CACHE)

SELECT OWNER, NAME, TYPE, SHARABLE_MEM, LOADS, EXECUTIONS
FROM V$DB_OBJECT_CACHE
ORDER BY LOADS DESC;

5. 최근 변경된 오브젝트 확인 (DBA_OBJECTS)

SELECT OBJECT_NAME, OBJECT_TYPE, LAST_DDL_TIME
FROM DBA_OBJECTS
WHERE LAST_DDL_TIME > SYSDATE - 7
ORDER BY LAST_DDL_TIME DESC;

6. 특정 오브젝트 사용 여부 확인 (V$OPEN_CURSOR)

SELECT S.SID, S.SERIAL#, C.USER_NAME, C.SQL_TEXT
FROM V$OPEN_CURSOR C
JOIN V$SESSION S
ON C.SID = S.SID
WHERE C.SQL_TEXT LIKE '%테이블_이름%';

7. 삭제된 오브젝트 복구 (FLASHBACK TABLE)

-- 삭제된 테이블 목록 조회
SELECT OBJECT_NAME, ORIGINAL_NAME, DROPTIME FROM RECYCLEBIN;
-- 특정 테이블 복구
FLASHBACK TABLE 테이블_이름 TO BEFORE DROP;

 

1. 현재 실행 중인 세션 및 SQL 조회 (V$SESSION, V$SQL)

-- 현재 실행 중인 세션 확인
SELECT SID, SERIAL#, USERNAME, STATUS, MACHINE, PROGRAM FROM V$SESSION WHERE STATUS = 'ACTIVE';
-- 실행 중인 SQL 조회
SELECT S.SID, S.SERIAL#, S.USERNAME, SQ.SQL_TEXT
FROM V$SESSION S
JOIN V$SQL SQ
ON S.SQL_ID = SQ.SQL_ID
WHERE S.STATUS = 'ACTIVE';

2. 락 걸린 세션 찾기 (V$LOCK, V$SESSION)

-- 락 걸린 세션 확인
SELECT L.SID, S.SERIAL#, S.USERNAME, L.TYPE, L.MODE_HELD
FROM V$LOCK L
JOIN V$SESSION S
ON L.SID = S.SID
WHERE L.BLOCK = 1;

3. UNDO 테이블스페이스 사용량 (V$UNDOSTAT)

-- 최근 1시간 동안 UNDO 사용량 조회
SELECT BEGIN_TIME, END_TIME, UNDOTSN, UNDOBLKS, TXNCOUNT
FROM V$UNDOSTAT
WHERE BEGIN_TIME > SYSDATE - 1/24
ORDER BY BEGIN_TIME DESC;

4. 실행 계획 및 성능 분석 (V$SQL_PLAN)

-- 특정 SQL 실행 계획 조회
SELECT *
FROM V$SQL_PLAN WHERE SQL_ID = 'SQL_ID_값';

 

+ Recent posts