오라클 DB에 ODBC로 연결해야 하는 상황이고.. 클라이언트급 개인 PC에는 오라클이 깔려있지 않음..

여러가지 상황으로 클라이언트에는 오라클 Client를 설치하지 않고.. ODBC만을 연결하여 접속해야 함

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

1. Oracle.com에서 접속용 기본 프로그램 및 ODBC를 다운 받음.

다운받는 위치: htttp://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/winsoft.html


금일현재 Version 11.1.0.7.0가 최신버젼


가장 기본적인 프로그램 (무조건 받을 것.)
instantclient-basic-win32-11.1.0.7.0.zip (46,734,555 bytes)

가장 기본적인 프로그램 (경량버전)
instantclient-basiclite-win32-11.1.0.7.0.zip (17,667,999 bytes)

JDBC 클라이언트 패키지
instantclient-jdbc-win32-11.1.0.7.0.zip (1,562,261 bytes)

SQL*Plus 패키지
instantclient-sqlplus-win32-11.1.0.7.0.zip (789,617 bytes)

개발자 관련 SDK 패키지
instantclient-sdk-win32-11.1.0.7.0.zip (1,068,348 bytes)

개별접속용 ODBC 패키지 - 내가 필요한 기능
instantclient-odbc-win32-11.1.0.7.0.zip (728,899 bytes)

WRC 패키지
instantclient-tools-win32-11.1.0.7.0.zip (6,009 bytes)


내가 필요한 것은 기본 프로그램과 ODBC용 패키지로 2개를 다운받아 아래 디렉토리에 압축을 해제함

d:\oracle\instentclient_11_1   (요걸 잘 기억 해 주시고...)


2. 환경변수 지정

시작-> 내컴퓨터 -> 속성

사용자 삽입 이미지


고급 -> 환경변수
사용자 삽입 이미지


시스템 변수 새로 만들기
사용자 삽입 이미지


시스템 변수 생성
사용자 삽입 이미지


ORACLE_HOME=d:\Oracle\instantclient_11_1

TNS_ADMIN=d:\Oracle\instantclient_11_1 <- tnsnames.ora 파일이 위치할 폴더

NLS_LANG=KOREAN_KOREA.KO16MSWIN949   <- 한글관련 설정

PATH=d:\Oracle\instantclient_11_1 <- 기존 패스에 추가해야 함


Path만 기존 변수명에 추가하고 나머지는 새로이 생성


3. 레지스트리 변경

1) 드라이브 설치했다고 변경 (아래 표내의 글을 복사해서 drive.reg 파일로 저장해서 더블클릭 해도 됨)

 Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers]
"Oracle in InstantClient_11_1"="Installed"


2) Oracle in InstantClient_11_1 세부내역 추가 (아래글을 복사해서 dddd.reg 파일로 저장해 더블클릭 해도 됨)

 Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\Oracle in InstantClient_11_1]
"APILevel"="1"
"CPTimeout"="60"
"ConnectFunctions"="YYY"
"Driver"="d:\\Oracle\\instantclient_11_1\\SQORA32.DLL"
"DriverODBCVer"="03.51"
"FileUsage"="0"
"Setup"="d:\\Oracle\\instantclient_11_1\\SQORAS32.DLL"
"SQLLevel"="1"

 

3. TNS 서비스 파일 등록

아래 내용을 tnsnames.ora 파일을 작성하여 d:\Oracle\instantclient_11_1 디렉토리에 저장

oracleTest1 =
(DESCRIPTION =
     (ADDRESS_LIST =
          (ADDRESS =
               (PROTOCOL = TCP)
                    (HOST = xxx.xxx.xxx.xxx)
                    (PORT = 1521)
                )
          )
     (CONNECT_DATA =
          (SERVICE_NAME = DB_NAME)
     )

)




oracleTest1 : 사용할 TNS 서비스명으로 임의로 자기가 설정
xxx.xxx.xxx.xxx : oracle이 설치된 서버 IP 주소
1521: 포트번호
DB_NAME : 접속할 DB명


여기까지 진행이 되었으면 컴퓨터를 재부팅 함... (환경변수 등이 반영되도록...)


4. ODBC 데이터 원본 관리자 실행
시작-> 제어판-> 데이터 원본 (ODBC) - 추가

사용자 삽입 이미지


드라이버를 선택 - 하단 그림은 Oracle in OraClient10g로 되어 있으나 위에 레지스트리를 정상적으로 적용했다면 Oracle in InstantClient_11_1로 나옴...

사용자 삽입 이미지



드라이버 정보 입력 - TNS Service Name이 중요함
사용자 삽입 이미지


비밀번호를 입력하고....
사용자 삽입 이미지



접속 성공...
사용자 삽입 이미지


후... 이 문제에 대해서 삽질을 한 것이 얼마 전 일이었는데...
솔직히 근본적인 원인을 잡아내지 못하고 차선책을 선택했던 것 같다.


보통 ODP.NET을 이용하고자 하는 사람들은 Oracle Client 버전이나 Server버전을 설치한 사람들이 대부분일 것이다.

우리 회사 환경 또한 그러했기 때문에 ODP.NET을 설치 할 때 폴더 설정을 Default로 해서 그대로 깔게 되었을 때 발생되는
문제에 대해서는 무지하였다.

솔직히 인터넷에도 잘 나와 있는 부분이 없었다. ( 내가 검색을 잘 못했던 걸까...? )

설치 폴더 설정을 기본으로 했을 때 발생 되는 문제...

-> TNSNAMES.ORA를 찾아가는 환경변수가 등록 되어 기존에 쓰던 것을 옮겨서 새로 생긴

D:\oracle\product\10.2.0\client_1\network\admin 폴더에 넣던가 내 컴퓨터 > 속성 > 고급 > 환경변수 셋팅에서 path 부분을 다시 원래의 패스
D:\oracle\product\db_1\network\admin 폴더로 잡아줘야한다.

여튼 !! 이런 문제를 근본적으로 설치 시에 해결하는 방법이 있더라.
모든 삽질은 해결책을 찾고 나면 허무한 법.

자자~ 서론이 길었다.

이제 모든 분들께서 기다리시는 해결책을 알아보자.
ODP.NET설치 Setup.exe를 실행한다.


사용자 삽입 이미지

 

다음을 클릭한다.

 

사용자 삽입 이미지

 

본인의 PC는 Vista이기 때문에 마리님의 포스트에 적힌 대로 설치를 하였다.

odp.net\stage\product.xml을 찾은 후 다음을 누른다.

 

사용자 삽입 이미지

 

Oracle Data Access Component 10.2.0.2 21을 선택하고 다음을 누른다.

 

사용자 삽입 이미지


요것이 핵심 되시겠다~! 상단의 이름은 콤보 박스를 선택하여 나오는 이름을 클릭한다.

굳이 그렇게 안해도 되는 듯하나, 찜찜하다. 그냥 선택해주자.

그리고~! 밑에 경로는 현재 깔려있는 Client or Server의 패스를 넣어 주시면 되겠다.

단순히 D:\Oracle << 아니다... 패스를 잘봐라...

D:\Oracle\Product\10.2.0\db_1까지이다..

ps : 선택해주면 자동으로 패스가 잡히지만 다시한번 확인해 주시길 바랍니다^^


ODP.NET 다운로드: http://www.oracle.com/technology/software/tech/windows/odpnet/utilsoft.html

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

가끔 이미 설지가 되어 있는 서버설치쪽 경로에 설치를 하게 되면...
설지가 되지않는다...

그럴땐 그냥 과감히...
기본 경로로 설치를 하고 "TNSNAMES.ORA" 파일을 위에서 지정한 기본 폴더로 변경 하고 서비스 리스타드 하면 가장 손쉽게 해결이 된다.

10g 부터는 pump 기능이 제공된다.
기존까지 사용하던 exp, imp 는 클라이언트에서 실행하지만 pump 는 서버에서만 실행가능하다.

백업하기(expdp)
순서는 다음과 같다.
  1. expdp 실행을 위한 ORACLE_HOME 환경변수 설정(필요하다면)
  2. sysdba 권한으로 펌프할 디렉토리 생성하기
  3. 사용자에게 디렉토리에 대한 접근/작성 권한 할당하기
  4. pump export 하기
다음은 예제다. 진한 글씨를 임의의 설정에 맞추면 된다.

ORACLE_HOME 환경변수가 맞추어져있다면 다음 과정은 생략 가능하다. 다음은 AIX 의 경우 샘플이다.
$>export ORACLE_HOME=/app/oracle/product/102/db

관리자 계정으로 접속
SQL> conn /as sysdba 를 실행하거나 $>sqlplus sys/11234@ORCL as sysdba 를 실행하여 접속
Connected.

pump 를 위한 directory 생성
SQL> create  directory pump_dir as '/tmp/backup/oracle';
Directory created.

pump 를 위한 권한 설정
SQL> grant read,write on directory pump_dir to slothink;

Grant succeeded.

SQL> exit

$ mkdir /tmp/backup/oracle

펌프 export
$ expdp slothink/1234@ORCL directory=pump_dir dumpfile=exp.`date "+%Y-%m-%d"`.pump.dmp job_name=backup_job

만약 하위버젼이나 특정버젼으로 import 를 시킬 계획이라면 버젼을 명시해줘야한다.

$ expdp slothink/1234@ORCL directory=pump_dir dumpfile=exp.`date "+%Y-%m-%d"`.pump.dmp job_name=backup_job version=10.2.0.4

특정한 테이블을 export 시킬 계획이라면 테이블을 입력한다.
$ expdp slothink/1234@ORCL tables=MY_LOVE_SLOTHINK directory=pump_dir dumpfile=exp.`date "+%Y-%m-%d"`.pump.dmp job_name=backup_job version=10.2.0.4


복구하기(impdp)
$ impdp slothink/1234 directory=pump_dir dumpfile=exp.2009-11-04.dmp job_name=backup_job


오라클 내에 있는 테이블 전체를 백업해보자.


1. EXP

1.1. 기본 타입

C:\> exp 유저아이디/패스워드 file=파일명.dmp  (파일명의 경우 임의로 정하면 된다.)


1.2. 실행

사용자 삽입 이미지


2. IMP

2.1. 기본타입

C:\> imp 유저아이디/패스워드 file=파일명.dmp  (파일명의 경우 백업한 파일명을 사용한다.)


2.2. 실행

사용자 삽입 이미지


3. 백업 파일의 위치

C:\Documents and Settings\윈도우계정(i.e. Administrator)


export 시키면 기본적으로 저장되어지는 위치로, import 시에도 같은 위치에 저장하는 편이 속 시원하다.

실제로 다른 위치에 놓고 실행해 본 경험은 없다.


사용자 삽입 이미지


MySQL 에서는 create table 명령문 내에서 auto-increment 를 사용할 수 있지만,
ORACLE에서는 그게 불가능한 것처럼 보인다.
이건 내가 알고 있는 지식일 뿐, oracle도 create table 명령문 내에서 가능할 수도 있다.

아무튼. create table 내에서 auto-increment를 세팅할 수 없다는 가정 하에, sequence와 trigger를 통해서 어떻게 auto-increment를 생성할 수 있는지 알아보도록 하자.

먼저, auto-increment를 시행해볼 table을 만들자.

SQL> CREATE TABLE test
(id NUMBER PRIMARY KEY,
name VARCHAR2(30));

Table created.

id column을 auto incrment 하고 싶다고 가정하자.

id가 1로부터 시작해서 1씩 증가할 수 있도록 sequence를 생성한다.


SQL> CREATE SEQUENCE test_sequence
START WITH 1
INCREMENT BY 1;

Sequence created.


이제 test 테이블에 insert 할 때마다 id column에 이 sequence 를 적용시킬 수 있도록 trigger를 걸어보도록 하자.

CREATE OR REPLACE TRIGGER test_trigger
BEFORE INSERT
ON test
REFERENCING NEW AS NEW
FOR EACH ROW
BEGIN
SELECT test_sequence.nextval INTO :NEW.ID FROM dual;
END;


Trigger created.

이제 test 테이블에 새로운 row가 insert 될 때마다 이 test_trigger가 실행될 것이고, 결과적으로 id가 자동으로 1씩 증가하게 된다.
 
insert 문에서 id의 값으로는 null을 주거나, 다른 값(즉, name) 만 설정해 주어도 된다.

확인을 해보자.


SQL> INSERT INTO test (name) VALUES ('Jon');

1 row created.

SQL> INSERT INTO test (name) VALUES (’Bork’);

1 row created.

SQL> INSERT INTO test (name) VALUES (’Matt’);

1 row created.

SQL> SELECT * FROM test;

ID NAME
???- ??????????
1 Jon
2 Bork
3 Matt


자! 모든 게 완성되었다!

다만, 이번 예제의 경우 column이 id와 name, 이렇게 2개밖에 안되어 id를 제외한 모든 column을 일일이 나열해 insert를 해줄 수 있었지만, column의 수가 많을 경우, 이와 같은 작업이 불가능하다. 이럴 경우, id의 값 대신 null을 주면 된다. 즉, 다음과 같다.

SQL> INSERT INTO test (name) VALUES ('Jon');

-->

SQL> INSERT INTO test VALUES (null, 'Jon');


OK???

사용자 삽입 이미지


유저 생성

CREATE USER [ user_name ] IDENTIFIED BY [ user_password ];

유저 권한주기

GRANT connect, resource, dba TO  [ user_name ];

생성한 유저로 접속

CONN [ user_name ] / [ user_password ]

생성한 유저 확인


이건 위에 생성한 유저로 접속과 반대로 해도 괜찮다.

아니 먼저 확인하고 접속하는게 맞는거 같긴한데 다시 하기 귀찮다.


지울때는 그냥

CONN system / password

DROP USER [ user_name ];


물론 위에 쓴 모든 예시문의  [ ]는 제외하고 쓴다. ( 이런 사람 있어 꼭 ㅋㅋㅋ )

그리고 대소문자 구분은 안하는거 같다.

사용자 삽입 이미지
 

+ Recent posts