728x90

안녕하세요. 이번 글에서는 인포믹스 테이블 복구 기능에 대해서 소개드리고자 합니다.

데이터베이스의 물리적인 오류나 사용자의 실수로 데이터가 손실되었을 때 테이블 복구 기능을 사용합니다.

 

오라클의 FLASHBACK과 유사한 기능으로 볼수도 있습니다. FLASHBACK은 언두영역의 과거 데이터를 복구하는 반면, 인포믹스의 테이블 복구기능은 백업본을 스캔하여 특정 테이블의 데이터를 추출하여 복구합니다.

 

Informix의 테이블 복구기능의 장점은 아래와 같습니다.

1. ontape 또는 onbar로 백업받은 이미지가 존재할 경우, 백업된 시점의 데이터를 복구할 수 있다.

2. 백업 전체를 리스토어 할 필요없이 특정 테이블만 추출하여 복구가 가능하다. 따라서 복구시 테이블 크기만큼의 여유공간만 필요하므로 효율적이다.

3. 기존 테이블과 다른 이름의 테이블, 또는 CSV파일 형식으로 지정하여 복구할 수 있다.

4. onbar의 경우 log restore가 가능하다. 즉, 특정 시점을 지정하여 복구 가능하다.

 

인포믹스 테이블 복구에는 archecker라는 유틸리티를 사용합니다.

복구를 수행하려면 대상 테이블의 CREATE TABLE 문장이 포함된 스키마 커맨드 파일이 필요합니다.

테이블 복구 명령 개요

 

아래는 스키마 커맨드 파일의 예시입니다. 텍스트 형식의 파일입니다.

특정 테이블의 데이터를 다른 테이블 명으로 복구하는 시나리오
특정 테이블 데이터를 파일로 복구하는 시나리오

스키마 커맨드 파일이 준비되면 archecker를 실행하여 복구를 수행할 수 있습니다.

archecker 유틸리티 실행 예시

기존 데이터에 영향없이 과거 데이터를 별도 공간에 복구하는 방법이기 때문에 매우 유용한 기능입니다.

대신 스키마 정보가 꼭 필요하기 때문에 수시로 백업이 되어야겠죠.

이 기능은 별도 라이센스가 필요하지 않으므로 인포믹스 무료 버전인 Innovator-C 에디션에서도 사용가능합니다.

728x90
728x90

archecker 유틸리티는 onbar/ontape 드라이버를 통해 아카이브(archive)에서 테이블을 추출(extract)한다.

복원을 수행하기 위해서는 다음 내용을 지정한 스키마 커맨드 파일(schema command file)을 사용한다.

  • 원본 테이블
  • 대상 테이블
  • 테이블 스키마
  • 데이터베이스
  • 외부 테이블(external table)
  • 특정 시점으로 테이블 복원
  • 기타 옵션

스키마 커맨드 파일을 설정하기 위한 두 가지 방법 :

1. archecker 구성 파일(ac_config)에 AC_SCHEMA 구성 매개 변수를 설정한다. 

2. -f cmdname 옵션을 사용하며 AC_SCHEMA 구성 매개 변수는 무시한다. (우선 순위 높음)


스키마 커맨드 파일은 다음 구문을 사용하여 작성할 수 있다.

  • CREATE TABLE
  • DATABASE
  • INSERT INTO
  • RESTORE
  • SET


CREATE TABLE은 원본 테이블과 대상 테이블을 지정하는 구문이다. 구문 형식은 IBM Informix SQL 형식을 따른다.

원본 테이블에 대한 구문은 백업을 수행했을 당시의 테이블 형상과 동일해야 한다.


Note:
원본 테이블 형상은 archecker에 의해 검증되지 않으며, 백업본의 테이블 형상과 다르게 지정하면 오류가 발생할 수 있다.


원본 테이블에는 동의어(synonym)나 뷰(view)를 지정할 수 없다. 원본 테이블의 형상에는 컬럼과 스토리지 옵션만이 필요하다. 익스텐트(extent) 크기, 잠금(lock) 모드 같은 옵션은 무시된다. 


원본 테이블이 분할(fragmented)되어 있다면, 원본 테이블의 데이터가 있는 모든 dbspace를 지정해야 한다. archecker 유틸리티는 스키마 커맨드 파일에 지정한 dbspace에서만 데이터를 추출한다. 원본 테이블에 제약조건(constraints), 인덱스, 트리거 등이 포함되어 있으면 복원하는 동안에는 자동으로 비활성화된다. 외래키(foreign constraints)의 경우에는 참조하는 테이블의 제약조건 또한 비활성화된다. 복원이 완료되면 제약조건, 인덱스, 트리거가 활성화된다. 빠른 성능으로 복원을 수행하려면 복원하기 전에 제약조건, 인덱스, 트리거를 생성하지 않도록 한다.

마찬가지로 대상 테이블도 커맨드 파일에 지정해야 한다. 대상 테이블이 복원 시점에 존재하지 않으면, 커맨드 파일에 지정한 구문이 실행된다. 대상 테이블이 존재한다면 커맨드 파일에 지정한 형상과 일치해야 한다. 데이터는 기존 테이블에 추가된다.


Examples

원본 테이블과 대상 테이블의 형상은 동일하지 않아도 된다. 다음 예제는 원본 데이터를 추출하여 대상 테이블을 분할 형태로 구성하는 방법이다. 

CREATE TABLE source (col1 integer, ...) IN dbspace1;
CREATE TABLE target (col1 integer, ...) 
   FRAGMENT BY expression
      MOD(col1, 3) = 0 in dbspace3),
      MOD(col1, 3) = 1 in dbspace4),
      MOD(col1, 3) = 2 in dbspace5);
INSERT INTO target SELECT * FROM source;


테이블을 외부 테이블로 구성하려면 CREATE EXTERNAL TABLE 구문을 사용한다.

Syntax

스키마 커맨드 파일의 CREATE EXTERNAL TABLE 구문은 Informix SQL 구문과 다르다.

Read syntax diagramSkip visual syntax diagram                                   .-,-----------------.
                                   V                   |
>>-CREATE EXTERNAL TABLE--name--(----column--data_type-+--)----->
>--USING--(--"filename"--+------------------+--)--;------------><
                         '-,--+-DELIMITED-+-'
                              '-INFORMIX--'


CREATE EXTERNAL TABLE 구문은 데이터를 외부 테이블로 복사할 때 사용한다. level-0 아카이브 데이터만 가능하며, 논리 로그(logical log)는 적용되지 않는다.

다음은 외부 테이블의 포맷을 지정하는 옵션이다.

  • DELIMITED: ASCII 구분자 파일. 기본 포맷
  • INFORMIX: 이진 포맷.

외부 테이블의 경우 성능을 최적화를 위해 조건을 적용하지 않는다. 조건을 지정해도 무시된다.



DATABASE 구문은 사용할 데이터베이스를 지정한다. 

Syntax

Read syntax diagramSkip visual syntax diagram>>-DATABASE--dbname--+-----------+--;--------------------------><
                     '-MODE ANSI-'
DATABASE 구문을 여러번 사용할 수도 있다. 이 구문 아래의 명시된 테이블 이름은 지정한 데이터베이스의 테이블을 가리킨다. 데이터베이스의 로깅 모드가 ANSI이고 decimal 데이터 타입을 사용하는 경우, 로깅 모드를 명시해야 한다.

Note:
로깅모드를 지정하지 않고 복원 수행시 오류가 발생하지 않더라도, 데이터는 보장할 수 없다.

Examples

다음 예제는 dbs 데이터베이스에 원본 테이블과 대상테이블이 모두 존재하는 경우의 구문이다.

DATABASE dbs;
CREATE TABLE source (...);
CREATE TABLE target (...);
INSERT INTO target SELECT * from source;

어떤 데이터베이스에서 테이블을 추출하여 다른 데이터베이스로 복사할 때는 여러개의 DATABASE 구문을 사용한다.

DATABASE dbs1;
CREATE TABLE source (...) IN dbspace1;
DATABASE dbs2;
CREATE TABLE target (...) IN dbspace2;
INSERT INTO dbs2:target SELECT * FROM dbs1:source;


INSERT 구문은 아카이브에서 추출한 데이터를 어느 테이블에 넣을지 지정한다. 

Syntax

Read syntax diagramSkip visual syntax diagram>>-INSERT INTO--target_table--+-----------------------+--------->
                              |   .-,-------------.   |
                              |   V               |   |
                              '-(---target_column-+-)-'
             .-,----------.
             V            |
>--SELECT--+---src_column-+-+--FROM--src_table------------------>
           '-*--------------'
>--+---------------+-------------------------------------------><
   '-WHERE--filter-'
ElementDescription
filterThe following filters are supported by the INSERT statement:

  • =, !=, <>
  • >, >=, <, <=
  • [NOT] MATCH, [NOT] LIKE
  • IS [NOT] NULL
  • AND, OR
  • TODAY, CURRENT

The following operators are not supported by thearchecker utility:

  • Aggregates
  • Functions and procedures
  • Subscripts
  • Subqueries
  • Views
  • Joins

Filters can only be applied to physical-only restore.

src_columnA list of columns to be extracted.
src_tableThe source table on the archive where the data is restored from.
target_columnThe destination column or columns where the data will be restored.
target_tableThe destination table where the data will be restored.

Examples

다음 구문으로 원본 테이블의 모든 데이터를 대상 테이블에 입력할 수 있다.

INSERT INTO target SELECT * FROM source;

원본 테이블의 일부 컬럼만을 추출할 수도 있다. 다음 예제는 원본 테이블의 두 컬럼을 대상 테이블에 입력하는 구문이다.

CREATE TABLE source (col1 integer, col2 integer, col3 integer, col4 integer);
CREATE TABLE target (col1 integer, col2 integer);
INSERT INTO target (col1, col2) SELECT (col3, col4) FROM source;


RESTORE는 선택적 명령으로 테이블을 특정 시점으로 복원할 때 사용한다.

Syntax

Read syntax diagramSkip visual syntax diagram>>-RESTORE--+----------------------------------+---------------><
            '-TO--+-"time"--+--+-------------+-'
                  '-CURRENT-'  '-WITH NO LOG-'
ElementDescription
"time"The date and time the table is to be restored to.

Usage

TO절에서 테이블을 복원할 특정 시점을 지정한다. 날짜와 시간 또는 CURRENT 키워드를 사용할 수 있다.

RESTORE 구문은 커맨드 파일에서 한 번만 사용할 수 있다. 커맨드 파일에 RESTORE를 명시하지 않으면 복원시 현재 시점의 논리 로그까지 적용한다. WITH NO LOG 절을 명시하면 물리(physical) 복원만 수행된다. 물리 복원은 level-0 아카이브만을 사용한다.

Example

RESTORE TO CURRENT WITH NO LOG;

SET 구문을 사용하여 테이블 레벨 로드(unload,load) 라이브러리의 다양한 기능을 제어할 수 있다.

Syntax

Read syntax diagramSkip visual syntax diagram>>-SET--+-COMMIT TO--number------------------+-----------------><
        |               .-,----------------. |
        |               V                  | |
        '-WORKSPACE TO----+-dbspace------+-+-'
                          |         (1)  |
                          '-dbslice------'
Notes:
  1. Extended Parallel Server only
ElementDescription
numberSets the number of records to insert before committing during a physical restore. The default is 1000.
dbspaceThe dbspaces to use for the working storage space. The default is the root dbspace. You cannot use temporary dbspaces for the working storage space.
dbsliceThe dbslices to use for the working storage space.

archecker 유틸리티는 논리 복원을 수행하는 동안 논리 로그 레코드를 준비하기 위한 테이블을 여러개 만든다. 이 테이블들은 sysutils 데이터베이스에 생성되며 작업 저장 공간(dbspace)에 저장된다.

Examples

SET COMMIT TO 20000;
SET WORKSPACE to dbspace1;

728x90
728x90

 

난이도 : 초급

김도연, IT Specialist, IBM

2006 년 8 월 28일

기업 내 다양한 업무를 신속하게 처리하는 데 있어 데이터베이스 시스템의 장애로 인해 특정 중요 테이블의 긴급 복구를 해야 할 필요가 있습니다. 물리적인 장애로 인해 테이블의 데이터를 이용하지 못하는 경우도 있고, 사용자의 실수로 인해 특정 테이블의 데이터의 손실을 유발할 수 있습니다.

IBM Informix Dynamic server 10.0에서는 archecker 유틸리티를 사용하여 보관으로부터 특정 테이블을 복구할 수 있습니다. 복구하려는 테이블은 특정 시점까지 복원할 수 있고, 특정 범위의 데이터만 찾아 복원할 수 있습니다. 이를 사용하면 전체 보관의 복원을 수행하지 않고 데이터의 특정 조각을 복원할 수 있습니다.

 

Figure 1. Overview of archecker utility

 

사전 작업

TSM 또는 ISM을 이용하여 onbar backup을 받을 수 있는 환경을 만들어 놓습니다.

환경 설정

IDS v10에서 테이블 단위의 복구 기능을 사용하려면 archecker라는 유틸리티를 사용합니다. Archecker를 실행하기 위해 몇 가지 설정을 해야 하는 데, 인포믹스 사용자 환경과 archecker가 실행될 때 복구 범위를 참조해야 할 커맨드 파일을 작성해야 합니다.

환경변수 AC_CONFIG를 사용하여 archecker의 설정 파일의 경로를 지정합니다. onCONFIG와 마찬가지로 $INFORMIXDIR/etc/ac_config.std를 복사해서 설정 파일로 사용합니다.

# cp $INFORMIXDIR/etc/ac_config.std $INFORMIXDIR/etc/ac_config
# export AC_CONFIG=$INFORMIXDIR/etc/ac_config

현재 설치된 IDS의 환경에 맞게 AC_CONFIG에 지정된 파일을 수정합니다. AC_SCHEMA는 archecker 실행시 참조하는 커맨드 파일의 경로를 지정하는 데, 이후 ?f 옵션을 사용하여 커맨드 파일을 읽을 때는 이 값은 무시됩니다. AC_IXBAR는 onbar 백업을 받을 때 생성되는 ‘ixbar.인포믹스 서버번호’ 을 지정합니다.


  # /informix/etc/ac_config
  AC_MSGPATH      /informix/ac_msg.log         	# archecker message log
  AC_STORAGE      /tmp                    	# Directory used for temp storage
  AC_VERBOSE      1                       		# 1 verbose messages 0 terse messages
  AC_SCHEMA       /informix/ARCH/cmdfile
  AC_IXBAR        /informix/etc/ixbar.0

 

커맨드 파일의 작성

테이블 단위 복구를 위해 다음의 값들을 읽고 복구의 범위를 결정합니다.

  • 소스 테이블
  • 복구 테이블
  • 테이블 스키마
  • 데이터베이스
  • 외부테이블
  • 시점 복구할 테이블

복구 명령어

테이블의 복구 시점을 결정하기 위해 커맨드 파일에 ‘RESTORE TO’ 이후 복구 방법을 표시해야 합니다.

RESTORE TO timestamp : 원하는 시점의 타임 스템프 값(시간)으로 복구
RESTORE TO current : 최근 시점으로 복구
RESTORE TO current no log restore : 0레벨 백업 시점까지의 복구

복구 예제

사전 준비

먼저 0 레벨 백업을 받은 다음 복수 기능 별로 테이블에 데이터를 복원해 보겠습니다. 0 byte 크기의 파일을 생성한 후 dbspace로 등록한 후 stores7 샘플 데이터베이스를 작성합니다.

# touch /informix/DBS/data_chk
# chmod 660 data_chk
# onspaces ?c ?d datadbs ?p /informix/DBS/data_chk ?s 10000 ?o 0
# dbaccessdemo stores7 -dbspace datadbs ?log

샘플 데이터베이스가 완성된 후 onbar를 이용하여 0 레벨 백업을 받습니다.

# onbar ?b

다음 예제들에선 /informix/bar_act.log 파일을 참조하여 0 레벨 백업이 끝난 ‘2006-03-24 21:10:08’ 시점을 기준으로 테이블들을 복원하겠습니다.

 [/informix/bar_act.log]
 2006-03-24 21:10:02 21724  21722 /informix/bin/onbar_d -b
 2006-03-24 21:10:02 21724  21722 Archive started on rootdbs, datadbs, sbdbs (Requested Level 0).
 2006-03-24 21:10:03 21724  21722 Begin level 0 backup rootdbs.
 2006-03-24 21:10:03 21724  21722 Successfully connected to Storage Manager.
 2006-03-24 21:10:03 21724  21722 Completed level 0 backup rootdbs (Storage Manager copy ID: 720324002 0).
                                                 :
                                                 :
 2006-03-24 21:10:07 21724  21722 /informix/bin/onbar_d complete, returning 0 (0x00)
 2006-03-24 21:10:08 21751  21749 /informix/bin/onbar_d -b -l
 2006-03-24 21:10:08 21751  21749 /informix/bin/onbar_d complete, returning 0 (0x00)

 

시나리오 1. 손실 테이블 복구

DBA가 실수로 고객 테이블을 삭제했다고 가정하겠습니다.

drop table customer;

삭제된 테이블만 복구를 하기 위해 다음과 같이 커맨드 파일을 작성합니다.


[ cmdfile1.cmd ]
database stores7;
create table customer
  (
    customer_num serial not null ,
    fname char(15),
    lname char(15),
    company char(20),
    address1 char(20),
    address2 char(20),
    city char(15),
    state char(2),
    zipcode char(5),
    phone char(18),
    primary key (customer_num)
  ) in datadbs;
insert into customer select * from customer;
restore to '2006-03-24 21:10:08';

 

커맨드 파일의 작성이 끝나면 다음과 같은 명령어를 실행합니다.


# archecker -bvs -f /informix/ARCH/cmdfile1.cmd
IBM Informix Dynamic Server Version 10.00.UC4
Program Name:   archecker
Version:        8.0
Released:       2005-11-18 22:22:21
CSDK:           IBM Informix CSDK Version 2.90
ESQL:           IBM Informix-ESQL Version 2.90.UC1
Compiled:       11/18/05 22:23  on Linux 2.4.21-27.0.2.ELsmp #1 SMP Wed Jan 12 23:35:44 EST 2005
AC_STORAGE               /tmp
AC_MSGPATH               /informix/ac_msg.log
AC_VERBOSE               on
AC_TAPEBLOCK             62 KB
AC_IXBAR                 /informix/etc/ixbar.0
Dropping old log control tables
Extracting table stores7:customer into stores7:customer
Scan PASSED
Control page checks PASSED
Table checks PASSED
Table extraction commands 1
Tables found on archive 1
LOADED: stores7:customer produced 28 rows.
Creating log control tables
Staging Log 48
Logically recovered stores7:customer Inserted 0 Deleted 0 Updated 0
 

 

실행이 완료되면 데이터를 확인합니다. Customer 테이블이 생성되며 데이터가 로딩됩니다. 
# dbaccess stores7 - 
Database selected. 
> select count(*) from customer; 
        (count(*))
                 28
1 row(s) retrieved.

시나리오 2. 다른 테이블로 복구

운영 중인 데이터베이스 내 테이블의 특정 데이터를 실수로 삭제를 했을 경우, 현재 테이블은 보존하면서 다른 이름의 테이블을 생성하여 데이터를 복원할 수 있습니다.

delete from customer where customer_num > 120;

다음과 같이 커맨드 파일을 작성하세요. 이때 원본 테이블 이름과 다른 테이블 이름을 지정하세요.


--cmdfile2.cmd
database stores7;
create table customer
  (
    customer_num serial not null ,
    fname char(15),
    lname char(15),
    company char(20),
    address1 char(20),
    address2 char(20),
    city char(15),
    state char(2),
    zipcode char(5),
    phone char(18),
    primary key (customer_num)
  ) in datadbs;
create table customer2
  (
    customer_num serial not null ,
    fname char(15),
    lname char(15),
    company char(20),
    address1 char(20),
    address2 char(20),
    city char(15),
    state char(2),
    zipcode char(5),
    phone char(18),
    primary key (customer_num)
  ) in datadbs;
insert into customer2 select * from customer;
restore to '2006-03-24 21:10:08';

 

커맨드 파일의 편집이 끝나면 다음과 같은 명령어를 실행합니다. 
# archecker -bvs -f /informix/ARCH/cmdfile2.cmd

실행이 완료되면 데이터를 확인합니다. Customer2 테이블이 생성되며 customer 테이블의 데이터가 customer2 테이블로 로딩됩니다. 이때 customer 테이블에서 삭제된 데이터를 customer2 테이블에서 확인할 수 있습니다. 

# dbaccess stores7 - 
Database selected.
> select count(*) from customer2 where customer_num > 120;

         (count(*)) 
                 8 
1 row(s) retrieved.

시나리오 3. 데이터 필터링 후 복구

DBA가 테이블 내 특정 시점의 특정 테이터 만 선별하여 복구하려 합니다. 다음과 같이 커맨드 파일을 작성하며, 이때 물리 복구만을 해야하며 ‘no log restore’ 옵션을 추가해야 합니다.


--cmdfile3.cmd
database stores7;
create table customer
  (
    customer_num serial not null ,
    fname char(15),
    lname char(15),
    company char(20),
    address1 char(20),
    address2 char(20),
    city char(15),
    state char(2),
    zipcode char(5),
    phone char(18),
    primary key (customer_num)
  ) in datadbs;
create table customer3
  (
    customer_num serial not null ,
    fname char(15),
    lname char(15),
    company char(20),
    address1 char(20),
    address2 char(20),
    city char(15),
    state char(2),
    zipcode char(5),
    phone char(18),
    primary key (customer_num)
  ) in datadbs;
insert into customer3 select fname,lname from customer where customer_num > 120;
restore to '2006-03-24 21:10:08’
no log restore;

 

커맨드 파일의 편집이 끝나면 다음과 같은 명령어를 실행합니다. 
# archecker -bvs -f /informix/ARCH/cmdfile3.cmd

실행이 완료되면 데이터를 확인합니다.

# dbaccess stores7 - 
Database selected. 
> select count(*) from customer3 where customer_num > 120; 

        (count(*)) 
                8 
1 row(s) retrieved.

시나리오 4. ASCII 데이터 파일로 테이블 복구

백업 디바이스 내에 백업된 테이블 데이터를 데이터베이스 내의 테이블이 아닌 ASCII의 파일 형태로 복구하려고 합니다. 다음과 같이 커맨드 파일을 작성하며, ‘external’로 표시되는 가상의 타겟 테이블을 정의해야 합니다.


--cmdfile4.cmd
database stores7;
create table customer
  (
    customer_num serial not null ,
    fname char(15),
    lname char(15),
    company char(20),
    address1 char(20),
    address2 char(20),
    city char(15),
    state char(2),
    zipcode char(5),
    phone char(18),
    primary key (customer_num)
  ) in datadbs;
create external table customer4
  (
    customer_num serial not null ,
    fname char(15),
    lname char(15),
    company char(20),
    address1 char(20),
    address2 char(20),
    city char(15),
    state char(2),
    zipcode char(5),
    phone char(18)
  ) using ('/tmp/customer.unl',delimited);
insert into customer4 select * from customer;
restore to '2006-03-24 21:10:08’ no log restore;

 

커맨드 파일의 편집이 끝나면 다음과 같은 명령어를 실행합니다. 
# archecker -bvs -f cmdfile4.cmd

customer 테이블의 데이터를 추출하여 “|”를 구분자로 customer.unl 데이터 파일을 생성합니다.
실제 customer.unl 파일이 생성되었는지 확인하십시오.

# cat /tmp/customer.unl
101|Ludwig|Pauli|All Sports Supplies|213 Erstwild Court||Sunnyvale|CA|94086|408-789-8075|
102|Carole|Sadler|Sports Spot|785 Geary St||San Francisco|CA|94117|415-822-1289|
103|Philip|Currie|Phil's Sports|654 Poplar|P. O. Box 3498|Palo Alto|CA|94303|415-328-4543|
                                              :
                                                                                            :




위로



참고자료 

       도움말
        IBM Informix Dynamic Server v10.0 Information Center 

       Informix 문서
        Informix 문서
        Informix IBM Informix Backup and Restore Guide 

       제품 얻기
        Informix product family -- How to get Informix product downloads -- IBM Software

 

728x90

'Informix > informix reference' 카테고리의 다른 글

informix version 확인  (0) 2010.06.01
ONBAR  (0) 2010.05.26
Porting from Oracle to Informix  (0) 2009.12.29
[TIP] embedding SQL in UNIX Script  (0) 2009.12.29
DB size  (0) 2009.12.28

+ Recent posts