★ 오류발생 : listener 연결이 안되어있다. 당연히 DB접속도 안된다.
# 상태 체크
[oracle@oracle ~]$ lsnrctl status
...
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle)(PORT=1521)))
TNS-12541: TNS:no listener
 TNS-12560: TNS:protocol adapter error
  TNS-00511: No listener
   Linux Error: 111: Connection refused
...


# DB 연결
[oracle@oracle ~]$ sqlplus / as sysdba
...
Connected to an idle instance.
>>> sqlplus에 접속했지만 DB연결이 안된다.


# sqldeveloper에 접속 시 오류


요청한 작업을 수행하는 중 오류 발생:
IO 오류: The Network Adapter could not establish the connection
업체 코드 17002
# listener 시작
[oracle@oracle ~]$ lsnrctl start
...
The listener supports no services
The command completed successfully
>>> 실제 반영에는 약간의 텀이 있을 수 있다.


[oracle@oracle ~]$ lsnrctl status
...
Alias                     LISTENER
...
The listener supports no services
The command completed successfully
>>> db서비스가 없다. DB를 확인하자


# DB 접속
[oracle@oracle ~]$  sqlplus / as sysdba
...
Connected to an idle instance.
>>> sqlplus는 실행했지만 DB연결이 안되어있다.


SQL> startup
ORACLE instance started.
...
Database mounted.
Database opened.
>>> 시간 소요 주의


SQL> !
# listener 상태 확인
[oracle@oracle ~]$ lsnrctl status
...
Service "ora11gXDB" has 1 instance(s).
  Instance "ora11g", status READY, has 1 handler(s) for this service...
The command completed successfully

>>> 준비가 되었다.


# db 연결
[oracle@oracle ~]$  sqlplus / as sysdba


# instance 상태 확인
SQL> select status from v$instance;

STATUS
------------
OPEN


# 오라클 프로세스 상태 확인
SQL> ! ps -ef | grep oracle
avahi      798     1  0 19:35 ?        00:00:00 avahi-daemon: running [oracle.local]
root      3214  1400  0 20:05 ?        00:00:00 sshd: oracle [priv]
oracle    3223  3214  0 20:06 ?        00:00:00 sshd: oracle@pts/0
oracle    3227  3223  0 20:06 pts/0    00:00:00 -bash
oracle    3315  3227  0 20:07 pts/0    00:00:00 sqlplus   as sysdba
oracle    3320     1  0 20:07 ?        00:00:00 ora_pmon_ora11g
oracle    3322     1  0 20:07 ?        00:00:00 ora_psp0_ora11g
oracle    3324     1  5 20:07 ?        00:00:20 ora_vktm_ora11g
...


SQL> !
>>> 가상머신에서 리눅스 OS를 완전 종료하면 항상 초기화 된다. 시스템 상태 저장으로 닫자




■ daily check list

# listener 상태 체크
[oracle@oracle ~]$ lsnrctl status

# 오라클이 사용하고 있는 프로세스 확인
[oracle@oracle ~]$   ps -ef | grep oracle

# 관리하는 DB에 접속 
[oracle@oracle ~]$  sqlplus / as sysdba

# instance 확인
SQL> select * from v$instance;



# 오라클 DB 다중 사용 시 접속할 DB설정
[oracle@oracle ~]$ . oraenv
ORACLE_SID = [ora11g] ? 입력



# listener
호스트, 포트, SID 등 정보를 가진 리모트 접속을 위한 네트워크 관리자
putty는 서버로 직접 DB 접속 (client) , 네트워크를 열 필요가 없으니 리스너라는게 의미가 없다
MobaXterm, sqldeveloper, 등 리모트 접속에서 필요

# listener 시작
[oracle@oracle ~]$ lsnrctl start
>>> 적용시간 필요

# listener 중지
[oracle@oracle ~]$  lsnrctl stop





■ sqlplus 편집기

# 사용자정의 변수 목록 확인
SQL> define
...
DEFINE _EDITOR         = "ed" (CHAR)

# 기본 편집기를 vi로 변경
SQL> define_editor="vi"
...
DEFINE _EDITOR         = "vi" (CHAR)
>>> vi 편집기로 실행 설정


# 마지막 실행한 명령어 정보
SQL> l
  1* select status from v$instance


# 마지막 수행한 명령어 수정
SQL> ed
select * from v$instance
/

select open from v$instance
/
>>> 수정 후 저장


# 마지막 수행한 명령어 재실행
SQL> /
select open from v$instance
       *
ERROR at line 1:
ORA-00904: "OPEN": invalid identifier
>>> 시멘틱에러, open이라는 단어가 없다. ---> test 임

SQL> ed
select status from v$instance
/
>>> 수정 시 명령어 끝에 ; 제외한다.

SQL> /

STATUS
------------
OPEN


SQL> exit
[oracle@oracle ~]$ sqlplus / as sysdba
SQL> define
...
DEFINE _EDITOR         = "ed" (CHAR)
>>> 복구되어있다?!

SQL> exit
[oracle@oracle ~]$ cd $ORACLE_HOME/sqlplus/admin

[oracle@oracle admin]$ vi glogin.sql
>>> 글로벌 접속 시 환경설정 (define 등)

define_editor="vi"
>>> 저장

[oracle@oracle admin]$ cd
[oracle@oracle ~]$ sqlplus / as sysdba
SQL> define
...
DEFINE _EDITOR         = "vi" (CHAR)
>>> 영구저장



SQL> select systimestamp from dual;

SYSTIMESTAMP
---------------------------------------------------------------------------
07-DEC-23 09.02.49.628685 PM -05:00
>>> 설치 시 미국으로 했기 때문





■ alert log file
- 오라클이 운영되고 종료될 때까지 중요한 내용들을 저장하고 있는 파일
- 오라클 서버에서 어떤 장애가 발생했거나 문제의 징후가 보일 경우 이 파일 내용을 자세히 분석해보면 해답을 찾을 수 있다.

<< putty 새창 >>
/u01/app/oracle/diag/rdbms/SID명/SID명/trace
$ORACLE_BASE/diag/rdbms/SID명/SID명/trace

[oracle@oracle ~]$ cd $ORACLE_BASE/diag/rdbms/ ora11g/ora11g/trace
[oracle@oracle trace]$ vi alert_ora11g.log
>>> DB생성시작부터 누적

[oracle@oracle trace]$ tail -f alert_ora11g.log
>>> 실시간 보기 (-f -F 무관)
>>> 
ctrl + c : 나가기


<< 기존창에서 테스트 >>
SQL> shutdown immediate
>>> DB 즉시 종료

SQL>startup 
>>> DB 시작

>>> 신규창에서 로그 확인 가능





■ ORACLE DataBase 시작

SQL> startup
ORACLE instance started.     ---> 메모리 구성

Total System Global Area  711430144 bytes
Fixed Size                  1367004 bytes
Variable Size             469763108 bytes
Database Buffers          234881024 bytes
Redo Buffers                5419008 bytes
Database mounted.     ---> 컨트롤파일 열기
Database opened.    ---> DB 오픈


★ startup 단계
ORACLE instance started.    nomount
Database mounted.           mount
Database opened.            open

1. nomount

- instance 시작 : sga영역과 background process 생성
    - initialization parameter file 초기 파라미터 파일) open : spfile<SID>.ora. init<SID>.ora
    - 위치 : $ORACLE_HOME/dbs
        startup nomount 단계에서 제일 먼저 보는 파일이 spfile<SID>.ora를 찾는데 없으면 init.ora를 찾는다. 둘다 없으면 오류 발생
        SQL> show parameter spfile
- alert<SID>.log, trace file open
- nomount 단계에서 오라클 작업하는 일
    - db 생성
    - control file 재생성
    - 백업, 복구


# alert log file (TEST)

1. SPFILE 경로확인
SQL> show parameter spfile
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /u01/app/oracle/product/11.2.0.4/db_1/dbs/spfileora11g.ora


2. 데이터 확인
[oracle@oracle dbs]$ pwd
/u01/app/oracle/product/11.2.0.4/db_1/dbs
[oracle@oracle dbs]$ ls
hc_ora11g.dat  init.ora  lkORA11G  orapwora11g  spfileora11g.ora

spfileora11g.ora : 바이너리(2진)형식 파일(=서버파라미터파일). vi편집기 불가. 


3. 파일명 변경
[oracle@oracle dbs]$ mv spfileora11g.ora spfileora11g.bak
[oracle@oracle dbs]$ ls
hc_ora11g.dat  init.ora  lkORA11G  orapwora11g  spfileora11g.bak


4. db 종료
SQL> shutdown abort
ORACLE instance shut down.


5. db 시작
SQL> startup
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/u01/app/oracle/product/11.2.0.4/db_1/dbs/initora11g.ora'


6. 파일 복구
[oracle@oracle ~]$ cd $ORACLE_HOME/dbs
[oracle@oracle dbs]$ ls
hc_ora11g.dat  init.ora  lkORA11G  orapwora11g  spfileora11g.bak

[oracle@oracle dbs]$ mv spfileora11g.bak spfileora11g.ora


[oracle@oracle dbs]$ cp spfileora11g.ora spfileora11g_20231208.bak
>>> 초기 파라미터 파일 백업. 수정 전 후 작업



2. mount
    - control file open
    - mount 단계에서 오라클 작업하는 일
        - 데이터 파일 이름 바꾸기
        - noarchivelog mode를 archivelog mode로 바꾸는 작업
        - full database recovery
        - rman을 이용해서 close backup 할 때



3. open
    - data file, redo log file open


[oracle@oracle trace]$ tail -f alert_ora11g.log
...
Instance shutdown complete
>> 새창에 띄어 놓고

[oracle@oracle ~]$ sqlplus / as sysdba
...
Connected to an idle instance.
>>> DB내려간 상태

SQL> startup nomount
ORACLE instance started.

SQL> select status from v$instance;
STATUS
------------
STARTED

SQL> alter database mount;
Database altered.


SQL> select status from v$instance;
STATUS
------------
MOUNTED

SQL> alter database open;
Database altered.

SQL> select status from v$instance;

STATUS
------------
OPEN

>>> 단계별 진행해야 한다.
startup : 기본값 open




■ DB 읽기모드로 시작

SQL> select open_mode from v$database;

OPEN_MODE
--------------------
READ WRITE
>>> 현재 오픈모드가 뭐냐 : 읽고 쓸 수 있다.

>>> 정상적 DB 즉시 종료
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

>>> db 읽기모드로 시작
SQL> startup open read only

SQL> select open_mode from v$database;

OPEN_MODE
--------------------
READ ONLY

SQL> select salary from hr.employees where employee_id  = 100 ;

    SALARY
----------
     24000

SQL> update hr.employees set salary = 1000 where employee_id = 100;
update hr.employees set salary = 1000 where employee_id = 100
          *
ERROR at line 1:
ORA-16000: database open for read-only access

>>> 모드를 바꾸려면 DB 온오프 필요 -> 작업중에 하지말자.

SQL> shutdown immediate
SQL> startup    ---> 기본값 : [open] [read write]
SQL> select open_mode from v$database;

OPEN_MODE
--------------------
READ WRITE





■ 오라클 종료
Database closed.            close
Database dismounted.        mount
ORACLE instance shut down.  nomount


shutdown [normal]
- normal 기본 종료 모드
- 새 연결을 생성할 수 없습니다. 새로운 session은 생성할 수 없다.
- 오라클 서버는 모든 유저가 연결을 끊을 때까지 종료하지 않고 대기한다.
- 데이터 버퍼 캐시 및 리두 버퍼가 디스크에 기록된다.
- 백그라운드 프로세스가 종료되고 SGA메모리에서 제거된다.
- instance 종료하기 전에 데이터베이스(데이터파일, 리두로그파일)를 닫고 마운트(컨트롤파일)를 해제한다.
- 데이터베이스를 다시 시작할 때 instance recovery가 필요하지 않습니다.


shutdown [transactionall]
- 새 연결을 생성할 수 없습니다. 새로운 session은 생성할 수 없다.
- (DML 작업을) transacion 수행하는 유저는 계속 오라클에 접속을 나누고 접속은 했지만 아무 작업을 하지 않은 유저는 자동으로 sessopn을 종료 시킨다.
- 모든 transacion 이 완료(commit, rollback) 되면 즉시 데이터베이스가 종료 된다.
- 데이터베이스를 다시 시작할 때 instance recovery가 필요하지 않습니다.


shutdown [immediate]
- 새 연결을 생성할 수 없습니다. 새로운 session은 생성할 수 없다.
- 오라클 서버는 현재 연결하고 있는 유저를 자동으로 session을 종료시킨다.(kill)
- 현재 유저들 중에 DML 작업을 수행해고 이을경우에 kill 시키는 순간 작동 rollback 된다.
- instance 종료하기 전에 데이터베이스(데이터파일, 리두로그파일)를 닫고 마운트(컨트롤파일)를 해제한다.
- 데이터베이스를 다시 시작할 때 instance recovery가 필요하지 않습니다.
- 데이터베이스 close backup을 수행할 때 한다.


shutdown [abort]
- 비정상적인 종료
- normal, transacion, immediate 작동되지 않을 경우
- 데이터버퍼 캐시 및 리두 버퍼가 디스크에 기록되지 않습니다.
- commit 되지 않은 트랜젝션은 롤잭되지 않았습니다.
- 파일을 닫지 않은 상태로 instance가 종료된다.
- 데이터베이스가 닫히거나 마운트 해제되지 않습니다.
- 데이터베이스를 시작 시 instance recovery가 필요하며 이는 자동으로 수행된다.
주의!! shutdown abort 수행한 후 데이터베이스 백업은 하지 말자!