오라클은 삭제 기능을 제공하지 않는다.

친절하지 않기 때문이 아니라 친절하기 때문이다.

만약 unintaller 를 제공한다면.. 누군가 실수로 더블클릭 한번으로 시스템에서 가장 중요한

DB가 날라가는것이다. 

상상만 해도 온몸에 소름이 돋는 일이다.

 

아무튼 학습용으로 로컬에 깔은 오라클 버전을 올리거나 리소스 문제로 삭제는 해야 하니

수동으로 삭제하는 방법은 아래와 같다.

 

1. 서비스에서  Oracle관련 서비스 삭제
윈도우키에서 서비스 입력 또는 윈도우+r에서 services.msc 실행하면 서비스 관리창 나옴.
Oracle 시작하는 모든 서비스 중지

2. 레지스트리 삭제
윈도우키에서 레지스트리 입력 또는 윈도우+r에서 regedit.exe 실행하면 서비스 관리창 나옴.
HKEY_LOCAL_MACHINE/SOFTWARE/Oracle*
HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/Oracle*
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Oracle*

3. 컴퓨터 재부팅 후 Oracle 설치 폴더 삭제
C:\Oracle or ORACLE_BASE
C:\Program Files\Oracle
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Oracle - OraDB19Home1
C:\Users Oracle-related folders.

 

이상.

sql developer 에서 문자열에 & 를 입력하여 쿼리를 실행하는데

파라미터 값을 넣으라고 입력창이 뜬다.

set define off 를 실행하면 쿼리가 문자열로 실행된다.

sql > set define off

이후 다시 파라미터를 이용하려면

set define on 을 실행하면 된다.

 

 

REGEXP_SUBSTR(대상문자열, 정규표현식, 시작위치, 몇번째일치하는것 가져올지, 대소문자구분, 패턴중 몇번째 패턴 가져올지)

 

select juso, REGEXP_SUBSTR(juso, '\d+동 \d+호', 1, 1, 'i' ) as dongho from (
    select '150동 2305호 서울특별시 영등포구 당산로54길 11, 230동 111호(당산동, 래미안당산1차아파트)' as juso from dual
);  --> 150동 2305호

select juso, REGEXP_SUBSTR(juso, '\d+동 \d+호', 1, 2, 'i' ) as dongho from (
    select '150동 2305호 서울특별시 영등포구 당산로54길 11, 230동 111호(당산동, 래미안당산1차아파트)' as juso from dual
); --> 230동 111호

 

select juso, REGEXP_SUBSTR(juso, '(\d+동) (\d+호)', 1, 2, 'i', 1 ) as dongho from (
    select '150동 2305호 서울특별시 영등포구 당산로54길 11, 230동 111호(당산동, 래미안당산1차아파트)' as juso from dual
); --> 230동

 

select juso, REGEXP_SUBSTR(juso, '(\d+동) (\d+호)', 1, 2, 'i', 2 ) as dongho from (
    select '150동 2305호 서울특별시 영등포구 당산로54길 11, 230동 111호(당산동, 래미안당산1차아파트)' as juso from dual
); --> 111호

오라클에서 정규식을 사용하여 IP를 모두 3자리로 만든 다음에 비교를 하면 된다.

 

select REGEXP_REPLACE(REPLACE('.'||'127.0.0.1', '.', '.00'), '([^.]{3}(\.|$))|.', '\1')

from dual;

 

127.0.0.1 -> 127.000.000.001

 

위와 같은 정규식을 이용하여 접근하는 아이피 체크를 하면 된다.

 

기본 데이터는 아이피 허용 시작 ~ 끝으로 설정해 놓고 해당 범위에 들어오면 접근을 허용하면 된다.

 

select count(*) as cnt 
from (
select REGEXP_REPLACE(REPLACE('.'||'192.168.100.55', '.', '.00'), '([^.]{3}(\.|$))|.', '\1') as ip 
, REGEXP_REPLACE(REPLACE('.'||'192.168.100.51', '.', '.00'), '([^.]{3}(\.|$))|.', '\1') as ip_start
, REGEXP_REPLACE(REPLACE('.'||'192.168.100.56', '.', '.00'), '([^.]{3}(\.|$))|.', '\1') as ip_end
from dual
) where ip between ip_start and ip_end

;

 

위 쿼리는 192.168.100.51 ~ 192.168.100.56 까지 접근 가능하게 설정한 예이다.

 

 

오라클 AS-IS데이터를 덤프받아서 개발용으로 생성

임포트 하자.


imp test/1234 file='backup.dmp' full=y log=log.log


임포트 중 아래와 같은 에러가 발생했습니다.


IMP-00017: 다음 명령이 실패하고 ORACLE 959 오류가 발생했습니다:

 "CREATE TABLE "AUCTION_T" ("AUCTIONNO" VARCHAR2(15) NOT NULL ENABLE, "AUCTIO"

 "NTITLE" VARCHAR2(255), "AUCTIONCONTENT" CLOB, "THUMBNAILNAME" VARCHAR2(255)"

 ", "SUPPORT" VARCHAR2(64), "FROMPOINT" NUMBER(8, 0), "TOPOINT" NUMBER(8, 0),"

 " "FROMAUCTION_TIME" VARCHAR2(12) NOT NULL ENABLE, "TOAUCTION_TIME" VARCHAR2"

 "(12) NOT NULL ENABLE, "JOIN_CNT" NUMBER(8, 0), "LIMIT_CNT" NUMBER(8, 0), "J"

 "OINPOINT" NUMBER(8, 0), "REGISTERUSERID" VARCHAR2(32) NOT NULL ENABLE, "MOD"

 "IFYUSERID" VARCHAR2(32) NOT NULL ENABLE, "AUCTIONREGISTER_DT" DATE, "AUCTIO"

 "NMODIFY_DT" DATE)  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(IN"

 "ITIAL 65536 NEXT 1048576 MINEXTENTS 1 FREELISTS 1 FREELIST GROUPS 1 BUFFER_"

 "POOL DEFAULT) TABLESPACE "BAERON" LOGGING NOCOMPRESS LOB ("AUCTIONCONTENT")"

 " STORE AS BASICFILE  (TABLESPACE "BAERON" ENABLE STORAGE IN ROW CHUNK 8192 "

 "PCTVERSION 10 NOCACHE LOGGING  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENT"

 "S 1 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT))"

IMP-00003: ORACLE 오류 959이(가) 발생했습니다.

ORA-00959: 테이블스페이스 'BAERON'이(가) 존재하지 않습니다.


특정 테이블의 테이블 스페이스가 다른곳으로 지정되어 생긴 문제


우선 테이블 스페이스를 먼저 만드어주고


CREATE TABLESPACE BAERON

DATAFILE 'D:\app\abc\oradata\orcl\BAERON.dbf' SIZE 100M

AUTOEXTEND ON NEXT 10M

DEFAULT STORAGE 

(

  INITIAL    10K

  NEXT      10K

  MINEXTENTS 2

  MAXEXTENTS 50

  PCTINCREASE 50

);



create user test identified by 1234 default tablespace BAERON TEMPORARY TABLESPACE TEMP;



이후 임포트작업을 실행하면 된다.





노트북에 SSD만 설치해 놓으니 항상 하드가 모자라다.

오늘은 내 PC에 테스트 용으로 설치된 오라클을 삭제해야 겠다.


윈도우키+R 을 눌러 실행창에서 services.msc 를 입력하여 서비스를 실행한다.






서비스에서 오라클 관련 서비스를 중지한다.



프로그램 > 오라클 > 오라클 설치제품 > 인스톨러를 실행한다.



설치해제를 클릭



오라클11ghome을 선택하고 제거버튼을 클릭



이런 알림창이 뜬다.



창을 드래크해서 늘려보면 

오라클 홈에 있는 인스톨러 명령을 실행하라는 이야기다.



각자 자기의 오라클 홈 경로로 이동해서

deinstall.bat 파을을 실행한다.

실행은 관리자 권한으로 실행해 주자.



해제할 리스너를 지정하자는 데에서 그냥 엔터치고 넘어가자.




데이터베이스 이름은 표기된 대로 ORCL을 입력하고 엔터.



세부정보는 수정할필요없으므로 n 엔터



계속 하시겠습니까? 에서 y를 입력하고 엔터.



몇분후 CMD창이 닫히면 오라클 홈 폴더를 삭제합니다.




서비스에서 확인해 보면 Oracle관련 서비스가 삭제된 것을 확인 할수 있다.



레지스트리까지 지우고 싶으면


실행창에서 regedit 입력


HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE 삭제

HKEY_LOCAL_MACHINE\SYSEM\ControlSet001\Service 에서 Oracle 포함 삭제

HKEY_LOCAL_MACHINE\SYSEM\ControlSet002\Service 에서 Oracle 포함 삭제

HKEY_LOCAL_MACHINE\SYSEM\CurrentControlSet\Services 에서 Oracle 포함 삭제

HKEY_CLASSES_ROOT 에서Oracle과 Ora로 시작되는 것 삭제


과정을 거치면 된다.


프로젝트 진행 중 개발서버 셋팅을 위해서 오라클 덤프를 받을것을

윈도우 개발서버에 임포트 해야 했다.


뭐 임포트 쯤이야


cmd > imp system/password file='d:\full.dmp' full=y



헐 에러가 난다.


IMP-00038 : Could not convert to environment character set's handle


케랙터 셋 문제..

항상 무섭다. 언어문제..


무한 구글링과 무한 삽질을 한 결과


해결책은 imp 대신 impdp 를 사용하는 것이다.

Data Pump라는 기능이다.


진화된 임포트, 익스포트 기능인거 같다.


우선 Data Pump를 사용하려면 덤프파일이 있는 물리적 디렉토리를 디렉토리에 등록하는 것이다.


SQL > create directory TESTDBDUMP as 'D:\TESTDBDUMP';


이후 덤프 파일을 임포트 한다.


CMD > impdp 'system/password as sysdba' directory=TESTDBDUMP dumpfile=full.dmp full=y


임포트 작업이 진행된다.


작업 로그는 덤프파일 위치에 import.log로 쌓인다.


풀로 작업하면서 테이블 스페이스 에러가 많이 났다.


테이블 스페이스를 생성하는 쿼리에서 실제 물리적 경로(폴더)가 없어서 생긴 경우다.


해당 경로에 폴더를 생성해 주면 된다.












SID로 접근하는 경우




ORA-12505: TNS:listener does not currently know of SID given in connect descriptor
Cause: The listener received a request to establish a connection to a database or other service. The connect descriptor received by the listener specified a SID for an instance (usually a database instance) that either has not yet dynamically registered with the listener or has not been statically configured for the listener. This may be a temporary condition such as after the listener has started, but before the database instance has registered with the listener.
Action:

- Wait a moment and try to connect a second time.

- Check which instances are currently known by the listener by executing: lsnrctl services <listener name>

- Check that the SID parameter in the connect descriptor specifies an instance known by the listener.

- Check for an event in the listener.log file.


서비스 네임으로 접근하는 경우


ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
Cause: The listener received a request to establish a connection to a database or other service. The connect descriptor received by the listener specified a service name for a service (usually a database service) that either has not yet dynamically registered with the listener or has not been statically configured for the listener. This may be a temporary condition such as after the listener has started, but before the database instance has registered with the listener.
Action:

- Wait a moment and try to connect a second time.

- Check which services are currently known by the listener by executing: lsnrctl services <listener name>

- Check that the SERVICE_NAME parameter in the connect descriptor of the net service name used specifies a service known by the listener.

- If an easy connect naming connect identifier was used, check that the service name specified is a service known by the listener.

- Check for an event in the listener.log file.

https://docs.oracle.com/cd/B19306_01/server.102/b14219/net12500.htm#sthref3449


나같은 경우는 서비스네임이나 SID를 잘못적어서 생긴 문제였다.



cmd 에서

lsnrctl services 를 입력하면


리스터의 상태가 출력된다.

여기서 DECATED의 상태가 READY인 SID를 이용하면 된다.










오라클 쿼리 속도 저하 문제 중 하나가 인덱스의 밸런스가 깨진다는데 있다.


보통 B+트리 인덱스는 트리구조인데

이 트리구조 아래부분의 데이터들이 무작위로 삭제되거나 수정되는 경우

트리구조가 불균형을 이룬다는 것이다.


이런 경우 인덱스 재구성을 해주어 속도를 향상시킬 수 있다.


오라클 인덱스를 재설정하는 명령은

alter index 인덱스명 rebuild;


인덱스를 검색하는 쿼리는

select index_name from user_indexes;


위 두 쿼리를 조합해서 리빌드 하는 쿼리들을 뽑아낼려면

select 'alter index '||index_name||' rebuild ;' from user_indexes;


실행시 아래와 같이 리빌드 쿼리가 생성된다.


alter index PK_MEMBER rebuild ;

alter index PK_BOARD rebuild ;


요런식의 결과값이 떨어진다..


쉽게 모든 인덱스의 리빌드 쿼리를 뽑아낼 수 있다.



로그 데이타같이 단순히 데이타만 누적시키는 테이블에서 

해당 데이타가 있으면 업데이트 

없으면 인서트 하는 로직이 많죠..


asp라면 쉽게 생각하는 방법이

select 문을 써서 eof 면 인서트 eof가 아니면 업데이트 하는 소스를 생각하기 쉽죠..

그런데 구지 select를 해서 recordset에 담아야 할까요? 이런 로직은 디비콜이 2번일수 밖에 없죠.
게다가 select 당시에는 데이타가 없다가 인서트전에 데이타가 들어간경우... 중복데이타가 생기거나 PK오류로 sql에러가 뜨겠죠.. 


9i이후부터는 merge문을 지원합니다.


테스트 테이블 생성

CREATE TABLE TEST_LOG(

LOG_DATE VARCHAR2(10),

TOTAL NUMBER DEFAULT 1

)


merge 문

MERGE INTO TEST_LOG

USING DUAL B 

ON (LOG_DATE = '2011/09/16') 

WHEN MATCHED THEN 

 UPDATE SET TOTAL = TOTAL + 1 

WHEN NOT MATCHED THEN 

 INSERT (LOG_DATE,TOTAL) 

 VALUES ('2011/09/16',1)

;


한번의 콜로 업데이트 또는 인서트를 실행하게 됩니다.


그럼 9i버전 이전은 어떻게...

PL/SQL문을 사용할수 밖에 없겠죠..


UPDATE TEST_LOG

SET  TOTAL = TOTAL + 1

WHERE LOG_DATE = '2011/09/15';

IF SQL%NOTFOUND THEN

INSERT INTO TEST_LOG(LOG_DATE,TOTAL)

VALUES('2011/09/15',1);

END IF;

END;

/


업데이트해봐라 ... 업데이트못했으면 인서트하라는 문구입니다.


디비콜 최소화...

+ Recent posts