214
INFORMIX User Guide INFORMIX User Guide 2001. 6 Informix Korea

Informix user guide

Embed Size (px)

Citation preview

Page 1: Informix user guide

INFORMIX User GuideINFORMIX User Guide

2001. 6

Informix Korea

Page 2: Informix user guide

2INFORMIX User Guide

목차목차

RDB 란 무엇인가 SQL 개요 dbaccess 를 이용한 query 실행 Informix DBMS 의 이해 SQL 을 이용한 질의 방법 DB Admin 작업 ESQL/C 를 이용한 프로그래밍 System Admin 작업 Client/Server Connectivity Data Migration Backup & Restore GLS (Global Language Support)

Page 3: Informix user guide

RDB 란 무엇인가 정보와 데이터 정보시스템 자료처리시스템 데이터베이스의 정의 데이터베이스의 특성 DBMS 발전 배경 데이터 독립성과 데이터 구조간의 사상 데이터베이스 관리시스템 데이터 모델링 관계 데이터 모델 계층 데이터 모델 네트워크 데이터 모델 Primary Key 와 Foreign Key 정규화 (Normalization)

Page 4: Informix user guide

4INFORMIX User Guide

정보와 데이터

데이터 현실 세계 (Real World) 로부터 단순한 관찰이나 측정을 통해서 수집한 사실 (Fact)

또는 값 (Values)

정보 어떤 상황에 관한 어떤 의사 결정을 할 수 있게 하는 지식 (Knowledge) 로써

데이터의 유효한 해석 (Interpretation) 이나 데이터 상호간의 관계(Relationship)

처리기처리기 ((P)P)데이터데이터 ((D)D)데이터데이터 ((D)D) 정보정보 ((I)I)정보정보 ((I)I)

Page 5: Informix user guide

5INFORMIX User Guide

정보 시스템

경영 정보 시스템 (MIS : Management Information System) 군사 정보 시스템 (Military Information System) 행정 정보 시스템 (Administration Information System) 인사 정보 시스템 (Personnel Information System) 의사 결정 지원 시스템 (Decision Support System)

분배의

저장 데이터저장 데이터

수집 입력 출력처리기처리기 ((P)P)데이터데이터 ((D)D)데이터데이터 ((D)D)

정보정보 ((I)I)정보정보 ((I)I)현실 세계현실 세계현실 세계현실 세계

Page 6: Informix user guide

6INFORMIX User Guide

자료 처리 시스템

정보 시스템을 구축 하기 위해 정확한 최신의 정보를 적시에 제공하는 시스템 자료 처리 시스템의 종류

일괄 처리 시스템 (batch Processing) 온라인 처리 시스템 (on-line processing) 분산 처리 시스템 (distributed processing)

Page 7: Informix user guide

7INFORMIX User Guide

데이터베이스의 정의

데이터베이스란 어느 한 조직의 다수 응용 시스템들이 사용하기위해 통합 , 저장된 운영 데이터의 집합

통합된 데이터 (Integrated Data) 최소의 중복 , 통제된 중복 허용

저장된 데이터 (Stored Data) 운영 데이터 (Operational Data)

존재 목적이 뚜렷하고 필수 적인 데이터 공용 데이터 (Shared Data)

Page 8: Informix user guide

8INFORMIX User Guide

데이터 베이스의 특성

실시간 접근성 (Real Time Accessibility) 수시적이고 비 정형적인 데이터의 검색이나 처리를 요구하는 질의 질의 (Queries) 에 대하여 실시간에 처리 응답

계속적인 변화 (Continuous Evolution) 데이터의 삽입 , 삭제 , 갱신을 통하여 가장 최근의 정확한 데이터를 유지

동시 공유 (Concurrent Sharing) 동시에 여러사용자가 접근 이용 가능

내용에 의한 참조 (Content Reference) 데이터 레코드들은 주소나 위치에 의해 참조되는 것이 아니라 데이터의 내용 즉 ,

어떤 특정 조건을 만족하는 레코드들은 모두 하나의 논리적 단위로 취급되고 접근

Page 9: Informix user guide

9INFORMIX User Guide

DBMS 발전 배경

데이터의 종속성 데이터의 중복성 내부적 일관성 (Consistency)

보안성 (Security) 경제성 (Economics) 무결성 (Integrity)

데이터의 독립성 논리적 데이터 독립성 물리적 데이터 독립성

Page 10: Informix user guide

10INFORMIX User Guide

데이터 독립성과 데이터 구조간의 사상

ABCD

BEF

GAC

논리적

구조

사상

A

B

C

D

E

F

G

H

A B CD E FG H ...

물리적데이터베이스

프로그램 데이터 구조 데이터베이스 논리적 구조

응용 프로그램 1

응용 프로그램 2

응용 프로그램 3

물리적

구조

사상

Page 11: Informix user guide

11INFORMIX User Guide

데이터베이스 관리시스템

응용 프로그램과 데이터의 중재자로써 모든 응용 프로그램들이 데이터베이스를 공용할 수 있게끔 관리해 주는 소프트웨어 시스템 정의 기능

데이터베이스의 논리적 구조와 그 특성을 어떤 데이터 모델에 따라 명세 데이터베이스의 물리적 구조를 명세 물리적 구조와 논리적 구조의 변환이 가능하도록 사상 (mapping) 을 명세

조작 기능 데이터 처리가 간편하고 쉬우며 명확하고 완전하고 효율적

제어 기능 데이터 무결성 제어 보안과 권한을 검사 동시성 제어 (Concurrency Control)

Page 12: Informix user guide

12INFORMIX User Guide

데이터 모델링

객체 ( 그룹 )성 질

객체 ( 그룹 )성 질

엔티티 타입엔티티 타입에트리뷰트에트리뷰트

값값

레코드레코드데이터 필드데이터 필드

값값

현실 세계 ( 실체 ) 개념 세계 ( 정보 ) 컴퓨터 세계 ( 데이터 )

현실 세계현실 세계 개념 세계개념 세계개념 세계개념 세계

데이터 모델데이터 모델데이터 모델데이터 모델물리적 물리적 데이터베이스데이터베이스

물리적 물리적 데이터베이스데이터베이스

일치성일치성

데이터구조화데이터구조화

컴퓨터 세계컴퓨터 세계

데이터데이터모델링모델링

정보 모델링정보 모델링

Page 13: Informix user guide

13INFORMIX User Guide

관계 데이터 모델

현실 세계를 ER 다이어 그램으로 표현한 것은 현실 세계를 사람이 이해할 수 있게 표현한 논리적 구조

현실 세계현실 세계 ERER다이어그램다이어그램

데이터데이터모델모델

저장 저장 데이터베이스데이터베이스

학번

1234

1235

1246

1248

1225

이름

김철수이상철박영수조성진강신조

학년

3

4

3

3

1

학과

전산전산전자전기산공

학생학생

과목 번호

CS312

CS322

CS412

과목이름

자료 구조파일 처리

데이터베이스

학점

3

3

3

교과목교과목

학번

1235

1246

1234

1235

1248

1234

1235

1246

과목 번호

CS312

CS312

CS322

CS322

CS322

CS412

CS412

CS412

성적

90

85

88

95

94

98

75

80

수강수강

Page 14: Informix user guide

14INFORMIX User Guide

계층 데이터 모델

홍수영홍수영

CS 421.2CS 421.2

교과목교과목

선수 과목선수 과목 강 좌강 좌

교 수교 수 학 생학 생

데이터베이스데이터베이스

파일 처리론파일 처리론 CS 421.1CS 421.1

이상길이상길 김철수김철수

Page 15: Informix user guide

15INFORMIX User Guide

C

네트워크 데이터 모델

1000, 갑 , 경영 , 41000, 갑 , 경영 , 4

2000, 을 , 전산 , 32000, 을 , 전산 , 3

3000, 병 , 영문 , 23000, 병 , 영문 , 2

A

B

D

A

B

C

영어 , 4영어 , 4

역사 , 3역사 , 3

음악 , 2음악 , 2

Page 16: Informix user guide

16INFORMIX User Guide

Primary Key 와 Foreign Key

Primary Key 각 개체를 유일하게 구분할 수 있는 속성 혹은 속성의 조합 . Primary 는 반드시 존재하는 값이어야 한다 . 모든 개체는 하나의 primary key 를 가져야 한다 . 예

고객 개체 : 주민번호 상품 개체 : 상품 코드 , 제조업체 학생 개체 : 학번

Foreign Key 다른 개체의 primary key 를 참조해야 하는 개체의 속성 개체 간에 관계를 설정하기위해 사용되는 속성 혹은 속성의 집합 값이 없어도 가능 중복된 값 가능 수정 가능 예

주문 개체의 주문 고객 속성 고객 개체의 고객번호 수강 개체의 수강 학생 속성 학생 개체의 학번

Page 17: Informix user guide

17INFORMIX User Guide

정규화 - 1NF(First Normal Form)

엔티티 (entity) 안에 반복되는 속성 그룹을 제거한다

주문번호주문날짜총액항목번호 1항목수량 1항목번호 2항목수량 2항목번호 3항목수량 3항목번호 4항목수량 4

주문번호주문날짜총액항목번호 1항목수량 1항목번호 2항목수량 2항목번호 3항목수량 3항목번호 4항목수량 4

주문주문

반복되는 속성은 데이터를 유연하게 저장할 수 없다 .여기서 , 항목은 최대 4 개밖에 저장할 수 없다

주문번호항목번호수량주문날짜총액지불날짜

주문번호항목번호수량주문날짜총액지불날짜

주문주문

compositeprimary key

Page 18: Informix user guide

18INFORMIX User Guide

정규화 - 2NF(Second Normal Form)

1NF 에서 모든 속성은 전체 Primary Key 에 종속되어야한다 엔티티의 모든 속성은 Primary Key 에 functionally dependent

해야한다 데이터항목 a 가 데이터항목 b 에 의해 정의될 수 있다면 a 는 b 에

functionally dependant 하다고 한다

주문번호항목번호수량주문날짜총액지불날짜

주문번호항목번호수량주문날짜총액지불날짜

주문주문

주문날짜 , 총액 , 지불날짜는 단지 주문번호에만 functionally dependant 하다

주문번호 1010 1010 1011항목번호 1 2 3수량 20 3 12주문날짜 1/4/2001 1/4/2001 1/4/2001총액 50,000 50,000 50,000지불날짜 2/4/2001 2/4/2001 2/4/2001

1010항목의 지불날짜가 바뀌면 모든 1010항목을 수정해야 한다

주문번호주문날짜총액지불날짜

주문번호주문날짜총액지불날짜

주문마스터주문마스터

주문번호항목번호수량

주문번호항목번호수량

주문상세주문상세

Page 19: Informix user guide

19INFORMIX User Guide

정규화 - 3NF(Third Normal Form)

Primary Key 에 종속적인 Key 가 아닌 속성에 종속적인 속성이 있으면 안된다 .

어떠한 속성도 Primary Key 에 transitively dependent 하면 안된다 . 데이터항목 a 가 다른 데이터항목 b 에 종속적이면 a 는 b 가 종속적인 다른

데이터 항목에도 함께 종속적인 관계가 되고 이를 transitively dependent하다고 말한다

주문번호항목번호품목번호제조코드수량단가

주문번호항목번호품목번호제조코드수량단가

주문가격주문가격

주문번호 1010 1010 1011항목번호 1 2 1품목번호 1 30 1제조코드 ABC XYZ ABC수량 20 3 12단가 1,000 3,500 1,000

주문하지 않은 항목에 대한 단가를 입력할 수 없다항목을 포함한 주문이 삭제되면 그 항목의 단가를 잃는다단가는 중복적으로 저장된다단가가 변경되면 그 항목을 포함한 모든 주문에 대해서 변경해야 한다

주문번호항목번호품목번호제조코드수량

주문번호항목번호품목번호제조코드수량

주문주문

품목번호제조코드단가

품목번호제조코드단가

품목품목

Page 20: Informix user guide

SQL 개요 SQL 이란 무엇인가 SQL 의 종류 DB 내의 object 이름 규칙 인포믹스 자료형 (Data Type) Character Data Type Numeric Data Type Large Object Data Type Time Data Type Row Data Type Collection Data Type Complex Data Type

Page 21: Informix user guide

21INFORMIX User Guide

SQL 이란 무엇인가 ?

Structured Query Language 의 준말 영어와 흡사한 언어 Database 와의 관련 작업을 가능하게 함 . 논리적인 database 의 model 을 관계형 DB 의 schema 로 번역하는데

사용되는 언어 . schema 란 - DB 내에서의 table 의 물리적인 정의 table 이란 - 열과 행으로 이루어진 2 차원 표현

Page 22: Informix user guide

22INFORMIX User Guide

SQL 의 종류

DDL(Data Definition Language) DB 나 table 을 생성하고 , 그 구조를 수정하는 작업관련 구문

DML(Data Manipulation Language) Data 를 가져오고 , 수정하고 , 삭제하는 등의 Data 를 사용하는데 사용되는 구문

Cursor Manipulation Cursor 를 사용하는데 사용되는 구문

Dynamic Management 동적으로 자원을 사용 , 관리하는데 사용되는 구문

Data Access Data 에 대한 권한을 설정하고 , lock 을 거는등의 작업에 사용되는 구문

Data integrity Transaction 을 관리하는데 사용되는 구문

Query optimization 질의 최적화에 사용되는 구문

Stored procedure Stored procedure 를 실행하는 작업에 사용되는 구문

Page 23: Informix user guide

23INFORMIX User Guide

DB 내의 object 이름 규칙

Informix version 에 따라 길이 제한이 다름 . Informix 7.*,8.* ,9.1*: 18글자 ( 영문기준 ) Informix 9.2* : 128글자 ( 영문기준 )

숫자로 시작하면 안됨 . 특수문자의 사용 불가

예 : 공백문자 , tab 문자 , 등… “_ ” 는 사용 가능 ANSI-reserved word 사용 안됨 .

Page 24: Informix user guide

24INFORMIX User Guide

인포믹스 자료형 (data type)

Built-in Data Type

User-defined Data Type

Complex Data Type

Character

Numeric

Large-object

Time

boolean

char

varchar

lvarchar

Exact

Approximate

decimal/numeric

money

integer/int

smallint

int8

serial

serial8

decimal

float

real

byte

text

blob

clob

date

datetime

interval

Opaque Data Type

Distinct Data Type

Row Type

Collection Type

Named Row Type

Unnamed Row Type

set

list

multiset

Page 25: Informix user guide

25INFORMIX User Guide

Character Data Type

char (size) 고정 길이 문자 저장 1~ 32,767 byte까지의 character 저장 가능 default 값은 1

varchar (max, reserve) 가변 길이 문자 저장 1~ 255 byte까지 가능 Reserve(default 로 0 ) 는 option 이나 Max 는 반드시 주어야 함 .

lvarchar 2K까지의 가변길이 문자를 저장

Page 26: Informix user guide

26INFORMIX User Guide

Numeric Data Type

decimal (precision,scale) or numeric (precision,scale) 고정 소수점 실수를 저장 ,32 유효자리수까지 표현 default 자리수 : 16, default 소수점이하 : 0

money (precision, scale) 내부적으로 decimal 과 같으나 , 화폐단위기호가 붙어서 출력됨 .

integer or int 4bytes integer 저장 : -(231-1) ~ 231-1

int8 8bytes integer 저장 : -(263-1) ~ 263-1

smallint 2bytes integer 저장 : -(215-1) ~ 215-1

serial (start) / serial8 (start) 서버에 의해 자동적으로 1씩 증가되는 값을 저장할 수 있는 type. 내부적으로 int 와 같음 .

Page 27: Informix user guide

27INFORMIX User Guide

Numeric Data Type

float or double precision 부동 소수점 실수를 저장 유효자리수 16까지 표현 가능

real or smallfloat 부동 소수점 실수를 저장 유효자리수 8 까지 가능

Page 28: Informix user guide

28INFORMIX User Guide

Large-Object Data Type

Large-Object data type text

2G 까지의 ASCII character 형식의 object 를 저장 byte

2G 까지의 binary character 형식의 object 를 저장

Smart Large Object data type clob

4T까지의 ASCII character 형식의 object 를 저장 blob

4T까지의 binary character 형식의 object 를 저장

Page 29: Informix user guide

29INFORMIX User Guide

Time Data Type

date 연 ,월 , 일의 날짜를 저장 Format 을 정의할 수 있음 .(default : mm/dd/yyyy) 환경변수 DBDATE 를 이용해 변경

datetime 날짜를 시간까지 저장할 수 있음 . default : yyyy-mm-dd hh:MM:ss.fff

interval 시간의 간격 ( 기간 ) 을 저장할 수 있음 .

Page 30: Informix user guide

30INFORMIX User Guide

Row Data Type

C 언어의 구조체와 유사한 여러 종류의 데이터의 모음 Unnamed Row Data Type

create table part ( part_id serial , cost decimal,

part_dimensions row (length decimal, width decimal, height decimal, weight decimal) );insert into part values (0, 10.00, row(1.0, 2.0, 3.0, 4.0));

Named Row Data Typecreate row type dimension_t ( length decimal, width decimal, height decimal, weight decimal);create table part ( part_id serial, cost decimal, part_dimensions

dimension_t);insert into part values (0, 10.00, row(1.0, 2.0, 3.0, 4.0)::dimension_t;

Row Data Type 데이터 조회select part_id, cost, part_dimensions from part where part_dimensions.weight > 100;

constructor Cast operator Row data type

Page 31: Informix user guide

31INFORMIX User Guide

Collection Data Type

Set 데이터 입력 순서에 의미 없고 , 중복된 값을 허용하지 않음

alter table part add (defective_dates set(date not null));insert into part (part_id, defective_dates) values (0,(set{2/23/2001,3/15/2001}));select * from part where ‘1/26/2001’ in defective_dates;

MultiSet 데이터 순서에 의미 없고 , 중복된 데이터를 허용함

List 데이터 순서가 의미 있고 , 중복된 데이터를 허용함

Page 32: Informix user guide

32INFORMIX User Guide

Complex Data Type

User-defined Data Types (UDTs) 라고 부른다 Distinct Types

기존에 존재하는 데이터형을 기반으로한 새로운 데이터형을 나타낸다create distinct type inches as decimal;create row type dimension_t ( length inches, width inches, . . . );

Opaque Data Types C 언어나 JAVA 를 이용하여 데이터형의 내부 구조와 함수를 정의한다 Create Opaque Type 문을 이용하여 새로운 데이터형을 등록한다 Create Function 문을 사용하여 이 데이터형을 지원하는 함수를 등록한다

Page 33: Informix user guide

dbaccess 를 이용한 query 실행 dbaccess 란 ? dbaccess 실행 dbaccess 의 메뉴 구조 dbaccess 의 실행방법

Page 34: Informix user guide

34INFORMIX User Guide

Dbaccess 란 ?

Query 를 실행하고 , db 나 table 에 대한 information 을 볼 수 있는 tool

Page 35: Informix user guide

35INFORMIX User Guide

Dbaccess 실행

$ dbaccess

메뉴의 사용법 Space-bar 를 이용하거나 화살표키로 이동 혹은 각 메뉴의 대문자로 쓰여진 문자를 누름

예 : Exit 의 경우 “ e” 를 누름

Page 36: Informix user guide

36INFORMIX User Guide

Dbaccess 의 메뉴구조

Query Language Connection Database Table Session Exit

NewRunModifyUse-EditorOutputSaveInfoDropExit

ConnectDisconnectExit

SelectCreateInfoDropcLoseExit

CreateAlterInfoDropExit

NEW dbaccess editor 에서 SQL 문장을 작성한다 , 작성이 끝나면 ESC키를 눌러야 메뉴로 돌아간다 RUN 작성된 SQL 문장을 실행한다 MODIFY dbaccess editor 에서 SQL 문장을 수정한다 USE_EDITOR vi editor 를 호출하여 SQL 문장을 작성 및 수정한다 . 작성이 끝나면 저장하고 vi 를 종료한다 OUTPUT 출력결과를 파일로 저장한다 SAVE editor 에 기록되어 있는 SQL 문장을 파일로 저장한다 ( 확장자 : .sql) INFO 현재 연결된 데이터베이스의 테이블 정보를 본다 DROP 현재 디렉토리에 저장된 SQL 파일 ( 확장자 : .sql) 을 삭제한다 EXIT Query Language 종료

Page 37: Informix user guide

37INFORMIX User Guide

Dbaccess 의 실행 방법

구문을 적은 file 을 명령 프롬프트에서 바로 실행하여 결과를 볼 수 있다 . Shell program, cron job등에 응용 가능 dbaccess DB 이름 SQL 파일명

dbaccess test_db test.sql

Interactive mode 로 prompt 상에서 실행한다 SQL 문장 끝에 세미콜론 (;) 을 넣어야 실행된다 종료는 interrupt 키를 눌러 빠져나온다

dbaccess test_db - > select * from customer;

여러 문장을 그룹으로 프롬프트에서 실행한다 새 입력 라인 첫 자리에 종료 문자가 나타날때까지 문장을 입력 받는다

dbaccess test_db << !> select * from customer;> select * from state;!

Page 38: Informix user guide

Informix DBMS 의 이해 Informix DBMS 의 아키텍쳐 Database Server 의 구성요소 물리적인 저장 공간 논리적인 저장 공간 물리적 디스크 공간 할당 논리적 디스크 공간 할당 SYSMASTER 데이터베이스 데이터베이스 구조

Page 39: Informix user guide

39INFORMIX User Guide

Informix DBMS 의 아키텍쳐

Multi-threaded 구조 적은 프로세스 소요 여러 프로세스가 하나의 어플리케이션을

위하여 작업 서버 프로세스 안에서 thread

scheduling 과 context switching

process process process

Client/Server 구조 client 는 server 에게

command 나 query 를 보내고 결과를 받는다

server 는 데이터베이스의 컨텐츠를 관리하며 client 가 보낸 query 를 해석하고 실행하여 결과를 client 에게 보낸다

ClientClient ServerServer

SQL

results

•interpret•execute•return

applicationapplication

ServerServer

Page 40: Informix user guide

40INFORMIX User Guide

Database Server 의 구성 요소

Resident Portion

ProcessesProcessesChunkPageExtentTblspaceDbspaceBlobspaceSmart BlobspacePhysical Log, Logical Log

Virtual Portion

MessagePortion

Shared MemoryShared Memory

DiskDisk

Lock, LRU, Buffer Pool,Logical log buffer,Physical Log Buffer..

MT, Sort, Session,Procedure, Dictionary,Big buffer, Global..

Virtual Processors(CPU, PIO, LIO, AIO, ADT, MSC, SHM, TLI, SOC, ADM, OPT, JVP..)

V.P 는 자체적으로 thread 를 scheduling 하고 실행한다

빠른 access 를 위하여 disk 로부터 데이터를 cache 하는 영역

사용자 세션 관리 client 와 server 간의 통신 영역

checkpoint

메모리와 디스크 데이터의 동기화 작업

환경변수 : INFORMIXSERVER, INFORMIXDIR, PATH

Page 41: Informix user guide

41INFORMIX User Guide

물리적인 저장 공간

Page IDS 의 기본적인 I/O 의 단위 CHUNK 를 구성하는 최소 단위 . 메모리 버퍼의 사이즈와 동일 Size : 2K 혹은 4K

Extent Table 이나 index, fragment 에 저장영역을 할당하는 단위로서 , 연속된 페이지의 묶음 .

Chunk Informix 에 할당된 연속된 disk 의 공간 Raw device 나 cooked device(file) 가능

Page 42: Informix user guide

42INFORMIX User Guide

논리적인 저장공간

Tblspaces Table 에 할당된 extent 의 묶음 하나의 dbspace 에만 존재가능

Dbspaces Informix 가 사용하는 저장 공간으로 하나 이상의 Chunk 로 구성됨 .

dbspacedbspace

/dev/rvol1

/dev/rvol2/usr/ifmxdata

Tab1 의 tablespace

Tab2 의 tablespace

Page 43: Informix user guide

43INFORMIX User Guide

물리적인 디스크 공간 할당

create table first_table (tab_id int ,name char(20) ,address char(50)

) extent size 32 next size 16;

create table second_table (tab_id int ,name char(20) ,address char(50)

) extent size 16 next size 8;

…………

page

first_table

second_table

Page 44: Informix user guide

44INFORMIX User Guide

논리적 디스크 공간 할당

create database example1db;create database example2db in dbspace1;create table first_table (

tab_id int ,name char(20) ,address char(50)

) ;create table second_table (

tab_id int ,name char(20) ,address char(50)

) in dbspace2;

rootdbs

dbspace1

dbspace2

example1db

example2db

second_table

first_table

Page 45: Informix user guide

45INFORMIX User Guide

SYSMASTER 데이터베이스

Informix 서버의 정보를 저장 Informix 서버가 초기화 되는 시점에 자동 생성 공유메모리의 실제 데이터를 접근 (access)

shared memoryshared memory

processprocess

sysmastersysmaster

SELECT dbsnum, name, owner, nchuncks, is_temp, is_blobspace, flagsFROM sysdbspaces

SELECT c.dbsnum, chknum, nxchknum, d.name, chksize, nfreeFROM syschunks c, sysdbspaces cWHERE c.dbsnum = d.dbsnumAND d.name = “dbspace 이름”

SELECT name, owner, created, is_logging, is_buff_log, is_ansiFROM sysdatabases

SELECT partnum, dbsnum, owner, tabnameFROM systabnamessWHERE dbsname = “DB이름”

SELECT sid, username, uid hostname, connectedFROM syssessions

Page 46: Informix user guide

46INFORMIX User Guide

데이터베이스 구조 (1)

시스템 카타로그 테이블 (system catalog table) 데이터베이스의 구조에 대한 정보를 저장 데이터베이스가 생성되는 시점에 자동적으로 생성 데이터베이스내의 테이블 구조가 변경되는 시점에 자동으로 수정

데이터 테이블 테이블을 생성할 때 고려할 사항

dbspace : 테이블이 생성될 위치 extent/next size : 연속으로 할당할 공간의 크기 lock mode : row 또는 page 단위의 locking 사용

인덱스 데이터를 빠르게 접근하기 위한 정보를 저장 인덱스의 종류

데이터 중복 여부에 따라 unique / duplicate 인덱스로 구분 여러 컬럼을 인덱스 키로 사용하는 composite 인덱스 인덱스 생성 시 데이터의 물리적 위치를 재 정렬시키는 cluster 인덱스

Page 47: Informix user guide

47INFORMIX User Guide

데이터베이스 구조 (2)

제약조건 (Constraints) Referential constraint : 테이블간의 integrity 보장 Default values : 입력 내용이 없을 경우 지정한 기본값 저장 NOT NULL constraint : null 값을 허용하지 않는 컬럼 지정 Check constraint : 입력 , 수정시 허용하는 컬럼 값을 지정 Unique constraint : 컬럼값이 테이블안에서 유일

뷰 (view) 테이블 실제 테이블에서 데이터를 가져오는 가상의 테이블

Stored Procedure 사용자가 정의한 함수 데이터베이스 안에 저장되는 로직

Trigger 테이블에 이벤트 발생시 자동적으로 실행

Page 48: Informix user guide

48INFORMIX User Guide

데이터베이스 구조 (3)

dbschema utility 데이터베이스의 구조를 파악할 수 있는 유틸리티 사용법

dbschema -d <DB 이름 > dbschema -d <DB 이름 > -t <table 이름 > dbschema -d <DB 이름 > -s <synonym 이름 > dbschema -d <DB 이름 > -f <procedure 이름 >

table 이름 , synonym 이름 , procedure 이름 대신 “ all” 을 사용하면 지정한 데이터베이스 내의 모든 table, synonym, procedure 에 대한 정보를 출력한다

옵션뒤에 파일 이름을 명시하면 실행결과가 파일로 저장된다 -ss 옵션을 추가하면 테이블의 lock mode, extent, space 정보 등을 자세히 출력한다 .

Page 49: Informix user guide

SQL 을 이용한 질의 방법 SQL 질의 작성 방법 DML 문의 종류 SELECT SELECT 의 예 SQL 실행 경로 확인 INSERT, UPDATE, DELETE Concurrency Control SPL SPL 생성 및 실행 SPL 구문 Trigger

Page 50: Informix user guide

50INFORMIX User Guide

SQL 질의 작성 방법

구문 ( 구문 , 테이블이름 , 컬럼이름등 ..) 은 대 소문자 상관 없다 . 질의의 내용이 아닌 주석의 경우

줄단위로는 “ --”를 이용하고 단락단위로는 “ { }”를 이용한다 .

문자를 입력하거나 , 비교할때에는 인용부호가 필요하다 . 조건의 대상이되는 문자열의 경우 대소문자를 구별한다 .

“CA” ,”ca”, “Ca” 는 모두 다르다 . 한 문장은 “ ;”로 끝난다 .

Page 51: Informix user guide

51INFORMIX User Guide

DML 문의 종류

SELECT 테이블내의 자료를 가져옴 . Row, column 단위

INSERT 테이블내에 새로운 자료를 입력 Row 단위

UPDATE 테이블내의 자료를 갱신 Column 단위

DELETE 테이블내의 자료를 삭제 Row 단위

Page 52: Informix user guide

52INFORMIX User Guide

SELECT

문법

Select 가져올 컬럼 리스트From 테이블 이름Where 가져올 조건Group by 그룹으로 만들 대상 컬럼Having 그룹내의 가져올 조건Order by 정렬 기준 컬럼Into temp 임시테이블의 이름

Page 53: Informix user guide

53INFORMIX User Guide

Select 의 예 (1)

SELECT * FROM customer;Select *From table_name;

S Y N T A XS Y N T A X

Select distinct 컬럼이름From table_name;

S Y N T A XS Y N T A X

테이블의 모든 컬럼을 가져온다 .

테이블의 특정 컬럼중 유일한 값만을 가져 온다 .

SELECT distinct customer_num FROM orders

Page 54: Informix user guide

54INFORMIX User Guide

Select 의 예 (2)

SELECT phone[2,3] FROM customer;

Output :Phone081112

Select column [ first, last ]From table_name;

S Y N T A XS Y N T A X

Select substr(column,first,n)From table_name;

S Y N T A XS Y N T A X

테이블의 특정 컬럼의 first 부터 last까지를 가져온다 .

테이블의 특정 컬럼의 first 부터 n 개의 문자를 가져온다 .

SELECT substr(phone,2,3) FROM customer;

Output :(expression)789822328

Page 55: Informix user guide

55INFORMIX User Guide

Select 의 예 (3) – where 조건 적용

SELECT stock_num, manu_code, unit FROM stock WHERE unit != ‘case’;

stock 테이블 중 unit컬럼 값이 case인 것만

가져온다 .

Select . . .From . . .Where [ 조건 ]

특정 row 를 가져옴 .join 의 조건

S Y N T A XS Y N T A X

SELECT stock_num, manu_code, unit FROM stock WHERE unit != ‘case’;

stock 테이블 중 unit컬럼 값이 case가 아닌 것만 가져온다 .

Page 56: Informix user guide

56INFORMIX User Guide

Select 의 예 (3-1) – where 조건 적용

SELECT * FROM customer WHERE customer_num in (118,114,106);

Select . . .From . . .Where 컬럼 in ( 값 , 값 . . . );

S Y N T A XS Y N T A X

Select . . .From . . .Where 컬럼 between A and B;

S Y N T A XS Y N T A X

테이블의 컬럼이 값들중에 있다면 모두 가져온다 .

테이블의 컬럼이 A 와 B 사이인것을 가져온다 .

SELECT * FROM stock WHERE unit_price between 20.00 and

30.00;

Page 57: Informix user guide

57INFORMIX User Guide

Select 의 예 (3-2) – where 조건 적용

SELECT * FROM customer WHERE address2 is null;

Select . . . From . . . Where 컬럼 is null ;

S Y N T A XS Y N T A X

Select . . . From . . . Where 컬럼 is not null ;

S Y N T A XS Y N T A X

테이블의 컬럼이 null 값인것을 가져온다 .

테이블의 컬럼이 null 값이 아닌것을 가져온다 .

SELECT * FROM customer WHERE address2 is not null;

Page 58: Informix user guide

58INFORMIX User Guide

Select 의 예 (3-3) – where 조건 적용

SELECT * FROM customer WHERE phone[1,3] matches ‘415’;SELECT * FROM customer WHERE company matches ‘*City*’;

Select . . . From . . .Where 컬럼 matches ‘* 값 *’;

S Y N T A XS Y N T A X

Select . . . From . . .Where 컬럼 like ‘% 값 %’;

S Y N T A XS Y N T A X

테이블의 컬럼에 값을 포함한 것을 가져온다 .

테이블의 컬럼에 값을 포함한 것을 가져온다 .

SELECT customer_num , company FROM customer WHERE company like ‘City%’;

Page 59: Informix user guide

59INFORMIX User Guide

Select 의 예 (4) – 정렬

SELECT stock_num, manu_code FROM stock ORDER BY stock_num;

stock 테이블의 row 를 stock_num 순서로 가져온다 .

Select . . .From . . .Order by 컬럼 ;

S Y N T A XS Y N T A X

SELECT stock_num, manu_code FROM stock ORDER BY stock_num desc;

stock 테이블의 row 를 stock_num 내림 순서로 가져온다 .

Page 60: Informix user guide

60INFORMIX User Guide

Select 의 예 (5) – 조건식의 사용

CASEWHEN condition1 THEN result1WHEN condition2 THEN result2. . .ELSE resultnEND

S Y N T A XS Y N T A X

조건에 따라 다른값을 출력한다 .

SELECT title, CASE movie_type WHEN 1 THEN ‘HORROR’ WHEN 2 THEN ‘COMEDY’ WHEN 3 THEN ‘ROMANCE’ WHEN 4 THEN ‘WESTERN’ ELSE ‘UNCLASSIFIED’ END, our_cost FROM movie_titles;

Page 61: Informix user guide

61INFORMIX User Guide

Select 의 예 (5-1) – 조건식의 사용

NVL(value1, value2)

S Y N T A XS Y N T A X

value1 이 null 값이면 value2 를 출력한다 .

SELECT fname, NVL(addr, “Address is missing”) as address FROM employees;

Input :fname addressPeter 3318 RockdalePaul NULL

Output :fname addressPeter 3318 RockdalePaul Address is missing

Page 62: Informix user guide

62INFORMIX User Guide

Select 의 예 (5-2) – 조건식의 사용

DECODE(value1, value2, value3, value4, . . . valuen)

S Y N T A XS Y N T A X

value1 이 value2 이면 value3 을 return 하고 ,value4 이면 value5 를 return 하고 ,아니면 valuen 을 return 한다 .

SELECT DECODE (city, “Menlo Park”, “local”, “Palo Alto”, “Tall Tree”, city) city FROM customer;

Input :cityMenlo Park Santa ClaraPalo AltoSan Francisco

Output :cityLocalSanta ClaraTall TreeSan Francisco

Page 63: Informix user guide

63INFORMIX User Guide

Select 의 예 (6) – function 의 사용

today current

S Y N T A XS Y N T A X

오늘 날짜를 return 한다 .today : 연 ,월 , 일current : 연 ,월 , 일 , 시 , 분 ,초 , 각

CREATE TABLE new_acct ( col1 int, col2 datetime year to day default current year to day );DELETE FROM cust_calls WHERE res_dtime < CURRENT YEAR TO MINUTE;SELECT * FROM orders WHERE DAY(ord_date)<DAY(CURRENT);SELECT * FROM cust_calls WHERE call_dtime BETWEEN ‘1997-1-1 00:00:00’ AND CURRENT;

UPDATE orders SET order_date = TODAY WHERE order_num = 1005;INSERT INTO orders VALUES (0, TODAY, 120, NULL, NULL, NULL);

Page 64: Informix user guide

64INFORMIX User Guide

Select 의 예 (6-1) – Algebraic

ABS ( num_expression )MOD ( dividend, divisor )POW ( base, exponent )ROOT ( radicand, index ) default index:2ROUND ( expr, factor ) default factor:0SQRT ( sqrt_radicand )TRUNC ( expr, factor ) default factor:0

S Y N T A XS Y N T A X

SELECT * FROM orders WHERE ABS(ship_charge) > 20;SELECT MOD(today-mdy(1,1,year(today)),30) FROM orders;SELECT * FROM circle WHERE (3.14 * POW(radius,2)) < 1000;SELECT ROOT(9) FROM square;SELECT ROOT(64,3) FROM cube;SELECT SQRT(9) FROM angles;

Page 65: Informix user guide

65INFORMIX User Guide

Select 의 예 (6-2) – Log,hex,length

EXP (float_expression)LOGN (float_expression)LOG10 (float_expression)HEX (expression)LENGTH(expression)

S Y N T A XS Y N T A X

SELECT EXP(3) FROM angles;SELECT LOGN(population) FROM history ORDER BY date;SELECT LOG10(distance) +1 digits FROM travel; SELECT tabname, HEX(partnum) FROM systables;SELECT HeX(order_num + 1) FROM orders;SELECT LENGTH(fname) + LENGTH(lname), LENGTH(‘How many bytes ?’) FROM customer;

Page 66: Informix user guide

66INFORMIX User Guide

Select 의 예 (6-3) – time

DATE (non_date_expr)DAY (date/datetime_expr)MONTH (date/datetime_expr)WEEKDAY (date/datetime_expr)YEAR (date/datetime_expr)EXTEND (datetime_expr, first to last)MDY (month, day, year)

S Y N T A XS Y N T A X

SELECT * FROM order1. WHERE order_date<DATE(‘12/31/99’);2. WHERE order_date < DATE(365);3. WHERE DAY(order_date) > DAY (CURRENT);SELECT order_num, MONTH(order_date) FROM orders;SELECT * FROM orders WHERE WEEKDAY(paid_date) = WEEKDAY(CURRENT);SELECT order_num FROM orders WHERE YEAR(ship_date) < YEAR(TODAY);Date(365) = 12/31/1899+365day = 12/31/1900

WEEKDAY 는 일요일을 0으로 시작하여 각 요일을 나타낸다 0 : Sunday, 1 : Monday, …

Page 67: Informix user guide

67INFORMIX User Guide

Select 의 예 (6-4) – time

TO_DATE (String [,fmt] )TO_CHAR (String [,fmt] )

S Y N T A XS Y N T A X

SELECT TO_CHAR(begin_date, ‘%A %B %d, %Y %R’) FROM tab1;UPDATE tab1SET begin_date = TO_DATE (“Wednesday February 07, 01 14:17”, “%A %B %d, %Y %R”);

Input :begin_date2001-02-07 14:17

Output :begin_dateWednesday February 07, 01 14:17

%AThe full weekday name as defined in the locale

%BThe full month name as defined in the locale

%dThe day of the month as a decimal number

%Y The year as a 4-digit decimal number

%R The time in 24-hour notation

Page 68: Informix user guide

68INFORMIX User Guide

Select 의 예 (6-5) – trigonometric

COS/SIN/TAN (radian_expr)ASIN/ACOS/ATAN (numeric_expr)ATAN2 (y,x)

S Y N T A XS Y N T A X

SELECT COS(degrees*180/3.14) FROM anglestb1;SELECT SIN(radians) FROM anglestb1;SELECT TAN(radians) FROM anglestb1;SELECT ACOS(-0.73) FROM anglestb1;SELECT ASIN(-0.73) FROM anglestb1;SELECT ATAN(-0.73) FROM anglestb1 WHERE angles > ATAN2(4,5);

Page 69: Informix user guide

69INFORMIX User Guide

Select 의 예 (6-6) – string

TRIM ( source_expr)TRIM ({ LEADING|TRAILING|BOTH } [trim_expr] FROM source_expr)TRIM ( trim_expr FROM source_expr)

S Y N T A XS Y N T A X

SELECT TRIM(c1), TRIM(TRAILING ‘#’ FROM c1), TRIM(LEADING FROM c1) FROM tab;UPDATE c1 = ‘xyz’ FROM tab WHERE LENGTH(TRIM(c1))=5;SELECT c1, TRIM(LEADING ‘#’ FROM TRIM(TRAILING ‘%’ FROM ‘###abc%%%’)) FROM tab;

Page 70: Informix user guide

70INFORMIX User Guide

Select 의 예 (6-7) – string

REPLACE(string,old [,new] )

S Y N T A XS Y N T A X

SELECT REPLACE(‘Mighxzy xzime’,’xz’,’t’) FROM mytable;

Output :(constant)Mighty time

string 의 old 값을 new 로 대체한다 .

Page 71: Informix user guide

71INFORMIX User Guide

Select 의 예 (6-8) – string

LPAD(string,length [,pad] )RPAD(string,length [,pad] )

S Y N T A XS Y N T A X

SELECT LPAD(‘Here we are’,16,’-_’ ) FROM mytable;SELECT RPAD(‘Where are you’,18,’?!’) FROM mytable;

Output :(constant)-_-_-Here we are

(constant)Where are you?!?!?

왼쪽이나 오른쪽에 특정 문자를 채워 Length 만큼의 문자열을 만든다 .

Page 72: Informix user guide

72INFORMIX User Guide

Select 의 예 (6-9) – string

UPPER (column or string)LOWER(column or string)INITCAP (column or string)

S Y N T A XS Y N T A X

SELECT city, LOWER(city), UPPER(city), INITCAP(city) FROM weather WHERE UPPER(city) = “SUNNYVALE”;

Output :citysunnyVale

city (constant) (constant) (constant)sunnyVale sunnyvale SUNNYVALE Sunnyvale

UPPER : 모두 대문자로LOWER : 모두 소문자로INITCAP : 처음 문자만 대문자로

Page 73: Informix user guide

73INFORMIX User Guide

Select 의 예 (6-10) – aggregate

COUNT(*)AVG ( [DISTINCT|UNIQUE] column)MAX ( [DISTINCT|UNIQUE] column)MIN ( [DISTINCT|UNIQUE] column)SUM ( [DISTINCT|UNIQUE] column)COUNT([DISTINCT|UNIQUE] column)RANGE (expr)STDEV (expr)VARIANCE (expr)

S Y N T A XS Y N T A X

SELECT count(*) FROM stock;SELECT sum(total_price) FROM stock;SELECT city,state,count(*) FROM customer GROUP BY city,state;SELECT order_num,sum(total_price) FROM items GROUP BY order_num;

Page 74: Informix user guide

74INFORMIX User Guide

Select 의 예 (7) – group by,having

SELECT . . .FROM . . .GROUP BY 컬럼HAVING 조건 ;

S Y N T A XS Y N T A X

SELECT order_num,sum(total_price)FROM itemsGROUP BY order_numHAVING COUNT(*) > 2;

기준 컬럼에 의해 만들어진 group 안에서 조건을 만족하는 그룹의 결과만을 가져온다 .

Page 75: Informix user guide

75INFORMIX User Guide

Select 의 예 (8) – HINT 의 사용

Optimizer Directive (HINT) 란 ? SQL 을 어떠한 방식으로 실행할 것인가를 결정하는 optimizer 에게 주는 지시자 . Index 의 사용 , join 방법 등을 지정할 수 있다 .

문법 그 줄의 끝까지가 DIRECTIVE 일때

“--+”로 시작 여러 줄 혹은 그 줄의 일부가 DIRECTIVE 일때

{+ }로 묶음

Page 76: Informix user guide

76INFORMIX User Guide

Select 의 예 (8-1) – access method

--+ INDEX ( {table|view|synonym|alias} index[,index] )

S Y N T A XS Y N T A X

SELECT --+ INDEX(e salary_indx) name, salary FROM emp e WHERE e.dno = 1 AND e.salary > 50000;

특정 테이블에 대해 인덱스를 사용하여 질의하도록 함 .

--+ AVOID_INDEX ( {table|view|synonym|alias} index[,index] )

S Y N T A XS Y N T A X

특정 테이블에 대해 인덱스를 사용하지 않도록 질의하도록 함 .

SELECT --+ AVOID_INDEX(e salary_indx) name, salary FROM emp e WHERE e.dno = 1 AND e.salary > 50000;

Page 77: Informix user guide

77INFORMIX User Guide

Select 의 예 (8-2) – access method

--+ FULL ( {table|view|synonym|alias} )

S Y N T A XS Y N T A X

SELECT {+ FULL(e) } name, salary FROM emp e WHERE e.dno = 1 AND e.salary > 50000;

특정 테이블에 대해 full scan 하여 질의하도록 함 .

--+ AVOID_FULL ( {table|view|synonym|alias} )

S Y N T A XS Y N T A X

특정 테이블에 대해 full scan 하지 말고 질의하도록 함 .

SELECT {+ AVOID_FULL(e), INDEX(e salary_indx) } name, salary FROM emp e WHERE e.dno = 1AND e.salary > 50000;

Page 78: Informix user guide

78INFORMIX User Guide

Select 의 예 (8-3) – Join Order

--+ ORDERED

S Y N T A XS Y N T A X

SELECT --+ ORDERED name, title, dept FROM dept, job, emp WHERE title = “clerk” AND emp.dno = dept.dno AND emp.job = job.job;

Join 의 대상 테이블에 대한 Join 의 순서를 from절 다음의 테이블 순서대로 하도록 한다 .

Page 79: Informix user guide

79INFORMIX User Guide

Select 의 예 (8-4) – Join Method

--+ USE_NL( {table|view|synonym|alias} )

S Y N T A XS Y N T A X

Join 에 있어서 Nested Loop Join 방법을 사용한다 .

--+ AVOID_NL( {table|view|synonym|alias} )

S Y N T A XS Y N T A X

Join 에 있어서 Nested Loop Join 을 사용하지 않는다 .

--+ USE_HASH( {table|view|synonym|alias} [/BUILD|/PROBE] )

S Y N T A XS Y N T A X

--+ AVOID_HASH( {table|view|synonym|alias} [/BUILD|/PROBE] )

S Y N T A XS Y N T A X

Join 에 있어서 HASH Join 방법을 사용한다 . Join 에 있어서 HASH Join 방법을 사용하지 않는다 .

Page 80: Informix user guide

80INFORMIX User Guide

Select 의 예 (8-2) – Optimization Goal

--+ FIRST_ROWS--+ ALL_ROWS (default)

S Y N T A XS Y N T A X

Query Optimizer 가 질의를 최적화 할때에 , 그 목적을 처음 몇개의 row 를 빨리 가져올 수 있도록 최적화 하거나 , 전체 row 를 빨리 가져올 수 있도록 최적화 할 것인가를 지정할 수 있다 .

이 방법은 질의의 대상이 전체가 아닌 일부분의 데이터 만을 가져오는 “ first n” 과 함께 사용될때 가장 좋은 성능을 낼 수 있다 ,

SELECT --+ FIRST_ROWS name, age FROM employee e, department d WHERE e.dept_no = d.dept_no;

SET OPTIMIZATION FIRST_ROWS;SELECT ……

OPT_GOAL. 파라매터를 사용하여 최적화 방법을결정할 수 있다OPT_GOAL = -1 : ALL_ROWSOPT_GOAL = 0 : FIRST_ROWS

Page 81: Informix user guide

81INFORMIX User Guide

Select 의 예 (8-2) – First N

SELECT FIRST n

S Y N T A XS Y N T A X

SELECT FIRST 10 name, salary FROM emp ORDER BY salary DESC;

질의의 결과중 처음 n 개의 row 를 가져옴 .

Page 82: Informix user guide

82INFORMIX User Guide

SQL 실행 경로 확인

SQL 구문이 optimizing 된 결과를 볼 수 있다 . Set explain on; 확인하고자 하는 구문들 . . . Set explain off;

UNIX 의 경우 현재 이 구문을 실행한 application 이 실행된 디렉토리 밑에 “sqexplain.out” 이라는 file 에 기록된다 .

NT 의 경우 $INFORMIXDIR/sqexpln 디렉토리 안에 현재 구문을 실행한 “user 이름 .out” 이라는 file 에 기록된다 .

예 >QUERY:------select * from customer

Estimated Cost: 1Estimated # of Rows Returned: 28 1) anchoi.customer: SEQUENTIAL SCAN

Page 83: Informix user guide

83INFORMIX User Guide

INSERT,UPDATE,DELETE

문법 Insert into 테이블 (컬럼이름들 ) values( 값들 );

테이블에 값들을 입력

Update 테이블 set 컬럼 ( 들 ) = 값 where 조건 ; 테이블중 조건에 만족하는 row 의 컬럼을 값으로 갱신

Delete 테이블 Where 조건 ; 테이블에 조건을 만족하는 row 를 삭제

Page 84: Informix user guide

84INFORMIX User Guide

Concurrency Control

DB 는 다수의 사용자에 의해 공유됨 . Read Concurrency - SELECT

4 가지의 isolation level 로 적용 . Dirty Read Committed Read Cursor Stability Repeatable Read

Update Concurrency - INSERT, DELETE, UPDATE Lock 의 크기로 적용

Type of Locking Exclusive Shared Update

Levels of locking Database, Table, Page, Row, Key

Page 85: Informix user guide

85INFORMIX User Guide

Concurrency Control - READ

Dirty Read

기존의 lock 을 check 하지 않고 , Data 를 읽어내림 .이때에 자신도 lock 을 걸지 않고 읽음 .

server processCommitted Read

자신이 lock 을 걸수 있는지 check 하고 읽어내림 .그러나 자신은 lock 을 걸지 않음 .

server process

Can lock be acquired?

Cursor Stability

Cursor 가 현재 fetch 하고 있는 row 에 대해Lock 을 걸고 , 다음 row 를 fetch 할때에 Lock 을 해제함 .

server processRepeatable Read

자신의 process 가 질의에서 참조하고 있는 모든 row 에 대해 lock 을 걸고 작업함 .

server process

Locks put onall rows examined

Shared lockplaced on row

Page 86: Informix user guide

86INFORMIX User Guide

Concurrency Control - READ

Isolation level 의 적용 DB 의 형태 별 default 가 존재 한다 .

NO Logging DB : Dirty Read Logging DB : Committed Read ANSI DB : Repeatable Read

따라서 default 이외로 변경시에는 다음의 구문으로 적용하여야 한다 . 해당 세션에만 적용된다 .

구문Set Isolation To Dirty Read;Set Isolation To Committed Read;Set Isolation To Cursor Stability;Set Isolation To Repeatable Read;

Page 87: Informix user guide

87INFORMIX User Guide

Concurrency Control - UPDATE

Database Level Locking

database stores exclusive;

stores

Table Level Locking

lock table customer in share mode;

customer

lock table customer in exclusive mode;

customer

update deleteinsert

select select

set isolationto dirty read

다른 사용자는 데이터베이스에 접근할 수 없다

Page 88: Informix user guide

88INFORMIX User Guide

Concurrency Control - Lock Mode

다른 사용자에 의해 lock 이 걸려 있는 자료에 접근할때에는 default 로 기다리지 않고 error 를 return.Set Lock Mode to Wait ;Set Lock Mode to Not Wait ;Set Lock Mode to Wait 20 ;

set lock mode to wait 20

set lock mode to not waitset lock mode to wait

lock 이 해제될때까지무한정 기다림

lock 이 해제될때까지 20 초 동안 기다림

lock 이 해제될때까지 기다리지 않고 즉시 에러를 리턴함

Page 89: Informix user guide

89INFORMIX User Guide

Concurrency Control - Page/Row

테이블 생성 시 default lock mode 는 page 단위create table row_lock_table (

id char(20),name char(20)

) lock mode row;alter table page_lock_table lock mode (page);page

page

modify

access

modify

Page 90: Informix user guide

90INFORMIX User Guide

SPL

Stored Procedure Language Stored procedure 를 작성하는 데 사용됨 . Stored procedure

DB 내에 저장된 SQL 문들과 , SPL 로 작성된 구문의 묶음 . 주로 business logic 을 DB 에 저장하는 용도로 사용됨 . SQL 문은 미리 parsing 되고 optimize 된 상태로 해당 DB 의 시스템 카타로그 테이블 (sysprocedures, sysprocbody, sysprocplan, sysprocauth) 에 저장됨 .

Page 91: Informix user guide

91INFORMIX User Guide

SPL - 간단한 예제

작성

create procedure test_proc(name varchar(10))insert into test_tab values(name);

end procedure;

실행execute procedure test_proc(“anna”);

Stored procedure 의 이름 매개 변수의 이름

매개 변수로 넘어 온 값을 test_tab 이라는 table 에 insert 하라는 구문

매개 변수의 type

Page 92: Informix user guide

92INFORMIX User Guide

SPL - 코드 내용 보기

DBSCHEMA utilitydbschema -d <dbname> -f <procedure 이름 > sql.sqldbschema -d <dbname> -f all spl.sql

System Catalog Tableselect data from sysprocedures d, sysprocbody b where datakey = “T” and d.procname = “procedure 이름” and d.procid = b.procid

Page 93: Informix user guide

93INFORMIX User Guide

SPL 생성 및 실행 - 기본구조

기본구조

create procedure raise_prices (per_cent int)update stock -- increase by percentage set unit_price = unit_price + (unit_price * (per_cent / 100 ) );

end proceduredocument “usage : execute procedure raise_prices (xxx) “, “xxx = percentage from 1 – 100 “

with listing in “warn_file”;

execute procedure raise_prices (5);execute procedure db@servername:raise_prices(5)

Stored procedure 의 이름 매개변수 문장 블럭 (statement block)

주석 (comment)

document 절은 생략 가능

컴파일 warning 저장

Page 94: Informix user guide

94INFORMIX User Guide

SPL 생성 및 실행 - 매개변수와 리턴값

create procedure delete_order (p_order_num int default null )returning int, int;define item_count int;select count(*) into item_count from items

where order_num=p_order_num;delete from items where order_num = p_order_num;delete from orders where order_num = p_order_num;returning p_order_num, item_count;

end procedure; DBACCESS

execute procedure delete_order (1001) ; ESQL/C

EXEC SQL execute procedure delete_order(:p_order_num) into :p_order_num, :p_item_count;

default 값

매개변수

두 개의 정수 반환 예정

두 개의 정수 변수 반환

Page 95: Informix user guide

95INFORMIX User Guide

SPL 생성 및 실행 - 커서사용

SPLcreate procedure get_items()

returning integer, char(3), integer;define p_stock_no integer;define p_manu_code char(3);define p_quantity integer;foreach

select stock_num, manu_code, quantityinto p_stock_no, p_manu_code, p_quantityfrom itemsreturn p_stock_no, p_manu_code, p_quantity with resume;

end foreach;end procedure;

EXEC SQL declare geti cursor for execute procedure get_items();EXEC SQL open getiwhile(1) { EXEC SQL fetch geti into :p_num, :p_code, :p_qty; if (sqlca.sqlcode == 100) break;}EXEC SQL close geti;

EXEC SQL declare geti cursor for execute procedure get_items();EXEC SQL open getiwhile(1) { EXEC SQL fetch geti into :p_num, :p_code, :p_qty; if (sqlca.sqlcode == 100) break;}EXEC SQL close geti;

ESQL/CESQL/CESQL/CESQL/C

foreach 문안에서 계속 리턴값을 반환하도록 한다

커서 사용

Page 96: Informix user guide

96INFORMIX User Guide

SPL 생성 및 실행 - 호출 / 제거

SQL 문에서 호출select * from orders where order_num = get_biggest_order(114);insert into old_orders execute procedure get_orders(114);

SPL 에서 호출create procedure give_disconnect (p_customer_num integer)

define p_order_num integer;call get_biggest_order (p_customer_num ) returning p_order_num;:

end procedure SPL 제거

drop procedure get_biggest_order;

Page 97: Informix user guide

97INFORMIX User Guide

SPL 구문 - 변수

SPL 내부에서 변수 선언 define p_order_date date; define p_customer_num like orders.customer_num; define global global_bar integer default 1; define blob_var references text;

변수값 할당 let c = 10; let d = 5; let p_order_date = today; let a,b = 10,c+d; let a,b = (select col_a, col_b from tab1 where col_c=10); let a = proc_name(); let a = c || d;

유효한 데이터베이스 자료형

명시한 테이블 컬럼의 자료형

세션 안에서 전역값을 가진다 BLOB 자료형

Page 98: Informix user guide

98INFORMIX User Guide

SPL 구문 - 조건식

구문IF 조건식 THEN 문장 1 ELIF 조건식 THEN 문장 2 ELSE 문장 3END IF

조건식의 예if exists (select order_num from orders where order_num = 1023)

then:

end ifif p_total_price > all (select total_price from items where order_num = 1023) then

:

end ifif p_customer_name matches “A*” then

:

end if

Page 99: Informix user guide

99INFORMIX User Guide

SPL 구문 - 루프

FOREACHforeach select ship_charge into p_ship_charge from orders

:

end foreach; WHILE

while i < nbr_rowsinsert into test_tab values ( i );let i = i + 1;

end while FOR

for i = 1 to 10 step 2:

end forfor i in (1,5,10,15) … end forfor i in (1 to 20 step 5, 20 to 1 step –5, 1,2,3,4,5) … end for

※ 루프 제어for i = 1 to 10 if i = 5 then continue for; elif i = 8 then exit for; end ifend for;

※ 루프 제어for i = 1 to 10 if i = 5 then continue for; elif i = 8 then exit for; end ifend for;

Page 100: Informix user guide

100INFORMIX User Guide

SPL 구문 – dbinfo 사용

serial 값 반환define ser int;insert into orders (order_num, order_date, customer_num) values (0, “04/01/99”, 102);let ser = dbinfo(“sqlca.sqlerrd1”);

처리된 행의 수 반환define num_rows int;delete from orders where customer_num = 104;let num_rows = dbinfo(“sqlca.sqlerrd2”);

Page 101: Informix user guide

101INFORMIX User Guide

SPL 구문 - 기타

업데이트 커서define p_ship_date date;begin work;foreach cur1 for

select ship_date into p_ship_date from orders where order_date < today - 100if p_ship_date is not null then delete from orders where current of cur1;end if

end foreach;commit work;

OS 명령어 호출system “echo ““Delete Operation Completed”” | mail judy” ;system “mail –s violation ” || usr1 || “ ” || usr2 || “< vio.file”;

업데이트 커서의 이름을 명시해야 한다

현재 커서가 오픈하고 있는 행

업데이트 된 행의 lock 해제

Page 102: Informix user guide

102INFORMIX User Guide

Trigger

트리거 (Trigger) 는 어떠한 이벤트가 발생했을때 자동적으로 SQL 문을 실행하도록 하는 데이터베이스 메커니즘

트리거 이벤트 (event) 는 특정 테이블에 대해 INSERT, UPDATE, DELETE 와 같은 SQL 문

트리거 액션 (action) 은 INSERT, UPDATE, DELETE 및 EXECUTE PROCEDURE 문

Trigger

CreateTrigger

Triggername

Triggerevent

Triggeraction

correlationname

Page 103: Informix user guide

103INFORMIX User Guide

Trigger - Event / Action

트리거 이벤트 (event) INSERT ON 테이블이름 DELETE ON 테이블이름 UPDATE ON 테이블이름 UPDATE OF 컬럼이름 ON 테이블이름

트리거 액션 (action) BEFORE ( SQL 문 ) FOR EACH ROW ( SQL 문 ) AFTER ( SQL 문 )

예제create trigger test1 update on orders

before (execute procedure check_permission())for each row (execute procedure log_chg())after (execute procedure log_total());

106

106

update orders set ship_instruct = “express”where customer_num = 106;

update orders set ship_instruct = “express”where customer_num = 106;

event

execute check_permissionupdate 1 rowexecute log_chgupdate 1 rowexecute log_chgexecute log_total

execute check_permissionupdate 1 rowexecute log_chgupdate 1 rowexecute log_chgexecute log_total

action

Page 104: Informix user guide

104INFORMIX User Guide

Trigger - referencing

트리거 동작 전 ,후의 값을 구분하기 위하여 correlation name 을 부여 NEW, OLD 는 키워드로 DELETE 이벤트에서는 NEW 가 사용 될 수 없고 ,

INSERT 이벤트에서는 OLD 가 사용 될 수 없다 . 예제

create trigger items_upd update of total_price on itemsreferencing new as post old as prefor each row

(update orders set order_price = order_price + post.total_price = pre.total_price

where order_num = post.order_num );

Page 105: Informix user guide

105INFORMIX User Guide

Trigger - when

트리거 이벤트가 발생되었을때 WHEN절에 조건이 만족하는지 먼저 검사한 후 조건이 맞을 때에 트리거 액션이 동작한다 .

예제create trigger ins_cust_calls insert on cust_calls

referencing new as postfor each row when (post.call_code = “B”)

( insert into warn_billing values (post.customer_num) );

Page 106: Informix user guide

DB admin 작업 DB admin 작업이란 DB 의 생성 Table 의 생성 Table 의 분할 보안의 설정 데이터 무결성 보장 인덱스의 생성 질의 수행을 최적화 해주기 위한 작업 Data Migration

Page 107: Informix user guide

107INFORMIX User Guide

DB admin 작업이란

DB admin 작업이란 ? DB 와 관련된 사항을 결정하고 , 변경하는 작업 DB 나 table 을 생성하는 작업 보안을 적용하는 작업 데이터의 무결성을 보장하는 작업 동시 사용자에 관한 제어 인덱스와 관련된 작업 질의 수행을 최적화해 주는 작업 Data migration

Page 108: Informix user guide

108INFORMIX User Guide

DB 의 생성

DB 의 생성시 다음의 사항을 고려해야 한다 . DB 를 물리적으로 어느 위치에 둘 것인가

DB 가 위치할 dbspace 를 지정함 . DB 는 어떤 형태로 만들것인가

DB 에 대한 logging 작업을 할 것인가를 결정

create database <DB 이름 > in <DB 를 저장할 dbspace 이름 > default: rootdbswith <DB 의 logging 모드 >; default : no logging

예 > create database test_db in dbspace1 with log;create database test_db with log;create database test_db in dbspace1 ;create database test_db in dbspace1 with buffered log;

Page 109: Informix user guide

109INFORMIX User Guide

Table 의 생성

Table 생성시 다음의 사항을 고려해야 한다 . 컬럼에는 어떤 자료형을 사용할 것인가 테이블에 대해 분할 할 것인가 테이블의 위치 얼마만큼의 디스크 공간을 할당할 것인가 테이블에 대한 lock 모드

create table <테이블이름 >( 컬럼이름 컬럼자료형 )in <dbspace 이름 > or < 분할 방법및 위치 >extent size <초기에 할당할 영역 크기 K 단위 : default 는 8page>next size <증가분에 할당할 영역 크기 K 단위 : default 는 8page>lock mode <row or page : default 는 page>;

Page 110: Informix user guide

110INFORMIX User Guide

Table 의 분할

한 테이블의 데이터를 여러 dbspace 에 분할한다 병렬적으로 데이터를 입출력 할 수 있다 입출력의 부하를 균등하게 조절할 수 있다 데이터의 가용성을 향상 시킨다 다양한 기준으로 데이터를 분할할 수 있다

fragment1

fragment2

fragment3

scan thread

scan thread

scan thread

table

병렬

스캔

입출력 부하 분산

Page 111: Informix user guide

111INFORMIX User Guide

Table 의 분할 - round robin

create table roundtable (col_1 serial,col_2 char(20),:

) fragment by round robin in dbspace1, dbspace2, dbspace3extent size 10000 next size 3000 ;

dbspace1 dbspace2 dbspace3

insert into roundtable(col_1, col_2) values (0, ‘aabb’);insert into roundtable(col_1, col_2) values (0, ‘aabb’);insert into roundtable(col_1, col_2) values (0, ‘aabb’);insert into roundtable(col_1, col_2) values (0, ‘aabb’);insert into roundtable(col_1, col_2) values (0, ‘aabb’);insert into roundtable(col_1, col_2) values (0, ‘aabb’);

Page 112: Informix user guide

112INFORMIX User Guide

Table 의 분할 - Expression

create table exprtable (col_1 serial,col_2 char(20),:

) fragment by expression

col_1 <= 100 and col_1 >= 1 in dbspace1,col_1 <= 200 and col_1 > 100 in dbspace2,remainder in dbspace3 ;

dbspace1 dbspace2 dbspace3

insert into exprtable(col_1) values (50);insert into exprtable(col_1) values (700);insert into exprtable(col_1) values (120);

Page 113: Informix user guide

113INFORMIX User Guide

Table 의 분할 - hash

create table exprtable (col_1 serial,col_2 char(20),:

) fragment by expression

mod (col_1, 3) = 0 in dbspace1,mod (col_1, 3) = 1 in dbspace2,mod (col_1, 3) = 2 in dbspace3 ;

dbspace1 dbspace2 dbspace3

insert into exprtable(col_1) values (17);insert into exprtable(col_1) values (34);insert into exprtable(col_1) values (66);

Page 114: Informix user guide

114INFORMIX User Guide

Table 의 분할 - guidelines

가급적 remainder 절을 쓰지 않도록 expression 을 만든다 여러 디스크에 I/O 를 분산할 수 있도록 고려한다 expression 은 가능한한 단순한 형태여야 한다 expression 에서 가장 제한적인 조건이 먼저 나올 수 있도록 한다 데이터의 변환이 필요한 expression 은 피한다 데이터 로드 및 전체 조회가 주된 목적이라면 round robin 을 사용한다 인덱스 또한 fragment 구문에 의해 분할 될 수 있지만 , 가급적 별도의

dbspace 에 fragment 되지 않은 형태 (detached index) 로 생성한다create index idx_roundtable on roundtable(col_1) in dbspace4;

테이블 분할에 의한 이득이 그다지 많지 않다면 분할하지 않는다

Page 115: Informix user guide

115INFORMIX User Guide

보안의 설정

보안의 적용 방법 권한 제한 View 의 사용 Role 의 사용

권한의 종류 DB level : DBA,RESOURCE,CONNECT Table,Column level : SELECT,INSERT,UPDATE,DELETE,ALTER…

Page 116: Informix user guide

116INFORMIX User Guide

보안의 설정 - 권한 제한

권한 설정 방법 GRANT 권한이름 <on 테이블이름 (컬럼이름 )> to user 이름 ; REVOKE 권한이름 <on 테이블이름 > from user 이름 ; Table 의 경우 일단 모든 권한을 뺏고 하나하나 설정한다 .

예GRANT DBA to user1;GRANT CONNECT to user2;REVOKE ALL ON tab1 from PUBLIC;GRANT SELECT ON tab1 to user2;GRANT DELETE,UPDATE,INSERT on tab1 to user1;GRANT SELECT(col1,col2) on tab2 to user2;

Page 117: Informix user guide

117INFORMIX User Guide

보안의 설정 - view 의 사용

View 는 테이블의 일부 혹은 계산된 값등에 설정될 수 있다 . 예

create view cust_seoul asselect * from customer where city=‘ 서울’ ;

create view big_order_won asselect total_price*1200 from orders where total_price > 10000;

create view detail_info_cust asselect company, order_num,total_price from customer,orders where customer.customer_num=orders.customer_num;

Page 118: Informix user guide

118INFORMIX User Guide

보안의 설정 - role 의 사용

Role 이란 , 사용자의 그룹 권한의 제한이 , 개인별로가 아닌 그룹별로 해야할 필요가 있을때에 쓰임 .

개인은 개인의 권한으로의 작업도 가능하고 , role 의 일원으로서의 작업도 가능하다

예Create role marketing;Create role sales;Grant marketing to user1,user2;Grant sales to user3,user4;

만일 user1 이 marketing role 로서 작업하려면 다음 구문을 실행해야 함 .Set role marketing;

Page 119: Informix user guide

119INFORMIX User Guide

데이터 무결성의 보장 (1)

데이터값에 대한 속성을 제한자 (constraint) 를 통해 적용 . 종류

Primary Key Foreign key CHECK UNIQUE NOT NULL

Page 120: Informix user guide

120INFORMIX User Guide

데이터 무결성의 보장 (2)

Constraint 의 이름은 자동적으로 부여 될 수 있지만 , 직접 명시할 수도 있다CREATE TABLE orders (

order_num integer UNIQUE CONSTRAINT order_num_uq,order_date date NOT NULL CONSTRAINT order_num_nn DEFAULT TODAY);

ALTER TABLE orders MODIFY order_num integer NOT NULL CONSTRAINT order_num_nn;

Constraint 는 컬럼 단위 또는 테이블 단위로 정의할 수 있는데 , 다른 컬럼에 대한 정의가 포함될 경우는 테이블 단위로 정의해야만 한다

-- 테이블 단위ALTER TABLE items ADD CONSTRAINT CHECK (quantity >= 1);-- 컬럼 단위ALTER TABLE items MODIFY quantity smallint CHECK (quantity >= 1);-- 컬럼 단위는 다른 컬럼을 사용할 수 없다 .ALTER TABLE orders MODIFY paid_date date CHECK (paid_date >

ship_date);##676: Invalid check constraint column.

Page 121: Informix user guide

121INFORMIX User Guide

데이터 무결성의 보장 (3)

Referential Constraint 의 종류 Cyclic referential constraints

Self referential constraints

Multiple path constraints

Primary / Foreign Key 규칙 Primary key 는 자동적으로 unique index 역할을 하게 된다 Foreign key 컬럼값은 Primary key 에 값이 있어야 입력 , 수정 할 수 있다 Foreign Key 값이 있는 상태에서 Primary Key 값을 삭제 , 수정 할 수 없다

parent parent child child

parent parent

parent parent child child

child child

Page 122: Informix user guide

122INFORMIX User Guide

데이터 무결성의 보장 (4)

Cyclic referential constraintscreate table customer (

customer_num serial,fname char(20),primary key (customer_num) constraint pk_cnum );

create table orders (order_num serial,customer_num integer,foreign key (customer_num) references customer constraint fk_cnum);

Self referential constrainscreate table emp (

enum serial,mnum integer,primary key (enum) constraint pk_enum,foreign key (mnum) references emp(enum) constraint fk_enum) ;

customer_num

fname

customercustomerorder_num

ordersorders

customer_num

enum

mnum

empemp

Page 123: Informix user guide

123INFORMIX User Guide

데이터 무결성의 보장 (5)

Multiple path referential constraintscreate table stock (

stock_num smallint,manu_code char(3),primary key (stock_num, manu_code) constraint pk_stock);

create table items (item_num smallint,stock_num smallint,manu_code char(3),foreign key (stock_num, manu_code) references stock constraints fk1_stock);

create table catalog (catalog_num serial,stock_num smallint,manu_code char(3),foreign key (stock_num, manu_code) references stock constraints fk2_stock);

stock_num

stockstock

item_num

itemsitems

stock_num

manu_code

manu_code

catalog_num

catalogcatalog

stock_num

manu_code

Page 124: Informix user guide

124INFORMIX User Guide

인덱스의 생성

테이블에 대해 빠른 접근을 위해 사용 OLTP 업무의 경우 인덱스의 생성은 매우 중요함 . 다음에 해당되는 컬럼에 생성하는 것이 좋음 .

조인의 대상이 되는 컬럼 조건 비교의 대상이 되는 컬럼 정렬의 기준이 되는 컬럼

Create index < 인덱스이름 > on 테이블이름 (컬럼이름 ) In < 인덱스를 저장할 위치 >;

예create unique index idx_cust on customer(customer_num) in dbspace1;create index idx_stock on stock (stock_num, manu_code) ;

Page 125: Informix user guide

125INFORMIX User Guide

질의 수행을 최적화 해주기 위한 작업

서버로 전달된 모든 질의는 다음의 과정을 거침

질의 수행 경로를 결정하는데 참조하는 데이터는 system catalog 의 정보를 기반으로 함 .

질의 수행 경로를 결정하는 데 영향을 미치는 요인 인덱스 유무 , 데이터의 양 , 데이터 분포도 등 ..

따라서 , 현재상황의 데이터에 관한 정확한 정보를 제공하여야 , 최적의 질의를 수행할 수 있음 .

ParsingParsing OptimizingOptimizing ExecutingExecuting

유효성 , 문법 등을 체크 최적화된 질의 수행의경로를 결정

실행

Page 126: Informix user guide

126INFORMIX User Guide

질의 수행을 최적화 해주기 위한 작업

Update statistics System catalog 의 데이터 관련 통계자료를 갱신 데이터에 대한 분포도를 만들어줌 .

Mode 의 종류 Low

system catalog 의 통계정보만 갱신 Medium

통계정보 갱신과 함께 , 데이터 분포도를 만듬 . 이때 , 표본 추출에 의해 분포도를 만듬 . High

medium 과 같으나 , 표본추출이 아닌 전체 데이터를 가지고 분포도를 만듬 .

Page 127: Informix user guide

127INFORMIX User Guide

질의 수행을 최적화 해주기 위한 작업

언제 수행하여야 하나 ? 대량의 데이터 변경시에는 반드시 해주어야 한다 .

Bulk Data loading후 , bulk update등 .. 시스템 유휴 시간대에 정기적으로 해주어도 좋다 .

구문 Update statistics [low|medium|high] ; Update statistics [low|medium|high] for table; Update statistics [low|medium|high] for table 테이블이름 ; Update statistics [low|medium|high] for table 테이블이름 (컬럼이름 );

Page 128: Informix user guide

128INFORMIX User Guide

Data Migration

DB 혹은 table 을 file 로 내릴 필요가 있을때 사용 . Data Backup 의 하나의 방법으로도 사용 가능 서로 다른 기종의 machine 에 있는 서버로 데이터를 옮기고자 할때 유용 . Data 를 기존의 table 에 append 할때에 유용 . 사용 용도나 , 제공되는 기능에 따라 다양한 tool, 구문을 제공 .

Page 129: Informix user guide

129INFORMIX User Guide

Data Migration - Unloading

종류 UNLOAD 구문

SQL 구문이므로 사용하기 쉽고 , 원하는 조건에 따라 내려 받을 수 있다 . UNLOAD to ‘ 파일이름’ select * from customer;

ONUNLOAD DB담위 , table 단위 가능 Binary 형태로 받음 .

onunload –t /dev/rmt0 DB 이름

DBEXPORT DB 단위의 작업 지원 : DB 단위작업에 가장 많이 사용 Ascii 형태로 받음 .

dbexport DB 이름

ONPLOAD HPL(High Performance Loader) 을 구성하는 process 많은 양의 데이터에 대해 가장 좋은 성능을 냄 .

Page 130: Informix user guide

130INFORMIX User Guide

Data Migration - Loading

종류 LOAD 구문

SQL 구문이므로 사용하기 쉽고 , 원하는 조건에 따라 내려 받을 수 있다 . LOAD from ‘ 파일이름’ insert into customer;

ONLOAD DB담위 , table 단위 가능 Binary 형태로 받음 .

onload –t /dev/rmt0 DB 이름

DBIMPORT DB 단위의 작업 지원 : DB 단위작업에 가장 많이 사용 Ascii 형태로 받음 .

dbimport DB 이름

ONPLOAD HPL(High Performance Loader) 을 구성하는 process 많은 양의 데이터에 대해 가장 좋은 성능을 냄 .

Page 131: Informix user guide

ESQL/C 를 이용한 프로그래밍 ESQL/C 란 ESQL/C 의 사용 ESQL/C 프로그램 작성 규칙 ESQL/C 프로그램 compile ESQL/C 프로그램 작성 예제 호스트변수 (Host Variables) 데이터베이스 연결 SQLCA 구조체 EXCEPTION 테스트 GET DIAGNOSTICS 사용 prepare 를 사용한 단순 DML 처리 Indicator 사용 커서 (Cursors)

Page 132: Informix user guide

132INFORMIX User Guide

ESQL/C 란

C 프로그램 내에 sql 구문을 바로 넣어 그 실행 결과를 프로그램에서 다양하게 사용할 수 있도록 제공되는 어플리케이션 개발 tool

ESQL/C 의 주된 component 는 preprocessor 로서 ESQL/C code 를 C code 로 변환하여 C compiler 에게 넘겨준다 .

Page 133: Informix user guide

133INFORMIX User Guide

ESQL/C 의 사용

다음의 환경변수를 설정해야 한다 . INFORMIXDIR

ESQL/C 설치 디렉토리 PATH

ESQL/C 실행 파일의 위치를 추가 LD_LIBRARY_PATH

Library 의 위치 INFORMIXC

CC 컴파일러 외의 다른 컴파일러를 사용하고자 할 때

예export INFORMIXDIR=/usr/informixexport PATH=$PATH:$INFORMIXDIR/binexport LD_LIBRARY_PATH=$INFORMIXDIR/lib:$INFORMIXDIR/lib/esqlexport INFORMIXC=gcc

Page 134: Informix user guide

134INFORMIX User Guide

ESQL/C 프로그램 작성 규칙

ESQL/C preprocessor 가 다른 C code 와 구별할 수 있게 하기 위해 SQL은 “ $” 혹은 “ exec sql” 으로 시작

SQL 구문의 끝에는 “ ;”를 붙임 . SQL 구문 안의 변수 (host 변수라 부름 ) 는 변수 이름 앞에 “ :”를 붙임 . 주석은 표준 C 의 주석인 “ /* */”사용

Page 135: Informix user guide

135INFORMIX User Guide

ESQL/C 프로그램 compile (1)

Esql 의 option 은 다양하므로 각 경우에 따라 다양하게 사용 esql [-e] [preprocessor 옵션 ] [cc 매개변수 ] [-o 실행파일 ] 소스 .ec [

링크옵션 ] 예 >

ESQL/C 로 작성된 customer.ec file 을 customer 라는 이름의 실행파일로 만들고자 한다면

esql -o customer customer.ec

esql customer.ec file.c -l mylib -o customer -static

customercustomercustomer.eccustomer.ec customer. ccustomer. c customer. ocustomer. o

esql preprocess c compile

standard librarystandard library esql/c libraryesql/c library

customercustomercustomer.eccustomer.ec customer. ccustomer. c customer. ocustomer. o

esql preprocess c compile

file. ofile. ofile.cfile.c mylibmylib

-static 옵션

-shared 옵션이 default 값

Page 136: Informix user guide

136INFORMIX User Guide

ESQL/C 프로그램 compile (2)

include 에 지정된 파일을 찾는 순서 현재 디렉토리 컴파일시 -I 옵션으로 지정한 디렉토리 $INFORMIXDIR/incl/esql /usr/include

다음과 같은 preprocessor 구문을 사용할 수 있다 define, undef ifdef, elseif, else, endif, ifndef 예제

EXEC SQL define USERTRANSACTIONS;EXEC SQL ifdef USERTRANSACTIONS;EXEC SQL begin work;EXEC SQL endif;

# include <stdio.h>EXEC SQL include pgm_global.h;EXEC SQL “filename” main (){ …}

# include <stdio.h>EXEC SQL include pgm_global.h;EXEC SQL “filename” main (){ …}

myfile.ecmyfile.ec

EXEC SQL include sqlca;EXEC SQL begin declare section;int customer_num;long drop_date;EXEC SQL end declare section;

EXEC SQL include sqlca;EXEC SQL begin declare section;int customer_num;long drop_date;EXEC SQL end declare section;

pgm_global.hpgm_global.h

Page 137: Informix user guide

137INFORMIX User Guide

ESQL/C 프로그램 작성 예제

#include <stdio.h>exec sql include sqlca;main(int argc,char **argv){

exec sql begin declare section;char dbname[19];exec sql end declare section;printf(“Enter name of database : “);gets(dbname);exec sql database :dbname;if (SQLCODE == 0)

printf(“Database %s is now open.\n”,dbname);else

printf(“Error %ld opening database\n”,SQLCODE);exit(0);

}

Page 138: Informix user guide

138INFORMIX User Guide

호스트변수 (Host Variables) (1)

호스트 변수 : SQL 데이터를 저장하는 C 변수 대소문자 구분 SQL 문장안에서 컬럼명과 구분하기 위하여 호스트변수 앞에 : 기호 사용 선언

달러 기호 사용$ CHAR *desc;

EXEC SQL 키워드 사용EXEC SQL begin declare section;char *desc;EXEC SQL end declare section;

사용 SQL 문 내에서

EXEC SQL update customer set zipcode = :zipcode ; C 구문 안에서

gets (dbname);EXEC SQL database :dbname;

Page 139: Informix user guide

139INFORMIX User Guide

호스트변수 (Host Variables) (2)

C 의 변수 선언과 유사 사용자 정의

typedef short smallint;typedef long date;smallint stocknum;date orderdate;

구조체struct stock_t {

short stocknum;char manucode[4];

} stockrec1;struct stock_t stockrec2;

배열char *buf[6];static long unit[6] = {0,0,0,0,0,0}

simple types

SQL C

char(n) character(n) smallint integer int smallfloat real float double precision serial date

char [ n + 1 ]char *short int long int

float

double

long int long int

decimal dec numeric money datetime interval varchar

dec_t or struct decimal

dtime_t or struct dtime intrvl_t or sturct intrvl varchar or string

non-simple types

Page 140: Informix user guide

140INFORMIX User Guide

호스트변수 (Host Variables) (3)

external 이나 static 으로 선언하지 않은 경우 자동적으로 local 범위

function parameter 로 사용될 때의 예제 선언

EXEC SQL begin declare section;char *col;EXEC SQL end declare section;

함수int foo (col)EXEC SQL begin declare section;parameter char *col;EXEC SQL end declare section;{ :}

$ extern short StockNumS ;

func1() $ double StockNumS ;

$ {$ long StockNumS ; :$ }

func2() {$ insert into stock … values ($StockNumS); :}

Page 141: Informix user guide

141INFORMIX User Guide

데이터베이스 연결 (1)

ESQL/C 6.0 이전의 구문 ( 현재 버전에서도 사용가능하지만 , 권장 사항 아님 ) DATABASE 데이터베이스명 CLOSE DATABASE

ESQL/C 6.0 이후 구문 CONNECT TO 데이터베이스명 DISCONNECT ALL

CONNECT 구문의 옵션 Connection 이름

EXEC SQL CONNECT TO ‘stores@munish’ AS ‘munich_con’ ; User 절

EXEC SQL CONNECT TO ‘stores@munish’ USER :uid USING :passwd ; Default 절 ( 데이터베이스를 오픈하지 않고 서버에 연결 )

EXEC SQL CONNECT TO DEFAULT ; Default절 사용 후 다음과 같은 문장이 필요

DATABASE CREATE DATABASE START DATABASE

Page 142: Informix user guide

142INFORMIX User Guide

데이터베이스 연결 (2)

연결 전환 (switching) 구문

EXEC SQL SET CONNECTION ‘munish_con’ ;EXEC SQL SET CONNECTION :connect_id ;EXEC SQL SET CONNECTION DEFAULT;

connection 이름을 가지고 연결해야 switch 할 때 사용할 수 있다 connection 이 전환될 때 기존의 모든 트랜잭션은 먼저 commit 된다 현재 트랜잭션을 유지한 상태에서 connection 을 전환하려면 WITH

CONCURRENT TRANSACTION 구문을 사용하여 먼저 연결하여야 한다 .EXEC SQL CONNECT TO :db_connect AS :connect_id WITH CONCURRENT

TRANSACTION

연결 종료 (disconnecting) 열린 데이터베이스를 닫고 connection 을 종료한다

EXEC SQL DISCONNECT :connect_id ;EXEC SQL DISCONNECT CURRENT ;EXEC SQL DISCONNECT DEFAULT ; EXEC SQL DISCONNECT ALL ;

default 로 connect했거나 connection 이 하나 일 경우 DEFAULT 사용

Page 143: Informix user guide

143INFORMIX User Guide

SQLCA 구조체

SQL 문을 실행한 후 서버에서 SQLCA 라 불리는 영역에 feedback 정보를 남긴다 errors performance warnings

SQLCODE 는 sqlca.sqlcode 값과 같다 SQLCODE < 0 : 에러 코드 값 SQLCODE = 0 : 정상적 처리 SQLCODE = 100 : SQLNOTFOUND, 찾는 행이 없음 SQLCODE = 1~99 : Dynamic SQL

에러 메시지를 얻기 위한 함수 rgetmsg, rgetlmsg

char msg1[512], msg2[512];if (SQLCODE) /* SQL 에러 */

rgetmsg(SQLCODE, msg1, sizeof(msg1) );if (sqlca.sqlerrd[1]) /* ISAM 에러 */

rgetmsg( (short)sqlca.sqlerrd[1], msg2, sizeof(msg2) );printf (“%ld : %s \n %ld : %s\n”,SQLCODE, msg1, sqlca.sqlerrd[1], msg2);

struct sqlca_s { long sqlcode ; char sqlerrm[72] ; char sqlerrp[8] ; long sqlerrd[6] ; struct sqlcaw_s { char sqlwarn0 ; char sqlwarn0 ; char sqlwarn0 ; char sqlwarn0 ; char sqlwarn0 ; char sqlwarn0 ; char sqlwarn0 ; char sqlwarn0 ; } sqlwarn ;} ;extern struct sqlca_s sqlca;

struct sqlca_s { long sqlcode ; char sqlerrm[72] ; char sqlerrp[8] ; long sqlerrd[6] ; struct sqlcaw_s { char sqlwarn0 ; char sqlwarn0 ; char sqlwarn0 ; char sqlwarn0 ; char sqlwarn0 ; char sqlwarn0 ; char sqlwarn0 ; char sqlwarn0 ; } sqlwarn ;} ;extern struct sqlca_s sqlca;

Page 144: Informix user guide

144INFORMIX User Guide

EXCEPTION 테스트

SQL 문이 실행되고 다음과 같은 4 가지 중 하나의 상태가 된다 성공 / 성공 , 찾을 수 있는 데이터는 없음 / 성공 , 경고 (warning) 메시지가 있음 실패

성공 외의 나머지 상태에 대한 처리 방법을 exception 처리로 제어한다 WHENEVER exception action

exception : NOT FOUND, SQLWARNING, SQLERROR action : GO TO label, CALL function, STOP, CONTINUE

디폴트 action 은 CONTINUE WHENEVER 문의 scope 는 한 소스 파일에서 global 성격을 가진다

Module 1stock_ins() { EXEC SQL whenver sqlerror call sqlerr; :}

stock_del() { EXEC SQL whenver sqlerror continue; :}

sqlerr() { :}

Module 2

stock_qry() { EXEC SQL whenver sqlerror goto doerr; : return ;doerr :}

Page 145: Informix user guide

145INFORMIX User Guide

GET DIAGNOSTICS 사용 (1)

GET DIAGNOSTICS 문은 여러개의 SQL exception 을 처리할 수 있고 , ANSI 및 X/OPEN 표준으로 컴파일된다

SQLCA 는 계속 사용가능하다 다음 세가지 분류로 사용한다

SQLSTATE GET DIAGNOSTICS 문 GET DIAGNOSTICS EXCEPTION 문

GET DIAGNOSTICS 의 정보 MORE : 모든 exception 이 반환되었음을 나타냄 NUMBER : exception 의 갯수 ROW_COUNT : SQL 에 의해 처리된 행 수

EXCEPTION 의 정보 RETURNED_SQLSTATE SERVER_NAME CONNECTION_NAME CLASS_ORIGIN 등

C C S S S

SQLSTATESQLSTATE

subclass codesubclass codeclass codeclass code

00 성공01 성공 ( 경고포함 ) 02 데이터없음>02, IX 에러발생

Page 146: Informix user guide

146INFORMIX User Guide

GET DIAGNOSTICS 사용 (2)

SQLSTATE 사용 예if (strncmp(SQLSTATE, “00”, 2) == 0 ) . . . /* 성공 */else if (strncmp(SQLSTATE, “01”, 2) == 0 ) . . . /* 성공 ( 경고 포함 ) */else if (strncmp(SQLSTATE, “02”, 2) == 0 ) . . . /* 데이터 없음 */else . . . /* 에러발생 */

DIAGNOSTICS 사용 예EXEC SQL BEGIN DECLARE SECTION;int xcept_cnt;char more_ind[2];EXEC SQL END DECLARE SECTION;EXEC SQL WHENEVER SQLERROR CALL get_errmsg;. . ./* ---- get_errmsg() ---- */EXEC SQL GET DIAGNOSTICS :more_ind = MORE, :xcept_cnt = NUMBER;if (strcmp(more_ind, “Y”) == 0 )

printf (“%ld Exceptions, more than fit in diagnostics area. \n”, xcept_cnt);

Page 147: Informix user guide

147INFORMIX User Guide

Prepare 를 사용한 단순 DML 처리

단일 SQL 문 처리 예EXEC SQL insert into customer (customer_num, fname, lname,

company) values (0, :fname, :lname, ‘MPS Corp’);EXEC SQL insert into items values (:itemsrec);※ itemsrec 변수는 items테이블의 컬럼 순서로 선언된 structure 형

PREPARE / EXECUTE 사용EXEC SQL PREPARE ins_p from “insert into customer (customer_num, fname, lname, company) values (0,?,?,?)” ;EXEC SQL EXECUTE ins_p using :fname, :lname, :company;

PREPARE 를 사용하는 이유 PREPARE 시점에 SQL 문장에 대하여 미리 parsing 되고 query plan 이

생성된다 EXECUTE 시점에는 처리해야 할 값만 넘겨주면 즉시 실행된다 하나의 DML 문장에서 여러번 값을 바꿔서 넘겨주어야 할 때 PREPARE 에서 한

번만 query plan 을 생성하므로 유용하게 사용할 수 있다

Page 148: Informix user guide

148INFORMIX User Guide

Indicator 사용

데이터를 호스트변수에 저장할 때 다음과 같은 Exception 이 발생할 수 있다 NULL 값을 fetch 하였다 컬럼 데이터에 비해 호스트 변수의 크기가 작다

사용법 :host 변수 :indicator 변수 $host 변수 $indicator 변수 :host 변수 INDICATOR indicator 변수 (ANSI 표준 )

예EXEC SQL begin declare section;char ship_instruct[16];short instruct_ind;EXEC SQL end declare section;EXEC SQL select ship_instruct into :ship_instruct indicator instruct_ind from orders where order_num = :ord_num;

NULL

NULL -1

ship_instruct ship_instruct instruct_ind instruct_ind

ring bell, kick 40

ship_instruct ship_instruct instruct_ind instruct_ind

ring bell, kick door loudly

ship_instruct char(40) ship_instruct char(40)

Page 149: Informix user guide

149INFORMIX User Guide

커서 (Cursor) (1)

Cursor 의 이해 Cursor 는 select 구문에 의해 선택된 row 들을 가리키고 있는 일종의 marker

라고 볼 수 있음 . 여러개의 row 를 가져오는 select 문의 결과에 대해 처리하기 위해서 필요함 . Cursor 의 종류

Insert cursor Select cursor

Scroll cursor Non-scroll cursor For update cursor

Previous

Next

Scroll cursorScroll cursor

Next

Non-Scroll cursorNon-Scroll cursor

Next

For Update cursorFor Update cursor

Page 150: Informix user guide

150INFORMIX User Guide

커서 (Cursor) (2)

Cursor 의 사용 순서 DECLARE

SELECT 구문에 대해 사용할 cursor 의 이름 할당 Application memory 에 cursor block setting

OPEN SELECT 구문의 문법을 체크하고 , 질의에 만족하는 row 들에 대해 논리적인 set 을

open Server memory 에 cursor block setting Application memory 에 data buffer setting

FETCH 실질적인 row 를 database 로 부터 가져옴 . fetch next, fetch prior, fetch relative n, fetch absolute n 등

CLOSE Cursor 의 사용종료를 의미 . 사용하던 temp table 삭제됨 . Cursor 에 할당된 buffer 반환 사용하던 lock 을 release

FREE Cursor 가 사용하던 application 과 server 측의 자원을 반환

Page 151: Informix user guide

151INFORMIX User Guide

커서 (Cursor) (3)

Scroll Cursor 사용의 예EXEC SQL DECLARE test_cur SCROLL CURSOR FOR select lname from

customer;EXEC SQL OPEN test_cur;

:

EXEC SQL FETCH NEXT test_cur INTO :host_var;:

EXEC SQL CLOSE test_cur;EXEC SQL FREE test_cur;

PREPARE 를 사용한 커서의 예EXEC SQL PREPARE p_id FROM “select customer_num form customer where lname = ?” ;strcpy(lname, “smith”);EXEC SQL DECLARE cur_c SCROLL CURSOR FOR p_id ;EXEC SQL OPEN cur_c USING :lname ;

Page 152: Informix user guide

152INFORMIX User Guide

커서 (Cursor) (4)

FOR UPDATE 커서의 예EXEC SQL DECLARE upd_cur FOR select unit, unit_descr from stock where stock_num=:stp->stock_num and manu_code=:stp-

>manu_code FOR UPDATE;

:

EXEC SQL OPEN upd_cur ;EXEC SQL FETCH upd_cur INTO :stp->unit, :stp->unit_descr;

:

EXEC SQL update stock set (unit, unit_descr) = (:stp->unit, :stp->unit_descr)

where current of upd_cur;:

EXEC SQL CLOSE upd_cur ;EXEC SQL FREE upd_cur ;

Page 153: Informix user guide

153INFORMIX User Guide

커서 (Cursor) (5)

INSERT 커서의 사용 단계 DECLARE : insert 문을 정의하고 커서명을 할당 OPEN : insert 문의 적합 여부를 체크하고 insert 버퍼를 할당한다 PUT : 입력할 데이터를 insert 버퍼에 넣는다 FLUSH : insert 버퍼의 내용을 데이터베이스로 저장한다 CLOSE : flush 안된 나머지 데이터를 저장하고 커서의 자원을 해제한다

일반적인 사용 예제EXEC SQL PREPARE ins_mcode FROM “insert into manufact values

(?,?)” ;EXEC SQL DECLARE mcode CURSOR FOR ins_mcode;EXEC SQL OPEN mcode;/* 데이터가 있는 만큼 루프 순환 */EXEC SQL PUT mcode from :the_code, :the_name ;/* 일정 주기마다 flush 또는 루프가 끝났을때 */EXEC SQL FLUSH mcode ; /* 순환 끝 */EXEC SQL CLOSE mcode ;

Page 154: Informix user guide

System admin 작업 System Admin 작업 서버의 상태 확인 서버의 구동 및 종료 서버에 추가 디스크 할당 backup ISA 이용

Page 155: Informix user guide

155INFORMIX User Guide

System Admin 작업

서버의 환경 구성을 결정 , 변경 서버의 상태를 Monitoring 서버의 자원의 할당 및 제거 서버의 backup

Page 156: Informix user guide

156INFORMIX User Guide

서버의 상태 확인

onstat 명령어를 이용함 onstat -

서버의 상황 요약을 볼 수 있음 .Informix Dynamic Server 2000 Version 9.21.UN205 -- On-Line -- Up 4 days

02:04:05 -- 19456 Kbytes

onstat -m 서버의 최근 메세지 로그를 확인 .16:51:56 Fuzzy Checkpoint Completed: duration was 0 seconds, 42 buffers

not flushed.16:51:56 Checkpoint loguniq 500, logpos 0x25218c17:26:56 Fuzzy Checkpoint Completed: duration was 0 seconds, 42

buffers not flushed.17:26:56 Checkpoint loguniq 500, logpos 0x25518c18:51:56 Fuzzy Checkpoint Completed: duration was 0 seconds, 42

buffers not flushed.18:51:56 Checkpoint loguniq 500, logpos 0x26b18c

Page 157: Informix user guide

157INFORMIX User Guide

서버의 구동 및 종료

Informix user 로 작업하여야 한다 . 구동

oninit

onstat - 로 확인Informix Dynamic Server 2000 Version 9.21.UN205 -- On-Line -- Up 0 days

00:00:05 -- 19456 Kbytes

종료 onmode -ky

Page 158: Informix user guide

158INFORMIX User Guide

서버에 추가의 disk 할당

onspaces 명령 이용 (informix user 로 작업 ) 예 >

/usr/home/informix/chunk1 이라는 file 을 informix dbspace1 이라는 이름으로 100M 만큼 사용하게 하고자 한다면

touch /usr/home/informix/chunk1 chmod 660 /usr/home/informix/chunk1 onspaces -c -d dbspace1 -s 100000 -o 0 -p /usr/home/informix/chunk1

Raw device(mount 되지 않은 disk 영역 ) /dev/rvol01 (size 100M,offset 512K) 을 informix 기존에 존재하는 dbspace1 에 추가하려면

chown informix:informix /dev/rvol01 chmod 660 /dev/rvol01 onspaces -a -d dbspace1 -s 100000 -o 512 -p /dev/rvol01

Page 159: Informix user guide

159INFORMIX User Guide

Backup

시스템 장애시 복구를 위해 전체 database 시스템의 backup 은 필수적이다 . 종류

Ontape Tape device 로 backup 가능 , incremental backup 지원 Backup : ontape -s Restore : ontape -r

Onbar 외부 storage manager 를 통한 backup 지원 좀더 빠른 작업 가능 Backup : onbar -b Restore : onbar -r

Page 160: Informix user guide

160INFORMIX User Guide

ISA 의 이용

Common Hyperlinks

Interpreted onstat -loutput

Related controls

Menu

onstat - on every page

Page 161: Informix user guide

Client/Server Connectivity

client 연결 단계 server 구성 예시 Client-SDK 연결 – Setnet32 설정 Client-SDK 연결 – ilogin 테스트 Client-SDK 연결 – ODBC 설정 JDBC 연결 Remote Database Access

Page 162: Informix user guide

162INFORMIX User Guide

Client 연결 단계

Client 의 $INFORMIXSERVER 환경변수를 체크한다 $INFORMIXDIR/etc/$INFORMIXSQLHOSTS 파일에서

$INFORMIXSERVER 환경변수값과 연결 방법을 찾고 , 어느 서버에 연결할지 읽는다

$INFORMIXSQLHOSTS 변수가 정의되지 않았다면 sqlhosts 파일

$INFORMIXDIR/etc/$ONCONFIG 파일의 DBSERVERNAME 또는 DBSERVERALIASES 파라매터 값과 비교한다

$ONCONFIG 변수가 정의되지 않았다면 onconfig 파일

$INFORMIXSERVER

dbservername nettype hostname servicename

$INFORMIXDIR/etc/$INFORMIXSQLHOSTS

:DBSERVERNAMEDBSERVERALIASES:

$INFORMIXDIR/etc/$ONCONFIG/etc/services 파일 참조/etc/hosts 파일 참조

Page 163: Informix user guide

163INFORMIX User Guide

서버 구성 예시

$INFORMIXDIR/etc/$ONCONFIG (default : onconfig)DBSERVERNAME ids921uc3 # Name of default database serverDBSERVERALIASES ids921uc3tcp # List of alternate dbservernames

$INFORMIXDIR/etc/$INFORMIXSQLHOSTS (default : sqlhosts)ids921uc3 onipcshm kor-olive sqlexec ids921uc3tcp ontlitcp kor-olive service921

/etc/hosts201.231.242.100 kor-olive

/etc/servicesservice921 31236/tcp

네트워크 통신을 지정하는 항목으로SUN, IBM 등은 ontlitcp 를 , HP, linux 등은 onsoctcp 를 사용한다 .시스템별로 사용하는 nettype 의 종류는 release note 를 확인한다

공유메모리 통신 방법으로/etc/services 에 servicename 이등록될 필요없다

Page 164: Informix user guide

164INFORMIX User Guide

Client-SDK 연결 - Setnet32 설정

Environment DB Server 의 환경변수에 맞게 설정

GLS 한글 사용시• DB_LOCALE=ko_kr.ksc• CLIENT_LOCALE=ko_kr.ksc

NLS 사용시 (HP 의 예 )• DB_LOCALE=en_us.8859-1• CLIENT_LOCALE=en_us.8859-1

DB 서버의 환경변수DB_LOCALE=ko_kr.kscCLIENT_LOCALE=ko_kr.kscSERVER_LOCALE=ko_kr.ksc

DB 서버의 환경변수 (HP 예 )DBNLS=2LANG=CLC_CTYPE=english

Page 165: Informix user guide

165INFORMIX User Guide

Client-SDK 연결 - Setnet32 설정

Server Information Informix Server

sqlhosts 에서 nettype 필드가 on***tcp 인 서버가 onconfig 에 있는 서버인지 확인하고 맞다면 그 서버명을 넣는다

HostName windows\hosts 파일이나 winnt\

system32\driver\etc\hosts 에 host명이 등록되어 있다면 그 host 명을 사용하고 그렇지 않다면 ip 를 직접 적어 준다

ProtocolName onsoctcp

ServiceName windows\services 파일이나 winnt\

system32\driver\etc\services 파일에 port 이름이 등록되었다면 그 port 이름을 사용하고 그렇지 않다면 port 번호를 직접 적어 준다

ids921uc3 onipcshm kor-olive sqlexec

$INFORMIXDIR/etc/$INFORMIXSQLHOSTS

ids921uc3tcp ontlitcp kor-olive service921

201.231.242.100 kor-olive

/etc/hosts

service921 31236/tcp

/etc/services

Page 166: Informix user guide

166INFORMIX User Guide

Client-SDK 연결 - Setnet32 설정

Host Information Current Host

Server Information 에서 입력한 host 명이 그대로 넘어온다 User Name

데이터베이스에 접근할 수 있는 사용자 id 를 넣는다 Password Option

Password Password

password 를 입력한다

Page 167: Informix user guide

167INFORMIX User Guide

Client-SDK 연결 - ilogin 테스트

setnet32 로 설정한 정보가 올바른지 확인한다 데모 데이터베이스에 customer 란 테이블이 있어야 결과물이 출력되지만 , 이 테이블이 없거나 데이터가 없어도 테스트 성공 여부는 판단할 수 있다

Page 168: Informix user guide

168INFORMIX User Guide

Client-SDK 연결 - ODBC연결

제어판에서 ODBC 아이콘을 클릭하여 ODBC 소스를 만든다 Setnet 과 달리 DB 정보를 포함하므로 DB 가 여러개이면 각각 Data

Source Name 을 만들어야 한다

Page 169: Informix user guide

169INFORMIX User Guide

Client-SDK 연결 - ODBC연결

ids921uc3 onipcshm kor-olive sqlexec

$INFORMIXDIR/etc/$INFORMIXSQLHOSTS

ids921uc3tcp ontlitcp kor-olive service921

201.231.242.100 kor-olive

/etc/hosts

service921 31236/tcp

/etc/services

setnet32 를 설정했다면위의 정보가 자동으로 로드된다(Database Name, User Id, Password 제외 )NLS DB 의 경우 데이터베이스 리스트에서에러가 발생할 수 있는데 무시하고 직접 입력한다

setnet32 과 마찬가지로NLS DB 의 경우 en_us.8859-1,GLS 한글 DB 는 ko_kr.ksc 로 설정한다

Page 170: Informix user guide

170INFORMIX User Guide

JDBC 연결

환경변수 PATH (java 실행이 가능하도록 한다 )

export PATH=$PATH:/opt/java1.2/bin CLASSPATH ( 현재 디렉토리와 ifxjdbc.jar 를 포함한다 )

export PATH=$CLASSPATH:/opt/jdbc/lib/ifxjdbc.jar:.

JDBC connection URL jdbc:informix-sqli://host 명 :port 번호 /DB 명 :informixserver=informix

서버명 ;user= 사용자 ID;password=패스워드

jdbc:informix-sqli://201.231.242.100:31236/stores_demo:informixserver=ids921uc3tcp;user=informix;password=informix

Page 171: Informix user guide

171INFORMIX User Guide

JDBC 연결

데모 JDBC 설치 디렉토리 /demo/basic/DBConnection.java 로 테스트한다 Connection URL 에 DB 명을 직접 넣는 방법과 DB 명없이 연결한 후 , SQL 구문

“database DB 명 ;” 을 실행시키는 방법으로 테스트 한다 데모 데이터베이스 testDB 를 먼저 만들어 놓아야 한다 예 )

$ javac DBConnection.java $ java DBConnection

jdbc:informix-sqli://201.231.242.100:31236:informixserver=ids921uc3tcp;user=informix;password=informix

>>>Database Connection Direct test. URL =

"jdbc:informix-sqli://201.231.242.100:31236/testDB:informixserver=ids921uc3tcp;user=informix;password=informix"

>>>End of Database Connection Direct test. >>>Database Connection Indirect test. URL =

"jdbc:informix-sqli://201.231.242.100:31236:informixserver=ids921uc3tcp;user=informix;password=informix"

>>>End of Database Connection Indirect test.

Page 172: Informix user guide

172INFORMIX User Guide

JDBC 연결

NLS DB 와 JDBC JDBC 는 NLS 를 지원하지 않으므로 URL 에 직접 DB 명을 쓸 수 없다 “database DB 명”구문을 사용하면 SQLException 으로 빠져나가는데 ,

getErrorCode() 는 0을 반환한다 . 따라서 위의 구문을 사용하면서 DB 에 연결할 때 , getErrorCode 값을 체크하여 0

이면 정상적으로 처리하도록 하면 문제없이 사용할 수 있다try { Connection con = DriverManager.getConnection(url); Statement stmt = con.createStatement(); try { stmt.executeUpdate(“DATABASE ” + dbname); } catch (SQLException e) { if (e.getErrorCode() != 0 ) e.printStackTrace(); }} catch (Exception e) { if (stmt != null) try { stmt.close(); } catch (Exception e1)

{ e1.printStackTrace(); } if (con != null) try { con.close(); } catch (Exception e2)

{ e2.printStackTrace(); } e.printStackTrace();}

Page 173: Informix user guide

173INFORMIX User Guide

Remote Database Access

Local 데이터베이스를 연결한 상태에서 현재 연결 정보를 끊지 않고 즉시 다른 데이터베이스에 대해 조회 , 수정 , 삭제 등이 가능하다

DB명@서버명:소유자.테이블명 구문을 사용하는데 , 소유자는 지정하지 않아도 상관없다 . 동일 서버의 다른 데이터베이스라면 서버명을 지정하지 않아도 된다 .

ids731uc4 onipcshm kor-k400 sqlexec

$INFORMIXDIR/etc/$INFORMIXSQLHOSTS

ids921uc3tcp onsoctcp kor-olive service921

ids731uc4tcp onsoctcp kor-k400 service731

ids921uc3 onipcshm kor-olive sqlexec

$INFORMIXDIR/etc/$INFORMIXSQLHOSTS

ids921uc3tcp ontlitcp kor-olive service921

ids731uc4tcp ontlitcp kor-k400 service731

server : ids921uc3DB : stores7table : customer

server : ids731uc4DB : stores_demotable : state

select * from stores_demo@ids731uc4tcp:state ;

insert into stores7@ids921uc3tcp:customer (customer_num, fname, lname)values (0, ‘first name’, ‘second name’);

Page 174: Informix user guide

174INFORMIX User Guide

Remote Database Access

Remote 데이터베이스를 접근하기 위해서는 OS 레벨에서 사용자의 인증을 통과할 수 있어야 한다 . 예를 들어 , remote 서버로 password 입력없이 rlogin 이 되는 상태가 우선 만들어져야 한다

Remote 데이터베이스의 테이블을 쓰기 위한 구문이 길고 복잡하기 때문에 create synonym 을 사용하여 동의어를 만들면 사용하기 간편하다 구문 : create synonym synonym 명 for 테이블명

create synonym remote_state for stores_demo@ids731uc4tcp:state; create synonym remote_customer for stores7@ids921uc3tcp:customer; select * from remote_state; select * from remote_customer;

일반 테이블과의 구분방법 select tabname, tabtype from systables where tabid > 99; 일반 테이블은 tabtype 이 ‘ T’, synonym 테이블은 ‘ S’, view 는 ‘ V’ 로 표시된다

Page 175: Informix user guide

Data Migration

Data Migration Tool SQL unload / load 구문 SQL unload / load 구문 - deimiter dbload dbload - option dbload – delimiter / mapping dbload – fixed length / null 입력 dbexport dbimport 파일 구조 및 스키마 변경 onunload onload HPL (High Performance Loader)

Page 176: Informix user guide

176INFORMIX User Guide

Data Migration Tool

SQL unload / Load 구문 dbload dbexport / dbimport onload / onunload High Performance Loader (HPL)

Page 177: Informix user guide

177INFORMIX User Guide

SQL unload / load 구문

unload unload 는 기존의 존재하는 파일이 있다면 덮어쓴다 (overwrite) varchar컬럼의 데이터 중 후행 공백은 보존된다 예

unload to ‘/tmp/cust.unl’ select * from customer;

load load 하려는 테이블에 이미 존재하는 행이 있다면 계속 추가 (append) 된다 serial 컬럼이 있는 테이블에 자료를 순차적으로 다시 넣으려면 데이터 파일에 해당

되는 컬럼 데이터를 0으로 넣는다 delimiter 사이에 아무 값도 없는 경우 null 이 입력된다 예

load from ‘cust.unl’ insert into customer;

Page 178: Informix user guide

178INFORMIX User Guide

SQL unload/load 구문 - delimiter지정

Default 값을 파이프 기호 (|) 이다 Delimiter 지정

load from ‘file’ DELIMITER ‘,’ insert into table; DBDELIMITER 환경 변수를 지정할 수 있다

Delimiter 로 역슬래시 (\), 개행문자 (newline character), 16진수를 사용할 수 없다

Delimiter 로 tab 이나 공백 (blank) 는 사용가능하다

Page 179: Informix user guide

179INFORMIX User Guide

dbload

delimiter 로 구분된 데이터파일이나 고정길이 (fixed length) 의 데이터 파일 모두 지원한다

사용하기 전에 먼저 command 파일을 만들어야한다 unload 는 지원하지 않는다 다음과 같은 설정을 할 수 있다

필드 매핑 NULL 값 대체 커밋 (commit) 간격 최초 무시하고 읽을 데이터 행 수 에러를 무시하고 넘어갈 수 있는 행 수 테이블의 locking 방법

Page 180: Informix user guide

180INFORMIX User Guide

dbload - option

dbload [-d DB 명 ] [-c command 파일명 ] [-l 로그파일명 ] [-e number] [-n number] [-i number] [-s] [-p] [-r | -k] [-X]

-e : 종료되기 전까지 허용할 에러 갯수 -n : 지정한 숫자만큼 로드 후 commit -i : 지정한 숫자만큼 데이터행을 스킵하고 로드하기 시작한다 -s : syntax error 만 체크한다 -p : commit 할 것인지 rollback 할 것인지 대답해야 한다 -r : 테이블에 lock 을 걸지 않고 로드한다 (default)

insert 되는 행에 대해서만 lock 이 걸린다 -k : 테이블에 exclusive lock 을 걸고 로드한다 -X : HEX binary 데이터를 문자형 컬럼에 로드하고자 할때 사용한다

Page 181: Informix user guide

181INFORMIX User Guide

dbload - delimiter / mapping

command file (delimiter)vi /work/export/command_file.txtFILE sample.txt DELIMITER ‘|’ 4;INSERT INTO sample;

실행 dbload -d DB 명 -c /work/export/command_file.txt -l 에러로그파일

필드 매핑 방법vi /work/export/command_file2.txtFILE sample2.txt DELIMITER ‘ ‘ 4;INSERT INTO sample (id, flag, amount, memo)VALUES (f03,’constant_value’,f02, f01);

미리 정의된 변수 f01, f02, f03..등에 의해서 데이터 파일의 필드를 지정할 수 있다

Page 182: Informix user guide

182INFORMIX User Guide

dbload - fixed length / null 입력

command file (fixed length)FILE cust_address.unl( city 1-15, state 16-17, area_code 23-25 NULL = ‘xxx’, phone 23-34 NULL = ‘xxx-xxx-xxxx’, zip 18-22, state_area 16-17 : 23-25, cust_number 26-32);INSERT INTO locale (cust_id, city, state, zip)VALUES (cust_number, city, state, zip);INSERT INTO mail_sort VALUES (area_code, zip);

데이터 중 23-25번째 자리에 xxx 로 표시된 곳은 null 을 입력한다 state_area 는 여러 위치의 값을 하나로 연결하여 만든다 한 데이터 파일에 대해서 여러개의 insert 문장을 사용할 수 있다

Page 183: Informix user guide

183INFORMIX User Guide

dbexport

전체 데이터베이스를 ASCII 파일로 export받는다 데이터베이스의 스키마 파일을 생성한다 명령어 수행 중에는 데이터베이스에 exclusive lock 이 걸린다 각각의 테이블을 순차적으로 unload받는다 -ss옵션을 사용하면 테이블의 dbspace옵션 , extent옵션 , lock mode옵션 , fragment옵션을 모두 기록한다

예dbexport stores

현재 디렉토리에 stores 데이터베이스를 export받는다

dbexport stores -ssdbexport stores -ss -o /work/exports

export받을 위치를 /work/exports 디렉토리로 지정한다

dbexport stores -ss -t /dev/rmt0 -b 1024 -s 1024000 -f /tmp/stores.sql unload 데이터는 테이프 /dev/rmt0 에 , 스키마 파일은 / tmp/stores.sql 로 저장한다

Page 184: Informix user guide

184INFORMIX User Guide

dbimport

dbexport 로 받은 데이터를 DB 를 생성하고 로드한다 명령 실행 중 데이터베이스에는 exclusive lock 이 발생한다 데이터를 로드하기전에 순차적으로 테이블을 생성하고 로드 한 후 인덱스를

만든다 DB 를 생성할 때 logging 모드로 생성할 수 있지만 데이터 로드 후에

로깅모드를 설정하는 것이 훨씬 더 좋다 PDQPRIORITY 를 100으로 설정하고 작업을 시작하면 성능이 좋다 예

dbimport stores현재 디렉토리에 export받아진 stores 데이터베이스를 import 한다

dbimport stores -i /work/exports/work/exports 에 export받아진 stores 데이터베이스를 import 한다

dbimport stores -d dbs1데이터베이스를 dbs1 에 생성한다 (default 는 rootdbs 에 생성됨 )

Page 185: Informix user guide

185INFORMIX User Guide

파일 구조 및 스키마 변경

dbexport 를 실행하면 다음과 같은 파일 구조로 데이터를 받는다 DB 명 .exp 디렉토리

DB 명 .sql 스키마파일 각 테이블별 unload 파일

테이블 스키마를 변경하고 dbimport 하려면 DB 명 .exp디렉토리안의 DB명 .sql 파일안에서 내용을 먼저 수정한다

데이터베이스 이름을 변경하려면 DB 명 .exp 디렉토리를 다른 이름으로 바꾸고 , 그 디렉토리 안의 DB 명 .sql 파일도 다른 이름으로 바꾸어야한다dbexport DB100mv DB100.exp DB200.expcd DB200.expmv DB100.sql DB200.sqlcd ..dbimport DB200

Page 186: Informix user guide

186INFORMIX User Guide

onunload

Informix 서버의 데이터페이지 바이너리 이미지를 unload 한다 unload/load 문 보다 속도가 빠르다 테이프나 파일 시스템으로 저장한다 데이터베이스 전체 또는 테이블 별로 unload 할 수 있다 unload 하는 동안 테이블에는 shared lock 이 발생한다 테이프 디바이스를 사용할 때 -t, -s -b옵션을 쓰는데 , -l 옵션을 사용하면

Informix 서버의 config 중 LTAPEDEV, LTAPEBLK, LTAPESIZE 값을 그대로 사용하게 된다

예onunload -t /dev/rmt0 -s 20000 -b 32 storesonunload -t /dev/rmt0 -s 20000 -b 32 stores:customeronunload -l stores

Page 187: Informix user guide

187INFORMIX User Guide

onload

onunload 로 받은 데이터를 load 한다 다음과 같은 제한이 있다

Informix 서버의 데이터페이지 크기가 동일해야 한다 시스템의 byte 정렬 방법 및 숫자의 저장 포맷이 동일해야한다 Informix 버전이 동일해야 한다

onload 를 수행하면서 데이터베이스 및 테이블을 생성한다 onload 수행하는 동안 테이블에는 exclusive lock 이 발생한다 예

onload -t /dev/rmt0 -b 32 -s 20000 storesonload -l -d dbs1 stores7

Page 188: Informix user guide

188INFORMIX User Guide

iploadipload

• xterm window 에서 실행• onpload database 에 저장할

정보를 생성하고 onpload 를 실행

onploadonpload

onploaddatabase

targetdatabase

DB 서버DB 서버

tape file pipe

HPL - overview

대용량의 데이터를 migration 하는데 우수한 성능을 나타내도록 디자인된 유틸리티이다

• Ipload 를 최초로 실행시킬 때 생성• onpload 실행을 위한 정보를 저장

• Unload, load 작업을 실제로 수행함• command 로 직접 수행할 수 있고 ,

ipload 에서 호출하여 사용될 수 있다

Page 189: Informix user guide

189INFORMIX User Guide

HPL - load 모드

Deluxe 모드 constraint, index, trigger 가 적용된 상태에서 로드 data replication 상태에서 로드 가능 로드 중에 다른 사용자가 그 테이블을 접근할 수 있다 모든 데이터 타입을 지원한다

Express 모드 Deluxe 모드 보다 속도가 빠르다 로드 중에는 constraint, index, trigger 를 disable 시킨다 로드 중에 테이블에 lock 를 사용한다 standard 데이터 타입만을 지원한다 로드 후 0 레벨 백업을 받기 전까지는 읽기 전용 상태로 남는다 Informix 서버의 페이지 크기 보다 큰 row 의 테이블은 로드 할 수 없다 ROWID 를 사용한 fragment 테이블은 로드 할 수 없다

Page 190: Informix user guide

190INFORMIX User Guide

HPL - 에러 검출

로드 작업 중 constraint 에러가 발생하거나 (deluxe 모드 ), disable 된 constraint 를 enable 시킬 때 에러가 발생하면 (express 모드 ) 에러가 발생한 행에 대한 정보를 violation 테이블과 diagnostics테이블에 저장한다

set constraint enabled

violation table (table 명 _vio) diagnostics table (table 명 _dia)

에러가 발생된 행 에러를 발생한 constraint 정보

기존 Table컬럼

Informix_tupleid

Informix_optype

Informix_recowner

serial

char(1)

char(8)

I=InsertD=DeleteO=Update ( 이전값 )N=Update ( 변경값 )S=Set command

Informix_tupleid

Obj_type

Obj_owner

integer

char(1)

char(8)

Obj_name char(18)

C=constraintI=Unique index

Page 191: Informix user guide

191INFORMIX User Guide

HPL - 에러 수정

Violation 테이블에 filtering 된 행을 읽고 그 원인이 무엇인지 찾아서 violation 테이블을 수정하고 기존 테이블에 입력한다update original_tab_vio set col1 = 123 where col1 = 100;insert into orginal_tab select col1, col2, col3 from orginal_tab_vio where informix_tupleid = 1;

시스템 카타로그 테이블을 모니터링하여 현재 데이터베이스안에 어느 테이블의 constraint, index, trigger 가 disable 된 상태로 남아 있는지 알 수 있다select tabname, objtype, state from systables a, sysobjstate b where a.tabid = b.tabid

objtype : C=Constraint, I=Index, T=Trigger state : D=Disabled, E=Enabled, F=Filtering with no error, G=Filtering with error

Page 192: Informix user guide

192INFORMIX User Guide

HPL - onpladm

onpladm 은 x-window 의 GUI 환경에서 동작하는 ipload 를 대신하여 command line 에서 사용할 수 있는 유틸리티이다

job 생성 , 수정 , 삭제 , 실행을 모두 할 수 있다 job 생성 구문

onpladm create job JOB 이름 -d DEVICE 이름 -D DB 명 -t TABLE 이름 -f [lu]

onpladm create job customer2 -d /tmp/pload/customer2.unl -D stores_demo -t customer2 -fu

job 을 생성하면 query 와 device 등의 정보도 자동적으로 함께 생성된다

job 리스트 보기 onpladm list job onpladm list query onpladm list device

Page 193: Informix user guide

193INFORMIX User Guide

HPL - onpladm

Job 실행 onpladm run job JOB 이름 -f [lu] [-l 로그파일이름 ]

onpladm run job customer2 -fu -l 옵션을 사용하면 화면상에 출력되는 메시지가 지정한 파일로 저장된다

Job 내용보기 onpladm describe job customer2 -fu onpladm describe query customer2 onpladm describe device customer2

Job 삭제 job 을 삭제해도 query 나 device 등에 대한 정보는 남고 , unload, load job 은

각각 삭제해야 한다 onpladm delete job customer2 -fl onpladm delete job customer2 -fu onpladm delete job query customer2 onpladm delete job device customer2

Page 194: Informix user guide

194INFORMIX User Guide

HPL - onpladm

Command 로 제어할 수 없는 몇 가지 정보는 onpload 데이터베이스를 직접 수정하여 사용한다 .

모든 테이블의 key컬럼은 name 이다 delimiter 변경

formats 테이블에서 fieldsep 컬럼 수정 한글 로케일 사용 (ko_kr.ksc)

formats 테이블에서 datatype 컬럼 값을 ASCII 에서 KS5601 로 변경 run mode 변경

session 테이블의 runmode 컬럼 수정 load

no conversion --> 2 : express, 129 : deluxe, conversion --> 130 : express, 386 : express (filtering 하지 않음 )

unload no conversion --> 2 conversion --> 129: Dirty read, 130:Commited Read, 131:Cursor stability, 132:Repeatable Read

Page 195: Informix user guide

Backup & Restore

ontape ontape 옵션 ontape 백업 ontape 로깅 모드 변경 ontape warm restore ontape cold restore onbar onbar 실행

Page 196: Informix user guide

196INFORMIX User Guide

ontape

Informix 서버의 데이터 저장 및 복원 , 로그 백업 및 복구를 위한 단순한 형태의 백업 유틸리티

기능 데이터베이스 시스템 레벨에서의 저장 및 복구 변동 사항 백업 및 복구 (incremental backup)

0 레벨 , 1 레벨 , 2 레벨 일반 데이터와 로그 백업 장치를 구분 가능 로그 백업

Automatic(on-demand) - 백업 받지 않은 모든 논리 로그를 백업 Continuous - 각 논리로그가 가득 차면 연속적으로 백업

데이터 영역 선택적 복구 Cold Restore

기본청크 rootdbs 나 로그가 포함된 dbspace 복구 서버가 정지 상태일때 복구 가능

Warm Restore rootdbs 와 로그가 포함된 dbspace 에 접근 가능한 서버 동작 상태에서 복구

Page 197: Informix user guide

197INFORMIX User Guide

ontape 옵션

ontape -a | -c | -l | -p | -r [ -D dbspace_list ] |

-s [ -L archive_level ] [-A | -B | -N | -U [database_list] ]

-a : 논리 로그 automatic backup -c : 논리 로그 continuous backup -l : 논리 로그 복구 -p : HDR 의 물리적 복구 -r : 전체 시스템 복구

-D : 선택한 dbspace 복구 -s : 전체 시스템 백업

-L : 0, 1, 2 레벨 지정 -A : ANSI logging 모드로 변환 -B : Buffered logging 모드로 변환 -N : No logging 모드로 변환 -U : Unbuffered logging 모드로 변환

Page 198: Informix user guide

198INFORMIX User Guide

ontape 백업

전체 백업 ontape -s

Please enter the level of archive to be performed (0, 1, or 2) 0Please mount tape 1 on /dev/rst0 and press Return to continue…10 percent done.100 percent done.Please label this tape as number 1 in the arc tape sequence.This tape contains the following logical logs: 2Program Over.

로그 백업 ontape -a

Performing automatic backup of logical logs.Please mount tape 1 on /dev/rst0 and press Return to continue…Do you want to back up the current logical log? (y/n) yPlease label this tape as number 1 in the arc tape sequence.This tape contains the following logical logs: 1 - 3Program Over.

Page 199: Informix user guide

199INFORMIX User Guide

ontape 로깅 모드 변경

No logging 상태에서 다른 logging 상태로 변경하려면 백업 정보가 필요 신속한 로깅 변경을 위하여 $INFORMIXDIR/etc/$ONCONFIG (default :

onconfig) 파일의 TAPEDEV 파라매터를 /dev/null 로 변경하고 ontape 명령을 실행한다

로깅 모드 변경 ontape -s -B stores_demo ontape -s -U stores_demo

Page 200: Informix user guide

200INFORMIX User Guide

ontape warm restore

Warm restore ontape –r –D dbs2

DBSpace ‘dbs2’ is online; restoring ‘dbs2’ will bring all chunks comprising the DBSpace OFFLINE and will terminate all active transactions and queries accessing the DBSpace.

OK to continue? yPlease mount tape 1 on /dev/rst0 and press Return to continue …

Archive Tape InformationTape type: Archive Backup TapeOnline version: INFORMIX-OnLine Version 9.21.UC1Archive date: Thur Dec 14 10:10:12 2000User id: informixTerminal id: /dev/ttyp2Archive level:0Tape device: /dev/rst0Tape blocksize (in k): 16Tape size (in k): 10240Tape number in series: 1

Continue restore? (y/n) yRestore a level 1 or 2 archive (y/n) nDo you want to restore log tapes? (y/n) yPlease mount tape 1 on /dev/rst0 and press

Return to continue …Do you want to restore another log tape? (y/n)

nProgram over.

Page 201: Informix user guide

201INFORMIX User Guide

ontape cold restore 1/3

cold restore ontape –r

Please mount tape 1 on /dev/rst0 and press Return to continue …

Archive Tape Information

Tape type: Archive Backup TapeOnline version: INFORMIX-OnLine Version 9.21.UC1Archive date: Thur Dec 14 10:10:12 2000User id: informixTerminal id: /dev/ttyp2Archive level:0Tape device: /dev/rst0Tape blocksize (in k): 16Tape size (in k): 10240Tape number in series: 1

Continue restore? (y/n) y

Page 202: Informix user guide

202INFORMIX User Guide

ontape cold restore 2/3

Archive InformationINFORMIX-OnLine Copyright© 1986,1987 Informix Software, Inc.

Initialization Time 12/12/2000 11:20:22System Page Size 2048Version 2Archive Checkpoint Time 12/12/2000 11:21:13

DbspacesNumber flags fchunk nchunks flags owner name1 1 1 N informix rootdbs1 2 1 N informix dbs2

Chunkschk/dbs offset size free bpages flags pathname1 5000 5000 3201 PO- /dev/chunk12 10000 5000 4747 PO- /dev/chunk1

Page 203: Informix user guide

203INFORMIX User Guide

ontape cold restore 3/3

Continue restore? (y/n) yDo you want to back up the logs? (y/n) y(note: this is the log salvage step)Please mount tape 1 on /dev/rst0 and press Return to continue

Restore a level 1 or 2 archive (y/n) nDo you want to restore log tapes? (y/n) yRoll forward should start with log number 3

Please mount tape 1 on /dev/rst0 and press Return to continue …

Do you want to restore another log tape? (y/n) n

Program over.

Page 204: Informix user guide

204INFORMIX User Guide

onbar

X/Open Backup Service Application Programming Interface (X/BSA) 를 통해 Storage Manager 를 사용하여 병렬적으로 데이터 백업 및 복구

StorageManager

On-Bar

Buffers인포믹스 서버

SysutilDB

DebugFile

On-BarLog

OnlineLog

BootFile

OnconfigFile

Dbspaces , Logs

X/BSATra

nsp

ort

SMMessage

File SMCatalog

BackupMedia

Command Line Utility

ISA

Third Part GUI Tool

Page 205: Informix user guide

205INFORMIX User Guide

onbar

onbar 백업 및 복구에 대하여 storage manager 에게 요청하고 정보를 전달

storage manager storage device 와 media 를 관리 Informix storage manager 또는 third part 제품사용

onbar catalog sysutils 데이터베이스에 저장

X/BSA 라이브러리 ON-Bar 프로그램은 X/BSA (X/Open Backup Service API) 를 사용하여 저장

관리자와 정보를 교환 . X/BSA 는 데이터베이스와 저장 관리자 사이에서 백업 및 복구 정보를 교환하기 위해 특별히 개발된 표준 API.

Message File onbar 동작에 대한 정보를 기록 default 는 / tmp/bar_act.log

Page 206: Informix user guide

206INFORMIX User Guide

onbar 실행

백업 onbar -b : 모든 dbspace 백업 onbar -b dbspace1 dbspace2 .. : 지정한 dbspace 백업 onbar -b -L 1 : 1 레벨 백업 onbar -b -w : whole system 백업 . 순차적으로 dbspace백업 .

로그백업 onbar -l -c : 로그 백업 (-c : 현재 로그까지 ) onbar -l -s : salvage 로그 백업

복구 onbar -r : 모든 dbspace 복구 onbar -r dbspace1 dbspace2 .. : 지정한 dbspace 복구 onbar -r -w : whole system 백업본을 복구 onbar -r -t 2001-01-05 16:25:00 : 지정한 시간까지 복구 onbar -r -n log_number : 지정한 로그 번호까지 복구

Page 207: Informix user guide

GLS (Global Language Support)

GLS 란 NLS 및 ALS 에서 GLS 로 migration GLS 환경과 JDBC연결을 통한 한글처리 JSP 에서의 한글 처리

Page 208: Informix user guide

208INFORMIX User Guide

GLS 란

GLS(Global Language Support) 로케일이란 영어권 외의 특정 지역을 위한 언어 환경이다

다음 세가지 환경변수에 의해 결정 된다 CLIENT_LOCALE SERVER_LOCALE DB_LOCALE

로케일 값은 “언어 _ 지역 . 코드셋” 의 포맷으로 구성된다 Default 값은 en_us.8859-1 한글 로케일은 ko_kr.ksc

로케일을 지정함으로써 문자의 정렬 순서 및 멀티 바이트 문자 처리 , 로컬라이즈된 포맷의 날짜형 , 숫자형 , 화폐 등을 나타낼 수 있다

Page 209: Informix user guide

209INFORMIX User Guide

NLS 및 ALS 에서 GLS 로 migration

Informix 7.2버전 이전까지는 NLS(Native Language Support) 또는 ALS(Asian Language Support) 를 지원하였다

이 두 타입의 로케일의 문제점은 OS 에 따라 사용할 로케일이 다르고 , 이렇게 다른 로케일을 사용한 데이터베이스간에서 분산 질의가 정상적으로 동작하지 않으며 질의에 대한 결과가 동일하지 않을 수 있다 참고

HP 의 NLS 설정 LANG=C LC_CTYPE=english DBNLS=2

SUN 의 NLS 설정 LANG=en_US LC_CTYPE=en_US DBNLS=2

GLS 로케일은 Informix 서버에서 제공하는 로케일로 플랫폼이나 OS 와 상관없이 동일한 값을 사용하며 동일한 결과를 리턴한다

Page 210: Informix user guide

210INFORMIX User Guide

GLS 환경과 JDBC연결을 통한 한글처리

JDBC 를 통해서 한글 자료를 처리할 때 Database Server 의 locale 설정에 따라 프로그램 안에서 code conversion 을 해야 하는 경우가 있음

JAVA

char

lvarchar

clob

언어 타입 영문 로케일 (en_us.8859-1) 한글 로케일 (ko_kr.ksc)

C

C

N

N

N

N

JSP

char

lvarchar

clob

N

INSERT : N, SELECT : C

C

C

INSERT : N, SELECT : C INSERT : N, SELECT : C

C : ConversionN : No Conversion

Page 211: Informix user guide

211INFORMIX User Guide

JSP 에서의 한글 처리 (lvarchar)

JSP 를 지원하는 엔진에 의해서 page code conversion 이 자동지원 . 하지만 Lvarchar 와 CLOB 의 경우 SELECT 시에 getString() 이나

getAsciiStream() 을 통해서 자료를 가져오는 경우 conversion 필요

<html><%@ page language="java" import="java.sql.*, java.util.*, java.math.BigDecimal,java.io.*, java.lang.*" %><body><% Statement stmt = null; Connection conn = null; String url = "jdbc:informix-sqli://kor- olive:8012/lob_db:informixserver=y92;user=informix;password=informix"; try { Class.forName("com.informix.jdbc.IfxDriver"); } catch (Exception e) {} try { conn = DriverManager.getConnection(url); } catch (SQLException e) {} int row = 0; String str = null; int rc = 0; ResultSet rs = null;

try { String value = null; stmt = conn.createStatement(); rs = stmt.executeQuery("Select * from lvar"); while( rs.next() ) { row++; value = rs.getString(1); byte[] rawBytes = col1.getBytes("KSC5601"); String result = new String(rawBytes, "8859_1"); }%><font size=2 color=black><%= result%></font> <br><% } catch (Exception e) {} try { stmt.close(); conn.close(); } catch ( SQLException e) {}%></body></html>

Page 212: Informix user guide

212INFORMIX User Guide

JSP 에서의 한글 처리 (clob) - 1/2

CLOB 의 경우 getString() 이나 getAsciiStream() 을 이용하지 않고 Large Object 를 처리하는 method 를 사용하면 conversion 없이 한글 자료를 처리 가능

<html><%@ page language="java" import="java.io.*, java.util.*, java.lang.* ,java.sql.*, com.informix.jdbc.*" %><body><% Statement stmt = null; PreparedStatement pstmt = null; Connection myConn = null; String newUrl = "jdbc:informix-sqli://kor-olive:8012/lob_db:informixserver=y92;user=informix;password=informix"; try { Class.forName("com.informix.jdbc.IfxDriver"); } catch (Exception e) {} try { myConn = DriverManager.getConnection(newUrl); } catch (SQLException e) {} File file; int fileLength; try { pstmt = myConn.prepareStatement("insert into demo1 values (?)"); } catch (SQLException e) {}

Page 213: Informix user guide

213INFORMIX User Guide

JSP 에서의 한글 처리 (clob) - 2/2

file = new File("/program/data.dat"); fileLength = (int) file.length(); StringBufferInputStream stream1 = new StringBufferInputStream("!@#$%^&*()"); try { pstmt.setAsciiStream (1,stream1,stream1.available()); pstmt.executeUpdate(); } catch ( Exception e) { String s = e.toString(); } try { FileInputStream fin; fin = new FileInputStream(file); pstmt.setAsciiStream(1 , fin, fileLength); pstmt.executeUpdate(); } catch ( Exception e) {} try { pstmt.close(); } catch ( Exception e) {} try { stmt = myConn.createStatement(); ResultSet rs1 = stmt.executeQuery("select * from demo1"); IfxCblob clob; String col1 = ""; byte[] rawBytes = col1.getBytes("8859_1");

while( rs1.next() ) { clob = (IfxCblob)rs1.getClob(1); InputStream reader = (InputStream)clob.getAsciiStream(); reader.read(rawBytes); col1 = new String(rawBytes, "8859_1");%><font size=2 color=black><%= col1%></font> <br><% } rs1.close(); stmt.close(); } catch(SQLException e) {} try { stmt.close(); pstmt.close(); myConn.close(); } catch ( SQLException e) {}%></body></html>

Page 214: Informix user guide

The End.

http://www.informix.com