Saturday, May 12, 2018

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 실습1 시작
장애 1: 잘못된 update 후 commit 으로 인한 장애 복구하기




사전작업 ------->>>>>>>>>>>>>>


1. 현재 상태 확인

SQL> !vi dd.sql
set line 200
col tablespace_name for a10
col file_name for a50
select tablespace_name, round(bytes/1024/1024,1) MB, file_name
from dba_data_files
/


SQL> @dd
TABLESPACE   MB FILE_NAME
---------- ---- --------------------------------------------------
SYSTEM      300 +FRA/testdb/datafile/system.262.776456133
UNDOTBS1    200 +DATA/testdb/datafile/undotbs1.261.776365357
SYSAUX      120 +DATA/testdb/datafile/sysaux.262.776365365
USERS         5 +DATA/testdb/datafile/users.264.776365391
TS_NEW       10 +FRA/testdb/datafile/ts_new.260.776454711
TS_NEW        5 +FRA/testdb/datafile/ts_new.261.776454737




SQL> !vi log.sql
set line 200;
col member for a50
col mb for 999
col sequence# for 999
col satus for a8
col archived for a5
select a.group#, a.member, b.bytes/1024/1024 MB, b.sequence#, b.archived, b.status, b.first_change#
from v$logfile a, v$log b
where a.group#=b.group#
order by 1,2
/



    GROUP# MEMBER                                               MB SEQUENCE# ARCHI STATUS           FIRST_CHANGE#
---------- -------------------------------------------------- ---- --------- ----- ---------------- -------------
         1 +DATA/testdb/onlinelog/group_1.257.776365295         50        13 NO    CURRENT                 230873
         1 +FRA/testdb/onlinelog/group_1.257.776365299          50        13 NO    CURRENT                 230873
         2 +DATA/testdb/onlinelog/group_2.258.776365301         50        11 NO    INACTIVE                172049
         2 +FRA/testdb/onlinelog/group_2.258.776365303          50        11 NO    INACTIVE                172049
         3 +DATA/testdb/onlinelog/group_3.259.776365307         50        12 NO    INACTIVE                206461
         3 +FRA/testdb/onlinelog/group_3.259.776365311          50        12 NO    INACTIVE                206461

6 rows selected.




SQL> archive log list;

Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     11
Current log sequence           13
  
▶ RMAN을 사용하기 위해 아카이브 로그 모드로 변경하여야 한다.


※ 참고 : Archive log mode 로 변경 방법
2012/01/30 - [Study/Oracle - 백업&복구] - 백업&복구 1 - No Archive log mode 와 Archive log mode


해당 디렉토리 먼저 생성
$ mkdir -p /data/arc1
$ mkdir -p /data/arc2


** spfile이면
SQL> alter system set log_archive_dest_1='location=/data/arc1';
SQL> alter system set log_archive_dest_2='location=/data/arc2';


** pfile이면 :
$ vi $ORACLE_HOME/dbs/inittestdb.ora
log_archive_dest_1='location=/data/arc1'
log_archive_dest_2='location=/data/arc2'
log_archive_format='%s_%t_%r.arc'
:wq!

SQL> shutdown immediate;

SQL> startup mount;

SQL> alter database archivelog;

SQL> alter database open;






2. 전체 백업 수행

RMAN>
backup as compressed backupset
format '/data/backup/rman/%U_%T'
database;



Starting backup at 29-FEB-12
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=147 devtype=DISK
channel ORA_DISK_1: starting compressed full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00001 name=+FRA/testdb/datafile/system.262.776456133
input datafile fno=00002 name=+DATA/testdb/datafile/undotbs1.261.776365357
input datafile fno=00003 name=+DATA/testdb/datafile/sysaux.262.776365365
input datafile fno=00005 name=+FRA/testdb/datafile/ts_new.260.776454711
input datafile fno=00004 name=+DATA/testdb/datafile/users.264.776365391
input datafile fno=00006 name=+FRA/testdb/datafile/ts_new.261.776454737
channel ORA_DISK_1: starting piece 1 at 29-FEB-12
channel ORA_DISK_1: finished piece 1 at 29-FEB-12
piece handle=/data/backup/rman/04n4g8dj_1_1_20120229 tag=TAG20120229T003915 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:15
channel ORA_DISK_1: starting compressed full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
including current control file in backupset
channel ORA_DISK_1: starting piece 1 at 29-FEB-12
channel ORA_DISK_1: finished piece 1 at 29-FEB-12
piece handle=/data/backup/rman/05n4g8e2_1_1_20120229 tag=TAG20120229T003915 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:02
Finished backup at 29-FEB-12




장애과정 ------->>>>>>>>>>>>>>


3. 테스트용 테이블(scott.tt100) 생성 후 데이터 입력

SQL> create table scott.tt100 (no number) tablespace ts_new;

SQl> insert into scott.tt100 values (1);
SQL> insert into scott.tt100 values (2);
SQL> commit;


SQL> select to_char(sysdate,'YYYY-MM-DD:HH24:MI:SS') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2012-02-29:00:45:50


SQL> select * from scott.tt100;

        NO
----------
         1
         2



※ scott 유저가 없다면? 만들기!!
SQL> create user scott identified by tiger;
User created.

SQL> grant dba to scott;
Grant succeeded.






4. 장애 발생 - 잘못된 update 후 commit

SQL> update scott.tt100 set no=1000;

2 rows updated.

SQL> commit;

Commit complete.

SQL> select * from scott.tt100;

        NO
----------
      1000
      1000




복구과정 ------->>>>>>>>>>>>>>

5. 임시 경로를 활용하여 복구하기

- 복구경로 : /data/temp
- 복구순서
  1) 현재 장애를 저장하고 있는 리두로그를 아카이브 로그로 만들어서 저장
  2) 현재 SCN 정보를 저장하고 있는 Current control file 을 백업받아서 복구 경로로 복원
  3) 파라미터 파일에서 control file 경로 변경 후 DB 종료
  4) 백업된 데이터 파일을 복구 경로로 복원 후 control file 재생성
  5) Recover 수행 (시간기반 복구)
  6) 복구된 테이블 exp 수행해서 운영 DB Open 후 import




1) 현재 장애를 저장하고 있는 리두로그를 아카이브 로그로 만들어서 저장
 : redo log 를 복사할 수 없기 떄문에 아카이브 로그로 만들어서 복구에 사용

SQL> alter system switch logfile;

System altered.

SQL> /

System altered.

SQL> /

System altered.

SQL> /

System altered.

SQL> /

System altered.




2) 현재 SCN 정보를 저장하고 있는 Current control file 을 백업받아서 복구 경로로 복원

- 디렉토리 만들고
$ mkdir -p /data/temp/

SQL> alter database backup controlfile to '/data/temp/control01.ctl';

Database altered.




3) 파라미터 파일에서 control file 경로 변경 후 DB 종료

① 원래 컨트롤파일 조회
SQL> select name from v$controlfile;

NAME
--------------------------------------------------------------------------------
+DATA/testdb/controlfile/current.256.776365293
+FRA/testdb/controlfile/current.256.776365293



② 파라미터 파일 수정
- spfile 경우

SQL> alter system set control_files='/data/temp/control01.ctl' scope=spfile;

- pfile 경우
$ vi $ORACLE_HOME/dbs/inittestdb.ora
기존부분 주석처리후 새경로 입력
#*.control_files='+DATA/testdb/controlfile/current.256.776365293','+FRA/testdb/controlfile/current.256.776365293'
*.control_files='/data/temp/control01.ctl'


SQL> shutdown immediate;

SQL> startup mount;

SQL> select name from v$controlfile;


NAME
--------------------------------------------------------------------------------
/data/temp/control01.ctl





4) 백업된 데이터 파일을 복구 경로로 복원 후 control file 재생성


① 백업된 데이터 파일을 복구 경로로 복원

RMAN> report schema;

Starting implicit crosscheck backup at 29-FEB-12
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=155 devtype=DISK
Crosschecked 2 objects
Finished implicit crosscheck backup at 29-FEB-12

Starting implicit crosscheck copy at 29-FEB-12
using channel ORA_DISK_1
Crosschecked 3 objects
Finished implicit crosscheck copy at 29-FEB-12

searching for all files in the recovery area
cataloging files...
no files cataloged

RMAN-06139: WARNING: control file is not current for REPORT SCHEMA
Report of database schema

List of Permanent Datafiles
===========================
File Size(MB) Tablespace           RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1    300      SYSTEM               ***     +FRA/testdb/datafile/system.262.776456133
2    200      UNDOTBS1             ***     +DATA/testdb/datafile/undotbs1.261.776365357
3    120      SYSAUX               ***     +DATA/testdb/datafile/sysaux.262.776365365
4    5        USERS                ***     +DATA/testdb/datafile/users.264.776365391
5    10       TS_NEW               ***     +FRA/testdb/datafile/ts_new.260.776454711
6    5        TS_NEW               ***     +FRA/testdb/datafile/ts_new.261.776454737

List of Temporary Files
=======================
File Size(MB) Tablespace           Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
1    20       TEMP                 32767       +DATA/testdb/tempfile/temp.263.776365373



RMAN>
run {
allocate channel ch1 device type disk;
allocate channel ch2 device type disk;

set newname for datafile 1 to '/data/temp/system01.dbf';
set newname for datafile 2 to '/data/temp/undotbs01.dbf';
set newname for datafile 3 to '/data/temp/sysaux01.dbf';
set newname for datafile 4 to '/data/temp/users01.dbf';
set newname for datafile 5 to '/data/temp/ts_new01.dbf';
set newname for datafile 6 to '/data/temp/ts_new02.dbf';

restore database;

switch datafile all;
}




released channel: ORA_DISK_1
allocated channel: ch1
channel ch1: sid=155 devtype=DISK

allocated channel: ch2
channel ch2: sid=154 devtype=DISK

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

Starting restore at 29-FEB-12

channel ch1: starting datafile backupset restore
channel ch1: specifying datafile(s) to restore from backup set
restoring datafile 00001 to /data/temp/system01.dbf
restoring datafile 00002 to /data/temp/undotbs01.dbf
restoring datafile 00003 to /data/temp/sysaux01.dbf
restoring datafile 00004 to /data/temp/users01.dbf
restoring datafile 00005 to /data/temp/ts_new01.dbf
restoring datafile 00006 to /data/temp/ts_new02.dbf
channel ch1: reading from backup piece /data/backup/rman/04n4g8dj_1_1_20120229
channel ch1: restored backup piece 1
piece handle=/data/backup/rman/04n4g8dj_1_1_20120229 tag=TAG20120229T003915
channel ch1: restore complete, elapsed time: 00:00:46
Finished restore at 29-FEB-12

datafile 1 switched to datafile copy
input datafile copy recid=10 stamp=776480988 filename=/data/temp/system01.dbf
datafile 2 switched to datafile copy
input datafile copy recid=11 stamp=776480988 filename=/data/temp/undotbs01.dbf
datafile 3 switched to datafile copy
input datafile copy recid=12 stamp=776480988 filename=/data/temp/sysaux01.dbf
datafile 4 switched to datafile copy
input datafile copy recid=13 stamp=776480988 filename=/data/temp/users01.dbf
datafile 5 switched to datafile copy
input datafile copy recid=14 stamp=776480988 filename=/data/temp/ts_new01.dbf
datafile 6 switched to datafile copy
input datafile copy recid=15 stamp=776480988 filename=/data/temp/ts_new02.dbf
released channel: ch1
released channel: ch2
▶ 데이터파일 복원완료


② 현재상태 조회
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/data/temp/system01.dbf
/data/temp/undotbs01.dbf
/data/temp/sysaux01.dbf
/data/temp/users01.dbf
/data/temp/ts_new01.dbf
/data/temp/ts_new02.dbf

6 rows selected.


SQL> select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------
+DATA/testdb/onlinelog/group_1.257.776365295
+FRA/testdb/onlinelog/group_1.257.776365299
+DATA/testdb/onlinelog/group_2.258.776365301
+FRA/testdb/onlinelog/group_2.258.776365303
+DATA/testdb/onlinelog/group_3.259.776365307
+FRA/testdb/onlinelog/group_3.259.776365311

6 rows selected.
▶ 조회결과
data file = 임시경로의 데이터파일 사용
redo log file = ASM기반의 현재 운영중인 것 사용

※ 참고
: 기존 복구의 경우 사용중인 리두로그파일도 shutdown 상태에서 cp로 복사후 rename해서 그대로 사용할수 있었다.

복구 후 resetlogs 옵션으로 open 해야 하는데, 그렇게 되면 사용중인 redo log file이 초기화 되어 현재 DB에 문제가 생긴다.

기존방법처럼 redo log file을 임시경로로 옮기는방법이 가장 좋으나, 10g ASM 까지는 cp 명령이 지원 안된다.
RMAN에서도 online redo log 를 백업이나 복사하지 못한다.

해결법 : 복구해야 하는 내용을 archive redo log file로 들어가게 만든후(위에서 로그스위치 일으켜서 작업완료),
           control file 을 재 생성해서 redo log file의 경로를 /data/temp/ 로 만든후 복구하고,
           resetlogs로 open



③ 컨트롤 파일 재생성
SQL> alter database backup controlfile to trace as '/data/temp/re.sql';

Database altered.
SQL> shutdown immediate;
ORA-01109: database not open

Database dismounted.
ORACLE instance shut down.



$ vi /data/temp/re.sql
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "TESTDB" RESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 (
    '/data/temp/redo01.log'
  ) SIZE 50M,
  GROUP 2 (
    '/data/temp/redo02.log'
  ) SIZE 50M,
  GROUP 3 (
    '/data/temp/redo03.log'
  ) SIZE 50M
DATAFILE
  '/data/temp/system01.dbf',
  '/data/temp/undotbs01.dbf',
  '/data/temp/sysaux01.dbf',
  '/data/temp/users01.dbf',
  '/data/temp/ts_new01.dbf',
  '/data/temp/ts_new02.dbf'
CHARACTER SET KO16MSWIN949



SQL> @/data/temp/re.sql
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1273276 bytes
Variable Size              92275268 bytes
Database Buffers          188743680 bytes
Redo Buffers                2920448 bytes

Control file created.





5) Recover 수행 (시간기반 복구)

$ rman target /

RMAN>
run {
sql 'alter session set nls_date_format="YYYY-MM-DD:HH24:MI:SS"';
set until time='2012-02-29:00:45:50';
recover database;
alter database open resetlogs;
}




using target database control file instead of recovery catalog
sql statement: alter session set nls_date_format="YYYY-MM-DD:HH24:MI:SS"

executing command: SET until clause

Starting recover at 29-FEB-12
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=155 devtype=DISK

starting media recovery

archive log filename=/data/arc2/15_1_776365287.arc thread=1 sequence=15
media recovery complete, elapsed time: 00:00:03
Finished recover at 29-FEB-12

database opened




SQL> select status from v$instance;

STATUS
------------
OPEN


SQL> select * from scott.tt100;

        NO
----------
         1
         2

▶ 임시로 복구 완료되었음






6) 복구된 테이블 exp 수행해서 운영 DB Open 후 import
  
① 복구된 테이블 exp로 안전하게 빼두기

$ exp scott/tiger tables=tt100 file=tt100.dmp

Export: Release 10.2.0.5.0 - Production on Wed Feb 29 01:36:15 2012

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


Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Export done in KO16MSWIN949 character set and AL16UTF16 NCHAR character set

About to export specified tables via Conventional Path ...
. . exporting table                          TT100          2 rows exported
Export terminated successfully without warnings.



② 컨트롤파일 위치 원래대로 돌리기
- spfile 경우

SQL> alter system set control_files='+DATA/testdb/controlfile/current.256.776365293','+FRA/testdb/controlfile/current.256.776365293' scope=spfile;


- pfile 경우

$ vi $ORACLE_HOME/dbs/inittestdb.ora
기존내용 살리고 임시경로 지정해준것 지우거나 주석처리
*.control_files='+DATA/testdb/controlfile/current.256.776365293','+FRA/testdb/controlfile/current.256.776365293'
#*.control_files='/data/temp/control01.ctl'




③ 원래 컨트롤 파일로 바꾸고 재 open후 장애 테이블 확인

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1273276 bytes
Variable Size              92275268 bytes
Database Buffers          188743680 bytes
Redo Buffers                2920448 bytes
Database mounted.
Database opened.


SQL> select * from scott.tt100;

        NO
----------
      1000
      1000

※ 참고
 : 컨트롤 파일을 원래대로 돌리는 것 만으로 이전 장애 상태의 DB로 돌아갈 수 있다.
   현재 임시폴더 (/data/temp/)에는 복구용 파일들이 남아 있지만 못쓰게 된 상태.
   컨트롤 파일의 정보대로 DB가 돌아왔다.
 : 우리가 임시로 복구한 DB는 (백업DATA file /새로만든control file/아카이브로그 참조해서 자료 살리고
   redo log file은 새로 만들어짐) 의 상태였다.
   기존 control file / 기존 DATA file / 기존 redo log file 들은 정보가 변화없이 동결되어 있던 상태에서 그대로 열린것이다.


SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
+FRA/testdb/datafile/system.262.776456133
+DATA/testdb/datafile/undotbs1.261.776365357
+DATA/testdb/datafile/sysaux.262.776365365
+DATA/testdb/datafile/users.264.776365391
+FRA/testdb/datafile/ts_new.260.776454711
+FRA/testdb/datafile/ts_new.261.776454737

6 rows selected.


SQL> select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------
+DATA/testdb/onlinelog/group_1.257.776365295
+FRA/testdb/onlinelog/group_1.257.776365299
+DATA/testdb/onlinelog/group_2.258.776365301
+FRA/testdb/onlinelog/group_2.258.776365303
+DATA/testdb/onlinelog/group_3.259.776365307
+FRA/testdb/onlinelog/group_3.259.776365311

6 rows selected.



④ 장애난 데이터 삭제
 : 필요에 따라 drop / truncate 도 가능

SQL> drop table scott.tt100;

Table dropped.


  

⑤ imp 로 테이블 살리기

$ imp scott/tiger file=tt100.dmp ignore=y fromuser=scott touser=scott

Import: Release 10.2.0.5.0 - Production on Wed Feb 29 01:54:06 2012

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


Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

Export file created by EXPORT:V10.02.01 via conventional path
import done in KO16MSWIN949 character set and AL16UTF16 NCHAR character set
. importing SCOTT's objects into SCOTT
. . importing table                        "TT100"          2 rows imported
Import terminated successfully without warnings.




⑥ 복구 확인

SQL> select * from scott.tt100;

        NO
----------
         1
         2
▶ 복구완료






6. 정리
 : ASM 기반에서 RMAN을 사용하여 잘못된 update 장애를 Flashback을 쓰지않고 복구완료
 : 잘못된 delete 장애도 동일한 방법으로 복구 할 수 있다.



=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 실습1 끝




=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 실습2 시작
장애 2: 잘못된 drop table 장애 복구하기



사전작업 ------->>>>>>>>>>>>>>


1. 현재 상태 확인 후 전체 백업 수행

SQL> @dd

TABLESPACE_NAME         MB FILE_NAME
--------------- ---------- ------------------------------------------------------------
SYSTEM                 300 +FRA/testdb/datafile/system.262.776456133
UNDOTBS1               200 +DATA/testdb/datafile/undotbs1.261.776365357
SYSAUX                 120 +DATA/testdb/datafile/sysaux.262.776365365
USERS                    5 +DATA/testdb/datafile/users.264.776365391
TS_NEW                  10 +FRA/testdb/datafile/ts_new.260.776454711
TS_NEW                   5 +FRA/testdb/datafile/ts_new.261.776454737

6 rows selected.

SQL> @log

    GROUP# MEMBER                                                     MB       SEQ# ARC STATUS           1st#
---------- -------------------------------------------------- ---------- ---------- --- ---------- ----------
         1 +DATA/testdb/onlinelog/group_1.257.776365295               50         19 YES INACTIVE       244289
         1 +FRA/testdb/onlinelog/group_1.257.776365299                50         19 YES INACTIVE       244289
         2 +DATA/testdb/onlinelog/group_2.258.776365301               50         20 NO  CURRENT        244291
         2 +FRA/testdb/onlinelog/group_2.258.776365303                50         20 NO  CURRENT        244291
         3 +DATA/testdb/onlinelog/group_3.259.776365307               50         18 YES INACTIVE       244287
         3 +FRA/testdb/onlinelog/group_3.259.776365311                50         18 YES INACTIVE       244287

6 rows selected.

SQL> col name for a50
SQL> select name from v$controlfile;


NAME
--------------------------------------------------
+DATA/testdb/controlfile/current.256.776365293
+FRA/testdb/controlfile/current.256.776365293
▶ 복구후 다시 사용 할것임



RMAN>
backup as compressed backupset
format '/data/backup/rman/%U_%T'
database;



Starting backup at 29-FEB-12
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=140 devtype=DISK
channel ORA_DISK_1: starting compressed full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00001 name=+FRA/testdb/datafile/system.262.776456133
input datafile fno=00002 name=+DATA/testdb/datafile/undotbs1.261.776365357
input datafile fno=00003 name=+DATA/testdb/datafile/sysaux.262.776365365
input datafile fno=00005 name=+FRA/testdb/datafile/ts_new.260.776454711
input datafile fno=00004 name=+DATA/testdb/datafile/users.264.776365391
input datafile fno=00006 name=+FRA/testdb/datafile/ts_new.261.776454737
channel ORA_DISK_1: starting piece 1 at 29-FEB-12
channel ORA_DISK_1: finished piece 1 at 29-FEB-12
piece handle=/data/backup/rman/06n4gdpl_1_1_20120229 tag=TAG20120229T021100 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:25
channel ORA_DISK_1: starting compressed full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
including current control file in backupset
channel ORA_DISK_1: starting piece 1 at 29-FEB-12
channel ORA_DISK_1: finished piece 1 at 29-FEB-12
piece handle=/data/backup/rman/07n4gdqe_1_1_20120229 tag=TAG20120229T021100 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:02
Finished backup at 29-FEB-12





장애과정 ------->>>>>>>>>>>>>>


2. 테스트용 테이블(scott.tt100) 생성 후 데이터 입력

SQL> create table scott.tt200 (no number) tablespace ts_new;

SQl> insert into scott.tt200 values (1);
SQL> insert into scott.tt200 values (2);
SQL> commit;


SQL> select to_char(sysdate,'YYYY-MM-DD:HH24:MI:SS') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2012-02-29:02:13:27


SQL> select * from scott.tt200;

        NO
----------
         1
         2






3. drop table 장애 발생

SQL> drop table scott.tt200 purge;

Table dropped.

SQL> select * from scott.tt200;
select * from scott.tt200
                    *
ERROR at line 1:
ORA-00942: table or view does not exist


- 아카이브 로그 파일을 사용하기 위해 로그스위치 강제로 발생시켜서 아카이빙 한다.
SQL> alter system switch logfile;

System altered.

SQL> /

System altered.

SQL> /

System altered.

SQL> /

System altered.

SQL> /

System altered.







복구과정 ------->>>>>>>>>>>>>>


4. 임시 경로를 활용하여 복구하기
복구경로 : /data/temp2
  
$ mkdir -p /data/temp2



1) 현재 SCN 정보를 저장하고 있는 Current control file 을 백업받아서 복구 경로로 복원
SQL> alter database backup controlfile to '/data/temp2/control01.ctl';

Database altered.




2) 파라미터 파일에서 control file 경로 변경 후 DB 종료
- spfile 경우
SQL> alter system set control_files='/data/temp2/control01.ctl' scope=spfile;

- pfile 경우
$ vi $ORACLE_HOME/dbs/inittestdb.ora
기존부분 주석처리후 새경로 입력
#*.control_files='+DATA/testdb/controlfile/current.256.776365293','+FRA/testdb/controlfile/current.256.776365293'
*.control_files='/data/temp2/control01.ctl'





5. MOUNT 까지 재 시작 후 데이터 파일 경로 변경 후 복원하기


SQL> shutdown immediate;

SQL> startup mount;

SQL> select name from v$controlfile;


NAME
--------------------------------------------------------------------------------
/data/temp2/control01.ctl




RMAN> report schema;

Starting implicit crosscheck backup at 29-FEB-12
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=155 devtype=DISK
Crosschecked 2 objects
Finished implicit crosscheck backup at 29-FEB-12

Starting implicit crosscheck copy at 29-FEB-12
using channel ORA_DISK_1
Crosschecked 3 objects
Finished implicit crosscheck copy at 29-FEB-12

searching for all files in the recovery area
cataloging files...
no files cataloged

RMAN-06139: WARNING: control file is not current for REPORT SCHEMA
Report of database schema

List of Permanent Datafiles
===========================
File Size(MB) Tablespace           RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1    300      SYSTEM               ***     +FRA/testdb/datafile/system.262.776456133
2    200      UNDOTBS1             ***     +DATA/testdb/datafile/undotbs1.261.776365357
3    120      SYSAUX               ***     +DATA/testdb/datafile/sysaux.262.776365365
4    5        USERS                ***     +DATA/testdb/datafile/users.264.776365391
5    10       TS_NEW               ***     +FRA/testdb/datafile/ts_new.260.776454711
6    5        TS_NEW               ***     +FRA/testdb/datafile/ts_new.261.776454737

List of Temporary Files
=======================
File Size(MB) Tablespace           Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
1    20       TEMP                 32767       +DATA/testdb/tempfile/temp.263.776365373


RMAN>
run {
allocate channel ch1 device type disk;
allocate channel ch2 device type disk;

set newname for datafile 1 to '/data/temp2/system01.dbf';
set newname for datafile 2 to '/data/temp2/undotbs01.dbf';
set newname for datafile 3 to '/data/temp2/sysaux01.dbf';
set newname for datafile 4 to '/data/temp2/users01.dbf';
set newname for datafile 5 to '/data/temp2/ts_new01.dbf';
set newname for datafile 6 to '/data/temp2/ts_new02.dbf';

restore database;

switch datafile all;
}



released channel: ORA_DISK_1
allocated channel: ch1
channel ch1: sid=155 devtype=DISK

allocated channel: ch2
channel ch2: sid=154 devtype=DISK

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

Starting restore at 29-FEB-12

channel ch1: starting datafile backupset restore
channel ch1: specifying datafile(s) to restore from backup set
restoring datafile 00001 to /data/temp2/system01.dbf
restoring datafile 00002 to /data/temp2/undotbs01.dbf
restoring datafile 00003 to /data/temp2/sysaux01.dbf
restoring datafile 00004 to /data/temp2/users01.dbf
restoring datafile 00005 to /data/temp2/ts_new01.dbf
restoring datafile 00006 to /data/temp2/ts_new02.dbf
channel ch1: reading from backup piece /data/backup/rman/04n4g8dj_1_1_20120229
channel ch1: restored backup piece 1
piece handle=/data/backup/rman/04n4g8dj_1_1_20120229 tag=TAG20120229T003915
channel ch1: restore complete, elapsed time: 00:00:46
Finished restore at 29-FEB-12

datafile 1 switched to datafile copy
input datafile copy recid=10 stamp=776480988 filename=/data/temp2/system01.dbf
datafile 2 switched to datafile copy
input datafile copy recid=11 stamp=776480988 filename=/data/temp2/undotbs01.dbf
datafile 3 switched to datafile copy
input datafile copy recid=12 stamp=776480988 filename=/data/temp2/sysaux01.dbf
datafile 4 switched to datafile copy
input datafile copy recid=13 stamp=776480988 filename=/data/temp2/users01.dbf
datafile 5 switched to datafile copy
input datafile copy recid=14 stamp=776480988 filename=/data/temp2/ts_new01.dbf
datafile 6 switched to datafile copy
input datafile copy recid=15 stamp=776480988 filename=/data/temp2/ts_new02.dbf
released channel: ch1
released channel: ch2
▶ 데이터파일 복원완료




6. redo log 경로 변경을 위해 현재 상태의 control file 을 재생성

SQL> alter database backup controlfile to trace as '/data/temp2/re.sql';

Database altered.
SQL> shutdown immediate;
ORA-01109: database not open

Database dismounted.
ORACLE instance shut down.

  
$ vi /data/temp2/re.sql
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "TESTDB" RESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 (
    '/data/temp2/redo01.log'
  ) SIZE 50M,
  GROUP 2 (
    '/data/temp2/redo02.log'
  ) SIZE 50M,
  GROUP 3 (
    '/data/temp2/redo03.log'
  ) SIZE 50M
DATAFILE
  '/data/temp2/system01.dbf',
  '/data/temp2/undotbs01.dbf',
  '/data/temp2/sysaux01.dbf',
  '/data/temp2/users01.dbf',
  '/data/temp2/ts_new01.dbf',
  '/data/temp2/ts_new02.dbf'
CHARACTER SET KO16MSWIN949

  
SQL> @/data/temp2/re.sql
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1273276 bytes
Variable Size              92275268 bytes
Database Buffers          188743680 bytes
Redo Buffers                2920448 bytes

Control file created.




7. Recover 수행 (시간기반 복구)

$ rman target /

RMAN>
run {
sql 'alter session set nls_date_format="YYYY-MM-DD:HH24:MI:SS"';
set until time='2012-02-29:02:13:27';
recover database;
alter database open resetlogs;
}



using target database control file instead of recovery catalog
sql statement: alter session set nls_date_format="YYYY-MM-DD:HH24:MI:SS"

executing command: SET until clause

Starting recover at 29-FEB-12
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=155 devtype=DISK

starting media recovery

archive log filename=/data/arc2/15_1_776365287.arc thread=1 sequence=15
media recovery complete, elapsed time: 00:00:03
Finished recover at 29-FEB-12

database opened

  

SQL> select status from v$instance;

STATUS
------------
OPEN


SQL> select * from scott.tt100;

        NO
----------
         1
         2

▶ 임시로 복구 완료되었음






8. 복구된 테이블 exp 수행해서 운영 DB Open 후 import

① 복구된 테이블 exp로 안전하게 빼두기

$ exp scott/tiger tables=tt200 file=tt200.dmp

Export: Release 10.2.0.5.0 - Production on Wed Feb 29 01:36:15 2012

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


Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Export done in KO16MSWIN949 character set and AL16UTF16 NCHAR character set

About to export specified tables via Conventional Path ...
. . exporting table                          TT200          2 rows exported
Export terminated successfully without warnings.




② 컨트롤파일 위치 원래대로 돌리기
- spfile 경우

SQL> alter system set control_files='+DATA/testdb/controlfile/current.256.776365293','+FRA/testdb/controlfile/current.256.776365293' scope=spfile;

- pfile 경우

$ vi $ORACLE_HOME/dbs/inittestdb.ora
기존내용 살리고 임시경로 지정해준것 지우거나 주석처리
*.control_files='+DATA/testdb/controlfile/current.256.776365293','+FRA/testdb/controlfile/current.256.776365293'
#*.control_files='/data/temp2/control01.ctl'




③ 원래 컨트롤 파일로 바꾸고 재 open후 장애 테이블 확인

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.



SQL> select * from scott.tt200;
select * from scott.tt200
                    *
ERROR at line 1:
ORA-00942: table or view does not exist
복구 전이라 에러 발생




④ imp 로 테이블 살리기

$ imp scott/tiger file=tt200.dmp ignore=y fromuser=scott touser=scott

Import: Release 10.2.0.5.0 - Production on Wed Feb 29 01:54:06 2012

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


Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

Export file created by EXPORT:V10.02.01 via conventional path
import done in KO16MSWIN949 character set and AL16UTF16 NCHAR character set
. importing SCOTT's objects into SCOTT
. . importing table                        "TT200"          2 rows imported
Import terminated successfully without warnings.




⑤ 복구 확인

SQL> select * from scott.tt200;

        NO
----------
         1
         2

▶ 복구완료






9. 정리
 : ASM 기반에서 장애가 발생했을 경우 복구 방법 완료
 : ASM 기반이 파일 시스템 기반과 조금 다르지만 복구 원리는 동일함
 : truncate table 장애, drop user 장애, drop tablespace 장애 등도 모두 원리 동일
 : RAC 기반에서 ASM을 사용할 경우 복구 원리 동일함




=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 실습2 끝

Saturday, April 9, 2016

[python] port scanner

import optparse
from socket import *
from threading import *

screenLock = Semaphore(value=1)
def connScan(tgtHost, tgtPort):
    try:
        connSkt = socket(AF_INET, SOCK_STREAM)
        connSkt.connect(tgtHost, tgtPort)
        connSkt.send('ViolentPython\r\n')
        results = connSkt.recv(100)
        screenLock.acquire()
        print ('[+] %d/tcp open'% tgtPort)
        print ('[+] '+str(results))
    except:
        screenLock.acquire()
        print ('[-] %d/tcp closed'% tgtPort)
    finally:
        screenLock.acquire()
        connSkt.close()

def portScan(tgtHost, tgtPorts):
    try:
        tgtIP = gethostbyname(tgtHost)
    except:
        print ("[-] Cannet resolve '%s': Unknown host'"% tgtHost)
        return
    try:
        tgtName = gethostbyaddr(tgtIP)
        print ("\n[+] Scan Results for: "+tgtName[0])
    except:
        print ("\n[+] Scan Results for: "+tgtIP)
    setdefaulttimeout(1)
    for tgtPort in tgtPorts:
        t = Thread(target=connScan, args=(tgtHost, int(tgtPort)))
        t.start()
        print ("Scanning Port "+ tgtPort)

def main():
    parser = optparse.OptionParser('usage %prog -H -p ')
    parser.add_option('-H', dest='tgtHost', type='string', help='specify target host')
    parser.add_option('-p', dest='tgtPort', type='string', help='specify target port')
    (options, args) = parser.parse_args()
    tgtHost = options.tgtHost
    tgtPorts = str(options.tgtPort).split(',')
    if (tgtHost == None) | (tgtPorts[0] == None):
        print (parser.usage)
        exit(0)
    portScan(tgtHost, tgtPorts)

if __name__ == '__main__':
    main()

#'print (tgtHost+', '+str(tgtPort))
 
'''
c:\Python34\python.exe port_scanner.py -H localhost -p 135,136
'''

Friday, April 8, 2016

[python] zipfile cracker

import zipfile
import optparse
from threading import Thread
def extractFile(zFile, password):
    try:
        zFile.extractall(pwd=password.encode())
        print ('[+] Found Password :'+password+ '\n')
    except Exception as e:
        print ('[-] Error = '+str(e)+ '\n')
        pass

def main():
    parser = optparse.OptionParser("usage%prog " + "-f -d ")
    parser.add_option('-f', dest='zname', type='string', help='specify zip file')
    parser.add_option('-d', dest='dname', type='string', help='specify dictionary file')
    (options, args) = parser.parse_args()
    if (options.zname == None) | (options.dname == None) :
        print (parser.usage)
        exit(0)
    else:
        zname = options.zname
        dname = options.dname
    zFile = zipfile.ZipFile(zname)
    passFile = open(dname)
    for line in passFile.readlines():
        password = line.strip('\n')
        t = Thread(target=extractFile, args=(zFile, password))
        t.start()

if __name__ == '__main__':
    main()

'''
python zipfile_crack.py -f testfile.zip -d dictionary.txt
'''

Wednesday, November 12, 2014

Open API에 대한 간단한 정리 및 기술 요약

Open API에 대한 간단한 정리 및 기술 요약

Open API는 서비스, 정보, 데이터 등을 언제, 어디서, 누구나 쉽게 이용할 수 있도록 공개된 API를 말하며, 플랫폼 독립적으로 새로운 응용 서비스를 쉽게 개발할 수 있도록 합니다. 

주요 기술로는 웹서비스, SOAP, REST, XML, JSON, OAuth 등이 있으며 각 기술들에 대해 간단히 정리해 보면 다음과 같습니다.  

웹서비스 : Open API에서는 주로 사용하는 웹서비스 기술로는 SOAP (Simple Object Access Protocol) 과 REST (Representational State Template)가 사용됨

SOAP : 
HTTP, HTTPS, SMTP등을 통해 XML기반 메세지를 교환하는 프로토콜
장점 : 프록시/방화벽 영향 없고, 플랫폼/언어에 독립적, 웹서비스표준 사용(WSDL, UDDI, WS-*), 에러처리 기본제공, 분산환경에 적합
단점 : 복잡한 구조로인한 Overhead, 무겁고 느리고 개발 난이도 높음

SOA(Service Oriented Architecture) 구조에 따라 UDDI 레지스트리를 통해 웹 서비스를 등록(Publish) 하고, 탐색(Find), 바인딩(Bind) 하여 적용. 
동작방식은 서비스 요청자가 웹 서비스 요청을 SOAP 로 encoding 하여 Service Provider에게 전달하면 Service Provider는 이를 decoding 하여 적절한 서비스 로직을 태워 결과를 얻고 다시 SOAP로 encoding 하여 서비스 요청자에게 반환하는 방식으로 이루어짐. 주로 Business transaction이나 Service 상호 연동을 위해 사용됨.

REST : 
HTTP를 통해 세션 트랙킹 같은 부가적인 기능을 전송레이어 없이 전송하기 위한 간단한 인터페이스
HTTP의 기본 개념을 충실히 따름
장점 : 플랫폼/언어 독립적, 단순, 러닝커브 작음, 간결함(추가적인 메시징 계층 없음
단점 : point-to-point 통신모델로 분산 환경에 적합치 않음, 보안/정책 표준 없음. HTTP만 지원
 
ROA (Resource Oriented Architecture) 기반으로 Resource를 등록, 저장해 두는 중간매체 없이 Resource 제공자가 직접 요청자에게 Resource를 제공하는 방법을 이용. 동작 방식은 HTTP 프로토콜의 GET/PUT/POST/DELETE method를 이용하여 JSON/XML/RSS 등 다양한 형태로 Resource를 직접 실어 나름. 데이터와 UI 처리시에 사용함

XML/JSON : 
데이터를 표현하는 XML과 JSON방식의 경우 JSON은 데이터를 key-value 로 경량화 하여 표현/처리하기 때문에 데이터 크기가 줄어드는 반면 처리시간은 XML보다 많이 소요됨

OAuth :
Open API를 사용하기 위해 표준화된 인증 방식 (RFC 5849/6749, http://tools.ietf.org/html/rfc5849http://tools.ietf.org/html/rfc6749)
사용자가 API를 사용하여 서비스를 요청하기 위해 Service Provider에 등록 -> 등록이 완료되면 토큰을 발급 -> 등록된 토큰으로 서비스를 받을 URL에 접근 -> 인증이 되면 PIN을 Return -> 해당 Application에서 PIN을 입력 -> Access Token 발급하여 서비스 받음. ID/PW에 대한 노출 없이 Access Token을 통해 인증처리 됨

Wednesday, May 28, 2014

[aix] cpu deallocation

AIX CPU deallocation

1) Activate cpu deallocation 
# chdev -l sys0 -a cpuguard='enable'
check the application
# lsattr -El sys0

2) check the number of processor which try to disable
# lsdev -Cc processor

3) cpu disable
# cpu_deallocate (logical CPU number)


4) check the processor status
# lsattr -El proc##


※ Caution
You need to reboot to reactivate the disabled cpu. 
It needs more than 3 cpu to use cpuguard.

Thursday, May 8, 2014

[python] install easy_install, pip

which easy_install 2>/dev/null
    if [ $? -ne 0 ];then
        wget https://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz
        tar xvfz setuptools-0.6c11.tar.gz
        pushd setuptools-0.6c11
            sudo python setup.py install
        popd
        sudo rm -rf setuptools-0.6c11*
    fi

# running pip

$ sudo easy_install pip

[python] simplejson import

>>> import simplejson
Traceback (most recent call last):
  File "", line 1, in
ImportError: No module named simplejson
>>> import simplejson ?
  File "", line 1
    import simplejson ?
                      ^
SyntaxError: invalid syntax
>>> import json as simplejson
>>> help(json)

Help on package json:

NAME
    json - A simple, fast, extensible JSON encoder and decoder

FILE
    /usr/lib64/python2.6/json/__init__.py

DESCRIPTION
    JSON (JavaScript Object Notation) is a subset of
    JavaScript syntax (ECMA-262 3rd edition) used as a lightweight data
    interchange format.

    json exposes an API familiar to uses of the standard library
    marshal and pickle modules.

    Encoding basic Python object hierarchies::

        >>> import json
        >>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
        '["foo", {"bar": ["baz", null, 1.0, 2]}]'
        >>> print json.dumps("\"foo\bar")
        "\"foo\bar"
        >>> print json.dumps(u'\u1234')
        "\u1234"

Tuesday, March 11, 2014

[middleware] WebtoB + JEUS + web application

1. WebtoB 설치

1.1 설치파일, 라이센스(license.dat)준비
1.2 라이센스 적용 : webtoB4.1\license\license.dat

2. WebToB 실행2.1 실행파일생성(wsconfig) --> 환경파일 컴파일 : wscfl -i [환경파일]
2.2 실행 : wsboot --> wsboot -w (handler가 process들을 확인하며 booting->안정적인 booting)
2.3 종료 : wsdown --> wsdown -i (질의를 던지지 않고 바로 down)
2.4 웹서비스 테스트 : http://127.0.0.1:8080/
3. WebToB 환경설정 파일 : sample.m3.1 가상홍스트 추가하기
*VHOST
vhost1 DOCROOT="D:/TmaxSoft/edu01", HOSTNAME="test.tmax.co.kr",
NODENAME="Impression32", PORT="80"
3.2 윈도우의 hosts 파일에 등록하기
D:\WINDOWS\system32\drivers\etc\hosts 파일에 등록
3.3 환경파일 컴파일 : wscfl -i sample.m
3.4 기동중인 webtob 다운 후 재부팅 : wsdown -i / wsboot
3.5 테스트
NODE절 포트 수정 확인 :
 http://127.0.0.1:80/
가상호스트 추가 확인 : http://test.tmax.co.kr:80/
4. WebtoB 관리 툴 : wdadmin
4.1 wi : 웹투비의 기본 정보 출력
4.2 ci : 접속한 클라이언트의 정보 출력
ci -s : 접속한 클라이언트의 수 출력
cfg : 웹투비의 환경설정 내용 확인
cfg -n : 노드 환경설정 내용 확인
si : 웹투비의 서비스 목록 출력
st -v : 웹투비의 서비스 상태 출력
st -p : 웹투비의 프로세스 상태 출력
repeat(r) : 웹투비의 명령을 반복적으로 수행하여 모니터링 효과를 냄
ex) r -i 2 -k 10 si
5. JEUS 설치5.1 JEUS 설치파일, 라이센스
5.2 라이센스 적용 : D:\TmaxSoft\JEUS5.0\license\license파일적용
6. JEUS 실행6.1 Two-step 부팅
: 서버실행 - jeus
: 엔진실행 - JEUS의 웹관리자
웹관리자주소 :
 http://127.0.0.1:9744/webadmin
포트번호지정 : 기본Base port(9736) + 8
포트번호변경 : bin/jeus.properties.cmd
JEUS/config/vhost.xml 의 포트번호를 변경합니다.
웹관리자 계정 : administrator
패스워드 : jeusadmin
노드선택 --> 제어 --> 부트

6.2 One-step 부팅
: 부트명령(jboot.bat) --> jeus -xml -Uadministrator -Pjeusadmin
: 종료명령(jdown.bat) --> jeusadmin [노드명] -Uadministrator -Pjeusadmin jeusexit

6.3 JEUS 웹서비스 테스트
:
 http://127.0.0.1:8088/
7. JEUS의 환경설정 파일7.1 JEUS\config\JEUSMain.xml : JEUS서버 전체의 환경 설정
7.2 EJBMain.xml : EJB엔진에 대한 환경 설정
7.3 JMSMain.xml : JMS엔진에 대한 환경 설정
7.4 WEBMain.xml : Servlet엔진에 대한 환경 설정
web.xml : 웹의 컨텍스트를 만들때 컨텍스트의 환경설정
7.5 WSMain.xml : WS엔진에 대한 환경 설정
1. JEUS에서 web application 서비스하기
1.1 물리적 Context 생성
C:\tmaxsoft\edu01
|----WEB-INF
web.xml(NODE의 servlet engine에서 가져옴)
1.2 JEUS에 Context 등록
웹관리자 로그인 --> J2EE 어플리케이션 모듈배치 --> 절대경로
--> ~~~~ --> 배치(2단계배치[J2EE어플리케이션모듈], 영구배치[J2EE어플리케이션모듈배치])
1.3 서비스 실행
:테스트를 위한 jsp파일 생성(test.jsp)
:http://127.0.0.1:8088/edu01/test.jsp
8088 : http_listener port
edu01: 배치한 모듈명
test.jsp :
실습) edu02 컨텍스트 생성, 실행 웹 어플리케이션 파일 test02.jsp --> http://127.0.0.1:8088/edu02/test02.jsp
2. JEUS container 관리2.1 생성 : 서블릿 엔진 생성(리스너ID, 리스너PORT 지정)
2.2 서블릿 엔진 테스트 --> http://127.0.0.1:8089/edu01/test.jsp
3. WebtoB와 JEUS연동하기3.1 WebtoB 설정 : sample.m 파일에 추가
3.2 JEUS 설정 : 해당 컨테이너의 webtob 리스너 연결 설정
3.3 연동 설정 테스트 --> http://127.0.0.1:80/edu01/test.jsp
4. 실 습
WebtoB의 가상호스트 vhost1 과 JEUS의 container1에 webtob2 리스너 추가, 연동.
http://test.tmax.co.kr:80/edu01/test.jsp
4.1 WebtoB 설정 추가
4.2 JEUS container1에 webtob2 리스너 추가
5. JEUS에서 서블릿 실습
5.1 서블릿 코드 작성 : HelloWorldServlet.java
5.2 컴파일 : jeus.jar 파일 경로 지정후
javac -d . HelloWorldServlet.java
5.3 JEUS에서 실행 --> http://127.0.0.1:8088/edu01/servlets/HelloWorldServlet
web.xml 문서의 WorkServlet 은 /servlets/* 로 매핑되어 있음
1. WAR 파일 생성하기1.1 패키징하기 : JeusBuilder 사용
- 파일명 : wartest.war
서블릿명 : Hello
서블릿 클래스 : tmax.HelloWorldServlet
URI 패턴지어 : /helloworld
Contextpath(url에서 context호출) : /hello
1.2 JEUS에 패키징한 모듈 배치하기
- JEUS 웹관리자 --> J2EE 어플리케이션 모듈 배치 --> 모듈배치 --> ~~~ --> 배치(2단계 배치, 영구배치)
http://1273.0.0.1:8088/Hello (/Context를 정의, /Context는 모듈에 하나존재)
1.4 실 습
파일명 : wartest2.war
서블릿명 : Hello2
서블릿 클래스 : tmax.HelloWorldServlet
URI 패턴지정 : /helloworld2/
Contextpath : /hello2
<결과확인>
 http://127.0.0.1:8088/hello2/Hello2 , http://127.0.0.1:8088/hello2/helloworld2/
2. DB 연동2.1 DataBase 정보 확인
- 서버 IP : 192.169.10.5
- 접속계정 : oracle/dkzkepal(아카데미)
- sql접속계정 : sqlplus edu01~edu32/edu01~edu32
- SID 명 : ORA10G
- 테이블 생성 : TmaxTest
create table TmaxTest ( name varchar(20), address varchar(20) );
- 데이터 입력 :
Insert into TmaxTest values('장동건','서울'); Insert into TmaxTest values('강호동','부산');
- commit;

2.2 드라이버 준비 및 JEUS 서버 등록
- JDBC 드라이버 : ojdbc14.zip
- 오라클 JDBC 드라이버 다운로드 사이트 :
 http://www.oracle.com/global/kr
- JEUS 등록 : D:\TmaxSoft\JEUS5.0\lib\datasource\ojdbc14.jar
2.3 DataSource 설정
- JEUS 웹관리자 -> JEUS 매니저 리소스 -> JDBC -> 새 JDBC 데이터 소스 생성
2.4 실 습
로그인 실행 테스트 : MVC
login.jsp (presentation 로직 : View)
loginCheck.jsp (business 로직 : Control)
TmaxLogin (data : Model)
아이디 : tmax 비밀번호 : 1234
***************************************************************************************************************
*** webToB
***************************************************************************************************************
*VHOST
vhost11 DOCROOT="c:/xxx/webapps/test/",
NODENAME = "web1",
HOSTNAME = "test.com",
PORT = "80"
vhost12 DOCROOT="c:/xxx/webapps/test/",
NODENAME = "web1",
HOSTNAME = "www.test.com",
PORT = "80"

* SVRGROUP
vhost11g NODENAME = "web1", SVRTYPE = JSV,Vhostname="vhost11"
vhost12g NODENAME = "web1", SVRTYPE = JSV,Vhostname="vhost12"

* SERVER
test SVGNAME = vhost11g, MinProc = 20, MaxProc = 20, HttpInBufSize=0
wwwtest SVGNAME = vhost12g, MinProc = 20, MaxProc = 20, HttpInBufSize=0

***************************************************************************************************************
*** JEUS
***************************************************************************************************************
container.xml 에 두개의 contextgroup을 생성하여 각각의 RegistrationID 를 test, wwwtest 로 하여 연동
***************************************************************************************************************
웹모듈(application) 추가하기
1) %JEUS_HOME%\config\노드명\JEUSMain.xml 수정
- 아래내용 추가

폴더위치
애플리케이션명
\
COMPONENT



컨테이너명

MyGroup

ISOLATED
JAR
2) JEUS 재시작
3) 해당폴더\WEB-INF/web.xml 생성 확인
4) 해당폴더\WEB-INF/jeus-web-dd.xml 생성 확인

http://www.tmaxsoft.com/xml/ns/jeus
">
/
true

false
false

-1
false
false
false

false

============================================================================================================
JDBC*Class Loading : Class.forName();
->class를 사용하는 방법

*Connection 생성방법 2가지
-DBCP를 사용안함 (Driver class를 로드하여 DB에 접근)
public Connection connectDbms() {
Connection con = null;
Properties env = new Properties(); //사용자 환경변수 객체

try {
env.load(new FileInputStream("d:\\java\\day6\\db.properties"));
Class.forName(env.getProperty("driver")); // JDBC 드라이버용 클래스 로드
} catch (ClassNotFoundException e) {
e.printStackTrace();
return null;
}catch (FileNotFoundException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}

// 1. DB Connection 얻기
String url = env.getProperty("url");
//"jdbc:oracle:thin:@127.0.0.1:1521:ORCL"; // JDBC 전용 URL 형식으로 기술
// thin = type4(순수java)
String user = env.getProperty("user"); //"scott";
String password = env.getProperty("password"); //"tiger";

try {
con = java.sql.DriverManager.getConnection(url, user, password);
System.out.println("****** Connect to DBMS! *******");
} catch (SQLException e) {
e.printStackTrace();
return null;
}
return con;
}
-DBCP 사용 (server.xml, web.xml에 Container에 대한 코드 추가)
try{
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
ds = (DataSource)envCtx.lookup("jdbc/EmployeeDB");
}catch(NamingException ne){
ne.printStackTrace();
}
1. Servlet의 init()메소드에서 DataSource를 생성하여 인자로 넘겨 connection 가져오기
-Servlet 마다 DataSource 생성
2. ServletContextListener에서 한번만 생성하여 인자로 넘김
-DataSource 한번만 생성해도 됨(Servlet마다 DataSource를 생성하지 않음)
3. ServletContextListener에서 생성한 DataSource를 Single tone pattern으로 사용
-class에서도 single.getAttribute()로 DataSource를 얻어 올 수 있음

*statement
상속관계Statement <---------- br="" callablestatement="" preparedstatement="">(가장 보편적인 처리) (binding 변수를 통해 빠를 sql처리) (가장 특화 function, procedure호출)
->Statement
String sql = "select age from test1 where id='syh1011'";
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);

->PreparedStatementString sql = "select age from test1 where ?=?";
PreparedStatement pstmt = con.prepareStatementStatement(sql);
pstmt.setString(1, "id");
pstmt.setString(2,"syh1011");
ResultSet rs = pstmt.executeQuery();
->CallableStatement
String sql = "select anem from salary";
PreparedStatement pstmt = conpreparedStatement(sql);
CallableStatement sctmt = con.prepareCall("{call adjust(?,?)}");
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
cstmt.setString(1, rs.getString("name"));
cstmt.setFloat(2, (float)0.05);
cstmt.executeUpdate();
}
executeQeury(String sql) : SQL문이 select일 경우
executeUpdate(String sql): SQL문이 insert, update, delete문 등일 경우
execute(String sql) : SQL문을 알지 못할 경우
->장점, 단점
*ResultSet, getXXX()로 Column값 얻기, Type별로 다른 method사용
getXXX(int columnindex) : columnIndex의 값을 XXX타입으로 반환
getXXX(String columnName): columnName의 값을 XXX타입으로 반환
*Transaction 처리Transaction의 4가지 특성(ACID)
*원자성(Atomicity)
*일관성(Consistency)
*고립성(Isolation)
*지속성(Durability)
con.setAutoCommit(false); ->true : transaction을 시작하지 않겠다. ->false: transaction을 시작하겠다.
setAutoCommit(false)와 commit(), rollback()사이의 operation들에 대한 transaction 처리
-> con.commit(); -> con.rollback();
***********************************************************************************************************
#####
##### DOMAIN 절
#####
# 독립적인 WebtoB 시스템의 전반적인 환경 설정을 할 수 있다.
*DOMAIN
# 도메인 네임은 string 형식으로 31자까지 사용 가능.
# 다른 절들의 string 항목도 이와 동일하다.
webtob1

#####
##### NODE 절
#####
# WebtoB를 이루는 각 Node들에 대한 구체적인 환경 설정을 할 수 있다.
# 필수 항목으로 WebtobDir, ShmKey, DocRoot 항목을 설정해야 있다.
*NODE
# 실제 등록된 호스트의 이름을 말하며, UNIX의 경우 "uname -n" 명령으로 각 Host의 이름을 확인할 수 있다.
# Node명은 반드시 UNIX의 경우 "/etc/hosts"(Windows의 경우 C:\WINNT\system32\drivers\etc) 파일에 등록되어 있어야 한다.
# 하나의 Domain은 하나 이상의 Node로 이루어지므로, NODE절에는 최소한 하나 이상의 Node 이름이 정의되어야 한다.
WebServer
# WebtoB가 설치되어 있는 Home Directory 의 절대 경로명이다.
# 환경변수로 정의되는 WEBTOBDIR 과 동일한 값으로 설정하면 된다.
WebtobDir = "/data2/wbqam/webtob",
# Shared Memory Segment를 가리키는 값이다.
# 32768 ~ 262143 범위 내에서 다른 업무에 사용되는 키값과 충돌이 나지 않게 Shared Memory의 Key값을 설정 하면 된다.
ShmKey = 78100,
# WebtoB가 웹을 통해 서비스하는 모든 문서를 포함하는 Root Directory 의 절대 경로를 설정한다.
DocRoot="/data2/wbqam/webtob/docs",
# HTTP Request Handler) Process의 개수를 설정한다.
# Hth하나당 약 800개 이상의 Client를 수용할 수 있다.
# Default Number 설정은 1 이며, 최대 20개 까지 지정할 수 있다.
Hth = 2,
# WebtoB가 Listen하는 Port를 지정한다.
# 일반적으로 Web Server는 80 Port 이용하므로 설정하지 않을경우 default 값으로 80으로 설정된다.
# 최대 100개의 포트를 동시에 지정하여 사용할 수도 있다.
# Listen 항목과 동시에 운영할 수 없으며, Port보다 Listen항목에서 지정되는 Port가 우선순위가 높아
# 동시에 지정하면 Port항목은 무시 된다.
Port = "8100,8200",
##### User, Group 설정
# WebtoB에서 시스템의 보안을 위하여 WebtoB의 실제 실행 Process에 대한 권한 설정을 할 수 있다.
# 설정한 권한으로 Process가 실행되기 위해서는 반드시 root 권한으로 WebtoB를 실행해야 한다.
# 설정된 Group의 권한으로 WebtoB가 요구를 수행하게 된다.
# Client 요구를 수행하기 위하여 Group 설정을 권장한다.
# Group 설정은 Unix계열의 OS에서만 지원한다.
Group = "nobody",
# 설정된 User의 권한으로 WebtoB가 요구를 수행하게 된다.
# Client 요구를 수행하기 위하여 User 설정을 권장한다.
# User 설정은 Unix계열의 OS에서만 지원한다.
User = "nobody",
# 관리자의 정보를 나타낸다.
# 관리자에게 연락할 수 있는 e-mail address를 설정할 수 있다.
Admin = "wbqam@tmax.co.kr",
# Http Response Header의 host name field에 기록될 값을 설정할 수 있다.
HostName = "www.tmax.co.kr",
# 해당 서버의 HostName를 적어 준다.
# 특별히 $(NODENAME)이라고 적어주면, 자동으로 해당 서버의 HostName가 적용된다.
# 한글 노드명을 사용하거나 긴 노드명을 사용할 경우 NodeName 을 설정한다.
NodeName = "$(NODENAME)"
# MultiNode 설정시 각 Node들 간의 연결 Port 번호를 지정한다.
# MultiNode 설정시 반드시 지정해 주어야 한다.
# default 설정은 7777 번이다.
# NodePort = 7777,
# WebtoB와 Servlet 수행 Server간의 연결 Port 번호를 지정한다.
# default 설정은 9999 번이다.
JSVPort = 9100,
# Multi Node 구성시 Node 관리 차원에서 Node간 통신을 위한 Port번호를 지정한다.
# 위의 NodePort와는 달리 이것은 관리 Process 중 하나인 wsracd Daemon에서 사용하는 Port번호이다.
# default 설정은 3333 번이다.
RacPort = 4455,
# WebtoB는 Server 내부 Caching의 한 Entry의 크기로서 기본단위는 Kbyte이다.
# default size는 128 Kbyte 이다.
CacheSize = 128,
# Cache의 총 Hashing Key 엔트리 개수를 설정한다.
# default 개수는 128개 이다.
CacheEntry = 256,
# HTML file에 대한 cache refresh time을 설정한다.
# default 설정은 0 second 이다.
CacheRefreshHtml = 60,
# DirIndex에 대한 cache refresh time을 설정한다.
# default 설정은 0 second 이다.
CacheRefreshDir = 60,
# 사용자가 웹사이트에 접속한 후, 다른 웹페이지를 읽어 들이기 위해 곧 다시 접속을 시도 할 경우
# 불필요한 시간 지연이 없도록 하려면 이 항목을 지정함으로써 접속을 단절하지 않고 유지할 수 있다.
KeepAlive = Y,
# 커넥션 설정후 일정 개수의 요구는 커넥션을 유지한 상태로 서비스를 하고 커넥션을 끊도록 하는데,
# 커넥션을 끊기 전에 들어주는 요구의 개수를 지정한다.
# default 설정은 9999 이다.
KeepAliveMax = 10,
# 하나의 Client가 불필요하게 커넥션을 오래 잡고 있는 경우를 막기 위해
# 다음 Request 까지 일정 시간 이상이 되면 커넥션을 끊을 수 있도록 설정할 수 있다.
# default 설정은 60 second 이다.
KeepAliveTimeout = 30,
# 사용자의 최대 접속시간을 지정한다.
# default 설정은 300 second 이다.
Timeout = 100,
# WebtoB를 통해 사용자별로 동시에 서비스 하려는 경우 설정한다.
# 값이 설정이 되면 각 사용자의 directory를 찾아서 서비스 한다.
UserDir = "public_html",
# WebtoB를 통해 응용 프로그램을 바로 호출하는 경우 해당 프로그램이 위치할 디렉토리를 설정한다.
# 경로명은 절대 경로와 WEBTOBDIR을 기준으로 한 상대 경로를 사용할 수 있다.
AppDir = "/data2/wbqam/webtob/ap",
##### Log Directory
# WebtoB에서는 기본적으로 Log 정보를 남기기 위하여 설정한다.
# 환경파일에 따로 설정하지 않을경우 WEBTOBDIR/log 디렉토리에 기록이 된다.
# 로그가 기록될 디렉토리가 없을경우 booting시 에러가 나므로, 실제 존재하는 디렉토리여야 한다.
# 경로명은 절대 경로와 WEBTOBDIR을 기준으로 한 상대 경로를 사용할 수 있다.
# 시스템 메시지가 기록될 Directory의 경로명을 설정한다.
# Default Path는 (WEBTOBDIR)/log/syslog 이다.
SysLogDir = "/data2/wbqam/webtob/log/syslog",
# 사용자 메시지가 기록될 Directory의 경로명을 설정한다.
UsrLogDir = "/data2/wbqam/webtob/log/usrlog",
# Service Directory로 요청이 올대 기본적으로 서비스되는 파일 이름을 설정한다.
# 기본 설정은 index.html 이다.
IndexName = "indexname.html",
# Service Directory에 요구를 보낼 때의 동작을 지정한다.
# Options에 지정할수 있는 서비스와 기능들을 아래와 같다.
# Service: HTML, CGI, SSI, PHP, JSV
# Function: INDEX, INCLUDE
# 모든 기능을 이용하려면 "+ALL", 모든 기능을 이용하지 않으려면 "-ALL"을 설정할 수 있다.
Options = "+Index",
# Client가 보내는 Request Method에 대한 정의를 할 수 있다.
# HEAD, GET, POST, OPTIONS 등을 설정을 할 수 있으며, 사용하고 싶지 않을경우 "-Option" 으로 설정하면 된다.
# 참고로 HTTP Method CONNECT, DELETE, GET, HEAD, OPTIONS, POST, PUT, TRACE 등이 있다.
Method = "GET,POST,HEAD,-OPTIONS",
# 여러개의 IP Address를 가진 Server에서 자신이 원하는 IP로만 서비스 하기를 원할때 지정한다.
# 여러개의 아이피와 포트를 지정할 수도 있다.
# Port항목과 Listen 항목을 동시에 지정하는 경우 Port에 지정한 Port는 무시된다.
# Listen="192.168.1.43:8300",
# DIRINDEX절에서 설정하는 디렉토리 인덱스의 이름을 적어준다.
DirIndex = "diridx_def"
# 접속 Client가 사용 언어를 지정하지 않았을 경우
# Server쪽에서 지정된 언어 순서대로 Multiview request 등의 처리가 이루어지도록 한다.
LanguagePrio = "kr",
# LOGGING절에서 설정하는 Logging Name을 설정하며, 해당 설정에 해당하는 Log를 남기게 되는 것이다.
Logging = "log1",
# LOGGING절에서 설정하는 Logging Name을 설정하며, 해당 설정에 따라 Error Log를 남기게 된다.
ErrorLog = "log2",
# WebtoB에서 특정 정보를 읽어 들일 필요가 있는 경우 이용된다.
# EnvFile = "WebtoB.env",
# WebtoB에서 SSL을 이용할 때 Y 로 설정한다.
# default 설정은 N 이다.
# SslFlag = Y,
# SslFlag = Y 상태일때 적용이 되며, SSL절에 설정한 Ssl Name를 지정한다.
# SSLNAME = "ssl_def",
# 서버 프로세스에 속한 노드의 최대 동시 접속자 수를 설정한다.
MaxUser = 4000,
# WebtoB 내부 프로세스의 접근권한을 설정한다.
# Default 설정은 0700 이다.
# IpcPerm = 0744,
# 접속을 기다리는 큐(queue)의 길이를 제한하는 것으로,
# 서버가 대량의 접속 시도를 한꺼번에 날려주는 TCP SYN해킹을 당하고 있다면 유용하게 사용 될수 있을 것이다.
# default 설정은 511 이다.
ListenBacklog = 100,
# TCP 전송 Buffer의 크기를 설정하는 것으로, 이 항목을 이용하면 특정한 환경에서 동작 속도를 향상시킬 수 있다.
# default 설정은 0이며, 0의 값은 OS default값을 사용함을 의미한다.
SendBufferSize = 4096,
# 클라이언트의 요청시 HTTP 프로토콜을 통해 서버가 제공할 수 있는 Request Body 크기를 바이트 단위로 정의하는 것으로,
# 0의 값은 크기에 제한이 없음을 의미한다.
# default 설정은 0 bytes 이다.
LimitRequestBody = 20000,
# 클라이언트의 요청시 허용되는 HTTP Request header field의 수를 설정한다.
# 0의 값은 제한이 없음을 의미한다.
# default 설정은 100 이다.
LimitRequestFields = 20,
# 클라이언트의 요청시 허용되는 각 HTTP Request header field의 크기를 설정한다.
# 최대 허용되는 값은 8190이다.
# default 설정은 8190 bytes 이다.
LimitRequestFieldSize = 300,
# 클라이언트의 요청시 허용되는 HTTP Request line의 최대 크기를 설정한다.
# 최대 허용되는 값은 8190이다.
# default 설정은 8190 이다.
LimitRequestLine = 4000,
# HTTP 응답 헤더의 Server에 관한 정보를 어떻게 다룰지 결정한다.
# "Off", "Prod[uctOnly]", "Min[imal]", "OS", "Full", "Custom=xxx/x.x" 등을 설정할 수 있다.
ServerTokens = "Minimal",
# HTTP 요청으로부터 해당 Server와 Service를 결정할때, URI절과 EXT절의 우선순위를 결정한다.
# Vhost절에 이 항목이 설정되지 않은 경우는 Node절에 설정된 값이나 기본값을 Vhost가 따르게 된다.
# default 설정은 "uri,ext" 이다.
ServiceOrder = "ext,uri",
# HTTP header의 Content-Type에 character set 설정이 없는 Request에 응답에 추가될 character set의 이름을 설정한다.
# "On"(ISO-8859-1), "Off"(설정안함), "_charset_"(사용자 기술) 중 하나를 설정할 수 있다.
# 여러 절에서 적용되는 우선 순위는 Node < Vhost < SvrGroup < Directory 순이다.
DefaultCharset = "Off",
# MIME-Type을 결정할 수 없는 문서의 Default Content-Type을 설정한다.
# Default Content-Type은 SvrGroup, Vhost, Node절의 순으로 결정된다
DefaultMimetype = "text/html",
# Web Server에서 내부 프로세스간 IPC통신을 하기 위해서 기본적으로 특정 포트(6666)를 사용하는데,
# IPCBasePort항목을 통해 해당 포트를 변경할 수 있다.
# 현재 Windows에서만 지원된다. (UNIX의 경우 PIPE통신)
# default 설정은 6666 이다.
# IpcBasePort = 6667,
# EXPIRES절의 설정한 Expires이름을 설정한다.
Expires = "exp11, exp12, expdef1",
# TCPGW 절에 설정한 tcpgw 이름을 설정한다.
TcpGW = "tcpgw_full",
# ERRORDOCUMENT절에 설정한 ErrorDocument 이름을 설정한다.
ErrorDocument = "404",
# WebtoB 내부 프로세스 통신을 위한 socket생성 디렉토리를 설정한다.
# default 설정은 $WEBTOBDIR/path 이다.
PathDir="/data2/wbqam/webtob/path",
##### 멀티노드 구성시 아래와 같이 추가적으로 노드를 정의한다.
#tmaxi1
# WEBTOBDIR="/data/wbqam/webtob",
# SHMKEY = 78100,
# DOCROOT="/data/wbqam/webtob/docs",
# APPDIR="/data/wbqam/webtob/ap",
# PORT = "8100",
# HTH = 2,
# LOGGING = "log5",
# ERRORLOG = "log6",
# HostName = "www.tmax.co.kr",
# RACPORT = 4455,
# NodePort = 7787
**********************************************************************************************************
1. WebToB의 가상호스트 설정
1.1 환경설정파일(sample.m)을 추가, 컴파일
*VHOST
vhost1 HostName="test.tmax.co.kr",
DOCROOT="C:/TmaxSoft/edu02", # 웹서비스 파일 위치 지정
NODENAME="respect04",
PORT="80", # URL 이름이 같은 경우 포스번호를 다르게 설정해야 함. 현재는 호스트네이임이 다르므로 포스번호가 같아도 상관없다
IndexName="test.html", # Wellcome page 설정
KeepAlive=Y, # KeepAlive와 KeepAliveTimeout은 같이 사용해야 함(set 구성)
KeepAliveTimeout=30

1.2 윈도우 hosts 파일에 가상호스트 설정 (실제 서비스할 경우 DNS서버에 추가)
(C:\WINDOWS\system32\drivers\etc\hosts)
추가 => 127.0.0.1 test.tmax.co.kr
1.3 기동 후 테스트
1) sample.m 컴파일(wscfl -i sample.m)
2) ws 재기동
3) C:/TmaxSoft/edu02에 test.html 추가
4) 웹에서 test.html 확인 url=http://test.tmax.co.kr
# 알아둡시다
- sample.m에서 정의된 *NODE는 localhost(127.0.0.1)이다.
- sample.m에서 정의되지 않은 기본설정 확인은 wsadmin에서 cfg명령어로 확인한다
cfg -n : Node 환경설정
cfg -vh : vhost 환경설정 (sample.m에 *VHOST가 정의 되었을 때만 사용)
- 기본설정을 변경할 경우 cfg에서 보여진 명령어를 sample.m에 재정의한다
- DOCROOT의 디렉토리 구분은 ''이 아니라 '/'로 구분한다
2. WebToB의 가상호스트와 JEUS연동설정
2.1 가상호스트를 인식 시키기 위한 WebToB설정
sample.m에 정의
*SVRGROUP
v_jsvg NODENAME = "respect04", SVRTYPE = JSV, VHOSTNAME="vhost1" #가상호스트에서 인식
*SERVER #컨테이너 그룹명과 연동정의 및 몇개의 프로세스 사용할 것인가 정의
v_MyGroup SVGNAME = v_jsvg, MinProc = 10, MaxProc = 20 # 가상호스트 MyGroup
2.2 JEUS 설정
2.2.1 웹관리자 이용 시
1) 새 웹 리스너 생성
경로 : 서블릿엔진 - MyGroup - 웹리스너
2) 설정
- Listener Id : alias 명
- PORT : 기존 webtob 포트번호와 다르게 설정
- 스레드풀 : max, min은 sample.m *SERVER에서 정의한 내용과 동일하게 처리
- Webtob Address : 해당 Listener와 연결되는 WebtoB서버의 IP어드레스
- Registration Id : sample.m *SERVER에서 정의한 그룹ID
- Webtob Home : C:\TmaxSoft\WebtoB4.1 => webtob가 설치되어 있는 home 디렉토리
2.2.2 서블릿 WEBMain.xml 정의

v_webtob1
9901

10
20

http
v_MyGroup
C:\TmaxSoft\WebtoB4.1

3. 컨테이너 추가 (웹관리자) 후 WebToB 연동
3.1 새 엔진 컨테이너 생성
- Name : container3
- ID, BasePort
- 서블릿 엔진 : engine2
- 리스너 ID/서버 채널 이름 : http2 (#http 리스너를 반드시 추가하세요.)
- 리스너/서버 채널 포트 : 8087
3.2 새 어플리케이션 모듈 배치 - 모듈 선택
- 2단계 배치
- 영구배치는 J2EE 어플리케이션 모듈 배치에서 영구배치를 클릭 시
에디터아이콘을 선택하여 영구 모듈 디플로이 컨테이너대상을 설정
3.3 추가한 컨테인너 서블릿 WEBMain.xml 정의

http://www.tmaxsoft.com/xml/ns/jeus
">

MyGroup


http2
8087
8192

10
20


v_webtob1
9901

10
20

http
v_MyGroup
C:\TmaxSoft\WebtoB4.1


4. 서블릿 작성/실행하기
4.1 HelloWorldServlet.java 작성
==============================================================================
package tmax;
import! java.io.*;
import! javax.servlet.*;
import! javax.servlet.http.*;
public class HelloWorldServlet extends HttpServlet
{
protected void doGet(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException,
java.io.IOException {
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("");
out.println("");
out.println("Hellow World Sample");
out.println("");
out.println("");
out.println("

Hello World!!!

");
out.println("");
out.println("");
out.close();
}
}
================================================================================
4.2 컴파일
C:\TmaxSoft\edu01\WEB-INF\classes>javac -d . H*.java
4.3 실행
http://127.0.0.1:8088/edu01/servlets/tmax/HelloWorldServlet

4.4. web.xml에 서블릿명 추가(HelloWorld)

HelloWorld
tmax.HelloWorldServlet
-1


HelloWorld
/helloworld/

4.5 실행
http://127.0.0.1:8088/edu01/HelloWorld

5. WebToB에서 서블릿을 실행하기 위한 url 설정
5.1 sample.m 파일 수정
*URI
uri2 Uri = "/edu01/", Svrtype = JSV #url에 edu01이 들어간 문자는 서블릿을 실행하게 한다
5.2 실행