RAC용 점검 스크립트

RAC 1노드에서 양쪽 노드 모두 확인하는 점검 스크립트입니다.



엔지니어 분들이 고객사 점검에 사용하면 좋게 만들었습니다.

운영하시는 분들도 일일 상태 체크나 DB관련 정보 확인을 위해 사용 할 수 있습니다.

11g 기준으로 작성 되었습니다.


check_RAC.sql


'ORACLE > Operation & Admin' 카테고리의 다른 글

RAC용 점검 스크립트  (0) 2018.12.25
무료 오라클 성능진단 툴 Mumbai 3.1.1  (0) 2018.12.25
Table 또는 인덱스의 사이즈를 확인 하는 쿼리  (0) 2018.11.01
CURSOR_SHARING  (0) 2018.10.31
ASM 용량 확인  (0) 2018.10.28
Datafile Resize 계산하기  (0) 2018.10.18

무료 오라클 성능진단 툴 Mumbai 3.1.1

오라클 성능 진단 툴인 Mumbai 3.1.1





일단 AWR, Statspack, ASH 등을 이툴로 DB에 접속해 직접 추출 할 수 있으며, 무엇보다 좋은것은 시각화를 가능하게 해주는 점입니다.


실시간 모니터링 보다는 성능진단시 더 유용합니다. 시각화를 통한 보고서 작성이나 성능에 관련한 다양한 내용을 확인 할 수 있기 때문에 좋습니다.


아래 출처에 가시면 다운받을수 있습니다.


링크 : https://marcusmonnig.wordpress.com/2016/09/21/mumbai-version-3-1-1-available/



'ORACLE > Operation & Admin' 카테고리의 다른 글

RAC용 점검 스크립트  (0) 2018.12.25
무료 오라클 성능진단 툴 Mumbai 3.1.1  (0) 2018.12.25
Table 또는 인덱스의 사이즈를 확인 하는 쿼리  (0) 2018.11.01
CURSOR_SHARING  (0) 2018.10.31
ASM 용량 확인  (0) 2018.10.28
Datafile Resize 계산하기  (0) 2018.10.18

Netbackup 연동 RMAN 복원 테스트

현업에서는 서버를 관리하는데 있어서 대부분 백업 솔루션이 들업갑니다.


중소규모의 회사나 서버가 몇대 없는 회사의 경우, RMAN 스크립트를 만들어서 crontab 이나 작업스케줄러에 등록하여 백업을 받기도 하지만, 대규모의 기업이나 많은 수의 서버를 가진 업체의 경우 Netbackup 같은 백업 솔루션이 들어갑니다.


백업 솔루션은 Netbackup만 있는 것은 아니고 많은 회사들이 출시한 다양한 제품이 있지만, 국내에서 가장 많이 사용하는 백업 솔루션은 Netbackup 입니다. 백업 솔루션은 Acronis 같은 제품도 있고, 다양하게 있습니다.


Netbackup 같은 백업 솔루션은 단순 DB 백업 뿐 아니라 서버 자체를 백업 한다거나 다른 어플리케이션 백업도 가능합니다.

그렇기 때문에 Netbackup 엔지니어들은 Netbackup 설치나 OS 복구 정도는 할 수 있습니다. 


하지만, 오라클은 DB를 Netbackup을 이용해서 백업 할 줄 알아도, DB를 복구 하는 방법을 모르는 경우가 대부분 입니다. Netbackup을 다루는 회사마다 복구 메뉴얼이 있고, 메뉴얼 대로 복구 하는 경우가 많지만, 왜 그렇게 복구를 해야 하는지?, 복구하다 막혔을때 어떻게 해야 하는지 모르는 경우가 많아 DB 엔지니어나 DBA의 도움을 필요로 합니다. Netbackup 엔지니어들은 오라클을 집중적으로 공부한 경우가 많지 않기 때문이죠.


백업 계약이라는 것은 백업만 해주는게 아니고 장애시 복구가 포함 되는 것인데 백업 엔지니어가 DBA가 없으면 복구를 못하는 경운가 많다는 것이죠. 개인적으로 봤을때는 말이 안되는 상황이라고 봅니다. 업체측에서 restore 까지만 계약 되어 있다고 하는 경우도 있는데, 일반적으로 백업 복구는 recovery 후 시스템 정상화까지가 복구입니다. 


DBA와 백업 엔지니어가 협력해야 하는게 맞고, 서로서로 좋은게 좋은것이지만, 기본적으로 혼자 복구 할 줄 알아야 한다고 생각합니다. 어떤 회사는 들어가보면 DB는 있는데 DBA도 없고, DB 유지보수 계약도 없는 경우도 많거든요.




시나리오


● RAC 2노드 (ASM) -> Single DB (ASM Standalone)


 - RAC는 라이센스도 비싸고, 장비 세팅이나 준비사항이 많습니다. 

   그렇기 때문에 DR서버를 구축하거나 복구를 위한 테스트 서버를 RAC로 구축하는것은 낭비입니다.

 - 오라클 DB의 버전은 동일하게 맞춥니다. 원본이 11.2.0.4 라면 복구도 11.2.0.4

 - 파일 시스템은 일반 파일시스템이나 Raw Device 이어도 상관 없지만, 복구 과정 중에 Rename 작업이 필요하며, 

   ASM의 경우는 Rename 작업이 필요가 없습니다.

 - Netbackup에서 원본 서버의 RMAN 백업과 Archive 파일을 백업 받습니다.

 - 복구 서버에도 Netbackup 에이전트를 설치하고, RMAN의 저장 경로를 Netbackup으로 인식 시켜줍니다.



1. pfile 설정


 - pfile을 Netbackup에 있는 RMAN 백업에서 내려 받아도 상관 없지만, 그냥 원본에서 spfile을 pfile로 백업해서 드래그로 긁어 오는게 편합니다.


 원본서버

 SQL> create pfile='init<SID>.ora' from spfile;


 $ORACLE_HOME/dbs 밑에 가면 init<SID>.ora 파일이 생성 되어 있는데, 복구서버의 동일한 디렉토리에 복사해 주거나, vi로 만들어서 안의 내용을 복사해서 붙여 넣습니다.


rac2.__db_cache_size=1526726656

rac1.__db_cache_size=1459617792

rac2.__java_pool_size=16777216

rac1.__java_pool_size=16777216

rac2.__large_pool_size=33554432

rac1.__large_pool_size=33554432

rac1.__oracle_base='/app/oracle'#ORACLE_BASE set from environment

rac2.__oracle_base='/app/oracle'#ORACLE_BASE set from environment

rac2.__pga_aggregate_target=1258291200

rac1.__pga_aggregate_target=1342177280

rac2.__sga_target=2097152000

rac1.__sga_target=2013265920

rac2.__shared_io_pool_size=0

rac1.__shared_io_pool_size=0

rac2.__shared_pool_size=486539264

rac1.__shared_pool_size=469762048

rac2.__streams_pool_size=0

rac1.__streams_pool_size=0

*.audit_file_dest='/app/oracle/admin/rac/adump'

*.audit_trail='db'

*.cluster_database=true

*.compatible='11.2.0.4.0'

*.control_files='+DATA/rac/controlfile/current.260.923661671','+RECO/rac/controlfile/current.256.923661671'

*.db_block_size=8192

*.db_create_file_dest='+DATA'

*.db_domain=''

*.db_name='rac'

*.db_recovery_file_dest='+RECO'

*.db_recovery_file_dest_size=7423918080

*.diagnostic_dest='/app/oracle'

*.dispatchers='(PROTOCOL=TCP) (SERVICE=racXDB)'

rac1.instance_number=1

rac2.instance_number=2

*.log_archive_dest_1='LOCATION=/archive'

*.log_archive_format='arch_rac_%t_%s_%r.arc'

*.memory_target=3348103168

*.open_cursors=300

*.processes=350

*.remote_listener='rac-cluster-scan:1521'

*.remote_login_passwordfile='exclusive'

*.sessions=390

rac2.thread=2

rac1.thread=1

rac2.undo_tablespace='UNDOTBS2'

rac1.undo_tablespace='UNDOTBS1'

 


파라미터 파일을 수정해야 합니다.

rac 관련되 부분을 삭제 혹은 주석 처리하고, cluster_database는 ture에서 false로 변경해 줍니다.


수정 후


rac.__db_cache_size=1459617792

rac.__java_pool_size=16777216

rac.__large_pool_size=33554432

rac.__oracle_base='/app/oracle'#ORACLE_BASE set from environment

rac.__pga_aggregate_target=1342177280

rac.__sga_target=2013265920

rac.__shared_io_pool_size=0

rac.__shared_pool_size=469762048

rac.__streams_pool_size=0

*.audit_file_dest='/app/oracle/admin/rac/adump'

*.audit_trail='db'

*.cluster_database=false

*.compatible='11.2.0.4.0'

*.control_files='+DATA/rac/controlfile/current.260.923661671'

*.db_block_size=8192

*.db_create_file_dest='+DATA'

*.db_domain=''

*.db_name='rac'

*.db_recovery_file_dest='+DATA'

*.db_recovery_file_dest_size=7423918080

*.diagnostic_dest='/app/oracle'

*.dispatchers='(PROTOCOL=TCP) (SERVICE=racXDB)'

rac.instance_number=1

#rac2.instance_number=2

*.log_archive_dest_1='LOCATION=/archive'

*.log_archive_format='arch_rac_%t_%s_%r.arc'

*.memory_target=3348103168

*.open_cursors=300

*.processes=350

#*.remote_listener='rac-cluster-scan:1521'

*.remote_login_passwordfile='exclusive'

*.sessions=390

#rac2.thread=2

rac.thread=1

#rac2.undo_tablespace='UNDOTBS2'

rac.undo_tablespace='UNDOTBS1'


수정하고 diag 경로를 생성하고, archive 경로가 맞는지 확인해줍니다.


$ mkdir -p /app/oracle/admin/rac/adump

$ mkdir -p /archive

# chown oracle.oinstall /archive


수정이 완료 되면 DB가 nomount 상태까지 올라갑니다.


$ sqlplus / as sysdba

SQL> startup nomount;


그러면 DB쪽은 Restore 준비가 끝난 상태입니다.



2. Netbackup 에서 Controlfile 내려 받기


 - DB가 nomount 상태가 되면 Netbackup 에이전트 설치 및 Netbackup RMAN 연동이 가능합니다. (Netbackup 엔지니어 작업)

 - Netbackup과 RMAN이 연결되면, RMAN에서 list backup 명령시 백업 파일들이 나옵니다.


RMAN> 


RUN {

ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE';

SEND 'NB_ORA_SERV=<넷백업 서버명>, NB_ORA_CLIENT=<복구서버 클라이언트 명>';

RESTORE CONTROLFILE FROM 'ctrl_dracDB_udnrljheg_s439_p1_t928630224';

RELEASE CHANNEL ch00;

}


빨간색으로 된 부분은 콘트롤 파일의 백업인데, 백업마다 이름이 다르고, 서버마다 다르니 맞는 걸 찾아서 복원하면 됩니다.


콘트롤 파일이 복원디면 DB mount가 가능해집니다.


RMAN> alter database mount;



3. Restore


 - controlfile이 복원되면 restore가 가능해집니다.

 - ASM의 경우 datafile의 끝에 랜덤 숫자로 고유번호가 붙는데, 원본 DB와 복구DB의 번호가 다릅니다.

 - Restore 시 바뀐 번호로 자동 적용됩니다.


restore 명령을 실행 해봅니다.


RMAN>


RUN {

ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE';

SEND 'NB_ORA_SERV=<넷백업 서버명>, NB_ORA_CLIENT=<복구서버 클라이언트 명>';

RESTORE DATABASE;                                   

RELEASE CHANNEL ch00;

}


그러면 진행 상황이 나오며, restore가 진행됩니다.


Starting restore at 23-OCT-16

using channel ORA_DISK_1


channel ORA_DISK_1: starting datafile backup set restore

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

channel ORA_DISK_1: restoring datafile 00001 to +DATA/rac/datafile/system.256.923661571

channel ORA_DISK_1: restoring datafile 00002 to +DATA/rac/datafile/sysaux.257.923661571

channel ORA_DISK_1: restoring datafile 00003 to +DATA/rac/datafile/undotbs1.258.923661573

channel ORA_DISK_1: restoring datafile 00004 to +DATA/rac/datafile/users.259.923661573

channel ORA_DISK_1: restoring datafile 00005 to +DATA/rac/datafile/example.264.923661707

channel ORA_DISK_1: restoring datafile 00006 to +DATA/rac/datafile/undotbs2.265.923661973

channel ORA_DISK_1: restoring datafile 00007 to +DATA/rac/datafile/test01.269.924548909

channel ORA_DISK_1: reading from backup piece /work/rman/0qrijlsp_1_1_20161017.bkp

channel ORA_DISK_1: piece handle=/work/rman/0qrijlsp_1_1_20161017.bkp tag=TAG20161017T161729

channel ORA_DISK_1: restored backup piece 1

channel ORA_DISK_1: restore complete, elapsed time: 00:18:05

Finished restore at 23-OCT-16


RMAN>



4. Recovery


 - recover database 명령을 날려보면 필요한 archive log 파일 리스트가 나옵니다.


RMAN> recover database;


Starting recover at 23-OCT-16
using channel ORA_DISK_1

starting media recovery

channel ORA_DISK_1: starting archived log restore to default destination
channel ORA_DISK_1: restoring archived log
archived log thread=2 sequence=473
channel ORA_DISK_1: restoring archived log
archived log thread=1 sequence=239
channel ORA_DISK_1: reading from backup piece /work/rman/0srijm73_1_1_20161017.bkp
channel ORA_DISK_1: ORA-19870: error while restoring backup piece /work/rman/0srijm73_1_1_20161017.bkp
ORA-19504: failed to create file "/archive/arch_rac_2_473_923661675.arc"
ORA-27040: file create error, unable to create file
Linux-x86_64 Error: 13: Permission denied
Additional information: 1

failover to previous backup
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 10/23/2016 17:28:31
RMAN-20506: no backup of archived log found
RMAN-06053: unable to perform media recovery because of missing log
RMAN-06025: no backup of archived log for thread 1 with sequence 239 and starting SCN of 4539696 found to restore
RMAN-06025: no backup of archived log for thread 2 with sequence 473 and starting SCN of 4539693 found to restore
RMAN-06025: no backup of archived log for thread 1 with sequence 238 and starting SCN of 4539695 found to restore
RMAN-06025: no backup of archived log for thread 2 with sequence 472 and starting SCN of 4539692 found to restore
RMAN-06025: no backup of archived log for thread 1 with sequence 237 and starting SCN of 4539694 found to restore
RMAN-06025: no backup of archived log for thread 2 with sequence 471 and starting SCN of 4539691 found to restore

thread 1은 1번 노드, thread 2는 2번 노드의 아카이브 파일입니다.
빨간색으로 된 부분에서 sequence 넘버를 잘 보면 맨 위에가 최신이고, 아래쪽이 오래된 시퀀스 넘버입니다.
해당 시퀀스 번호를 가진 아카이브 로그가 필요하다는 뜻 입니다.

그러면 Netbackup에서 아카이브 로그를 복구 합니다.

RUN {
ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE';
SEND 'NB_ORA_SERV=<넷백업 서버명>, NB_ORA_CLIENT=<복구서버 클라이언트 명>';
RESTORE ARCHIVELOG FROM SEQUENCE 237 UNTIL SEQUENCE 239 THREAD 1;
RESTORE ARCHIVELOG FROM SEQUENCE 471 UNTIL SEQUENCE 473 THREAD 2;
RELEASE CHANNEL ch00;
}


그 후에

RMAN> recover database;

RMAN> alter database open resetlogs; 

하면 완료가 됩니다.


  1. 도움이 되는 내용 잘 읽었습니다.
    다만, 조금 잘 못 알고 계신 부분이 있는데요..
    보통의 S/W유지보수 계약 시, 장애복구 내용은 해당하는 S/W의 정상화지
    Application 단위 장애의 정상화가 아닙니다....
    그런 계약이라면 아마 엄청난 유지보수 비용을 요구하리라 생각됩니다.

    오라클 DB의 장애인데, 백업업체가 모든걸 처리하면 오라클 유지보수 업체는 어떤 일을 하시나요?
    오라클 업체야 말로 계약한 DB시스템의 장애 시 복구 Role 이 있는 것이지요??
    복구 Role 이 누가 더 큰지 잘 생각해 보시기 바랍니다.

    님의 논리대로라면,
    백업엔지니어는
    MSSQL, Oracle, DB2, Exchange, SAP 기타 등등 현존하는 거의 모든 Application을 다룰 줄 알아야 한다는 것인데
    그런 인력이 과연 존재는 할까요?? ^^;


Error in invoking target 'agent nmhs' of makefile

11g 설치시 나오는 에러

Error in invoking target 'agent nmhs' of makefile ....

이라고 에러가 나오는 경우.


Oracle 11g R2를 Install하는 동안 “Error in invoking target 'agent nmhs' of makefile - during 11g Installation”과 같은 오류가 보고되는 경우 그냥 무시를 하고 진행해도 되지만 “$ emctl status dbconsole” 또는 오라클 에이젼트가 오작동을 일으키는 경우가 있습니다.


위와 같이 오류가 보고되는 순간 계속 진행하지 말고,


1. “$ORACLE_HOME/sysman/lib/ins_emagent.mk”을 vi로 Open


2. “$(MK_EMAGENT_NMECTL)”를 찾아서 “$(MK_EMAGENT_NMECTL) -lnnz11” 로 수정


3. 인스톨로 “Retry”를 선택하여 무시하지 말고 계속 진행.

리눅스7 버전에서 11g grid 설치시 root.sh 실패

root.sh 실행시 

아래와 같이 나오며 설치 실패 되는 경우


[root@localhost /]# /u01/app/11.2.0/grid/perl/bin/perl -I/u01/app/11.2.0/grid/perl/lib -I/u01/app/11.2.0/grid/crs/install /u01/app/11.2.0/grid/crs/install/roothas.pl

Using configuration parameter file: /u01/app/11.2.0/grid/crs/install/crsconfig_params

Creating trace directory

User ignored Prerequisites during installation

LOCAL ADD MODE

Creating OCR keys for user ‘oracle’, privgrp ‘oinstall’..

Operation successful.

LOCAL ONLY MODE

Successfully accumulated necessary OCR keys.

Creating OCR keys for user ‘root’, privgrp ‘root’..

Operation successful.

CRS-4664: Node localhost successfully pinned.

Adding Clusterware entries to inittab

ohasd failed to start

Failed to start the Clusterware. Last 20 lines of the alert log follow:

2016-01-01 02:14:46.806:

[client(11401)]CRS-2101:The OLR was formatted using version 3.

2016-01-01 02:14:49.572:

[client(11424)]CRS-1001:The OCR was formatted using version 3.


ohasd failed to start at /u01/app/11.2.0/grid/crs/install/roothas.pl line 377, line 4.




해결 방안


1. deinstall 해서 설치를 삭제


[root@localhost deinstall]# su – oracle

Last login: Fri Jan 1 02:17:02 EST 2016 on pts/1

[oracle@localhost ~]$ cd /u01/app/11.2.0/grid/deinstall

[oracle@localhost deinstall]$ ./deinstall


Checking for required files and bootstrapping …

Please wait …

Location of logs /tmp/deinstall2016-01-01_02-30-16AM/logs/


############ ORACLE DEINSTALL & DECONFIG TOOL START ############

######################### CHECK OPERATION START ###########################

[START] Install check configuration ##


Checking for existence of the Oracle home location /u01/app/11.2.0/grid

Oracle Home type selected for deinstall is: Oracle Grid Infrastructure for a Standalone Server

Oracle Base selected for deinstall is: /u01/app/oracle

Checking for existence of central inventory location /u01/app/oraInventory

Checking for existence of the Oracle Grid Infrastructure home /u01/app/11.2.0/grid

Checking for sufficient temp space availability on node(s) : ‘localhost.localdomain’


## [END] Install check configuration ##

Traces log file: /tmp/deinstall2016-01-01_02-30-16AM/logs//crsdc.log

Network Configuration check config START

Network de-configuration trace file location: /tmp/deinstall2016-01-01_02-30-16A/logs/netdc_check2016-01-01_02-30-40-AM.log

Network Configuration check config END

Asm Check Configuration START


ASM de-configuration trace file location: /tmp/deinstall2016-01-01_02-30-16AM/logs/asmcadc_check2016-01-01_02-30-41-AM.log

ASM configuration was not detected in this Oracle home. Was ASM configured in this Oracle home (y|n) [n]: n

ASM was not detected in the Oracle Home


######################### CHECK OPERATION END #########################

####################### CHECK OPERATION SUMMARY #######################

Oracle Grid Infrastructure Home is: /u01/app/11.2.0/grid

The cluster node(s) on which the Oracle home deinstallation will be performed are:null

Oracle Home selected for deinstall is: /u01/app/11.2.0/grid

Inventory Location where the Oracle home registered is: /u01/app/oraInventory

ASM was not detected in the Oracle Home

Do you want to continue (y – yes, n – no)? [n]: y

A log of this session will be written to: ‘/tmp/deinstall2016-01-01_02-30-16AM/logs/deinstall_deconfig2016-01-01_02-30-35-AM.out’

Any error messages from this session will be written to: ‘/tmp/deinstall2016-01-01_02-30-16AM/logs/deinstall_deconfig2016-01-01_02-30-35-AM.err’


######################## CLEAN OPERATION START ########################

ASM de-configuration trace file location: /tmp/deinstall2016-01-01_02-30-16AM/logs/asmcadc_clean2016-01-01_02-30-57-AM.log

ASM Clean Configuration END


Network Configuration clean config START

Network de-configuration trace file location: /tmp/deinstall2016-01-01_02-30-16A/logs/netdc_clean2016-01-01_02-30-57-AM.log

De-configuring backup files…

Backup files de-configured successfully.


The network configuration has been cleaned up successfully.

Network Configuration clean config END


—————————————->


Run the following command as the root user or the administrator on node “localhost”.


/tmp/deinstall2016-01-01_02-30-16AM/perl/bin/perl -I/tmp/deinstall2016-01-01_02-30-16AM/perl/lib -I/tmp/deinstall2016-01-01_02-30-16AM/crs/install /tmp/deinstall2016-01-01_02-30-16AM/crs/install/roothas.pl -force -deconfig -paramfile “/tmp/deinstall2016-01-01_02-30-16AM/response/deinstall_Ora11g_gridinfrahome1.rsp”


Press Enter after you finish running the above commands


<————————————-


This is the point where you have to execute the command highlighted and execute it from root user and wait for it to complete in order to deconfigure the Oracle Restart Stack.


[root@localhost ~]# /tmp/deinstall2016-01-01_02-30-16AM/perl/bin/perl -I/tmp/deinstall2016-01-01_02-30-16AM/perl/lib -I/tmp/deinstall2016-01-01_02-30-16AM/crs/install /tmp/deinstall2016-01-01_02-30-16AM/crs/install/roothas.pl -force -deconfig -paramfile “/tmp/deinstall2016-01-01_02-30-16AM/response/deinstall_Ora11g_gridinfrahome1.rsp”

Using configuration parameter file: /tmp/deinstall2016-01-01_02-30-16AM/response/deinstall_Ora11g_gridinfrahome1.rsp

CRS-2613: Could not find resource ‘ora.cssd’.

CRS-4000: Command Stop failed, or completed with errors.

CRS-2613: Could not find resource ‘ora.cssd’.

CRS-4000: Command Delete failed, or completed with errors.

CRS-4133: Oracle High Availability Services has been stopped.

Successfully deconfigured Oracle Restart stack



#########################

Setting the force flag to false

Setting the force flag to cleanup the Oracle Base

Oracle Universal Installer clean START


Detach Oracle home ‘/u01/app/11.2.0/grid’ from the central inventory on the local node : Done

Delete directory ‘/u01/app/11.2.0/grid’ on the local node : Done

Delete directory ‘/u01/app/oraInventory’ on the local node : Done

Delete directory ‘/u01/app/oracle’ on the local node : Done

Oracle Universal Installer cleanup was successful.

Oracle Universal Installer clean END


## [START] Oracle install clean ##

Clean install operation removing temporary directory ‘/tmp/deinstall2016-01-01_02-30-16AM’ on node ‘localhost’

## [END] Oracle install clean ##

######################### CLEAN OPERATION END #########################

####################### CLEAN OPERATION SUMMARY #######################

Oracle Restart was already stopped and de-configured on node “localhost”

Oracle Restart is stopped and de-configured successfully.

Successfully detached Oracle home ‘/u01/app/11.2.0/grid’ from the central inventory on the local node.

Successfully deleted directory ‘/u01/app/11.2.0/grid’ on the local node.

Successfully deleted directory ‘/u01/app/oraInventory’ on the local node.

Successfully deleted directory ‘/u01/app/oracle’ on the local node.

Oracle Universal Installer cleanup was successful.


Run ‘rm -rf /etc/oraInst.loc’ as root on node(s) ‘localhost’ at the end of the session.

Run ‘rm -rf /opt/ORCLfmap’ as root on node(s) ‘localhost’ at the end of the session.

Run ‘rm -rf /etc/oratab’ as root on node(s) ‘localhost’ at the end of the session.

Oracle deinstall tool successfully cleaned up temporary directories.

#######################################################################

############# ORACLE DEINSTALL & DECONFIG TOOL END #############


2. Oracle Support 홈페이지 (metalink)에서 패치 18370031 를 받는다.


3. Grid를 재설치 하고 root.sh 실행 바로전에 OPatch 18370031을 패치 한다.


 $ opatch napply -local ./18370031


4. 패치가 끝나면 root.sh 실행

DBMS 기본 데이터 타입

● 문자 데이터 타입


데이터 타입 

설명 

 CHAR(크기[BYTE|CHAR])

 고정길이 문자, 최대 2000byte, 디폴트 값 1byte 

 VARCHAR2(크기[BYTE|CHAR])

 고정길이 문자, 최대 4000byte, 디폴트 값 1byte 

 NCHAR (크기)

 고정길이 유니코드 문자 (다국어 입력 가능), 최대 2000BYTE, 디폴트 값 1byte

 NVARCHAR2 (크기)

 고정길이 유니코드 문자 (다국어 입력 가능), 최대 4000BYTE, 디폴트 값 1byte

 LONG

 최대 2GB 크기의 가변길이 문자형, 잘 사용하지 않음



● 숫자 데이터 타입


 데이터 타입 

 설명 

 NUMBER[(p,[s])]

 가변숫자, p(1~38, 디폴트 38) s(-84~127, 디폴트 0) 십진수 기준, 최대 22byte

 FLOAT[(p)]

 NUMBER의 하위 타입, p는 1~128, 디폴트 128, 이진수 기준, 최대 22byte

 BINARY_FLOAT

 32비트 부동소수점 수, 최대 4byte 

 BINARY_DOUBLE

 64비트 부동소수점 수, 최대 8byte 


- 4가지가 있지만 주로 NUMBER를 많이 사용합니다. 다른 DBMS는 INTEGER와 같은 정수형, DECIMAL과 같은 실수형을 제공합니다. 오라클도 INTEGER과 DECIMAL로 생성이 가능 하지만, 내부적으로는 NUMBER 형으로 변환되어 생성됩니다.



● 날짜 데이터 타입


데이터 타입 

 설명 

 DATE

 BC 4712년 1월 1일부터 9999년 12월 31일, 

 연,월,일,시,분,초까지 입력가능

 TIMESTAMP[(fractional_seconds_precision)]

 연도, 월, 일, 시, 분, 초는 물론 밀리초 까지 입력 가능

 fractional_seconds_precision은 0~9까지 입력할 수 있고 디폴트는 6



● LOB 데이터 타입 (Large OBject의 약자)


데이터 타입

 설명 

 CLOB

 문자형 대용량 객체. 고정길이와 가변길이 문자 집합 지원, 

 최대크기 (4GB-1)x(데이터베이스 블록 사이즈)

 NCLOB

 유니코드(다국어 지원)를 포함한 문자형 대용량 객체. 

 최대크기 (4GB-1)x(데이터베이스 블록 사이즈)

 BLOB

 이진형 대용량 객체, 최대 크기 (4GB-1)x(데이터베이스 블록 사이즈)

 BFILE

 대용량 이진 파일에 대한 로케이터(위치, 이름)저장. 최대 저장 크기는 4GB



● NULL


 - NULL은 '값이 없음'을 의미하면 테이블을 생성할 때 컬럼 속성에 기술한다. 디폴트 값이 NULL이므로 별도 지정 없으면 해당 컬럼은 NULL을 허용한다. NOT NULL로 명시한 컬럼에 데이터를 넣지 않으면 해당 로우 INSERT가 불가능하다.



'ORACLE > Oracle DBMS' 카테고리의 다른 글

DBMS 기본 데이터 타입  (0) 2018.11.02
데이터베이스 객체의 종류  (0) 2018.11.02
SCN과 Checkpoint  (0) 2014.06.12
Redo Log  (0) 2014.06.12
Control File  (0) 2014.06.11
Oracle Character set 에 관하여  (0) 2014.06.10

데이터베이스 객체의 종류

●  데이터베이스 객체의 종류


 데이터베이스 객체

 설명

 TABLE

 데이터를 담고 있는 객체 

 VIEW

 하나 이상의 테이블을 연결해서 마치 테이블인 것처럼 사용하는 객체 

 INDEX

 테이블에 있는 데이터를 빠르게 찾기 위한 객체 

 SYNONYM

 데이터베이스 객체에 대한 별칭을 부여한 객체 

 SEQUENCE

 일련번호 채번을 할 때 사용하는 객체

 FUNCTION

 특정 연산을 하고 값을 반환하는 객체

 PROCEDURE

 함수와 비슷하지만 값을 반환하지는 않는 객체 

 PACKAGE

 용도에 맞게 함수나 프로시저를 하나로 묶어놓은 객체



●  TABLE


- 데이터를 넣고 수정하고 삭제하는, 데이터를 담고 있는 가장 기본적인 객체. ROW (행)과 COLUMN (열)으로 구성된 2차원 형태(표)의 객체로 우리가 자주쓰는 엑셀과 비슷한 구조라고 보면 이해가 쉽습니다.


- TABLE 생성은 CREATE문으로 생성할 수 있는데, 기본 구문은 아래와 같습니다.


CREATE TABLE [스키마.]테이블명 (

컬럼1    컬럼1_데이터타입    [NULL, NOT NULL],

컬럼2    컬럼2_데이터타입    [NULL, NOT NULL],

...

) [TABLESPACE 테이블스페이스명];


스키마명은 생략이 가능하며, 생략하게되면 현재 자신이 로그인한 스키마 이름으로 생성됩니다.

TABLESPACE 구문도 생략이 가능한데, 해당 사용자의 디폴트 TABLESPACE에 생성됩니다.

'ORACLE > Oracle DBMS' 카테고리의 다른 글

DBMS 기본 데이터 타입  (0) 2018.11.02
데이터베이스 객체의 종류  (0) 2018.11.02
SCN과 Checkpoint  (0) 2014.06.12
Redo Log  (0) 2014.06.12
Control File  (0) 2014.06.11
Oracle Character set 에 관하여  (0) 2014.06.10

Table 또는 인덱스의 사이즈를 확인 하는 쿼리

개별 단위로 테이블 사이즈가 알고 싶을때 조회 하는 쿼리


select owner,segment_name,segment_type,sum(bytes)/1024/1024 as MB

from dba_segments

where OWNER='APP_USER'

GROUP BY owner,segment_name,segment_type;

'ORACLE > Operation & Admin' 카테고리의 다른 글

RAC용 점검 스크립트  (0) 2018.12.25
무료 오라클 성능진단 툴 Mumbai 3.1.1  (0) 2018.12.25
Table 또는 인덱스의 사이즈를 확인 하는 쿼리  (0) 2018.11.01
CURSOR_SHARING  (0) 2018.10.31
ASM 용량 확인  (0) 2018.10.28
Datafile Resize 계산하기  (0) 2018.10.18

CURSOR_SHARING

CURSOR_SHARING


어플리케이션이 리터럴SQL을 사용해서 만들어졌거나 패키지 어플리케이션이 바인드 변수를 사용하지 않는 경우, 이런 상황에서 성은이 나빠진다면 CURSOR_SHARING 파라미터를 이용해서 어플리케이션을 크게 변경하지 않고 튜닝하는 것이 가능합니다.


CURSOR_SHARING 파라미터는 EXACT, FORCE, SIMILAR 라는 값을 가지고 있고, FORCE 또는 SIMILAR로 설정한 경우, 사용자가 리터럴 SQL을 수행하여도 오라클이 리터럴값을 바인드 변수로 치환합니다.


실제 수행구문

SQL> select count(col1) from test where col2 = 10;


오라클이 Parse 한 SQL문

SQL> select count(col1) from test where col2 = :"SYS_B_0" ;


● FORCE 

 - 리터럴 값에 상관없이 한 개의 공유 커서를 공유합니다. 바인드 피크와 같이 특이한 값에 최적화될 위험이 있습니다.

 - Shared Pool 사용량을 줄이는 효과 및 경합을 줄이는 효과가 큽니다.


● SIMILAR

 - 실행 계획이 확실히 같을 때에만 한 개의 공유 커서를 공유합니다. 최적의 실행 계획이 같지 않을 가능성이 있는 경우에는 동일 문장에 여러 개의 공유 커서를 만듭니다.

 - 옵티마이저 통계를 수집한 경우 범위 조건을 지정하거나, 히스토그램을 수집했을때의 '=' 조건 등은 리터럴값에 따라 최적인 실행 계획이 달라질수 있으므로 다른 리터럴 값마다 자식 커서를 생성합니다.

 - 옵티마이저 통계가 없고 다이나믹 샘플링도 꺼져있다면, 내부 기본값에 의해 실행 계획이 결정되므로 같은 공유 커서를 사용합니다. 컬럼 통계가 최소값과 최대값만 있을 경우 (히스토그램 없음), '=' 조건은 선택도가 항상 1/NDV가 되기 때문에 같은 공유 커서를 사용합니다.


'CURSOR_SHARING=SIMILAR'일 때는 경우에 따라 Shared Pool 사용량을 줄이는 효과가 거의 없으며 경합도 줄이지 못하는 경우가 있습니다. SIMILAR를 사용할 때는 테스트를 하고 V$SQLAREA.VERSION_COUNT를 조사하여 값이 적은지에 대한 여부 (커서의 공유되고 있는지)를 확인해야 합니다.


SQL> select sql_text, version_count from v$sqlarea

   2  where sql_text like 'select /* TEST%';


SQL_TEST                                                VERSION_COUNT

------------------------------------------------------- -------------

select count(col1) from test where col2 = :"SYS_B_0" ;              5  


VERSION_COUNT = 5 는  같은 SQL문의 자식 커서가 5개 있다는 뜻

'ORACLE > Operation & Admin' 카테고리의 다른 글

무료 오라클 성능진단 툴 Mumbai 3.1.1  (0) 2018.12.25
Table 또는 인덱스의 사이즈를 확인 하는 쿼리  (0) 2018.11.01
CURSOR_SHARING  (0) 2018.10.31
ASM 용량 확인  (0) 2018.10.28
Datafile Resize 계산하기  (0) 2018.10.18
Listener password  (0) 2018.10.14

ASM 용량 확인

오라클 ASM DG 용량 확인


col name format a10

col USABLE_FILE_GB format 999,999.00

col TOTAL_GB       format 999,999.00

col FREE_GB        format 999,999.00

col USABLE_CALC_GB format 999,999.00


select group_number "Group#",

       name,

       total_mb/1024 TOTAL_GB,

   round((total_mb - USABLE_FILE_MB)/1024,2) USED_GB,

       USABLE_FILE_MB/1024 USABLE_FILE_GB,    

   free_mb/1024 FREE_GB,

       100-round(free_mb/total_mb*100) "usgae(%)",

        ((FREE_MB - REQUIRED_MIRROR_FREE_MB))/1024 USABLE_CALC_GB,

       type, state

from v$asm_diskgroup;


실제 사용하는 ASM의 용량을 확인 할 수 있습니다.


Free 와 Usable의 차이는 

Exadata의 경우, 남은 디스크 용량이 있으나 오라클 측에서 판매시 용량 제한을 위해 걸어둔 락이 있을시 사용 할 수 있는 공간의 이 FREE와 USABLE_FILE_DB 컬럼의 차이로 나타납니다.



    Group# NAME TOTAL_GB    USED_GB USABLE_FILE_GB FREE_GB   usgae(%) USABLE_CALC_GB TYPE STATE

---------- ---------- ----------- ---------- -------------- ----------- ---------- -------------- ------ -----------

1 DATA    119.99      37.87       82.12   82.12 32     82.12 EXTERN CONNECTED

2 RECO     60.00 1.34       58.65   58.65 2     58.65 EXTERN CONNECTED



일반적인 RAC ASM의 경우 DG를 RECO나 DATA만을 설정하기도 하고, DATA에 모두 넣는 경우도 있습니다.

OCR_VOTE 부분만 따로 빼서 설정하는 경우도 있습니다.



ASM을 모델링 할때


OCR, DATA, RECO, ACFS, FRA 등을 구성 할 수 있습니다.

FRA를 자주 활용 한다면 FRA DG를 크게 구성해서 FRA를 활용하는 방법도 있습니다.


'ORACLE > Operation & Admin' 카테고리의 다른 글

Table 또는 인덱스의 사이즈를 확인 하는 쿼리  (0) 2018.11.01
CURSOR_SHARING  (0) 2018.10.31
ASM 용량 확인  (0) 2018.10.28
Datafile Resize 계산하기  (0) 2018.10.18
Listener password  (0) 2018.10.14
CBO 와 바인드 변수, 바인드 피크  (0) 2018.05.17

Datafile Resize 계산하기

- maxshrink.sql - 


set verify off 

column file_name format a50 word_wrapped 

column smallest format 999,990 heading ""Smallest|Size|Poss."" 

column currsize format 999,990 heading ""Current|Size"" 

column savings format 999,990 heading ""Poss.|Savings"" 

break on report 

compute sum of savings on report 


column value new_val blksize 

select value from v$parameter where name = 'db_block_size' 


select file_name, 

ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) smallest, 

ceil( blocks*&&blksize/1024/1024) currsize, 

ceil( blocks*&&blksize/1024/1024) - 

ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) savings 

from dba_data_files a, 

( select file_id, max(block_id+blocks-1) hwm 

from dba_extents 

group by file_id ) b 

where a.file_id = b.file_id(+) 


column cmd format a75 word_wrapped 


select 'alter database datafile '''||file_name||''' resize ' || 

ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) || 'm;' cmd 

from dba_data_files a, 

( select file_id, max(block_id+blocks-1) hwm 

from dba_extents 

group by file_id ) b 

where a.file_id = b.file_id(+) 

and ceil( blocks*&&blksize/1024/1024) - 

ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) > 0 



테이블 스페이스에 공간이 부족해서 여유공간을 확보하려고 테이블에 데이터를 지우고 축소를 하려면?


해당 Tablespace가 automatic segment management 가 되어있어야 하고


해당 Table은 row movement가 enable 되어있어야 합니다


되어있다면 


SQL> alter table [table_name] shrink space;


SQL> alter table [table_name] shrink space cascade;


Shrink 작업으로 HWM를 당긴 다음에 Resize 작업을 진행해야 합니다.


Shrink는 온라인 상태에서 가능하나 시간이 오래 걸리고,


HWM 당길 테이블들을 기존에 담고 있는 Tablespace로 Move 명령을 하면 Reorg 작업이 가능합니다.


단, Tablespace를 offline 상태에서 해야합니다.

'ORACLE > Operation & Admin' 카테고리의 다른 글

CURSOR_SHARING  (0) 2018.10.31
ASM 용량 확인  (0) 2018.10.28
Datafile Resize 계산하기  (0) 2018.10.18
Listener password  (0) 2018.10.14
CBO 와 바인드 변수, 바인드 피크  (0) 2018.05.17
Oracle 8i Startup, shutdown  (0) 2018.04.09

RMAN 으로 Raw device 백업 복구하기

테스트 1 : Raw device 상태의 데이터파일을 RMAN 의 backupset 으로 백업 받은 후 정상적으로 복구 되는지 확인


Step 1. 현재상태 확인


[oracle@localhost ~]$ sqlplus / as sysdba


SQL*Plus: Release 10.2.0.5.0 - Production on Wed Feb 1 11:05:19 2012

Copyright (c) 1982, 2010, Oracle. All Rights Reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options


SQL> !vi dd.sql


set line 200

col tablespace_name for a10

col file_name for a45

select tablespace_name,bytes/1024/1024 MB,file_name from dba_data_files

/

:wq!


SQL> @dd <- Data file 상태 확인


TABLESPACE MB FILE_NAME

------------------- ---------- ---------------------------------------------

USERS 5 /dev/raw/raw4

SYSAUX 250 /dev/raw/raw2

UNDOTBS1 30 /dev/raw/raw3

SYSTEM 440 /dev/raw/raw1

EXAMPLE 100 /dev/raw/raw5


SQL> !vi log.sql <- Redo log file 상태 확인


set line 200

col group# for 999

col member for a20

col mb for 999

col seq# for 999

col archived for a4

col status for a8

select a.group#,a.member,b.bytes/1024/1024 MB,b.sequence# "SEQ#" ,b.archived,b.status

from v$logfile a, v$log b

where a.group#=b.group#

order by 1,2

/

:wq!


SQL> @log


GROUP# MEMBER MB SEQ# ARCH STATUS

---------- -------------------- ------ ------- ---------- -----------

1 /dev/raw/raw10 50 4 NO CURRENT

1 /dev/raw/raw9 50 4 NO CURRENT

2 /dev/raw/raw11 50 2 YES INACTIVE

2 /dev/raw/raw12 50 2 YES INACTIVE

3 /dev/raw/raw13 50 3 YES INACTIVE

3 /dev/raw/raw14 50 3 YES INACTIVE

6 rows selected.


SQL> select name from v$controlfile;


NAME

---------------------------------

/dev/raw/raw6

/dev/raw/raw7

/dev/raw/raw8


SQL> archive log list;

Database log mode Archive Mode

Automatic archival Enabled

Archive destination /data/arc2

Oldest online log sequence 2

Next log sequence to archive 4

Current log sequence 4


Step 2. RMAN 을 사용하여 전체 백업(백업경로는 /data/backup/rman/ 으로 하겠습니다)


[oracle@localhost ~]$ rman target /


Recovery Manager: Release 10.2.0.5.0 - Production on Wed Feb 1 10:47:50 2012

Copyright (c) 1982, 2007, Oracle. All rights reserved.

connected to target database: TESTDB (DBID=2557423915)


RMAN> backup as compressed backupset

2> format '/data/backup/rman/%U_%T'

3> database;

Starting backup at 01-FEB-12

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=144 devtype=DISK

channel ORA_DISK_1: starting compressed full datafile backupset

channel ORA_DISK_1: specifying datafile(s) in backupset

input datafile fno=00001 name=/dev/raw/raw1

input datafile fno=00003 name=/dev/raw/raw2

input datafile fno=00005 name=/dev/raw/raw5

input datafile fno=00002 name=/dev/raw/raw3

input datafile fno=00004 name=/dev/raw/raw4

channel ORA_DISK_1: starting piece 1 at 01-FEB-12

channel ORA_DISK_1: finished piece 1 at 01-FEB-12

piece handle=/data/backup/rman/01n27hl4_1_1_20120201 tag=TAG20120201T104907

comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:36

channel ORA_DISK_1: starting compressed full datafile backupset

channel ORA_DISK_1: specifying datafile(s) in backupset

including current control file in backupset

including current SPFILE in backupset

channel ORA_DISK_1: starting piece 1 at 01-FEB-12

channel ORA_DISK_1: finished piece 1 at 01-FEB-12

piece handle=/data/backup/rman/02n27hm8_1_1_20120201 tag=TAG20120201T104907

comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03

Finished backup at 01-FEB-12


[oracle@localhost ~]$ ls -lSh /data/backup/rman/

합계 112M

-rw-r----- 1 oracle dba 111M 2월 1 10:49 01n27hl4_1_1_20120201 <- 전체 backupset

-rw-r----- 1 oracle dba 1.1M 2월 1 10:49 02n27hm8_1_1_20120201 <- controlfile backupset


Step 3. 테스트용 테이블 scott.gogak 테이블 생성 후 장애 발생시킴


[oracle@localhost ~]$ sqlplus scott/tiger


SQL*Plus: Release 10.2.0.5.0 - Production on Wed Feb 1 11:14:21 2012

Copyright (c) 1982, 2010, Oracle. All Rights Reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options


SQL> create table gogak (no number, name varchar2(10)) tablespace users;

Table created.


SQL> insert into gogak values (1,'AAA');

1 row created.


SQL> insert into gogak values (2,'BBB');

1 row created.


SQL> commit;

Commit complete.


SQL> select * from gogak;


NO NAME

---------- ----------

1 AAA

2 BBB


SQL> conn / as sysdba

Connected.


SQL> @dd


TABLESPACE MB FILE_NAME

---------------- ---------- ---------------------------------------------

USERS 5 /dev/raw/raw4 <- 이 파일에 장애 발생시킴

SYSAUX 250 /dev/raw/raw2

UNDOTBS1 30 /dev/raw/raw3

SYSTEM 440 /dev/raw/raw1

EXAMPLE 100 /dev/raw/raw5


SQL> !dd if=/dev/zero of=/dev/raw/raw4 bs=8k

dd: writing `/dev/raw/raw4': 장치에 남은 공간이 없음

12801+0개의 레코드를 입력하였습니다

12800+0개의 레코드를 출력하였습니다


SQL> alter tablespace users offline immediate;

Tablespace altered.


SQL> alter tablespace users online;

alter tablespace users online

*

ERROR at line 1:

ORA-01122: database file 4 failed verification check

ORA-01110: data file 4: '/dev/raw/raw4'

ORA-01210: data file header is media corrupt


SQL> select * from scott.gogak;

select * from scott.gogak

*

ERROR at line 1:

ORA-00376: file 4 cannot be read at this time

ORA-01110: data file 4: '/dev/raw/raw4'


Step 4. RMAN 으로 해당 장애 복구하기


[oracle@localhost ~]$ rman target /


Recovery Manager: Release 10.2.0.5.0 - Production on Wed Feb 1 11:19:20 2012

Copyright (c) 1982, 2007, Oracle. All rights reserved.

connected to target database: TESTDB (DBID=2557423915)

RMAN> run {

2> sql "alter tablespace users offline immediate";

3> restore tablespace users;

4> recover tablespace users;

5> sql "alter tablespace users online";

6> }

sql statement: alter tablespace users offline immediate

Starting restore at 01-FEB-12

using channel ORA_DISK_1

channel ORA_DISK_1: starting datafile backupset restore

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

restoring datafile 00004 to /dev/raw/raw4

channel ORA_DISK_1: reading from backup piece /data/backup/rman/01n27hl4_1_1_20120201

channel ORA_DISK_1: restored backup piece 1

piece handle=/data/backup/rman/01n27hl4_1_1_20120201 tag=TAG20120201T104907

channel ORA_DISK_1: restore complete, elapsed time: 00:00:02

Finished restore at 01-FEB-12

Starting recover at 01-FEB-12

using channel ORA_DISK_1

starting media recovery

media recovery complete, elapsed time: 00:00:01

Finished recover at 01-FEB-12

sql statement: alter tablespace users online


RMAN> exit

Recovery Manager complete.


[oracle@localhost ~]$ sqlplus scott/tiger


SQL*Plus: Release 10.2.0.5.0 - Production on Wed Feb 1 11:21:53 2012

Copyright (c) 1982, 2010, Oracle. All Rights Reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options


SQL> select * from gogak;


NO NAME

---------- ----------

1 AAA

2 BBB


위에서 테스트 해 본 바와 같이 Raw device 도 RMAN 으로 백업 및 복구가 가능합니다.



테스트 2. Raw device 상태의 데이터 파일을 backupset 으로 증분 백업 가능한지와 복구 가능한지 테스트



Step 1. 현재 상태 확인


[oracle@localhost ~]$ sqlplus / as sysdba


SQL*Plus: Release 10.2.0.5.0 - Production on Wed Feb 1 11:24:25 2012

Copyright (c) 1982, 2010, Oracle. All Rights Reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options


SQL> @dd


TABLESPACE MB FILE_NAME

----------------- ---------- ---------------------------------------------

USERS 5 /dev/raw/raw4

SYSAUX 250 /dev/raw/raw2

UNDOTBS1 30 /dev/raw/raw3

SYSTEM 440 /dev/raw/raw1

EXAMPLE 100 /dev/raw/raw5


SQL> @log


GROUP# MEMBER MB SEQ# ARCH STATUS

----------- ---------------------- ------- --------- ---------- -------------

1 /dev/raw/raw10 50 4 NO CURRENT

1 /dev/raw/raw9 50 4 NO CURRENT

2 /dev/raw/raw11 50 2 YES INACTIVE

2 /dev/raw/raw12 50 2 YES INACTIVE

3 /dev/raw/raw13 50 3 YES INACTIVE

3 /dev/raw/raw14 50 3 YES INACTIVE


SQL> select name from v$controlfile;


NAME

----------------------------------------

/dev/raw/raw6

/dev/raw/raw7

/dev/raw/raw8

6 rows selected.



Step 2. RMAN 을 사용하여 증분 백업을 여러 차례 수행합니다.


[oracle@localhost ~]$ rman target /


Recovery Manager: Release 10.2.0.5.0 - Production on Wed Feb 1 11:28:05 2012

Copyright (c) 1982, 2007, Oracle. All rights reserved.

connected to target database: TESTDB (DBID=2557423915)


RMAN> backup as compressed backupset

2> incremental level 0

3> format '/data/backup/rman/%U_%T'

4> database;

Starting backup at 01-FEB-12

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=145 devtype=DISK

channel ORA_DISK_1: starting compressed full datafile backupset

channel ORA_DISK_1: specifying datafile(s) in backupset

input datafile fno=00001 name=/dev/raw/raw1

input datafile fno=00003 name=/dev/raw/raw2

input datafile fno=00005 name=/dev/raw/raw5

input datafile fno=00002 name=/dev/raw/raw3

input datafile fno=00004 name=/dev/raw/raw4

channel ORA_DISK_1: starting piece 1 at 01-FEB-12

channel ORA_DISK_1: finished piece 1 at 01-FEB-12

piece handle=/data/backup/rman/03n27jur_1_1_20120201 tag=TAG20120201T112827

comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:35

channel ORA_DISK_1: starting compressed full datafile backupset

channel ORA_DISK_1: specifying datafile(s) in backupset

including current control file in backupset

including current SPFILE in backupset

channel ORA_DISK_1: starting piece 1 at 01-FEB-12

channel ORA_DISK_1: finished piece 1 at 01-FEB-12

piece handle=/data/backup/rman/04n27jvu_1_1_20120201 tag=TAG20120201T112827

comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03

Finished backup at 01-FEB-12

-- 다른 터미널에서 데이터 변경을 위해 테이블 생성하고 데이터 입력합니다.


SQL> create table scott.gogak2 (no number,name varchar2(10)) tablespace users;

Table created.


SQL> insert into scott.gogak2 values (1,'CCC');

1 row created.


SQL> insert into scott.gogak2 values (2,'DDD');

1 row created.


SQL> commit;

Commit complete.


-- RMAN 터미널에서 증분 백업을 수행합니다.

RMAN> backup as compressed backupset

2> incremental level 2

3> format '/data/backup/rman/%U_%T'

4> tablespace users;

Starting backup at 01-FEB-12

using channel ORA_DISK_1

channel ORA_DISK_1: starting compressed incremental level 2 datafile backupset

channel ORA_DISK_1: specifying datafile(s) in backupset

input datafile fno=00004 name=/dev/raw/raw4

channel ORA_DISK_1: starting piece 1 at 01-FEB-12

channel ORA_DISK_1: finished piece 1 at 01-FEB-12

piece handle=/data/backup/rman/05n27knu_1_1_20120201 tag=TAG20120201T114150

comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01

Finished backup at 01-FEB-12



Step 3. 장애를 발생 시킵니다


SQL> @dd


TABLESPACE MB FILE_NAME

---------------- ------- ---------------------------------------------

USERS 5 /dev/raw/raw4

SYSAUX 250 /dev/raw/raw2

UNDOTBS1 30 /dev/raw/raw3

SYSTEM 440 /dev/raw/raw1

EXAMPLE 100 /dev/raw/raw5


SQL> !dd if=/dev/zero of=/dev/raw/raw4 bs=8k <- 장애를 발생시킵니다

dd: writing `/dev/raw/raw4': 장치에 남은 공간이 없음

12801+0개의 레코드를 입력하였습니다

12800+0개의 레코드를 출력하였습니다


SQL> alter tablespace users offline immediate;

Tablespace altered.


SQL> alter tablespace users online;

alter tablespace users online

*

ERROR at line 1:

ORA-01122: database file 4 failed verification check

ORA-01110: data file 4: '/dev/raw/raw4'

ORA-01210: data file header is media corrupt


SQL> select * from scott.gogak2;

select * from scott.gogak2

*

ERROR at line 1:

ORA-00376: file 4 cannot be read at this time

ORA-01110: data file 4: '/dev/raw/raw4'



Step 4. RMAN 으로 복구 후 확인합니다.


RMAN> run {

2> restore tablespace users;

3> recover tablespace users;

4> sql "alter tablespace users online" ;

5> }

Starting restore at 01-FEB-12

using channel ORA_DISK_1

channel ORA_DISK_1: starting datafile backupset restore

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

restoring datafile 00004 to /dev/raw/raw4

channel ORA_DISK_1: reading from backup piece /data/backup/rman/05n27knu_1_1_20120201

channel ORA_DISK_1: restored backup piece 1

piece handle=/data/backup/rman/05n27knu_1_1_20120201 tag=TAG20120201T114150

channel ORA_DISK_1: restore complete, elapsed time: 00:00:01

Finished restore at 01-FEB-12

Starting recover at 01-FEB-12

using channel ORA_DISK_1

starting media recovery

media recovery complete, elapsed time: 00:00:01

Finished recover at 01-FEB-12

sql statement: alter tablespace users online


SQL> select * from scott.gogak2;


NO NAME

---------- ----------

1 CCC

2 DDD



테스트 3. RMAN 으로 Raw device 상태의 데이터 파일을 Raw device 형태로 백업 받은 후 복구 가능한지 테스트



Step 1. 현재 상태 확인


RMAN> report schema;

Report of database schema

List of Permanent Datafiles

===========================

File Size(MB) Tablespace RB segs Datafile Name

---- -------- -------------------- ------- ------------------------

1 440 SYSTEM *** /dev/raw/raw1

2 30 UNDOTBS1 *** /dev/raw/raw3

3 250 SYSAUX *** /dev/raw/raw2

4 5 USERS *** /dev/raw/raw4

5 100 EXAMPLE *** /dev/raw/raw5

List of Temporary Files

=======================

File Size(MB) Tablespace Maxsize(MB) Tempfile Name

---- -------- -------------------- ----------- --------------------

1 20 TEMP 100 /dev/raw/raw15


Step 2. RMAN 으로 Raw device 파일 백업 수행


RMAN> copy

2> datafile 1 to '/data/backup/rman/system' ,

3> datafile 2 to '/data/backup/rman/undotbs1' ,

4> datafile 3 to '/data/backup/rman/sysaux' ,

5> datafile 4 to '/data/backup/rman/users' ,

6> datafile 5 to '/data/backup/rman/example' ;

Starting backup at 01-FEB-12

using channel ORA_DISK_1

channel ORA_DISK_1: starting datafile copy

input datafile fno=00001 name=/dev/raw/raw1

output filename=/data/backup/rman/system tag=TAG20120201T115814 recid=9

stamp=774100724

channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:35

channel ORA_DISK_1: starting datafile copy

input datafile fno=00003 name=/dev/raw/raw2

output filename=/data/backup/rman/sysaux tag=TAG20120201T115814 recid=10

stamp=774100744

channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:16

channel ORA_DISK_1: starting datafile copy

input datafile fno=00005 name=/dev/raw/raw5

output filename=/data/backup/rman/example tag=TAG20120201T115814 recid=11

stamp=774100749

channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:07

channel ORA_DISK_1: starting datafile copy

input datafile fno=00002 name=/dev/raw/raw3

output filename=/data/backup/rman/undotbs1 tag=TAG20120201T115814 recid=12

stamp=774100754

channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:03

channel ORA_DISK_1: starting datafile copy

input datafile fno=00004 name=/dev/raw/raw4

output filename=/data/backup/rman/users tag=TAG20120201T115814 recid=13

stamp=774100756

channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01

Finished backup at 01-FEB-12

-- 다른 창에서 백업 파일을 확인합니다


[oracle@localhost rman]$ pwd

/data/backup/rman


[oracle@localhost rman]$ ls –lSh

-rw-r----- 1 oracle dba 441M 2?? 1 11:58 system

-rw-r----- 1 oracle dba 251M 2?? 1 11:59 sysaux

-rw-r----- 1 oracle dba 101M 2?? 1 11:59 example

-rw-r----- 1 oracle dba 31M 2?? 1 11:59 undotbs1

-rw-r----- 1 oracle dba 5.1M 2?? 1 11:59 users


Step 3. 테스트용 테이블 scott.gogak3 을 생성 후 장애를 발생시킵니다.


SQL> create table scott.gogak3 (no number, name varchar2(10))

2 tablespace users;

Table created.


SQL> insert into scott.gogak3 values (1,'EEE');

1 row created.


SQL> insert into scott.gogak3 values (2,'FFF');

1 row created.


SQL> commit;

Commit complete.


SQL> select * from scott.gogak3;


NO NAME

---------- ----------

1 EEE

2 FFF


SQL> @dd


TABLESPACE MB FILE_NAME

---------------- -------- ---------------------------------------------

USERS 5 /dev/raw/raw4

SYSAUX 250 /dev/raw/raw2

UNDOTBS1 30 /dev/raw/raw3

SYSTEM 440 /dev/raw/raw1

EXAMPLE 100 /dev/raw/raw5

SQL> !dd if=/dev/zero of=/dev/raw/raw4 bs=8k

dd: writing `/dev/raw/raw4': 장치에 남은 공간이 없음

12801+0개의 레코드를 입력하였습니다

12800+0개의 레코드를 출력하였습니다


SQL> alter tablespace users offline immediate;

Tablespace altered.


SQL> alter tablespace users online;

alter tablespace users online

*

ERROR at line 1:

ORA-01122: database file 4 failed verification check

ORA-01110: data file 4: '/dev/raw/raw4'

ORA-01210: data file header is media corrupt


SQL> select * from scott.gogak3;

select * from scott.gogak3

*

ERROR at line 1:

ORA-00376: file 4 cannot be read at this time

ORA-01110: data file 4: '/dev/raw/raw4'


Step 4. RMAN 으로 파일을 복원 한 후 복구합니다.


RMAN> restore tablespace users;

Starting restore at 01-FEB-12

using channel ORA_DISK_1

channel ORA_DISK_1: restoring datafile 00004

input datafile copy recid=13 stamp=774100756 filename=/data/backup/rman/users

destination for restore of datafile 00004: /dev/raw/raw4

channel ORA_DISK_1: copied datafile copy of datafile 00004

output filename=/dev/raw/raw4 recid=14 stamp=774101682

Finished restore at 01-FEB-12

위에서 진하게 표시된 부분을 보면 RMAN 에서 자동으로 copy 된 raw device 를 찾아서

복원하는 것을 알 수 있습니다.


RMAN> recover tablespace users;

Starting recover at 01-FEB-12

using channel ORA_DISK_1

starting media recovery

media recovery complete, elapsed time: 00:00:00

Finished recover at 01-FEB-12


-- sqlplus 창에서 데이터가 복구되었는지 확인합니다.


SQL> alter tablespace users online;

Tablespace altered.


SQL> select * from scott.gogak3;

NO NAME

---------- ----------

1 EEE

2 FFF


정상적으로 복구가 된 것을 알 수 있습니다.

위에서 살펴본 바와 같이 Raw Device 로 구성된 database 도 RMAN 으로 동일하게 관리할 수 있습니다.

Listener password

Listener password 생성


1. 배경


해커들이 가장 즐겨 사용하는 트릭 중 하나가 대량의 텍스트를 리스너로 전달하여 실행을 강제 종료하도록 유도하는 것입니다. 

이 경우 데이터베이스는 여전히 실행 중이지만 리스너가 다운되기 때문에 새로운 연결을 생성할 수 없게 되므로, “서비스 거부(denial of service)” 공격이 가능합니다. 


해커는 이를 위해 리스너의 속성 변경을 시도할 수 있습니다. 이를 위해 services 커맨드를 이용하여 리스너에 의해 처리되는 서비스의 목록을 조회하는 방법이 자주 사용됩니다. 

아래 실행 예에서 볼 수 있는 것처럼 해커에게 필요한 충분한 수준의 정보가 제공되고 있음을 확인할 수 있습니다. 



LSNRCTL> set displaymode verbose

LSNRCTL> services

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)

(HOST=prolin1.proligence.com)(PORT=1521)(IP=FIRST)))

Services Summary...

Service "PROPRD" has 1 instance(s).

  Instance "PROPRD1", status READY, has 1 handler(s) for this

service...

    Handler(s):

      "DEDICATED" established:0 refused:0 state:ready

         LOCAL SERVER

(ADDRESS=(PROTOCOL=BEQ)(PROGRAM=/u01/oracle/products/10.1/db1/bin/ora

cle)(ARGV0=oraclePROPRD11)(ARGS='(LOCAL=NO)')(ENVS='_=/u01/oracle/pro

ducts/10.1/db1/bin/racgmain,_USR_ORA_CONNECT_STR=/ as

sysdba,_CAA_CHECK_INTERVAL=600,SHLIB_PATH=/u01/oracle/products/10.1/d

b1/lib32:/u01/oracrs/10gr1crs/lib32:/opt/nmapi/nmapi2/lib/hpux32:,_CA

A_ACTIVE_PLACEMENT=0,PATH=,_USR_ORA_ALERT_NAME=,_USR_ORA_IF=,_CAA_OPT

IONAL_RESOURCES=,_USR_ORA_START_TIMEOUT=0,ORACLE_BASE=/u01/oracle/pro

ducts/10.1/db2,_USR_ORA_DISCONNECT=false,_CAA_SCRIPT_TIMEOUT=600,_CAA

_UPTIME_THRESHOLD=7d,_USR_ORA_STOP_TIMEOUT=0,_CAA_FAILOVER_DELAY=0,_U

SR_ORA_PRECONNECT=none,_USR_ORA_FLAGS=,_CAA_TYPE=application,_USR_ORA

_INST_NOT_SHUTDOWN=,_CAA_REASON=boot,INIT_STATE=3,_USR_ORA_OPEN_MODE=

,_CAA_STATE=:OFFLINE,,_CAA_RESTART_ATTEMPTS=5,_CAA_ACTION_SCRIPT=/u01

/oracle/products/10.1/db1/bin/racgwrap,_CAA_DESCRIPTION=CRS

application for

Instance,_CAA_HOSTING_MEMBERS=prolin1,ORA_RACG_EXEC_ENV=LD_LIBRARY_PA

TH=/u01/oracle/products/10.1/db1/lib:/u01/oracrs/10gr1crs/lib:/opt/nm

api/nmapi2/lib/hpux64:/usr/lib:,_CAA_CLIENT_LOCALE=,_CAA_NAME=ora.PRO

PRD1.PROPRD11.inst,ORA_CRS_HOME=/u01/oracrs/10gr1crs,_CAA_AUTO_START=

1,_CAA_TARGET=:ONLINE,,_USR_ORA_PFILE=,_USR_ORA_OPI=false,_USR_ORA_CH

ECK_TIMEOUT=0,_CAA_PLACEMENT=restricted,_USR_ORA_LANG=,LD_LIBRARY_PAT

H=/u01/oracle/products/10.1/db1/lib:/u01/oracrs/10gr1crs/lib:/opt/nma

pi/nmapi2/lib/hpux64:/usr/lib:,_CAA_REQUIRED_RESOURCES=ora.prolin1.vi

p,_CAA_FAILURE_THRESHOLD=0,ORACLE_HOME=/u01/oracle/products/10.1/db1,

_USR_ORA_SRV=,PWD=/u01/oracrs/10gr1crs/bin,_USR_ORA_VIP=,_USR_ORA_STO

P_MODE=immediate,_CAA_FAILURE_INTERVAL=0,_USR_ORA_NETMASK=,_USR_ORA_D

EBUG=0,ORACLE_SID=PROPRD1,ORA_NET2_DESC=9,12,ORACLE_SPAWNED_PROCESS=1

')(ENV_POLICY=NONE))


또 다른 해킹 유형으로 리스너를 셧다운하는 방법이 있습니다. 새로운 연결은 거부되며, 따라서 실질적인 서비스 거부 공격이 가능합니다. 또는 다른 서버에 먼저 침입한 후 리스너의 원격 관리 기능을 이용하여 리스너를 원격에서 종료하는 방법이 가능합니다. 



2. 전략


최선의 대안은 tnslsnr, lsnrctl 실행 파일의 소유자를 제외한 모든 권한을 제거하는 것입니다. 이러한 방법으로 오라클 소프트웨어의 소유자를 제외한 어느 누구도 리스너를 시작 또는 종료할 수 없도록 통제할 수 있습니다. 실행 파일의 권한은 아래와 같이 설정됩니다. 


-rwx------   1 oracle    oinstall    214720 Oct 25 01:23 lsnrctl

-rwx------   1 oracle    oinstall   1118816 Oct 25 01:23 tnslsnr


경우에 따라 리스너의 시작/종료 권한을 다른 사용자에게 허용해야 할 수도 있습니다. 이러한 경우라면 아래와 같이 권한을 변경해 주어야 합니다. 


$ chmod 0711 lsnrctl



하지만 이와 같은 경우라 하더라도 패스워드 정책을 통해 불법적인 침입을 차단할 수 있어야 합니다. 패스워드를 설정하면 (HELP와 같은 무해한 명령을 제외한) 모든 커맨드가 비활성화됩니다. 


패스워드를 설정하는 방법은 버전에 관계없이 동일합니다. 하지만 그 적용 메커니즘은 버전에 따라 다릅니다:

 

Oracle9i Database Release 2 및 이전 버전에서는 모든 사용자가 패스워드를 입력해야 합니다. 

Oracle Database 10g Release 1 및 이후 버전에서는 데이터베이스 소프트웨어를 소유한 OS 사용자는 패스워드를 입력할 필요가 없습니다. 다른 모든 사용자는 패스워드를 필요로 합니다.

Oracle Database 11g Release 2부터는 Listener에 password생성하는 방법이 Deprecated되어 Single DB는 가능하지만 RAC에서는 사용할 수 없습니다.



3. Listener password 설정


 1) $ORACLE_HOME/network/admin/listener.ora 파일 상에 파라미터 추가

   LOCAL_OS_AUTHENTICATION_LISTENER = OFF

   - Oracle10g만 필요하며 9i 이전 DB는 필요없음

   

 2) lsnrctl 실행 후 작업 (이 때 리스너는 실행되고 있어야 함)


 - change_password 

   새로운 Passowrd를 설정하는 부분으로 old password 를 물어볼 때 그냥 엔터 ,

   new password 와 reenter password는 새로운 비빌번호 입력


 - set password

   새로 설정한 password확인

   

 - save_config

   새로 설정한 비밀번호 저장


3. 2번 단계가 끝나면 listener.ora 파일이 아래의 내용이 추가된다

#----ADDED BY TNSLSNR ----

PASSWORDS_LISTENER_ODSSDB01 = 75CD180DE6C75466

#--------------------------------------------



4. 설정 확인


패스워드를 입력하는 방법이 아래와 같습니다: 


LSNRCTL> set password mypassword

The command completed successfully

LSNRCTL> status

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

STATUS of the LISTENER

------------------------

Alias                     LISTENER

...


잘못된 패스워드가 입력되면 아래와 같은 에러가 뜹니다. 

TNS-01169: The listener has not recognized the password.



패스워드를 입력하지 않고 명령을 실행하면 아래와 같은 에러가 뜹니다. 

TNS-01190: The user is not authorized to execute the requested listener command



패스워드가 적용되었는지 확인하기 위해서는 아래와 같이 실행하여 리스너의 STATUS 설정을 조회합니다: 


$ lsnrctl status



출력 결과는 버전에 따라 다릅니다. Oracle9i Database 환경의 실행 결과 중 일부가 아래와 같습니다: 


STATUS of the LISTENER

------------------------

Alias                     LISTENER

Version                   TNSLSNR for Solaris: Version 9.2.0.6.0 - Production

Start Date                25-OCT-2005 10:26:47

Uptime                    0 days 13 hr. 8 min. 36 sec

Trace Level               off

Security                  ON

마지막 라인(Security ON)에서 패스워드가 설정되었음을 확인할 수 있습니다.


RAC인 경우 CRS Start시 listener를 자동으로 start되는데 이때 패스워드를 사용할 수 없으므로 수작업으로 listener를 start시켜야 합니다.

'ORACLE > Operation & Admin' 카테고리의 다른 글

ASM 용량 확인  (0) 2018.10.28
Datafile Resize 계산하기  (0) 2018.10.18
Listener password  (0) 2018.10.14
CBO 와 바인드 변수, 바인드 피크  (0) 2018.05.17
Oracle 8i Startup, shutdown  (0) 2018.04.09
ASM  (0) 2018.03.12

RAC to single RMAN 복구 (예제 - from ASM to ASM)

RAC to single RMAN 복구 (예제 - from ASM to ASM)



1. 원본 DB에서 RMAN으로 Full 백업



$ rman target /

RMAN> run {

Allocate channel c2 device type disk

format ‘경로/파일명.bkp’;

backup database plus archivelog;

}



2. 파라미터 파일 복원



원본 서버에서 RMAN 백업 파일을 가져옵니다.

복구 테스트 서버에는 엔진만 설치 되어 있습니다.


$ export ORACLE_SID=test (복구하는 db는 다른이름으로 해도 상관없습니다.)

$ rman target /

RMAN> startup nomount;  (명령을 하면 파라미터 파일 없이 구동됩니다)

RMAN> restore spfile from '백업파일이 있는 경로/파일.bkp’; 

- (RMAN 으로 백업된 파일이 여러 개 이기 때문에 이중에서 spfile이 들어있는 파일을 찾아야 하는데 명령어를 날려서 성공하는걸 찾는 수밖에 없습니다.)


 이 작업이 성공하면 $ORACLE_HOME/dbs 밑에 복구 DB의 ORACLE_SID로 설정된 명칭으로 spfile이 생성됩니다.

Sqlplus / as sysdba 접속해서

Create pfile from spfile; 명령으로 파라미터 파일을 pfile로 생성합니다.

Initnirs.ora 파일을 열고 RAC 관련된 부분을 삭제합니다.


변경전 (예제)

test2.__db_cache_size=1526726656

test1.__db_cache_size=1459617792

test2.__java_pool_size=16777216

test1.__java_pool_size=16777216

test2.__large_pool_size=33554432

test1.__large_pool_size=33554432

test1.__oracle_base='/app/oracle'#ORACLE_BASE set from environment

test2.__oracle_base='/app/oracle'#ORACLE_BASE set from environment

test2.__pga_aggregate_target=1258291200

test1.__pga_aggregate_target=1342177280

test2.__sga_target=2097152000

test1.__sga_target=2013265920

test2.__shared_io_pool_size=0

test1.__shared_io_pool_size=0

test2.__shared_pool_size=486539264

test1.__shared_pool_size=469762048

test2.__streams_pool_size=0

test1.__streams_pool_size=0

*.audit_file_dest='/app/oracle/admin/test/adump'

*.audit_trail='db'

*.cluster_database=true

*.compatible='11.2.0.4.0'

*.control_files='+DATA/test/controlfile/current.260.923661671','+RECO/test/controlfile/current.256.923661671'

*.db_block_size=8192

*.db_create_file_dest='+DATA'

*.db_domain=''

*.db_name='test'

*.db_recovery_file_dest='+RECO'

*.db_recovery_file_dest_size=7423918080

*.diagnostic_dest='/app/oracle'

*.dispatchers='(PROTOCOL=TCP) (SERVICE=testXDB)'

test1.instance_number=1

test2.instance_number=2

*.log_archive_dest_1='LOCATION=/archive'

*.log_archive_format='arch_test_%t_%s_%r.arc'

*.memory_target=3348103168

*.open_cursors=300

*.processes=350

*.remote_listener='test-cluster-scan:1521'

*.remote_login_passwordfile='exclusive'

*.sessions=390

test2.thread=2

test1.thread=1

test2.undo_tablespace='UNDOTBS2'

test1.undo_tablespace='UNDOTBS1'

*.utl_file_dir='/log/logminer'


변경 후

test.__db_cache_size=1459617792

test.__java_pool_size=16777216

test.__large_pool_size=33554432

test.__oracle_base='/app/oracle'#ORACLE_BASE set from environment

test.__pga_aggregate_target=1342177280

test.__sga_target=2013265920

test.__shared_io_pool_size=0

test.__shared_pool_size=469762048

test.__streams_pool_size=0

*.audit_file_dest='/app/oracle/admin/test/adump'

*.audit_trail='db'

*.cluster_database=false

*.compatible='11.2.0.4.0'

*.control_files='+DATA/test/controlfile/current.260.923661671'

*.db_block_size=8192

*.db_create_file_dest='+DATA'

*.db_domain=''

*.db_name='test'

*.db_recovery_file_dest='+DATA'

*.db_recovery_file_dest_size=7423918080

*.diagnostic_dest='/app/oracle'

*.dispatchers='(PROTOCOL=TCP) (SERVICE=testXDB)'

test.instance_number=1

#test2.instance_number=2

*.log_archive_dest_1='LOCATION=/archive'

*.log_archive_format='arch_test_%t_%s_%r.arc'

*.memory_target=3348103168

*.open_cursors=300

*.processes=350

#*.remote_listener='test-cluster-scan:1521'

*.remote_login_passwordfile='exclusive'

*.sessions=390

#test2.thread=2

test.thread=1

#test2.undo_tablespace='UNDOTBS2'

test.undo_tablespace='UNDOTBS1'


 * Diag 파일 경로 생성,

 * Archive log 경로 생성 or 변경, 

 * db_nique_name, service_name 변경

 * cluster parameter 변경

 * SGA,PGA TEST DB에 맞게 변경.


새로 생성한 pfile을 이용해 DB를 nomount로 open 합니다.



3. Control file 복원



$ export ORACLE_SID=test

$ rman target /

RMAN> restore controlfile from ‘백업파일이 있는 경로/파일.bkp’;

RMAN> restore controlfile from '/work/rman/0rrijm6l_1_1_20161017.bkp';


Starting restore at 23-OCT-16

using channel ORA_DISK_1


channel ORA_DISK_1: restoring control file

channel ORA_DISK_1: restore complete, elapsed time: 00:00:07

output file name=+DATA/test/controlfile/current.256.926006957

Finished restore at 23-OCT-16

성공하면 위와 같이 에러 메시지 없이 완료됩니다. (역시 어떤 백업 파일에 있는지 모르니 될떄까지 파일을 선택해 봐야 합니다.)

RMAN> alter database mount;

데이터베이스를 Mount 합니다.

RMAN> alter database mount;


database mounted

released channel: ORA_DISK_1


RMAN>



4. 패스워드 파일 복사



scp orapwtest1 ‘복구할DB’:/oracle/app/oracle/product/11.2.0.4/db_1/dbs/orapwtest



5. 데이터 파일 복구



RMAN> catalog start with '백업파일이 있는 경로';

RMAN> CONFIGURE CHANNEL 1 DEVICE TYPE DISK FORMAT '/work/rman/%U_%T.bkp';

RMAN> CONFIGURE CHANNEL 2 DEVICE TYPE DISK FORMAT '/work/rman/%U_%T.bkp';

RMAN> CONFIGURE CHANNEL 3 DEVICE TYPE DISK FORMAT '/work/rman/%U_%T.bkp';

RMAN> CONFIGURE CHANNEL 4 DEVICE TYPE DISK FORMAT '/work/rman/%U_%T.bkp';


RMAN> catalog start with '/work/rman/';


searching for all files that match the pattern /work/rman/


List of Files Unknown to the Database

=====================================

File Name: /work/rman/0rrijm6l_1_1_20161017.bkp

File Name: /work/rman/0prijlsh_1_1_20161017.bkp

File Name: /work/rman/0srijm73_1_1_20161017.bkp

File Name: /work/rman/0qrijlsp_1_1_20161017.bkp


Do you really want to catalog the above files (enter YES or NO)? yes

cataloging files...

cataloging done


List of Cataloged Files

=======================

File Name: /work/rman/0rrijm6l_1_1_20161017.bkp

File Name: /work/rman/0prijlsh_1_1_20161017.bkp

File Name: /work/rman/0srijm73_1_1_20161017.bkp

File Name: /work/rman/0qrijlsp_1_1_20161017.bkp


RMAN> restore database;      


Starting restore at 23-OCT-16

using channel ORA_DISK_1


channel ORA_DISK_1: starting datafile backup set restore

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

channel ORA_DISK_1: restoring datafile 00001 to +DATA/test/datafile/system.256.923661571

channel ORA_DISK_1: restoring datafile 00002 to +DATA/test/datafile/sysaux.257.923661571

channel ORA_DISK_1: restoring datafile 00003 to +DATA/test/datafile/undotbs1.258.923661573

channel ORA_DISK_1: restoring datafile 00004 to +DATA/test/datafile/users.259.923661573

channel ORA_DISK_1: restoring datafile 00005 to +DATA/test/datafile/example.264.923661707

channel ORA_DISK_1: restoring datafile 00006 to +DATA/test/datafile/undotbs2.265.923661973

channel ORA_DISK_1: restoring datafile 00007 to +DATA/test/datafile/test01.269.924548909

channel ORA_DISK_1: reading from backup piece /work/rman/0qrijlsp_1_1_20161017.bkp

channel ORA_DISK_1: piece handle=/work/rman/0qrijlsp_1_1_20161017.bkp tag=TAG20161017T161729

channel ORA_DISK_1: restored backup piece 1

channel ORA_DISK_1: restore complete, elapsed time: 00:18:05

Finished restore at 23-OCT-16


RMAN> recover database;


Starting recover at 23-OCT-16

using channel ORA_DISK_1


starting media recovery


channel ORA_DISK_1: starting archived log restore to default destination

channel ORA_DISK_1: restoring archived log

archived log thread=2 sequence=473

channel ORA_DISK_1: restoring archived log

archived log thread=1 sequence=239

channel ORA_DISK_1: reading from backup piece /work/rman/0srijm73_1_1_20161017.bkp

channel ORA_DISK_1: ORA-19870: error while restoring backup piece /work/rman/0srijm73_1_1_20161017.bkp

ORA-19504: failed to create file "/archive/arch_test_2_473_923661675.arc"

ORA-27040: file create error, unable to create file

Linux-x86_64 Error: 13: Permission denied

Additional information: 1


failover to previous backup

RMAN-00571: ===========================================================

RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============

RMAN-00571: ===========================================================

RMAN-03002: failure of recover command at 10/23/2016 17:28:31

RMAN-20506: no backup of archived log found

RMAN-06053: unable to perform media recovery because of missing log

RMAN-06025: no backup of archived log for thread 1 with sequence 239 and starting SCN of 4539696 found to restore

RMAN-06025: no backup of archived log for thread 2 with sequence 473 and starting SCN of 4539693 found to restore


RMAN> alter database open resetlogs;

database opened


$ sqlplus / as sysdba


SQL*Plus: Release 11.2.0.4.0 Production on Sun Oct 23 17:32:51 2016


Copyright (c) 1982, 2013, Oracle.  All rights reserved.



Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

With the Partitioning, Automatic Storage Management, OLAP, Data Mining

and Real Application Testing options


SQL> select open_mode from v$database;


OPEN_MODE

--------------------

READ WRITE


SQL>


Oracle 18c 설치 Single

오라클 18c가 릴리즈 되었는데 설치 방법이 약간 바뀌었다.


18c는 2018.08.21 기준, 리눅스와 솔라리스 버전만 릴리즈 되었다.



해당 예제는 리눅스 7버전에 설치를 진행 한다.



리눅스 7의 Oracle 설치를 위한 기본 설치 패키지



Server with GUI

Hardware Monitoring Utilities

Large Systems Performance

Network file system client

Performance Tools

Compatibility Libraries

Development Tools


# vi /etc/hosts


# yum update -y




자동 셋업


# yum install -y install oracle-database-preinstall-18c




수동 셋업


# vi /etc/sysctl.conf


fs.file-max = 6815744

kernel.sem = 250 32000 100 128

kernel.shmmni = 4096

kernel.shmall = 1073741824

kernel.shmmax = 4398046511104

kernel.panic_on_oops = 1

net.core.rmem_default = 262144

net.core.rmem_max = 4194304

net.core.wmem_default = 262144

net.core.wmem_max = 1048576

net.ipv4.conf.all.rp_filter = 2

net.ipv4.conf.default.rp_filter = 2

fs.aio-max-nr = 1048576

net.ipv4.ip_local_port_range = 9000 65500



# vi /etc/security/limits.d/oracle-database-preinstall-18c.conf


oracle   soft   nofile    1024

oracle   hard   nofile    65536

oracle   soft   nproc    16384

oracle   hard   nproc    16384

oracle   soft   stack    10240

oracle   hard   stack    32768

oracle   hard   memlock    134217728

oracle   soft   memlock    134217728



패키지 설치 목록


# OL6 and OL7 (RHEL6 and RHEL7)

yum install -y bc    

yum install -y binutils

yum install -y compat-libcap1

yum install -y compat-libstdc++-33

yum install -y compat-libstdc++-33.i686

yum install -y elfutils-libelf.i686

yum install -y elfutils-libelf

yum install -y elfutils-libelf-devel.i686

yum install -y elfutils-libelf-devel

yum install -y fontconfig-devel

yum install -y glibc.i686

yum install -y glibc

yum install -y glibc-devel.i686

yum install -y glibc-devel

yum install -y ksh

yum install -y libaio.i686

yum install -y libaio

yum install -y libaio-devel.i686

yum install -y libaio-devel

yum install -y libX11.i686

yum install -y libX11

yum install -y libXau.i686

yum install -y libXau

yum install -y libXi.i686

yum install -y libXi

yum install -y libXtst.i686

yum install -y libXtst

yum install -y libgcc.i686

yum install -y libgcc

yum install -y librdmacm-devel

yum install -y libstdc++.i686

yum install -y libstdc++

yum install -y libstdc++-devel.i686

yum install -y libstdc++-devel

yum install -y libxcb.i686

yum install -y libxcb

yum install -y make

yum install -y nfs-utils

yum install -y net-tools

yum install -y python

yum install -y python-configshell

yum install -y python-rtslib

yum install -y python-six

yum install -y smartmontools

yum install -y sysstat

yum install -y targetcli

yum install -y unixODBC



그룹 및 유저 추가


# groupadd -g 54321 oinstall

# groupadd -g 54322 dba

# groupadd -g 54323 oper


# useradd -u 54321 -g oinstall -G dba,oper oracle




추가 세팅



SELinux 설정


# vi /etc/selinux/config


SELINUX=permissive


# setenforce Permissive

※ 리눅스 7 버전은 SELinux 설정 후 재구동 필요없음.



방화벽 Off


# systemctl stop firewalld

# systemctl disable firewalld



디렉토리 생성


# mkdir -p /u01/app/oracle/product/18.0.0/dbhome_1

# mkdir -p /u02/oradata

# chown -R oracle:oinstall /u01 /u02

# chmod -R 775 /u01 /u02


* u01 - 엔진

* u02 - 데이터



프로파일 설정


기존의 방식대로 해도 되고, 

아래는 18c 부터 오라클이 제공하는 방식을 설명한다.


$ mkdir /home/oracle/scripts


$ touch /home/oracle/scripts/setEnv.sh


$ cat > /home/oracle/scripts/setEnv.sh <<EOF

# Oracle Settings

export TMP=/tmp

export TMPDIR=\$TMP


export ORACLE_HOSTNAME=ol7-183.localdomain

export ORACLE_UNQNAME=cdb1

export ORACLE_BASE=/u01/app/oracle

export ORACLE_HOME=\$ORACLE_BASE/product/18.0.0/dbhome_1

export ORA_INVENTORY=/u01/app/oraInvenotry

export ORACLE_SID=cdb1

export PDB_NAME=pdb1

export DATA_DIR=/u02/data


export PATH=/usr/sbin:/usr/local/bin:\$PATH

export PATH=\$ORACLE_HOME/bin:\$PATH


export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/lib:/usr/lib

export CLASSPATH=\$ORACLE_HOME/jlib:\$ORACLE_HOME/rdbms/jlib

EOF


$ echo ". /home/oracle/scripts/setEnv.sh" >> /home/oracle/.bash_profile



시작, 종료 스크립트 작성


$ touch /home/oracle/scripts/start_all.sh

$ touch /home/oracle/scripts/stop_all.sh


$ cat > /home/oracle/scripts/start_all.sh <<EOF

#!/bin/bash

. /home/oracle/scripts/setEnv.sh


export ORAENV_ASK=NO

. oraenv

export ORAENV_ASK=YES


dbstart \$ORACLE_HOME

EOF



$ cat > /home/oracle/scripts/stop_all.sh <<EOF

#!/bin/bash

. /home/oracle/scripts/setEnv.sh


export ORAENV_ASK=NO

. oraenv

export ORAENV_ASK=YES


dbshut \$ORACLE_HOME

EOF



$ chown -R oracle.oinstall /home/oracle/scripts

$ chmod u+x /home/oracle/scripts/*.sh


설치 완료후에 /etc/oratab에 넣어주고, 오라클 유저로 시작/종료 할 수 있다.


~/scripts/start_all.sh

~/scripts/stop_all.sh



엔진 설치


Oracle 홈페이지에서 LINUX.X64_180000_db_home.zip 파일을 받을 수 있다.


해당 파일을 반드시 /u01/app/oracle/product/18.0.0/dbhome_1 폴더로 옮겨서 압축을 푼다.


$ cd /u01/app/oracle/product/18.0.0/dbhome_1



X매니저 나 Gnome 환경에서 GUI 방식으로 설치 한다.


$ ./runInstaller




엔진 설치 완료


DBCA는 12c와 동일하다.

오라클에서 ODBC를 이용한 MySQL으로 DB LINK 설정

오라클에서 ODBC를 이용한 MySQL으로 DB LINK 설정



테스트 환경



오라클 DB 서버


Oracle Linux 6.9

Oracle 11gR2 - 11.2.0.4

ODBC Driver 8.0.11 (홈페이지에서 받아서 설치, https://dev.mysql.com/downloads/connector/odbc/)

캐릭터셋 - KO16MSWIN949

ip - 192.168.0.55



MySQL DB 서버


CentOS 7.2

MySQL 5.7 (yum 설치)

Oracle Gateway 11gR2 - 11.2.0.4

캐릭터셋 - euckr

ip - 192.168.0.44

Database - MYSQL



오라클 서버에서 설정


버전에 맞는 ODBC 드라이버를 받아서 yum으로 설치하면 /etc/odbc.ini, /etc/odbcinst.ini 파일이 보인다.


vi로 odbcinst.ini 열어보면


[MySQL ODBC 8.0 Unicode Driver]

Driver = /usr/lib64/libmyodbc8w.so

UsageCount = 1


[MySQL ODBC 8.0 ANSI Driver]

Driver = /usr/lib64/libmyodbc8a.so

UsageCount = 1


이 것이 MySQL 연결에 사용될 드라이버 인데, 주의할점은 각 DB의 캐릭터 셋에 맞춰 드라이버를 설정해줘야 한다.

UTF8를 사용할 것이라면 Unicode 드라이버를, EUCKR을 사용할 것 이라면 ANSI를 선택해야 한다.



# vi /etc/odbc.ini


[MYSQL]

Driver = /usr/lib64/libmyodbc8a.so

trace = off

port = 3306

server = 192.168.0.44

database = MYSQL

option = 2

user = DEMO

password = PASSWORD

charset = euckr



$ vi tnsnames.ora


MYSQL =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = tcp)(HOST = 192.168.0.44)(PORT = 1521))

      (CONNECT_DATA = (SID = MYSQL))

      (HS = OK)

  )



$ isql -v MYSQL 

+---------------------------------------+

| Connected!                            |

|                                       |

| sql-statement                         |

| help [tablename]                      |

| quit                                  |

|                                       |

+---------------------------------------+

SQL>


이렇게 나오면 일단 MySQL DB로 원격접속이 되는것이다.


※ 사전에 MySQL 서버의 방화벽을 내린다거나, MySQL 계정에 원격접속 가능한 권한을 줘야 한다.




MySQL 서버에서의 설정


MySQL은 기호에 맞게 설치하면 되고, 오라클 Gateway를 설치한다. 오라클 GUI 설치 할때와 같은 환경으로 맞춰서 설치한다.


# groupadd oinstall

# groupadd dba

# useradd -g oinstall -G dba oracle

# su - oracle



$ vi .bash_profile


export ODBCINI=/etc/odbc.ini

export ORACLE_HOME=/oracle/product/11.2.0/tg_1

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib:/usr/lib64:/lib

export PATH=$ORACLE_HOME/bin:$PATH


GUI에서 gateway를 설치할때 


ODBC 부분을 체크 해서 설치 해준다. (해당 스샷은 설치 후 캡처를 위해 다시 창을 띄운거라 reinstall 이라고 나옴)


Gateway 설치 후 HS 파라미터를 설정해야 한다.


$ cd $ORACLE_HOME/hs/admin



$ vi initMYSQL.ora (initXXXX.ora)    <-- [아래 HS_FDS_CONNECT_INFO = XXXX 의 XXXX 부분과 동일 하게 설정]


# This is a sample agent init file that contains the HS parameters that are

# needed for the Database Gateway for ODBC


#

# HS init parameters

#

HS_FDS_CONNECT_INFO = MYSQL      <-- [해당부분은 접속 하고자하는 MySQL DB 명 입력]

HS_FDS_SHAREABLE_NAME = /usr/lib64/libmyodbc8a.so      <-- [사용하고자 하는 ODBC 드라이버]

HS_FDS_TRACE_LEVEL = OFF                <--[접속은 되는데 결과값이 안나온다면 255 로 설정해 trace 확인]

HS_FDS_SUPPORT_STATISTICS = FALSE

HS_LANGUAGE=AMERICAN_AMERICA.KO16MSWIN949     <--[Oracle 서버쪽 DB의 캐릭터셋]

HS_RPC_FETCH_REBLOCKING = OFF

HS_KEEP_REMOTE_COLUMN_SIZE = ALL

HS_NLS_LENGTH_SEMANTICS = VARCHAR                  <-- [VARCHAR or CHAR 등으로 환경에 맞게 설정 가능]

HS_FDS_TIMESTAMP_MAPPING = DATE

HS_NLS_NCHAR=UCS2


#

# ODBC specific environment variables

#

set ODBCINI=/etc/odbc.ini


#

# Environment variables required for the non-Oracle system

#



Oracle Gateway를 이용해서 MySQL 서버에 오라클 Listener를 띄운다.

$ vi $ORACLE_HOME/network/admin/listener.ora

# listener.ora Network Configuration File: /oracle/product/11.2.0/tg_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME=MYSQL)
      (ORACLE_HOME=/oracle/product/11.2.0/tg_1)
      (PROGRAM=/oracle/product/11.2.0/tg_1/bin/dg4odbc)
      (ENVS=LD_LIBRARY_PATH = /usr/lib:/usr/lib64:/oracle/product/11.2.0/tg_1/lib:/oracle/product/11.2.0/tg_1/hs/lib)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.44)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )


ADR_BASE_LISTENER = /oracle/product/11.2.0/tg_1


$ lsnrctl start

$ lsnrctl start

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 27-JUL-2018 11:35:58

Copyright (c) 1991, 2013, Oracle.  All rights reserved.

Starting /oracle/product/11.2.0/tg_1/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 11.2.0.4.0 - Production
System parameter file is /oracle/product/11.2.0/tg_1/network/admin/listener.ora
Log messages written to /oracle/product/11.2.0/tg_1/diag/tnslsnr/MYSQL/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=1192.168.0.44)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.44)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date                27-JUL-2018 11:35:58
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /oracle/product/11.2.0/tg_1/network/admin/listener.ora
Listener Log File         /oracle/product/11.2.0/tg_1/diag/tnslsnr/MYSQL/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.44)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "MYSQL" has 1 instance(s).
  Instance "MYSQL", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully



오라클 서버에서 tnsping을 실행 했을때


$ tnsping mysql


TNS Ping Utility for Linux: Version 11.2.0.4.0 - Production on 27-JUL-2018 11:19:40


Copyright (c) 1997, 2013, Oracle.  All rights reserved.


Used parameter files:

/app/oracle/product/11.2.0.4/db_1/network/admin/sqlnet.ora



Used TNSNAMES adapter to resolve the alias

Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = tcp)(HOST = 192.168.0.44)(PORT = 1521)) (CONNECT_DATA = (SID = MYSQL)) (HS = OK))

OK (10 msec)



나오면 접속 준비가 완료




ORACLE DB의 SCOTT 계정에서 DB LINK TEST


DB LINK 생성 

※ DB Link를 생성하고자하는 계정에 create database link 권한을 주고 작업한다.


$ sqlplus scott/tiger


SQL> create database link mysql

connect to DEMO

IDENTIFIED BY "<password>"

USING 'MYSQL';



MySQL DB에 미리 만들어 놓은 DEMO 테이블을 조회 해본다.

※ 테스트용 계정과 테이블은 알아서 만드시길... DEMO 유저의 DEMO 테이블을 조회 했다.


SQL> select * from "demo"@mysql_test;


      col1 col2       col3 col4     col5

---------- ---------- ---------- ---------- --------------------

1 24-JUL-18  0123456789 0123456789 30313233343536373839

2 25-JUL-18  0123456788 0123456788 30313233343536373838



결과 값이 나오면 성공이다.




옵티마이저 기본기능

옵티마이저 기본 기능



1. RBO와 CBO의 차이



 RBO (Rule Based Optimizer) 규칙 기반 옵티마이저


 - Oracle 9i까지 사용하던 방식으로 Oracle 10g서 부터는 지원되지 않는다.


 RBO의 장점 


  1) 기능이 한정적이고 쉽기 때문에 배우기가 쉽다.

  2) 규칙을 외어버리면 튜닝이 쉽다.

  3) 오래전부터 사용된 기능이기 때문에 기존 지식을 사용 할 수 있다.

  4) 운영중에 SQL 실행계획이 거의 변하는 일이 없기 때문에 액세스 패스가 변경되어 성능이 떨어지는 장애가 발생하지 않는다.


 RBO의 단점


  1) 데이터 변동을 따라가지 못한다.

  2) SQL문 작성시 항목순서나 인덱스 만드는 순서가 중요하기 때문에 코드의 수정이나 인덱스 관리의 문제가 원인이 되어 성능       에 영향을 미치는 경우가 많다.

  3) 버전이 올라가면서 강화된 옵티마이저의 여러 기능 혜택을 받을수 없다. 



 CBO (Cost Based Optimizer) 비용 기반 옵티마이저


 - 내부적으로 통계정보를 참조하며 액세스 패스를 유연하게 최적화하는 기능.

 - CBO는 ANALYZE(통계수집)을 할 필요가 있으며, 통계를 최저한만 수집해서는 적절한 실행 계획을 얻지 못한다.



2. SQL문 처리에서 옵티마이저의 역할


 SQL문의 흐름


 - SQL문의 처리에는 소프트 파스와 하드 파스 두가지 방법이 있다.

 - 옵티마이저가 관여하는 경우와 관여하지 않는 경우로 나뉜다.


 소프트 파스


 - 실행한 SQL문은 파서에 의해 파스(Parse) 된다.

 - 파서는 SQL문을 컴포넌트 단위로 분해하여 문법적으로 틀리지 않았는지를 확인.

 - SGA에 캐시 되어 있는지를 조사. 캐시되어 있는 경우 SQL문을 즉시 실행가능


 하드 파스


 - SGA에 캐시가 없으면 SQL은 처음 실행되었거나 SGA에서 캐시 아웃된 상태. 이럴때 하드 파스 (Hard Parse)가 일어난다.

 - 하드 파스의 결과물로 옵티마이저가 '쿼리 실행 계획'을 만듬.

 - 실행 계획을 로우 소스 생성기가 받은후, 필요한 데이터 구조를 생성.

 - 로우 소스 생성기의 결과물을 이용해 SQL을 실행. 

 - DDL이나 UPDATE의 경우 실행 단계에서 작업이 완료되나, SELECT는 이후 Fetch 처리를 수행.



3. 옵티마이저가 수행하는 쿼리


 1) 옵티마이저가 가장 먼저 실행하는 처리는 쿼리의 변환(변형)

 - 작성된 SQL문을 다양한 형태로 변형한 후, 선택 가능한 실행 계획을 늘릭 위해 수행.

 2) 에스티메이터가 변환된 쿼리를 이용해 기초 비용을 예측하고 플랜 생성기가 실행 계획의 생성한 후, 다시 에스티메이터가 비용을 계산한다.

 - 계획의 비용을 예측할때에는 데이터 딕셔너리에 보관된 옵티마이저 통계를 이용.

 - 통계를 사전에 수집하지 않은 경우에는 다이내믹 샘플리을 수행하거나, 내부의 기본값이 사용되는 경우도 있음.


* 옵티마이저 통계에 포함된 정보

 

 테이블 통계

  - 건수

  - 블록 수

  - 평균 행 길이


 칼럼 통계

  - NDV(Number of distinct Value): 칼럼값의 종류 (Distinct count)

  - 칼럼 내의 NULL 수

  - 데이터 분포 (최댓값/최소값/히스토그램)

 

 인덱스 통계

  - 리프 블록 수

  - 레벨 (트리의 깊이)

  - 클러스터링 팩터


 시스템 통계

  - I/O 성능

  - CPU 성능


'ORACLE > Operation & Admin' 카테고리의 다른 글

Hint 정리  (0) 2017.12.18
CBO와 히스토그램 정리  (0) 2017.12.07
옵티마이저 기본기능  (0) 2017.11.14
RMAN 마지막 백업 확인  (0) 2017.04.05
DB의 실패한 로그인 확인하는 방법  (0) 2016.10.06
오라클 라이센스별 차이  (0) 2016.04.06

Oracle 12c R2 RAC 설치 #1

설치 환경


Esxi 5.5, 

Oracle Linux 6.9 x86_64

Oracle 12c R2 (12.2.0.1)


리눅스6 설치 옵션


SWAP 4GB+

방화벽 사용중지

SELinux 설정 변경 (permissive or disabled)

해당 패키지 그룹 설치

  • Base System > Base
  • Base System > Hardware monitoring utilities
  • Base System > Large Systems Performance
  • Base System > Network file system client
  • Base System > Performance Tools
  • Base System > Perl Support
  • Servers > Server Platform
  • Servers > System administration tools
  • Desktops > Desktop
  • Desktops > Desktop Platform
  • Desktops > Fonts
  • Desktops > General Purpose Desktop
  • Desktops > Graphical Administration Tools
  • Desktops > Input Methods
  • Desktops > X Window System
  • Applications > Internet Browser
  • Development > Additional Development
  • Development > Development Tools


자동 설정


# yum install oracle-database-server-12cR2-preinstall -y

# yum install ntp -y



직접 설정


# groupadd oinstall

# groupadd dba

# useradd -g oinstall -G dba oracle

# passwd oracle



# vi /etc/sysctl.conf


fs.file-max = 6815744

kernel.sem = 250 32000 100 128

kernel.shmmni = 4096

kernel.shmall = 1073741824

kernel.shmmax = 4398046511104

kernel.panic_on_oops = 1

net.core.rmem_default = 262144

net.core.rmem_max = 4194304

net.core.wmem_default = 262144

net.core.wmem_max = 1048576

net.ipv4.conf.all.rp_filter = 2

net.ipv4.conf.default.rp_filter = 2

fs.aio-max-nr = 1048576

net.ipv4.ip_local_port_range = 9000 65500


# sysctl -p



# vi /etc/security/limits.d/oracle-database-server-12cR2-preinstall.conf


oracle   soft   nofile    1024

oracle   hard   nofile    65536

oracle   soft   nproc    16384

oracle   hard   nproc    16384

oracle   soft   stack    10240

oracle   hard   stack    32768

oracle   hard   memlock    134217728

oracle   soft   memlock    134217728


# yum -y install ksh,libaio-devel,unixODBC, unixODBC-devel

# yum -y update



# vi /etc/hosts


127.0.0.1       localhost.localdomain   localhost

# Public

192.168.56.201   ol6-122-rac1.localdomain        ol6-122-rac1

192.168.56.202   ol6-122-rac2.localdomain        ol6-122-rac2

# Private

192.168.1.201   ol6-122-rac1-priv.localdomain   ol6-122-rac1-priv

192.168.1.202   ol6-122-rac2-priv.localdomain   ol6-122-rac2-priv

# Virtual

192.168.56.203   ol6-122-rac1-vip.localdomain    ol6-122-rac1-vip

192.168.56.204   ol6-122-rac2-vip.localdomain    ol6-122-rac2-vip

# SCAN

#192.168.56.205   ol6-122-scan.localdomain ol6-122-scan

#192.168.56.206   ol6-122-scan.localdomain ol6-122-scan

#192.168.56.207   ol6-122-scan.localdomain ol6-122-scan



박화벽 중지


# service iptables stop

# chkconfig iptables off



NTP 설정


# vi /etc/sysconfig/ntpd

OPTIONS="-x -u ntp:ntp -p /var/run/ntpd.pid"


# service ntpd restart

# chkconfig ntpd on



Grid 설치 폴더 생성


# mkdir -p /u01/app/12.2.0.1/grid

# mkdir -p /u01/app/oracle/product/12.2.0.1/db_1

# chown -R oracle:oinstall /u01

# chmod -R 775 /u01/



Oracle user 접속 후 프로파일 설정


$ vi .bash_profile


# Oracle Settings

export TMP=/tmp

export TMPDIR=$TMP


export ORACLE_HOSTNAME=ol6-122-rac1.localdomain

export ORACLE_UNQNAME=CDBRAC

export ORACLE_BASE=/u01/app/oracle

export GRID_HOME=/u01/app/12.2.0.1/grid

export DB_HOME=$ORACLE_BASE/product/12.2.0.1/db_1

export ORACLE_HOME=$DB_HOME

export ORACLE_SID=cdbrac1

export ORACLE_TERM=xterm

export BASE_PATH=/usr/sbin:$PATH

export PATH=$ORACLE_HOME/bin:$BASE_PATH


export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib


alias grid_env='. /home/oracle/grid_env'

alias db_env='. /home/oracle/db_env'


$ vi grid_env

export ORACLE_SID=+ASM1

export ORACLE_HOME=$GRID_HOME

export PATH=$ORACLE_HOME/bin:$BASE_PATH


export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib


$ vi db_env

export ORACLE_SID=cdbrac1

export ORACLE_HOME=$DB_HOME

export PATH=$ORACLE_HOME/bin:$BASE_PATH


export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib



공유 스토리지 Block device 설정


# fdisk /dev/sdb

 n, p, 1, Enter, Enter, w 



Udev 설정


# vi /etc/scsi_id.config

options=-g


# /sbin/scsi_id -g -u -d /dev/sdb1

36000c299ab492a9c2ff010df22555c9f


# vi /etc/udev/rules.d/99-oracle-asmdevices.rules

KERNEL=="sd?1", SUBSYSTEM=="block", PROGRAM=="/sbin/scsi_id -g -u -d /dev/$parent", RESULT=="36000c299ab492a9c2ff010df22555c9f", SYMLINK+="oracleasm/asm-disk1", OWNER="oracle", GROUP="dba", MODE="0660"



Block Device 파티션 테이블 불러오기


# partprobe /dev/sdb1



Udev Rule 다시 불러오기


# udevadm control --reload-rules


# ls -al /dev/oracleasm/*

lrwxrwxrwx. 1 root root 7 Mar  8 21:11 /dev/oracleasm/asm-disk1 -> ../sdb1




2번 노드도 똑같이 설정.

ORA-10873:FILE 1 NEEDS TO BE EITHER TAKEN OUT OF BACKUP MODE OR MEDIA RECOVERED

원인: DB가 Backup 모드에 들어간 상태에서 종료 되었을때 Startup을 하면 발생.


$ sqlplus / as sysdba


SQL> startup mount;

SQL> select * from v$backup;


쳐보면 데이터 파일들의 상태가 Active로 되어 있다.


SQL> alter database end backup;

SQL> alter database open;



해주면 끝.


RAC라면 1번 노드는 위 방식으로 올려주고,

나머지 노드는 sqlplus 에서 startup 또는 OS에서 srvctl 명령으로 올려준다. 

RAC CR 블록 리시브 타임에 따른 점검사항

1. AVR CR BLOCK RECEVIE TIME < 15ms 


한 Node에서 다른 Node의 데이터를 무결성 읽기를 하기 위해서 기다리는 

시간을 의미 하며 정상적인 경우 15ms보다 작아야 하고, 만약 시간이 많이 

걸리는 경우는 다음과 같은 사항들을 점검해서 문제를 해결해야 한다.


(1) 각 Node의 CPU 부하가 심하거나, CPU 용량이 부족한지 점검 함 

(2) 각 Node간 네트웍 성능에 문제가 없는지 점검 함 

(3) 각 Node간 불필요한 데이터 이동이 많게 데이터 구성이나 SQL이 

수행되는지 확인 함 


SQL> 

select b1.inst_id,

b2.value "CR BLOCKS RECEIVED",

b1.value "CR BLOCK RECEIVE TIME",

((b1.value/b2.value)*10)"AVG CR BLOCK RECEIVE TIME (ms)"

from gv$sysstatb1, gv$sysstatb2

where b1.name = 'globalcache crblock receive time'

and b2.name = 'globalcache crblocksreceived'

and b1.inst_id = b2.inst_id ;


2. GLOBAL CACHE LOCK GET TIME < 20ms 


RAC 환경에서 Cache에 있는 LOCK을 획득하기 위해서 걸리는 시간이 

정상적인 경우 20ms 보다 작아야 하며, 이보다 큰 경우가 자주 발생하는 

경우 이를 해결하기 위해서 다음과 같은 사항들을 점검해야 한다. 


(1) 서로 다른 Node에서 동일 DB Objects를 자주 Access해서 발생하는 

Application Lock이 심한지 점검 함 

(2) 각 Node간 네트웍 성능에 문제가 없는지 점검 함 

(3) 각 Node의 CPU 부하가 심하거나, CPU 용량이 부족한지 점검 함 


SQL> 

select b1.inst_id,

(b1.value + b2.value)"GLOBAL LOCK GETS",

b3.value "GLOBAL LOCK GET TIME",

(b3.value /(b1.value + b2.value)*10)"AVG GLOBAL LOCK GET TIME (ms)"

from gv$sysstatb1,gv$sysstatb2,gv$sysstatb3

where b1.name = 'globallock sync gets'

and b2.name = 'globallock async gets'

and b3.name = 'globallock gettime'

and b1.inst_id = b2.inst_id

and b2.inst_id = b3.inst_id;


RAC 환경에서는 1,2 번을 주기적으로 점검하여 결과치가 적정한 범위를 벗어

나는지 아닌지 모니터링을 하는 것이 바람직하다.

ASH Viewer - 무료 모니터링툴


클라이언트에서 오라클을 모니터링 할 수 있는 무료 소프트웨어 입니다.


공식 레퍼런스 사이트

http://jonathanlewis.wordpress.com/2011/03/06/free-ash/


다운로드

http://sourceforge.net/projects/ashv/


실행 방법

1. Java 설치

2. ASH 파일 압축 해제

3. ashv-3.4-bin\lib 경로 밑에 ojdbc14.jar 복사

4. 실행 스크립트 안에 JAVA_HOME을 자바가 설치된 경로로 바꿔준다.

5. 운영체제에 맞는 run 파일 실행 (windows -> run.bat, unix -> run.sh)


ojdbc14.jar


'ORACLE > Operation & Admin' 카테고리의 다른 글

Oracle 11g 계정 보안에 관한 profile 설정  (0) 2014.09.18
오라클 접속 가능한 세션의 수 변경  (0) 2014.09.15
ASH Viewer - 무료 모니터링툴  (0) 2014.09.11
RAC DB 시작과 종료  (0) 2014.06.20
Redo Log 관리하기  (0) 2014.06.12
Control file 관리하기  (0) 2014.06.11

아파치 톰캣에서 오라클 연동

오라클을 DB로 사용 하는 홈페이지들이 가장 많이 사용하는게 아마도 톰캣이 아닐까 싶네요.


web서버와 DB서버가 분리 되어 있을때,


server.xml 파일에서 오라클 서버의 접속 정보를 잡아주는데요.

일반적으로 아래와 같은 형식을 접속 정보로 사용 합니다.


jdbc:oracle:thin:@db서버ip:리스너포트:ORACLE_SID


재밌는건 딱히 오라클 클라이언트를 설치 하지 않아도, tnsnames.ora 파일이 없어도 리스너로 접속이 되더군요.


웹서버 쪽에 JDK와 톰캣을 설치 하고나서 오라클에서 특정 파일을 복사해 줘야 하는데요.


(Tomcat 설치폴더)\lib\
(JDK 설치폴더)\lib\ext\


에 해당 파일을 설치 해주면 됩니다.


classes12.jar 나 ojdbc14.jar 등등의 파일이 오라클 설치 폴더 내에 있습니다.

오라클 설치 폴더내에 JDBC/lib 이나 JRE같은 자바 관련 경로를 뒤져보면 있습니다.

버전마다 다 달라서..

ojdbc 뒤에 붙은 숫자에 따라 오라클이나 톰캣 지원 버전이 좀 다른걸로 알고 있습니다.

맞는걸 찾아서 설치 복사 해주면 됩니다.

RAC 설치시 클러스터웨어 설치 실패시 조치 방법

1. 삭제 스크립트 실행

# $ORA_CRS_HOME/install/rootdelete.sh

# $ORA_CRS_HOME/install/rootdeinstall.sh


2. 노드 application 프로세스 중단

# srvctl stop nodeapps -n <node name>


3. 부팅 시 노드 application 자동 실행 방지(root 권한으로 실행)

Sun:


# rm /etc/init.d/init.cssd

# rm /etc/init.d/init.crs

# rm /etc/init.d/init.crsd

# rm /etc/init.d/init.evmd

# rm /etc/rc3.d/K96init.crs

# rm /etc/rc3.d/S96init.crs

# rm -Rf /var/opt/oracle/scls_scr

# rm -Rf /var/opt/oracle/oprocd

# rm /etc/inittab.crs

# cp /etc/inittab.orig /etc/inittab


Linux:


# rm -f /etc/init.d/init.cssd

# rm -f /etc/init.d/init.crs

# rm -f /etc/init.d/init.crsd

# rm -f /etc/init.d/init.evmd

# rm -f /etc/rc2.d/K96init.crs

# rm -f /etc/rc2.d/S96init.crs

# rm -f /etc/rc3.d/K96init.crs

# rm -f /etc/rc3.d/S96init.crs

# rm -f /etc/rc5.d/K96init.crs

# rm -f /etc/rc5.d/S96init.crs

# rm -Rf /etc/oracle/scls_scr

# rm -f /etc/inittab.crs

# cp /etc/inittab.orig /etc/inittab


HP-UX:

# rm /sbin/init.d/init.cssd

# rm /sbin/init.d/init.crs

# rm /sbin/init.d/init.crsd

# rm /sbin/init.d/init.evmd

# rm /sbin/rc3.d/K960init.crs

# rm /sbin/rc3.d/S960init.crs

# rm -Rf /var/opt/oracle/scls_scr

# rm -Rf /var/opt/oracle/oprocd

# rm /etc/inittab.crs

# cp /etc/inittab.orig /etc/inittab


HP Tru64:


# rm /sbin/init.d/init.cssd

# rm /sbin/init.d/init.crs

# rm /sbin/init.d/init.crsd

# rm /sbin/init.d/init.evmd

# rm /sbin/rc3.d/K96init.crs

# rm /sbin/rc3.d/S96init.crs

# rm -Rf /var/opt/oracle/scls_scr

# rm -Rf /var/opt/oracle/oprocd

# rm /etc/inittab.crs

# cp /etc/inittab.orig /etc/inittab


IBM AIX:


# rm /etc/init.cssd

# rm /etc/init.crs

# rm /etc/init.crsd

# rm /etc/init.evmd

# rm /etc/rc.d/rc2.d/K96init.crs

# rm /etc/rc.d/rc2.d/S96init.crs

# rm -Rf /etc/oracle/scls_scr

# rm -Rf /etc/oracle/oprocd

# rm /etc/inittab.crs

# cp /etc/inittab.orig /etc/inittab


5. Oracle Universal Installer에서 CRS home을 선택 후 "설치해제" 


6. dd 명령으로 OCR 및 Voting File을 제거


ex)

# dd if=/dev/zero of=/dev/raw/raw1 bs=8192

# dd if=/dev/zero of=/dev/raw/raw2 bs=8192

# dd if=/dev/zero of=/dev/rdsk/V1064_vote_01_20m.dbf bs=8192 count=2560

# dd if=/dev/zero of=/dev/rdsk/ocrV1064_100m.ora bs=8192 count=12800


만약 RDBMS 설치를 제거한다면, 사용중이던 ASM 디스크도 정리합니다.

CRS를 재 설치하고자 하면, RAC 설치 매뉴얼에 기술된 순서대로 설치를 다시 진행.

참고 : 프로세스가 살아 있다면 EVM, CRS 및 CRS 프로세스를 kill 시키거나 노드를 재부팅.


ps -ef | grep crs 

ps -ef | grep evm

ps -ef | grep css