ORACLE/Backup & Recovery2008. 11. 28. 16:18
반응형
 Partition table 복원 작업내용 (동일 장비에서 다른 SID로 복원하기)
 
1)      Recovery에 필요한 파일 Copy
 이전의 백업 데이터파일 중 SYSTEM, UNDO, TS_PT_30(해당 테이블이 포함된 테이블
        스페이스)  Datafile, 오라클 환경 설정 파일만 임시 디렉토리로 복원한다
 
l       Recovery에 필요한 Tablespace
 
           TS_PT_30
SYSTEM
             UNDOTBS1
 
l       필요한 Oracle 파일
 
initRECOVER.ora  (initTEST.ora 복사)
orapwRECOVER   (orapwTEST password file 복사)
 
2)      환경에 맞게 initSID.ora 파일 수정
 
l       Archive를 적용하지 않기 때문에 Archive 관련 파라미터는 주석처리 한다.
-         LOG_ARCHIVE_DEST, LOG_ARCHIVE_START 주석 처리
 
l       Cold Backup 본이 아닌 Hot Backup 본으로 비정상적인 Open 이므로
    _OFFLINE_ROLLBACK_SEGMENTS, _CORRUPTED_ROLLBACK_SEGMENTS
    _ALLOW_RESETLOGS_CORRUPTION를 세팅한다.
 
l       _OFFLINE_ROLLBACK_SEGMENTS, _CORRUPTED_ROLLBACK_SEGMENTS 관련
Parameter를 세팅 하므로 Undo Tablespace 관련 Parameter를 주석처리 한다.
    - undo_management='MANUAL'로 세팅한다.
   
initRECOVER.ora  (기존 initTEST.ora 수정)
============================================================
 
background_dump_dest='/oracle9/app/oracle/admin/RECOVER/bdump'
*.compatible='9.2.0'
control_files='/home/oracle/control01.ctl'
core_dump_dest='/oracle9/app/oracle/admin/RECOVER/cdump'
*.db_block_size=8192
*.db_cache_size=1073741824
*.db_name='RECOVER'
*.java_pool_size=0
*.job_queue_processes=2
*.large_pool_size=41943040
# LOG_ARCHIVE_DEST='/arch'
# LOG_ARCHIVE_FORMAT='arcTEST_%s.arc'
# LOG_ARCHIVE_START=TRUE
*.open_cursors=500
*.pga_aggregate_target=1073741824
*.processes=500
*.query_rewrite_enabled='true'
*.service_names='RECOVER'
*.shared_pool_size=629145600
*.star_transformation_enabled='FALSE'
undo_management='MANUAL'
user_dump_dest='/oracle9/app/oracle/admin/RECOVER/udump'
 
*._OFFLINE_ROLLBACK_SEGMENTS=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$,_SYSSMU11$,_SYSSMU1
2$,_SYSSMU13$,_SYSSMU14$,_SYSSMU15$,_SYSSMU16$,_SYSSMU17$,_SYSSMU18$,_SYSSMU19$,_SYSSMU20$,_SYSSMU21$,_SYSSMU22$,_SYSSMU23$,_SYSSMU24$,_SYSSMU25$,_SYS
SMU26$,_SYSSMU27$,_SYSSMU28$,_SYSSMU29$,_SYSSMU30$,_SYSSMU31$,_SYSSMU32$,_SYSSMU33$,_SYSSMU34$,_SYSSMU35$,_SYSSMU36$,_SYSSMU37$,_SYSSMU38$,_SYSSMU39$,
_SYSSMU40$,_SYSSMU41$,_SYSSMU42$,_SYSSMU43$,_SYSSMU44$,_SYSSMU45$,_SYSSMU46$,_SYSSMU47$,_SYSSMU48$,_SYSSMU49$,_SYSSMU50$,_SYSSMU51$,_SYSSMU52$,_SYSSMU
53$,_SYSSMU54$,_SYSSMU55$,_SYSSMU56$,_SYSSMU57$,_SYSSMU58$,_SYSSMU59$)
 
*._CORRUPTED_ROLLBACK_SEGMENTS=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$,_SYSSMU11$,_SYSSM
U12$,_SYSSMU13$,_SYSSMU14$,_SYSSMU15$,_SYSSMU16$,_SYSSMU17$,_SYSSMU18$,_SYSSMU19$,_SYSSMU20$,_SYSSMU21$,_SYSSMU22$,_SYSSMU23$,_SYSSMU24$,_SYSSMU25$,_S
YSSMU26$,_SYSSMU27$,_SYSSMU28$,_SYSSMU29$,_SYSSMU30$,_SYSSMU31$,_SYSSMU32$,_SYSSMU33$,_SYSSMU34$,_SYSSMU35$,_SYSSMU36$,_SYSSMU37$,_SYSSMU38$,_SYSSMU39
$,_SYSSMU40$,_SYSSMU41$,_SYSSMU42$,_SYSSMU43$,_SYSSMU44$,_SYSSMU45$,_SYSSMU46$,_SYSSMU47$,_SYSSMU48$,_SYSSMU49$,_SYSSMU50$,_SYSSMU51$,_SYSSMU52$,_SYSS
MU53$,_SYSSMU54$,_SYSSMU55$,_SYSSMU56$,_SYSSMU57$,_SYSSMU58$,_SYSSMU59$)
 
*._ALLOW_RESETLOGS_CORRUPTION=TRUE
 
3)      강제로 DB OPEN
 
[oracle:/oracle9/app/oracle/product/9.2.0/dbs]echo $ORACLE_SID
TEST
[oracle:/oracle9/app/oracle/product/9.2.0/dbs]export ORACLE_SID=RECOVER
 
[oracle:/oracle9/app/oracle/product/9.2.0/dbs]echo $ORACLE_SID
RECOVER
 
[oracle:/oracle9/app/oracle/product/9.2.0/dbs]sqlplus "/as sysdba"
 
SQL*Plus: Release 9.2.0.8.0 - Production on Wed Oct 1 15:21:44 2008
 
Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
 
Connected to an idle instance.
 
SQL> startup nomount
ORACLE instance started.
 
Total System Global Area 1985971832 bytes
Fixed Size                   743032 bytes
Variable Size             754974720 bytes
Database Buffers         1224736768 bytes
Redo Buffers                5517312 bytes
Database mounted.
 
SQL> CREATE CONTROLFILE SET DATABASE "RECOVER" RESETLOGS NOARCHIVELOG
    MAXLOGFILES 64
    MAXLOGMEMBERS 3
    MAXDATAFILES 2000
    MAXINSTANCES 1
    MAXLOGHISTORY 17697
LOGFILE
  GROUP 1 ('/imsi/Oracle/redo01.log') SIZE 30M,
  GROUP 2 ('/imsi/Oracle/redo02.log') SIZE 30M,
  GROUP 3 ('/imsi/Oracle/redo03.log') SIZE 30M,
  GROUP 4 ('/imsi/Oracle/redo04.log') SIZE 30M
-- STANDBY LOGFILE
DATAFILE
  '/dev/rsystem',
  '/dev/rundo_01',
  '/dev/rundo_02',
   '/dev/rrec_01',
  '/dev/rrec_02',
  '/dev/rrec_03'
 CHARACTER SET KO16KSC5601
;
 
<=  SID를 Recover라고 변경해서 Open한다.
 
 
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
 
    ß 비정상 적인 불완전 복원 이기 때문에 Resetlogs Open해야 한다.
 
SQL> alter database open resetlogs;
Database altered.
 
4)      복원된 table Export & Import 수행을 한다.
 
[oracle:/temp]exp scott/oracle  file=exp1001.dmp tables=TBPT:PT_200910 log=exp1001.log


 






반응형
Posted by [PineTree]
ORACLE/ADMIN2008. 11. 27. 17:37
반응형
OS유저중 oracle유저 이외의 유저가 sqlplus등을 사용하기 위해
퍼미션을 할당하는 수순입니다.
 
> oracle유져로 실행함
 
1. 우선은 확인
  ls -al $ORACLE_HOME/bin/sqlplus
  -rwxr-x--x   1 oracle     oinstall     72080  9月  5日  15:15 sqlplus
 
2. 스크립트 실행
  $ORACLE_HOME/install/changePerm.sh
→ Do you wish to continue (y/n) [n]: 에서  y 를 입력
   시간이 조금 걸립니다.
 
3. 결과 확인
  ls -al $ORACLE_HOME/bin/sqlplus
-rwxr-xr-x   1 oracle     oinstall     72080  9月  5日  15:15 sqlplus
이것으로 다른 유저도 sqlplus를 사용할수 있게 되었네요..
 

Applies to:

Oracle Server - Enterprise Edition - Version: 9.2.0.8 to 10.2.0.3
Information in this document applies to any platform.

Goal

Where is the script changePerm.sh?

Solution


During patch set installation, all new files and directories are created with restricted access, by default. Users or third party applications with a different group identifier from that of the database, which try to access client-side utilities or libraries in the database home, will see permission errors when trying to access these files or directories.

changePerm.sh is a script that allows users that do not belong to the database group to access and execute files in the ORACLE_HOME directory. Only run this script when absolutely required as it will reduce security. The script (borne shell) loops through a hard-coded set of files and directories, extracts the "group" permissions, and set the "other" permissions the same as the group's permissions. By doing so, "other" users are able to execute these files and change to these directories

The script is located in the ORACLE_HOME/install directory on Unix and Linux systems (there is no equivalent for Windows). This script ships with Oracle Database versions 9.2.0.8 and Oracle 10g releases.
Output when the changePerm.sh script is executed:

$ cd $ORACLE_HOME/install
$ ./changePerm.sh
-------------------------------------------------------------------------------
Disclaimer: The purpose of this script is to relax permissions on some of the
files in the database Oracle Home so that all clients can access them.
Please note that Oracle Corporation recommends using the most restrictive file
permissions as possible for your given implementation. Running this script
should be done only after considering all security ramifications.
-------------------------------------------------------------------------------

Do you wish to continue (y/n) : y
Finished running the script successfully

Please see /tmp/changePerm_err.log for errors and /tmp/changePerm.log for the log of events
This script should be run by Oracle Software owner to relax the permission and can be run while database processes are active.

Note :
1. If you are patching Oracle RAC home, then you will need to run this script on all the nodes
2. Oracle recommends using the most restrictive file permissions possible for your given implementation. Run this script only after considering all security ramifications and only if you need to share this installation
반응형

'ORACLE > ADMIN' 카테고리의 다른 글

Oracle Flashback  (0) 2008.12.18
DICTIONARY(DICT) 뷰  (0) 2008.12.03
DBNAME, SID 변경하기.  (0) 2008.11.26
Oracle 10.2.0.1에서 10.2.0.3으로 rman백업을 이용한 업그레이드 메모  (0) 2008.11.21
[Oracle] Datafile Size 변경하기  (0) 2008.11.19
Posted by [PineTree]
ORACLE/ADMIN2008. 11. 26. 11:33
반응형
(V7.X ~ V9.X) Modifying a database to run under a new ORACLE_SID
================================================================

1. Shutdown instance

2. Backup all control, redo and data files.

3. Go thru the .profile, .cshrc, .login, oratab, tnsnames.ora(for net v2)
, and redefine the environment variable ORACLE_SID to a new value.
ie search thru disks and do a grep ORACLE_SID *

4. cd $ORACLE_HOME/dbs and rename the following files:

o init<sid>.ora (or use pfile to point to the init file.)
o control file(s) This is optional if you don't rename any of
the controlfiles, and the control_files parameter is used.
control_files would be set in the initSID.ora file or in a file
it references with the ifile parameter. Make sure control_files
doesn't point to any old file names, if you renamed them.

o crdb<sid>.sql & crdb2<sid>.sql This is optional. These are
only used at database creation.

5. cd $ORACLE_HOME/rdbms/admin and rename the file:
o startup<sid>.sql This is optional.
(On some platforms, this file may be in $ORACLE_HOME/rdbms/install.)
Make sure the contents of this file do not reference old initSID.ora
files that have been renamed. This file simplifies the process to
"startup exclusive" your database.

6. To rename the database files and redo log files, you would follow
the instructions in the bulletin: 98863.723.

7. Change the ORACLE_SID environment variable to the new value.

8. start up database and verify it works. Once you have done this,
shutdown the database and take a final backup of all control, redo
and data files.

9. When the instance is started, the control file gets updated with
the current ORACLE_SID.


Changing the dbname for a database
----------------------------------

1. sqldba

2. connect internal

3. alter database backup controlfile to trace;
This will write in a trace file, the CREATE CONTROLFILE command that
would recreate the controlfile as it currently exists.

4. Exit and go to the directory where your trace files are located.
They are usually in the $ORACLE_HOME/rdbms/log directory.
If user_dump_dest is set in the initSID.ora, then go to the directory
listed in the user_dump_dest variable.
The trace file will have the form "ora_NNNN.trc with NNNN being a
number.

5. Get the CREATE CONTROLFILE command from the trace file and put it in
a new file called something like ccf.sql.

6. Edit the ccf.sql file and modify the CREATE CONTROLFILE command.
Just change the word "REUSE" to "SET",and "NORESETLOGS" to
"RESETLOGS", and modify the dbname.
Old line:
CREATE CONTROLFILE REUSE DATABASE "olddbname" NORESETLOGS ...
New line:
CREATE CONTROLFILE set DATABASE "newdbname" RESETLOGS ...
Then save the ccf.sql file.

7. Rename the old control files for backup purposes and so they are not
in the way of creating the new ones.

8. Edit initSID.ora so that db_name="newdbname".

9. sqldba

10. connect internal

11. startup nomount

12. @ccf

13. alter database open resetlogs;

14. Make sure the database is working. Shutdown and backup the database.


Reference Documents
-------------------
<Note:15390.1>

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

# UNIX 환경
# 단순 SID 변경은 .profile 변경 및 dbs 의 init<원한는SID> 로만 변경 하면 된다.
# 결과적으로 단순 SID 변경은 Process 만 변경 된다.
# 간만에 SID 변경할 일이 있어서 테스트 한번 해봤음 ㅇ_ㅇ;
# 늘 그렇지만 엄청 새롭다.

TESTTG ==> TESTTGB 로 변경한다고 가정
1. vi .profile 에서 ORACLE_SID 를 원하는 SID 로 변경
   export ORACLE_SID=TESTTGB
2. dbs 에서 init<SID>.ora 을 init<원하는SID>.ora 로 copy 한다.
    cd /app/oracle/product/10.2.0/dbs
    cp initTESTTG.ora initTESTTGB.ora
# 작업 하시 편하게 pfile 환경에서 한다. pfile 생성은
   SQL> create pfile from spfile ;

3.  2번에서 생성한, initTESTTGB.ora 에서 db_name 을 수정한다.
     *.db_name='TESTTGB'

     주의 사항 :

     1.Control File Path 에 주의 하자  ( 원래 DB 가 떠 있는 동일 Machine 에서 하면 Overwrite 된다 ㅇ_ㅇ;)

         #*.control_files='/an01/TEST/TESTTG/control01.ctl'              -- 원본
         *.control_files='/an01/TEST/TESTTG/TESTTGB_control01.ctl' -- 테스트

     2. SGA , PGA 를 적당히 Edit 하자

     3. 필요하다면 필요한 Tablespace 의 Datafile 만 선택 하자 Control file 을 생성하자.

     4. Archive Dest 를 Edit 하자 ( Mount 이후에 alter system 으로 변경 가능하다 )

4. controlfile 재생성 ( 아래와 같이 )
화일 생성을 아래와 같이 TRACE 떨군 후에 Editing
SQL> alter database backup controlfile to trace  ;
Database altered.
STARTUP NOMOUNT
CREATE CONTROLFILE SET DATABASE "TESTTGB" RESETLOGS  NOARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/an01/TEST/TESTTG/redo01.log'  SIZE 10M,
  GROUP 2 '/an01/TEST/TESTTG/redo02.log'  SIZE 10M,
  GROUP 3 '/an01/TEST/TESTTG/redo03.log'  SIZE 10M
-- STANDBY LOGFILE
DATAFILE
  '/an01/TEST/TESTTG/system01.dbf',
  '/an01/TEST/TESTTG/undotbs01.dbf',
  '/an01/TEST/TESTTG/sysaux01.dbf',
  '/an01/TEST/TESTTG/users01.dbf'
CHARACTER SET UTF8
;

5. controlfile 재성성 후 Recover Database 진행
(  새로 생성한 control file 을 통한 복구이기 때문에 using backup control 사용

   테스트용이라 until cancel 로 하고 바로 cancel 적용

   SID 변경 후 recovery 도 되고, recovery 후 SID 변경이 가능하다.

   개인적으로, 작업 하기 쉬운건 Recovery 후 SID 변경 을 더 편하다

   아주 가끔 백업 본이 이상하던지, archive file 이상해서, 복구가 안되는 케이스가 발생한다. )
SQL> RECOVER DATABASE using backup controlfile until cancel ;
ORA-00279: change 9151408584711 generated at 11/19/2009 23:56:21 needed for
thread 1
ORA-00289: suggestion : /app/oracle/product/10.2.0/dbs/arch1_12_703375834.dbf
ORA-00280: change 9151408584711 for thread 1 is in sequence #12
 
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
Cancel
Media recovery cancelled.

6. RESETLOGS 로 OPEN 한다.
SQL> alter database open resetlogs ;

Database altered.

7. DB NAME 변경된것을 확인 한다.
SQL>  select dbid,name, to_char(created,'YYYY/MM/DD HH24:MI:SS') from v$database ;

      DBID NAME      TO_CHAR(CREATED,'YY
---------- --------- -------------------
3876231960 TESTTGB   2009/11/20 00:26:00

8. Local Listenr 변경 및 Remote tnsnames.ora 에서 TESTTG ==> TESTTGB 로 변경

EM 은 SID 변경에 따라서 당근 재생성 해야 한다.

단순 SID 만 변경해도, EM CONFIG정보는 HOSTNAME_SID 라는 디렉토리에 저장된다.

반응형
Posted by [PineTree]
ORACLE/TUNING2008. 11. 24. 16:39
반응형
힌트의 사용법
 
{SELECT | INSERT | UPDATE | DELETE} /*+ hint [text] [hint [text]] ... */
혹은
{SELECT | INSERT | UPDATE | DELETE} --+ hint [text] [hint [text]] ...
 
-         이러한 힌트의 사용은 SQL 전체가 아닌 쓰여진 SQL 블럭에만 적용됩니다.
 
 
힌트의 종류 별 분류
Optimization Goals and Approaches
             ALL_ROWS 혹은 FIRST_ROWS
             CHOOSE
             RULE
 
Acess Method Hints
             AND_EQUAL
             CLUSTER
             FULL
             HASH
             INDEX 혹은 NO_INDEX
             INDEX_ASC 혹은 INDEX_DESC
             INDEX_COMBINE
             INDEX_FFS
             ROWID
 
Join Order Hints
             ORDERED
             STAR
 
Join Operation Hints
             DRIVING_SITE
             HASH_SJ, MERGE_SJ 혹은 NL_SJ
             LEADING
             USE_HASH 혹은 USE_MERGE
             USE_NL
Parallel Execution Hints
             PARALLEL 혹은 NOPARALLEL
             PARALLEL_INDEX
             PQ_DISTRIBUTE
             NOPARALLEL_INDEX
 
Query Transformation Hints
             EXPAND_GSET_TO_UNION
             FACT 혹은 NOFACT
             MERGE
             NO_EXPAND
             NO_MERGE
             REWIRTE 혹은 NOREWRITE
             STAR_TRANSFORMATION
             USE_CONCAT
 
Other Hints
             APPEND 혹은 NOAPPEND
             CACHE 혹은 NOCACHE
             CURSOR_SHARED_EXACT
             DYNAMIC_SAMPLING
             NESTED_TABLE_GET_REFS
             UNNEST 혹은 NO_UNNEST
             ORDERED_PREDICATES
  
힌트의 설명 및 사용법
 
ALL_ROWS
             /*+ ALL_ROWS */
-         최소한의 자원을 사용하여 결과값의 전체를 추출하게 합니다.
 
AND_EQUAL
             /*+ AND_EQUAL (table index index [index] [index] [index] ) */
-         복수의 단일 컬럼을 스캔하여 머지 방식으로 처리하게 합니다.
 
APPEND_HINT
             /*+ APPEND */
-         직렬 모드 데이터베이스에서 Direct INSERT를 실행하게 합니다.
-         Enterprise Edition 이 아닌 데이터베이스의 기본 모드는 직렬 모드입니다. 이러한 직렬 모드 데이터 베이스에서의 INSERT 작업은 Conventional를 기본값으로 하고 병렬 처리 시에는 Direct INSERT를 기본값으로 합니다.
 
CACHE_HINT
             /*+ CACHE (table) +/
-         풀 테이블 스캔의 사용 시, 테이블에서 읽어온 블럭을 버퍼의 LRU 리스트 의 MRU 쪽에 위치시킵니다. 작은 테이블의 사용 시 유용합니다.
 
CHOOSE_HINT
             /*+ CHOOSE +/
-         Rule-Based 와 Cost-Based 방식 간의 선택을 유도합니다. 선택 기준은 사용 객체의 분석 정보 존재 여부이며, 사용되는 객체들중 하나라도 분석 정보가 존재한다면 Cost-Based 방식을 사용하게 됩니다.
 
CLUSTER_HINT
             /*+ CLUSTER (table) +/
-         지정 테이블의 클러스터 스캔을 유도합니다. 클러스터된 객체에만 사용할 수 있습니다.
 
CURSOR_SHARING_EXACT
             /*+ CURSOR_SHARING_EXACT +/
-         바인드 변수 값의 교체를 불가능하게 합니다.
-         기본적으로 CURSOR_SHARING 파라미터를 사용하여, 안전하다고 판단될 시 SQL 내의 바인드 변수 값을 교체할 수 있게 되어 있습니다.
 
DRIVING_SITE
             /*+ DRIVING_SITE (table) +/
-         오라클이 선택한 SITE 대신, 지정한 SITE를 사용하여 쿼리를 실행합니다. Rule-Based 와 Cost-Based, 두 모드 다 사용 가능합니다.
 
DYNAMIC_SAMPLING
             /*+ DYNAMIC_SAMPLING ( [table] n ) +/
-         해당 객체의 Selectivity 와 Cardinality 에 대한 보다 자세한 정보를 자동으로 생성시켜 실행합니다.
-         값은 0 부터 10 까지 지정할 수 있으며, 높을 수록 보다 자세한 정보를 생성하게 됩니다. 테이블에 해당 값을 지정하지 않았을 경우, 기본 값은 CURSOR 레벨의 값이 쓰여집니다.
 
EXPAND_GSET_TO_UNION
             /*+ EXPAND_GSET_TO_UNION +/
-         GROUP BY GROUPING SET 혹은 GROUP BY ROLLUP 등과 같은 구문을 포함하는 쿼리에 사용할 수 있습니다.
-         이 힌트는 기존의 쿼리를 개별적인 그룹 생성 후, UNION ALL 방식으로 실행되게 유도합니다.
 
FACT_HINT
             /*+ FACT (table) +/
-         스타 변형 구문에서 사용되며 해당 테이블이 FACT 테이블로 사용되게 유도합니다.
 
FIRST_ROWS
             /*+ FIRST_ROWS (n) +/
-         전체 결과값의 반환 대신 지정한 숫자만큼 로우의 결과값을 반환하는데 집중하게 유도합니다.
 
FULL_HINT
             /*+ FULL (table) */
-         지정한 테이블에 대해 풀 테이블 스캔을 유도합니다.
 
HASH_HINT
             /*+ HASH (table) */
-         지정한 테이블에 대해 hash 스캔을 수행하도록 유도합니다.
-         클러스터 테이블 만을 대상으로 합니다.
 
HASH_AJ
             /*+ HASH_AJ */
-         EXISTS 구문 뒤에 오는 서브 쿼리에 사용되며 HASH_SJ, MERGE_SJ 혹은 NL_SJ 등을 사용할 수 있습니다.
-         HASH_SJ 은 hash semi-join 이고, MERGE_SJ 은 sort merge semi-join 이며 NL_SJ 은 nested loop semi-join 입니다.
 
INDEX
             /*+ INDEX (table index [index] [index] ... ) */
-         지정한 테이블의 인덱스 스캔을 실행하도록 유도합니다.
-         Domain, B-tree, bitmap, bitmap join 인덱스 등이 사용될 수 있으나, bitmap 인덱스 들의 사용 시, INDEX 힌트보다는 INDEX_COMBINE 힌트 사용이 추천됩니다.
 
INDEX_ASC
             /*+ INDEX-ASC (table [index] [index] ... ) +/
-         해당 테이블의 인덱스를 순차적 방식으로 스캔하게 합니다.
-         해당 쿼리가 인덱스 범위 스캔의 사용 시, 인덱스 값의 순차적 방식으로 읽게 됩니다.
 
INDEX_COMBINE
             /*+ INDEX_COMBINE (table [index] [index] ... ) +/
-         해당 테이블에 Bitmap 인덱스의 존재 시, Bitmap 인덱스를 통한 액세스를 유도합니다.
-         힌트 내에 인덱스의 이름이 쓰여지지 않을 시, 해당 인덱스의 Boolean 값을 사용하여 최적의 Cost를 산출하여 실행하게 됩니다.
 
INDEX_DESC
             /*+ INDEX_DESC (table [index] [index] ... ) +/
-         지정한 인덱스에 대해 인덱스 스캔을 역순으로 실행합니다.
-         해당 쿼리가 인덱스 범위 스캔의 사용 시, 인덱스 컬럼의 값을 사용하여 역순으로 실행합니다.
-         파티션 인덱스에서는 파티션 별 개별적인 실행이 이루어집니다.
 
INDEX_FFS
/*+ INDEX_FFS (table [index] [index] ... ) +/
-         풀 테이블 스캔 대신에 빠른 풀 테이블 스캔의 실행을 유도합니다.
 
LEADING_HINT
             /*+ LEADING (table) +/
-         테이블 간의 조인 시에 지정한 테이블을 먼저 수행하도록 유도합니다.
-         두 개 이상의 LEADING 힌트의 사용 시, 힌트 자체가 사용되어 지지 않습니다.
-         ORDERED 힌트와 더불어 사용시, LEADING 힌트는 사용되지 않습니다.
 
MERGE
             /*+ MERGE (table) +/
-         각 쿼리의 결과값을 머지합니다.
-         해당 쿼리 내에 GROUP BY 절의 사용 이나 SELECT 구문에 DISTINCT 가 사용되었을 시, 머지의 실행이 가능할 경우에만 힌트가 실행됩니다.
-         IN 과 서브 쿼리의 사용 시, 서브 쿼리와 상위 쿼리 간의 상호 관계가 없을 때에만 머지의 실행이 가능합니다.
-         이 힌트는 Cost-based 가 아닙니다. 따라서 액세스하는 실행 쿼리 블럭에 MERGE 힌트가 반드시 명시되어야만 합니다. 그렇지 않을 경우 옵티마이저는 다른 실행 계획을 수립합니다.
 
MERGE_AJ
             HASH_AJ 를 참조하십시요.
 
MERGE_SJ
             HASH_AJ 를 참조하십시요.
 
NL_AJ
             HASH_AJ 를 참조하십시요.
 
NL_SJ
             HASH_AJ 를 참조하십시요.
 
NOAPPEND
             /*+ NOAPPEND +/
-         병럴 모드에서의 INSERT 작업을 Conventional 방식으로 수행합니다.
-         병렬 모드에서는 Direct-path INSERT 가, 직렬 모드에서는 Conventional INSERT가 기본값입니다.
 
NOCACHE
             /*+ NOCACHE (table) +/
-         풀 테이블 스캔의 사용 시, 테이블에서 읽어온 블럭을 버퍼의 LRU 리스트 의 LRU 쪽에 위치시킵니다. 기본 모드입니다.
 
NO_EXPAND
             /*+ NO_EXPAND +/
-         실행 쿼리 내에 OR 나 WHERE 절의 IN 이 사용되었을 시, Cost-Based 옵티마이저가 쿼리 처리를위해 OR 를 사용한 확장을 사용하는 것을 방지합니다.
-         일반적으로 옵티마이저는 위와 같은 경우 OR – 확장의 가격이 확장을 사용하지 않는 것보다 적을 시, 확장 방식으로 수행합니다.
 
NO_FACT
             /*+ NO_FACT (table) +/
-         Star 변형 시, 해당 테이블의 FACT 테이블로서의 사용을 방지합니다.
 
NO_INDEX
             /*+ NO_INDEX (table [index] [index] ... ) +/
-         지정 테이블의 인덱스 사용을 방지합니다.
 
NO_MERGE
             /*+ NO_MERGE (table) +/
-         머지 처리 방식의 사용을 방지합니다.
 
NOPARALLEL
             /*+ NOPARALLEL (table) +/
-         지정한 테이블의 병렬 처리를 방지합니다.
-         테이블의 지정된 PARALLEL 값에 대해서 우선권을 가집니다.
-         중첩 테이블에 대해서는 병렬 처리를 할 수 없습니다.
 
NOPARALLEL_INDEX
             /*+ NOPARALLEL_INDEX (table [index] [index] ... ) +/
-         인덱스 스캔 작업의 병렬 처리를 방지합니다.
-         인덱스에 지정된 PARALLEL 값에 우선권을 가집니다.
 
NO_PUSH_PRED
             /*+ NO_PUSH_PRED (table) +/
-         결과값에 대한 조인 방식 서술의 강제적 수행을 방지합니다.
 
NO_PUSH_SUBQ
             /*+ NO_PUSH_SUBQ +/
-         서브 쿼리의 결과값을 머지하지 않는 실행 계획이 실행 계획 설립 단계에서 제일 마지막으로 참조되는 것을 방지합니다.
-         일반적으로 서브 쿼리의 Cost 가 높거나, 처리 로우의 갯수를 크게 줄여주지 못할 때에는 서브 쿼리를 마지막에 참조하는 것이 성능 향상에 도움이 됩니다.
 
NOREWRITE
             /*+ NOREWRITE +/
-         해당 쿼리 블럭의 쿼리 재생성의 실행을 방지합니다.
-         QUERY_REWRITE_ENALBE 파라미터에 대해 우선권을 가집니다.
-         NOREWRITE 힌트의 사용 시, Function-Based 인덱스의 사용이 금지됩니다.
 
NO_UNNEST
             /*+ NO_UNNEST +/
-         해당 서브 쿼리 블럭의 UNNESTING 설정의 사용을 방지합니다.
 
ORDERED
             /*+ ORDERED +/
-         FROM 절에 나열된 테이블의 순서대로 조인 작업을 실행합니다.
 
ORDERED_PREDICATE
             /*+ ORDERED_PREDICATE +/
-         옵티마이저에 의한 조인 관계의 Cost를 산출하기 위해 미리 정해둔 조인 관계 별 실행 순서의 사용을 방지합니다.
n         인덱스 키를 사용한 조인 관계들은 제외됩니다.
-         이 힌트는 쿼리의 WHERE 절에 사용하십시요.
 
PARALLEL
             /*+ PARALLEL (table [ [, n |, DEFAULT |, ] [, n | DEFAULT ] ] ) +/
-         병렬 처리에 사용될 서버 프로세스의 갯수를 설정합니다.
-         병렬 처리 조건에 위배될 시, 힌트는 사용되지 않습니다.
-         임시 테이블에 대한 PARALLEL_HINT 사용 시, 힌트는 사용되지 않습니다.
 
PARALLEL_INDEX
             /*+ PARALLEL_INDEX (table [ [index] [, index]...]
[ [, n |, DEFAULT |, ] [, n | DEFAULT ] ] ) +/
-         파티션 인덱스의 인덱스 범위 스캔 작업의 병렬 처리에 할당될 서버 프로세스의 갯수를 지정합니다.
 
PQ_DISTRIBUTE
             /*+ PQ_DISTRIBUTE (table [,] outer_distribution, inner_distribution) +/
-         병렬 조인 시, Producer 프로세스와 Consumer 프로세스 간의 데이터 전달 방식을 지정합니다.
 
PUSH_PRED
             /*+ PUSH_PRED (table) +/
-         결과값에 대한 조인 방식 서술의 강제적 수행을 실행합니다.
 
PUSH_SUBQ
             /*+ PUSH_SUBQ +/
-         머지가 불가능한 서브 쿼리들의 우선 실행 계획을 실행 계획 수립시 먼저 참조하도록 합니다.
-         서브 쿼리의 사용 객체가 Remote 테이블이거나, 머지 조인의 사용 시 힌트는 실행되지 않습니다.
 
REWRITE
             /*+ REWRITE [ ( [materialized_view] [materialized_view]...) ] +/
-         실행 계획의 가격에 상관없이 Materialized View 를 사용하여 쿼리 재생성을 하도록 합니다.
-         Materialized View 를 지정할 시, 지정한 Materialized View 의 가격에 상관없이 무조건 쿼리 재생성을 실행합니다.
-         Materialized View 를 지정하지 않을 시, 오라클은 사용 가능한 모든 Materialized View 를 참조하여 그 중 가장 가격이 낮은 Materialized View 를 사용하여 쿼리 재생성을 합니다.
-         Materialized View 를 지정하지 않는 힌트의 사용이 권장됩니다.
 
ROW_ID
             /*+ ROWID (table) +/
-         지정한 테이블의 스캔을 ROWID 방식으로 수행하게 합니다.
 
RULE
             /*+ RULE +/
-         실행 계획을 Rule-Based 방식으로 실행하게 합니다.
-         해당 쿼리 블럭에 다른 힌트 또한 사용되었을 경우, 다른 힌트들은 사용되지 않습니다.
 
STAR
             /*+ STAR +/
-         Star 쿼리 계획이 사용 가능하다면, 실행하게 합니다.
-         Star 쿼리 계획이란 가장 큰 테이블이 마지막 순서로 조인되며, 조인될 시 가장 큰 테이블 내의 Concatenated 인덱스에 대해 Nested Loop 조인 방식으로 실행되는 것을 말합니다.
-         최소한 세개 이상의 테이블이 사용되며, 제일 큰 테이블의 Concatenated 인덱스의 생성에 최소한 세 개 이상의 컬럼이 사용되어야 하며, 액세스나 조인 방식에 충돌이 없어야만 이 힌트는 사용됩니다.
 
STAR_TRANSFORMATION
             /*+ STAR_TRANSFORMATION +/
-         옵티마이저가 Star 변형 작업에 최적화된 실행 계획을 수립, 실행하도록 합니다.
-         힌트를 사용하지 않을 시, 옵티마이저는 일반적인 작업에 최적화된 실행 계획을 수행합니다.
-         힌트를 사용하였어도 변형 작업에 맞추어진 실행 계획을 실행한다는 보장은 없습니다. 다른 일반적인 힌트의 사용과 마찬가지로 비교 분석 후, 오라클의 판단에 따라 다른 실행 계획이 실행될 수 있습니다.
 
UNNEST
             /*+ UNNEST +/
-         서브 쿼리 블럭에 대해 인증성 만을 검사하게 합니다.
-         인증이 되었다면 그 이상의 검증 작업없이 서브쿼리에 대한 UNNESTING 의 설정을 가능하게 합니다.
 
USE_CONCAT
             /*+ USE_CONCAT +/
-         WHERE 절의 OR 조인 을 UNION ALL 로 변경하여 수행하게 합니다.
-         일반적으로 이러한 변경은 결과값의 병합 수행의 가격이 수행하지 않을 시의 가격 보다 낮을 때에만 실행됩니다.
 
USE_HASH
             /*+ USE_HASH (table [table]...) +/
-         Hash 조인 방식으로 각 테이블을 조인하게 합니다.
 
USE_MERGE
             /*+ USE_MERGE (table [table]...) +/
-         Sort-Merge 방식으로 각 테이블을 조인하게 합니다.
 
USE_NL
             /*+ USE_NL (table [table]...) +/
- Nested-Loop 방식으로 각 테이블을 조인하게 합니다

반응형
Posted by [PineTree]
ORACLE/SQL2008. 11. 24. 11:10
반응형

-------------------------------------------------------------------------------------
 단일 행 함수
-------------------------------------------------------------------------------------

* initcap - 첫번째 영문자만 대문자로 바꾸어준다.

select ename, initcap(ename) from emp; 

--> 결과값 : KEVIN --> Kevin

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

* concat - 문자열 합치기. ||와 같으나 최대 2개만 가능

select ename || job || deptno, concat(ename,job) from emp;

--> 결과값 : SMITHCLERK20 / SMITHCLERK
 

select ename || job || deptno, concat(ename,job,deptno) from emp;

--> 에러 : concat에는 최대 2개까지만 가능..

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

* substr - 글자 수 기준 문자열 추출 , substrb - 바이트기준 문자열 추출

select substr('oracle',1,3), substr('대한민국',1,2) from dual; 


--> 결과값 : ora , 대한 (바이트와 상관없다.)

select substrb('oracle',1,3), substrb('대한민국',1,1) from dual;


--> substrb 는 바이트기준으로 출력한다. 한글은 2바이트,영문 1바이트

--> 결과값 : ora /  (3byte ora / 한글은 2바이트이기때문에 출력불가)

select substr('oracle',2) from dual;


--> 결과값 : racle ( 2번째 문자부터 끝까지 )

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

 * length - 글자수,비영어권에서 보편적임 , lengthb - 바이트수

select length('oracle'),length('대한민국'),
          lengthb('oracle'),lengthb('대한민국') from dual;

 --> 결과값 : 6 / 4 (4글자기준) / 6 / 8 (4글자 8byte기준)
       

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

* instr - 특정 문자열이 처음 발견 된 위치 값 리턴

select instr('oracle ORACLE oralb','ora',1),
         instr('oracle ORACLE oralb','ora',2),
         instr(lower('oracle ORACLE oralb'),lower('ora'),2)

from dual;

--> 결과값 : 1 / 15 / 8 (대소문자구분없이하기위해 소문자로 형변환)

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

        
* lpad, rpad - 특정 크기를 지정하여 공백부분에 특정 문자열로 채워준다.

                      숫자는 바이트라는 것에 절대 유의하자.

select lpad('오라클',20,'?'), lpad('?',20,'?'),rpad('?',20,'?'),rpad('오라클',20,'?') from dual;

--> 결과값 :

??????????????오라클 / ???????????????????? / ???????????????????? / 오라클??????????????

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

* ltrim , rtrim - 특정 문자열 혹은 공백 제거


select ltrim('오오징어오라클','오징' ), ltrim('오오징어오라클','클라' ),
       rtrim('오오징어오라클','오징' ), rtrim('오오징어오라클','클라' ),
    rtrim('오징어             ') ,ltrim('             오징어') ,
       rtrim(ltrim ('               오오징어오라클                ') )
from dual;

--> 결과값 :

어오라클 / 오오징어오라클 / 오오징어오라클 / 오오징어오 / 오징어 / 오징어 / 오오징어오라클

rtrim은 오른쪽에서 부터 제거되는 대신에, 지정 문자역시 뒤집어 입력해야한다.

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

* translate - 특정 문자열을 사용자가 지정한 매칭값으로 바꿔준다.

select translate('oracle',
                      'abcdefghijklmnopqrstuvwxyz',
                     'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
from dual;


--> 결과값 'ORACLE' - 대소문자 변환이 되었다.

select translate('공공칠빵',
                      '공일이삼사오육칠팔구빵',
                      '01234567890')
from dual;


--> 결과값 : 0070 (바뀌어질 것과 바뀌는 것의 타입은 전혀 상관없다.)

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

* replace - 문자열 바꾸기, 대소문자 구별..

select replace('oracle oracle9i ORACLEDBA', 'ora', '오라') from dual; 

--> 결과값 : 오라cle 오라cle9i ORACLEDBA
 

select replace(upper('oracle oracle9i ORACLEDBA'),upper('ora'), '오라') from dual; 

--> 결과값 : 오라CLE 오라CLE9I 오라CLEDBA

--> 대소문자 구별을 없애기 위해, 모든값을 대문자로 강제 형변환하였다.

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

reverse - 문자열 순서 뒤집기

select reverse('oracle oracle9i ORACLEDBA') from dual; 

--> 결과값 : ABDELCARO i9elcaro elcaro

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

* round - 반올림, 옵션 숫자가 음수면 정수자리, 양수면 소수자리 반올림

select 91.459, round(91.459,-3),round(91.459,-2) , round(91.459,-1) ,round(91.459,0) ,
       round(91.459,1) ,round(91.459,2), round(91.459,3)
from dual;

--> 결과값 : 91.459 / 0 / 100 / 90 / 91 / 91.5 / 91.46 / 91.459

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

* trunc - 숫자 절삭, 옵션 숫자가 음수면 정수자리, 양수면 소수자리

select 91.459, trunc(91.459,-3),trunc(91.459,-2) , trunc(91.459,-1) ,trunc(91.459,0) ,
       trunc(91.459,1) ,trunc(91.459,2), trunc(91.459,3)
from dual;

--> 결과값 : 91.459 | 0 | 0 | 90 | 91 | 91.4 | 91.45 | 91.459

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

* mod(나머지), power(제곱), sqrt(루트)

select mod(5,2), power(5,2), sqrt(2) from dual;
--> 결과값 : 1 / 25 / 1.4142135623731

* sign

select sign(5-2), sign(5-5), sign(2-5), sign(-3) from dual;
--> 결과값 : 1 / 0 / -1 / -1

* chr - ascii 코드에 해당하는 문자 리턴
select chr(65), chr(97), ascii('A'),ascii('a') from dual;
--> 결과값 : A / a / 65 / 97

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

-- 1.5.2 날짜 연산 (p.113)
-------------------------------------------------------------------------------------

* sysdate


select sysdate+1 , sysdate-1,sysdate-1/24,sysdate+1/24 from dual; 
--> 1 일 증감, 1시간 전,  1시간 후


select sysdate - to_date('2006-10-13', 'yyyy-mm-dd') from dual;
--> 1.67614583333333 (현재 날짜시간에서 해당날짜를 뺀 값, 대략 1.6일정도) 

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

* to_date

select to_date('2006-10-13', 'yyyy-mm-dd') from dual;
--> 2006-10-13 00:00:00


select to_date('20061013','yyyymmdd') from dual;
--> 2006-10-13 00:00:00


select to_date('20060931','yyyymmdd') from dual;
--> 에러.. 달력에9월 31일은 존재하지 않는다.

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

* months_between - 달 차이 구하기. (9월과 5월은 4달...)


select months_between('20061014','20060914') from dual;
--> 1 (1달 뒤)


select months_between('20060914','20061014') from dual;
--> -1 (1달 전)


select months_between(sysdate,'20060901') from dual;
--> 1.44128136200717 (대략 1달 보름)

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

* add_months -달 계산


select add_months(sysdate,2) from dual;
--> 2006-12-14 16:19:44 (현재 시각에 2달을 더하기.)


select add_months(sysdate,-2) from dual;
--> 2006-08-14 16:20:02 (현재 시각에 2달을 뺐다.)

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

* next_day - 가장 최근에 돌아오는 특정요일의 날짜 검색

select next_day(sysdate,'FRI') from dual;
select next_day(sysdate,'FRIDAY') from dual;

--> 돌아오는 금요일의 날짜와 현재와 같은 시각 리턴

select next_day(sysdate,'금') from dual;
select next_day(sysdate,'금요일') from dual; 
--> 한글은 sqlgate에서 실행불가, sqlplus에서 실행하자.

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


* last_day - 특정 월의 마지막 날짜 

select last_day(sysdate) from dual;

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

* 현재시각을 기준으로 특정값만 추출 --> 숫자 출력

select sysdate,
    to_char(sysdate,'yyyy') 년,to_char(sysdate,'mm') 월,
    to_char(sysdate,'dd') 일 , to_char(sysdate,'hh') 시,
    to_char(sysdate,'mm') 분,to_char(sysdate,'ss') 초
from dual;
--> 2006 10 15 03 10 42

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

* 현재시각을 기준으로 특정값만 추출 #2  --> 영문출력

select sysdate,  -- mon <-> month 같다 dy <-> day
    to_char(sysdate,'year') 년,to_char(sysdate,'month') 월,
    to_char(sysdate,'day') 일 ,to_char(sysdate,'hh') 시,
    to_char(sysdate,'mm') 분,to_char(sysdate,'ss') 초 ,
    to_char(sysdate,'dy')
from dual;
-->two thousand sixoctober  sunday   03 10 02

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

* 분기 (quarter) , 몇째 주  , 그 해의 주차, 요일에 해당하는 숫자

select to_char(sysdate,'q'), to_char(sysdate,'w'),
       to_char(sysdate,'ww'),to_char(sysdate,'d'),
    to_char(sysdate,'dd'),to_char(sysdate,'ddd')
from dual;
--> 4(4분기), 3(10월 3째주), 42(2006년 42주차),
--- 2 (월요일), 16(16일), 289(2006년 289일째) d / dd / ddd

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

* 요일값 구하기

--> to_char(sysdate,'d') 
--> 리턴값은 다음과 같은 숫자 - 일요일(1) 월(2) 화(3)수(4)목(5)금(6)토(7)


리눅스기반 오라클에서 리턴값 한글로 강제 변환 방법

1) 방법 1  (case구문은 oracle 9i 부터 사용)

select case to_char(sysdate,'d')
    when '1' then '일요일'
       when '2' then '월요일'
       when '3' then '화요일'
       when '4' then '수요일'
       when '5' then '목요일'
       when '6' then '금요일'
       when '7' then '토요일'
       end "오늘의 요일명"   --> alias , 쌍따옴표 주의!!
from dual;

2) 방법 2

select case
       when to_char(sysdate,'d')='1' then '일요일'
       when to_char(sysdate,'d')='2' then '월요일'
       when to_char(sysdate,'d')='3' then '화요일'
       when to_char(sysdate,'d')='4' then '수요일'
       when to_char(sysdate,'d')='5' then '목요일'
       when to_char(sysdate,'d')='6' then '금요일'
       when to_char(sysdate,'d')='7' then '토요일'
       end "오늘의 요일명"
from dual;

3) 방법 3 (오라클 8i 이전에 주로 사용..)

select decode(to_char(sysdate,'d'),'1','일요일'
                                   ,'2','월요일'
                                   ,'3','화요일'
                                   ,'4','수요일'
                                   ,'5','목요일'
                                   ,'6','금요일'
                                   ,'7','토요일')
"오늘의 요일명"
from dual;                              

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

* 현재 시각 (표준시각 current_date)

select sysdate, current_date from dual;

--> 2006-10-19 20:20:14(시스템시간) / 2006-10-19 11:20:15(세계표준시)

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

* 날짜 타입 서수형으로의 변환

select to_char(sysdate, 'yyspth'),to_char(sysdate, 'mmspth'),
       to_char(sysdate, 'ddspth')
from dual;
--> sixth tenth sixteenth (200 '6'년 '10'월 '16'일)

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

* 현재 날짜 원하는 형식으로 변환

select to_char(sysdate,'yyyy"년" mm"월" dd"일"')
from dual;
--> 2006년 10월 16일

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

* 'fmyyyy-mm-dd' 날짜중 0을 제거/삽입 

select ename, to_char(hiredate,'yyyy-mm-dd') hiredate,
       to_char(hiredate,'fmyyyy-mm-dd') hiredate, --> 제거 
      to_char(hiredate,'fmyyyy-mmfm-dd') hiredate --> /yyyy제거 mm삽입 
from emp;
--> 1981-04-02 -> 1981-4-2 (0을 삭제하자.)

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

* 통화기호와 자리표시

select ename,sal,
       to_char(sal,'09999'),  --> 00800   --> 01600
       to_char(sal,'$9,999'), -->  $800   --> $1,600
       to_char(sal,'L9,999')  -->  $800   --> $1,600
from emp;

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

* 현재 설정 (언어, 통화, 달력등 보기)

select * from v$nls_parameters;

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

* 날짜 계산


select '20061016'-'20061010'
from dual;
--> 6 (문자열 숫자열로 오라클 서버가 자동 형변환)

select sysdate-'20061010'
from dual;
--> 에러

select to_char(sysdate,'yyyymmdd')-'20061010'
from dual;
--> 6 (강제형변환을 해주어야한다)

select sysdate - to_date('20061010','yyyymmdd')
from dual;
--> 6.43899305555555

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

* to_yminterval


select sysdate, add_months(sysdate,14),
       sysdate + to_yminterval('01-02') -- only Oracle 9i upper!
from dual; 
--> 2006-10-16 10:33:15 / 2007-12-16 10:33:15 / 2007-12-16 10:33:15
--- 14개월 / 1년 2개월 후 

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

* to_dsinterval


select sysdate + to_dsinterval('001 02:03:04')
from dual;
--> 1일 2시간 3분 4초 후... / 2006-10-17 12:37:41

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

* to_yminterval + to_dsinterval


select sysdate
     + to_yminterval('01-02')
     + to_dsinterval('001 02:03:04')
from dual;
--> 1년 2월 1일 2시간 3분 4초 후.. / 2007-12-17 12:39:39

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

* extract - Oracle 9i이상에서만 동작한다.

    --> 날짜데이터에서 특정값을 숫자형으로 추출..(우측정렬)
    --> to_char와 결과물은 같지만, to_char는 문자열이다.(좌측)


select sysdate,
       extract(year from sysdate),
       to_char(sysdate,'yyyy'),   
       extract(month from sysdate),
       to_char(sysdate,'mm'),
       extract(day from sysdate)+1,  --> 원래 숫자형이므로 형변환 X
       to_char(sysdate,'dd')+1  --> 1을 더하면서 강제형변환이 일어났다.
from dual;

-->

2006-10-19 20:28:53 / 2006(우) / 2006(좌) / 10(우) / 10(좌) / 20(우) / 20(우)

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

* 실수로 반복 입력한 데이터의 삭제.. --> rowid와 rownum을 이용..

select rownum, rowid, name,jubun
from member;

--> 잘못입력된 데이터의 데이터 입력시 자동생성되는 rowid와 rownum을 검색하자

delete member
where rowid like 'AAAHZuAAJAAAAAP%';

--> rowid를 검색하여, 그 행을 조건절을 이용하여 삭제.

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

* 클라이언트 정보 검색

select userenv('language') "language",
       userenv('terminal') "terminal",
       userenv('sessionid') "sessionid"
from dual;

--> 현재 설정된 언어 값 / 접속컴퓨터터미널이름 / 세션ID

AMERICAN_AMERICA.KO16MSWIN949 / MVP386 /167

select uid, user from dual;

--> 59 (USER ID) / SCOTT(접속계정)

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

* 순위 매기기

방법 1)

select ename "사원명",deptno "부서번호",sal "급여",
       rank() over(order by sal desc) "전체등수",   --공동랭크 포함 - 공동2등 다음 4등
       rank() over(partition by deptno order by sal desc) "부서별등수",
       dense_rank() over(order by sal desc) 전체서열, --공동랭크 불포함 - 공동2등 다음 4등
       dense_rank() over(partition by deptno order by sal desc) 부서별서열
from EMP;

방법 2) 인라인 쿼리문 - 사실상 이 문제에는 필요없다.

select *
from
(
select ename "사원명",deptno "부서번호",sal "급여",
       rank() over(order by sal desc) "전체등수",   --공동랭크 포함 - 공동2등 다음 4등
       rank() over(partition by deptno order by sal desc) "부서별등수",
       dense_rank() over(order by sal desc) 전체서열, --공동랭크 불포함 - 공동2등 다음 4등
       dense_rank() over(partition by deptno order by sal desc) 부서별서열
from EMP
) T
where "전체등수" <=10
order by 2,3 desc;

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

-- Quiz )

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

1. member 테이블에서 여자만 출력하시오.

select *

from member

where substr(jubun,7,1) in (2,4)

select *

from member

where substr(jubun,7,1) =  '2' or substr(jubun,7,1) =  '4'

--> 위의 in 구문보다 아래의 OR 구문이 대용량DB에서 속도면에서 유리하다.

--> 2와 4에 홑따옴표(')를 붙여주지 않아도 동작은 되지만, 무결성을 위해 붙여주자

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

2. 아래와 같은 테이블이 있다.

create table filetab
(fileno number,
filename varchar2(200)
) tablespace users;

insert into filetab values(1,'c:\aaa\bbb\ccc\sales.xls');
insert into filetab values(2,'d:\aaa\salesinfo.doc');
insert into filetab values(3,'c:\research.xxls');
insert into filetab values(4,'d:\aaa\bbb\marketing.hwp');

1) 확장자가 xls인 파일만 출력하시오.

select *

from filetab

where filename like '%.xls';

--> 데이터중에 .xls와 .xxls가 있다. 점(.)을 꼭 넣어 구분해주자.

2) 아래와 같이 출력하시오.

--------------------------------
 fileno      filename
--------------------------------
1            sales.xls
2            salesinfo.doc
3            research.xxls
4            marketing.hwp

-->

select fileno,

         reverse(substr(reverse(filename),1,instr(reverse(filename),'\',1)-1)) filename
from filetab;

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

Quiz ) - 2006.10.14.16:36:00

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

1. 오늘 입대하면 언제 제대할까? (군 기간은 2년)
select add_months(sysdate,24) from dual;
--> 2008-10-14 16:36:34

2. 오늘 입대하면 몇끼를 먹어야 제대할까? (단, 하루3끼)
select (add_months(sysdate,24)-sysdate)*3 from dual;
--> 2193

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

Quiz ) 아래와 같이 출력하시오.

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

 이름  주민번호 계통 성별 나이

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

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

insert into member values('귀화남','7510165234567');
insert into member values('귀화녀','7611126234567');
commit;

select * from MEMBER;

방법 1) 복잡하고 잘못된 코딩

select name 이름,jubun 주민번호,

    case when substr(jubun,7,1) in ('1','2','3','4')
       then '한국계'
      else '외국계'
    end "원래국적" ,
    decode(substr(jubun,7,1),'1','남'
                                        ,'3','남'
                                        ,'5','남'
                                       ,'여') "성별" , --> 계통


    case when substr(jubun,7,1) in ('1','2') then to_char(sysdate,'yyyy') - ('19' || substr(jubun,1,2))
         when substr(jubun,7,1) in ('3','4') then to_char(sysdate,'yyyy') - ('20' || substr(jubun,1,2))
         when substr(jubun,7,1) in ('5','6') then to_char(sysdate,'yyyy') - ('19' || substr(jubun,1,2))        
           when substr(jubun,7,1) in ('7','8') then to_char(sysdate,'yyyy') - ('20' || substr(jubun,1,2)) 
        end "현재나이"       --> 나이계산
from member;

방법 2) 간단한 코딩 

select T.*,
add_months(to_char(sysdate,'yyyy')||'-02-20',12*(60-현재나이)) "정년일",
to_date(to_char(sysdate,'yyyy-mm-dd'),'yyyy-mm-dd') - 입사일 "근무일수",
add_months(to_char(sysdate,'yyyy')||'-02-20',12*(60-현재나이)) -
to_date(to_char(sysdate,'yyyy-mm-dd'),'yyyy-mm-dd') "남은일수"
from
(
select name 성명, jubun 주민번호, hiredate 입사일,
  case when substr(jubun,7,1) in ('1','2','3','4') then '한국계'
       else '외국계' end 혈통,
  case when substr(jubun,7,1) in ('1','3','5') then '남'
       else '여' end 성별,
  case when substr(jubun,7,1) in ('1','2','5','6') 
       then extract(year from sysdate) - (to_number(substr(jubun,1,2))+1899)
       else extract(year from sysdate) - (to_number(substr(jubun,1,2))+1999)
       end 현재나이     
from MEMBER
) T;


-->
귀화인 7510165234567 외국계 남 31
귀화여 7611126234567 외국계 여 30
이순신 7001031234567 한국계 남 36
김하늘 8012252234567 한국계 여 26
남자애 0005023234567 한국계 남 6
여자애 0103014234567 한국계 여 5

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

-- 컬럼 추가
----------------------------------------------------------------------------------

alter table member
add hiredate date;

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

Quiz ) member 테이블에서 아래와 같이 추출. 단 정년은 60세 되는해의 2월 20일이다.

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

성명 주민번호 입사일 계통 성별 현재나이 근무일수 정년일 남은일수

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

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

select *
from member;

update member set hiredate=to_date('1998-01-04','yyyy-mm-dd')
where name='이순신'; 
update member set hiredate=to_date('1999-12-14','yyyy-mm-dd')
where name='김하늘'; 
update member set hiredate=to_date('2002-09-10','yyyy-mm-dd')
where name='남자애'; 
update member set hiredate=to_date('2003-03-20','yyyy-mm-dd')
where name='여자애'; 
update member set hiredate=to_date('2000-01-30','yyyy-mm-dd')
where name='귀화인'; 
update member set hiredate=to_date('2000-01-30','yyyy-mm-dd')
where name='귀화여'; 

commit;

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

정답 )

select T.*,


add_months(to_char(sysdate,'yyyy')||'-02-20',12*(60-현재나이)) "정년일",


to_date(to_char(sysdate,'yyyy-mm-dd'),'yyyy-mm-dd') - 입사일 "근무일수",


add_months(to_char(sysdate,'yyyy')||'-02-20',12*(60-현재나이)) -
to_date(to_char(sysdate,'yyyy-mm-dd'),'yyyy-mm-dd') "남은일수"


from
(
select name 성명, jubun 주민번호, hiredate 입사일,


  case when substr(jubun,7,1) in ('1','2','3','4') then '한국계'
       else '외국계' end 혈통,


  case when substr(jubun,7,1) in ('1','3','5') then '남'
       else '여' end 성별,


  case when substr(jubun,7,1) in ('1','2','5','6') 
       then extract(year from sysdate) - (to_number(substr(jubun,1,2))+1899)
       else extract(year from sysdate) - (to_number(substr(jubun,1,2))+1999)
       end 현재나이     


from MEMBER
) T;

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

Quiz ) emp테이블의 사원중 1년간 총연봉(급여+보너스)가 30000이상인 사람 추출

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

방법1)

select ename, coalesce(sal*12+comm, comm, sal*12, 0)
from emp
where coalesce(sal*12+comm, comm, sal*12, 0) >= 30000;

방법2) 인라인쿼리


select *
from
(
select ename 사원명, coalesce(sal*12+comm,comm,sal*12,0) 연봉
from emp
) T
where T.연봉 >= 30000; 

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

Quiz ) 급여가 아닌 연봉으로 순위 출력

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

select *
from
(
select ename "사원명",deptno "부서번호",to_char(coalesce(sal*12+comm,comm,sal*12,0),'$999,999') "연봉",
       rank() over(order by coalesce(sal*12+comm,comm,sal*12,0) desc) "전체등수",   --공동랭크 포함 - 공동2등 다음 4등
       rank() over(partition by deptno order by coalesce(sal*12+comm,comm,sal*12,0) desc) "부서별등수",
       dense_rank() over(order by coalesce(sal*12+comm,comm,sal*12,0) desc) 전체서열, --공동랭크 불포함 - 공동2등 다음 4등
       dense_rank() over(partition by deptno order by coalesce(sal*12+comm,comm,sal*12,0) desc) 부서별서열
from EMP
) T
where "전체등수" <=10
order by 2,3 desc;       coalesce(sal*12+comm,comm,sal*12,0)

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

 7장 연습문제

1. 현재 날짜 출력하고 컬럼명은 'Current Date'로 출력하시오


select to_char(sysdate,'yyyy-mm-dd') "Current Date"
from dual;

2. EMP 테이블에서 현재 급여에서 15%증가된 급여를 사원번호, 이름,업무,급여,

  증가된 급여(New Salary), 증가액(Increase)를 출력


select empno,ename,job,sal,round(nvl(sal+sal*0.15,0),0) "인상된 급여",round(nvl(sal*0.15,0),0) "증가액"
from emp;

3. EMP테이블에 이름,입사일,입사일로부터 6개월 후 처음 돌아오는 월요일의 날짜 출력


select ename,hiredate,next_day(add_months(hiredate,6),'monday')
from emp;

4. EMP테이블에서 이름,입사일, 입사일로부터 현재까지의 월수, 총급여, 현재급여 출력

select ename,hiredate,round(months_between(sysdate,hiredate),0) 근무개월수,
       round(months_between(sysdate,hiredate),0)*sal 총월급,
       round(months_between(sysdate,hiredate),0)*(nvl(sal,0)+nvl(comm,0)) 총급여
from emp
order by 5 desc;

5. 다음과 같이 출력하시오.

Dream Salary

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

KING earns   $5,000 monthly but wants   $15,000
SCOTT earns   $3,000 monthly but wants    $9,000
FORD earns   $3,000 monthly but wants    $9,000
JONES earns   $2,975 monthly but wants    $8,925

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

select ename || ' earns' || to_char(sal,'$999,999') || ' monthly but wants ' || to_char(sal*3,'$999,999')
from emp
order by sal desc;

6. EMP테이블에서 모든 사원의 이름과 급여를 출력.

  단, 이름은 15자리로 지정하고, 공백부분은 *로 채워라.


select ename,lpad(to_char(sal,'$9,999'),15,'*')
from emp
order by sal

7. EMP테이블에서 모든 사원의 이름,업무,입사일,입사요일 출력
select ename,job,hiredate,
       case
         when to_char(hiredate,'d') =1 then '일요일'
            when to_char(hiredate,'d')='2' then '월요일'
            when to_char(hiredate,'d')='3' then '화요일'
            when to_char(hiredate,'d')='4' then '수요일'
            when to_char(hiredate,'d')='5' then '목요일'
            when to_char(hiredate,'d')='6' then '금요일'
            when to_char(hiredate,'d')='7' then '토요일'
       end "입사요일"      
from emp;

8. EMP테이블에서 이름이 6글자 이상인 사원의 이름,이름글자수,업무 출력
select ename,length(ename) 이름길이,job
from emp
where length(ename) >= 6
order by ename desc;

9. EMP테이블에서 모든 사원의 정보를 이름,업무,급여,보너스,급여+보너스 출력
select ename,job,sal,nvl(comm,0) 보너스,nvl2(sal+comm,comm,0) "급여+보너스"
from emp
order by 5 desc;

반응형

'ORACLE > SQL' 카테고리의 다른 글

insert 할 때 value값에 & 들어있을 때..  (1) 2008.12.30
문자열 처리 함수(Character Functions)  (0) 2008.12.29
oracle vs ms-sql 함수 비교  (0) 2008.11.24
Oracle 과 Mssql 날짜비교 함수  (0) 2008.11.24
RTRIM  (0) 2008.11.24
Posted by [PineTree]
ORACLE/SQL2008. 11. 24. 10:42
반응형

Math Functions


Function

Oracle

SQL Server

Absolute value

ABS

ABS

Arc cosine

ACOS

ACOS

Arc sine

ASIN

ASIN

Arc tangent of n

ATAN

ATAN

Arc tangent of n and m

ATAN2

ATN2

Smallest integer >= value

CEIL

CEILING

Cosine

COS

COS

Hyperbolic cosine

COSH

COT

Exponential value

EXP

EXP

Round down to nearest integer

FLOOR

FLOOR

Natural logarithm

LN

LOG

Logarithm, any base

LOG(N)

N/A

Logarithm, base 10

LOG(10)

LOG10

Modulus (remainder)

MOD

USE MODULO (%) OPERATOR

Power

POWER

POWER

Random number

N/A

RAND

Round

ROUND

ROUND

Sign of number

SIGN

SIGN

Sine

SIN

SIN

Hyperbolic sine

SINH

N/A

Square root

SQRT

SQRT

Tangent

TAN

TAN

Hyperbolic tangent

TANH

N/A

Truncate

TRUNC

N/A

Highest number in list

GREATEST

N/A

Lowest number in list

LEAST

N/A

Convert number if NULL

NVL

ISNULL

Standard deviation

STDDEV

STDEV

Variance

VARIANCE

VAR

 

 

String Functions

Function

Oracle

SQL Server

Convert character to ASCII

ASCII

ASCII

String concatenate

CONCAT

(expression + expression)

Convert ASCII to character

CHR

CHAR

Return starting point of character in character string (from left)

INSTR

CHARINDEX

Convert characters to lowercase

LOWER

LOWER

Convert characters to uppercase

UPPER

UPPER

Pad left side of character string

LPAD

N/A

Remove leading blank spaces

LTRIM

LTRIM

Remove trailing blank spaces

RTRIM

RTRIM

Starting point of pattern in character string

INSTR

PATINDEX

Repeat character string multiple times

RPAD

REPLICATE

Phonetic representation of character string

SOUNDEX

SOUNDEX

String of repeated spaces

RPAD

SPACE

Character data converted from numeric data

TO_CHAR

STR

Substring

SUBSTR

SUBSTRING

Replace characters

REPLACE

STUFF

Capitalize first letter of each word in string

INITCAP

N/A

Translate character string

TRANSLATE

N/A

Length of character string

LENGTH

DATALENGTH or LEN

Greatest character string in list

GREATEST

N/A

Least character string in list

LEAST

N/A

Convert string if NULL

NVL

ISNULL

 

 

Date Functions

Function

Oracle

SQL Server

Date addition

(use +)

DATEADD

Date subtraction

(use -)

DATEDIFF

Last day of month

LAST_DAY

N/A

Time zone conversion

NEW_TIME

N/A

First weekday after date

NEXT_DAY

N/A

Convert date to string

TO_CHAR

DATENAME

Convert date to number

TO_NUMBER(TO_CHAR())

DATEPART

Convert string to date

TO_DATE

CAST

Get current date and time

SYSDATE


 

반응형

'ORACLE > SQL' 카테고리의 다른 글

문자열 처리 함수(Character Functions)  (0) 2008.12.29
단일 행 함수  (0) 2008.11.24
Oracle 과 Mssql 날짜비교 함수  (0) 2008.11.24
RTRIM  (0) 2008.11.24
Oracle 날짜 관련 함수  (0) 2008.10.29
Posted by [PineTree]
ORACLE/SQL2008. 11. 24. 10:41
반응형
Oracle 과 Mssql 날짜비교 함수
 
 
CREATE TABLE TEMP_DATE
( ID   INT,
 INDATE DATETIME )
INSERT INTO  TEMP_DATE (ID, INDATE )
SELECT '1', SYSDATE  FROM  OPENQUERY(ORACLE_LINK,'SELECT SYSDATE FROM DUAL')
SELECT  *   FROM TEMP_DATE

          날짜   08 22 2006 의 형식을  2006-08-22 00:00:00 으로 변경하기
         SELECT @t_PLAN_STARTDATE = CAST(@Plan_StartDate    AS DATETIME  )
        SELECT @t_PLAN_ENDDATE = CAST(@Plan_EndDate    AS DATETIME  )


### DBMS에 따른 날짜포맷 변환 ###
Oracle - MS SQL - DB2 UDB 의 서로 다른 날짜 형식을 맞추기위한 SQL문
--------------------------------------------------------------------------------
DBMS 별 시간, 날짜 조회 쿼리
--------------------------------------------------------------------------------
1. Oracle
- 날짜+시분초 까지 조회가능
select sysdate from dual;
- 날짜+밀리초+시간존 까지 조회
select current_timestamp from dual;
 
2. MS SQL
- 날짜 + 밀리초 단위까지 조회가능
select getdate();
 
3. DB2 UDB
- 날짜+밀리초까지 조회 가능
select current timestamp from sysibm.sysdummy1;
- 날짜만 조회
select current date from sysibm.sysdummy1;
- 밀리초 단위의 시간만 조회
select current time from sysibm.sysdummy1;
 
--------------------------------------------------------------------------------
DBMS 별 default date format
--------------------------------------------------------------------------------
1. Oracle
한글 : YYYY/MM/DD                       영어 : DD-MON-YYYY
 
2. MS SQL
한글 :  YYYY/MM/DD HH:MI:SS      영어 : MM-DD-YYYY HH:MI:SS
 
3. DB2 UDB
TIMESTAMP 타입 : YYYY-MM-DD-HH:MI:SS.MMMMMM
DATE 타입 : YYYY-MM-DD
TIME 타입 : HH:MI:SS.MMMMMM
 
--------------------------------------------------------------------------------
날짜 포맷 변환
--------------------------------------------------------------------------------
[ 형식 : 'YYYY.MM.DD' ]
1. Oracle : TO_CHAR(date_exp, 'YYYY.MM.DD')
2. MSSQL : CONVERT(VARCHAR, date_exp, 102)
3. DB2 : REPLACE(CHAR(DATE(date_exp),ISO), '-', '.')
 
[ 형식 : 'HH:MI:SS' ]
1. Oracle : TO_CHAR(date_exp, 'HH:MI:SS')
2. MSSQL : CONVERT(VARCHAR, date_exp, 108)
3. DB2 : CHAR(TIME(date_exp) , JIS )
 
[ 형식 : 'YYYY/MM/DD' ]
1. Oracle : TO_CHAR(date_exp, 'YYYY/MM/DD')
2. MSSQL : CONVERT(VARCHAR, date_exp, 111)
3. DB2 : REPLACE(CHAR(DATE(date_exp), ISO), '-', '/')
[ 형식 : 'YYYYMMDD' ]
1. Oracle : TO_CHAR(date_exp, 'YYYYMMDD')
2. MSSQL : CONVERT(VARCHAR, date_exp, 112)
3. DB2 : CHAR(DATE(date_exp))
[ 형식 : 'HH24:MI:SS' ]
1. Oracle : TO_CHAR(date_exp, 'HH24:MI:SS')
2. MSSQL : CONVERT(VARCHAR(8), date_exp, 114)
3. DB2 : CHAR(TIME(date_exp))
[ 형식 : 'YYYY.MM.DD HH24:MI' ]
1. Oracle : TO_CHAR(date_exp, 'YYYY.MM.DD HH24:MI')
2. MSSQL : CONVERT(VARCHAR, date_exp, 102) + ' ' + CONVERT(VARCHAR(5), date_exp, 114)
3. DB2 : REPLACE(CHAR(DATE(date_exp), ISO), '-', '.') || CAST( TIME(date_exp) AS CHAR(5))
[ 형식 : 'YYYY/MM/DD HH24:MI:SS' ]
1. Oracle : TO_CHAR(date_exp, 'YYYY/MM/DD HH24:MI:SS')
2. MSSQL : CONVERT(VARCHAR, date_exp, 111) + ' ' + CONVERT(VARCHAR(8), date_exp, 114)
3. DB2 : REPLACE(CHAR(DATE(date_exp), ISO), '-', '/') || CAST( TIME(date_exp))
반응형

'ORACLE > SQL' 카테고리의 다른 글

단일 행 함수  (0) 2008.11.24
oracle vs ms-sql 함수 비교  (0) 2008.11.24
RTRIM  (0) 2008.11.24
Oracle 날짜 관련 함수  (0) 2008.10.29
Oracle 날짜형 데이터의 연산  (0) 2008.06.17
Posted by [PineTree]
ORACLE/SQL2008. 11. 24. 10:30
반응형

RTRIM


  분류

  Single-Row Functions > Character Functions Returning Character Values

  * 함수의 분류와 모든 목록에 관해서는 아래 페이지를 참고하세요.
  - http://www.soqool.com/servlet/board?cmd=view&cat=100&subcat=1030&seq=1

  * 분석함수에 관해서는 아래 페이지를 참고하세요.
  - http://www.soqool.com/servlet/board?cmd=view&cat=100&subcat=1030&seq=2


  적용 가능 version

  8i 이상
  * 8i 와 이후 버전만을 표시합니다.


  문법

  

  * 위의 Syntax Diagram을 읽는 방법은 아래 페이지를 참고하세요.
  - http://www.soqool.com/servlet/board?cmd=view&cat=100&subcat=1020&seq=8


  함수설명

  RTRIM 함수는 첫번째 파라미터로 주어지는 문자열의 오른쪽부분에서 두번째 파라미터로 주어지는 문자열에 속한 모든 문자들을 제거한다.
  즉, 첫번째 문자열을 오른쪽에서부터 왼쪽으로 검색시, 두번째 문자열에 포함되지 않은 문자가 처음으로 나타날 때까지 문자를 제거한다.
  두번째 파라미터를 생략하면 문자열 오른쪽에서 공백(' ')을 모두 제거한다.
  
  

  관련자료

  LTRIM 함수
  TRIM 함수


  예제

  SELECT RTRIM ('SoQooL@@##@#', '#@') rtrim1
       , RTRIM ('   SoQooL         ') rtrim2
    FROM DUAL



  RTRIM1 RTRIM2  
  ------ ---------
  SoQooL    SoQooL



  



  References

  1. Oracle Database SQL Reference 10g Release 2 (10.2) Part Number B14200-02
  - http://download-west.oracle.com/docs/cd/B19306_01/server.102/b14200/functions141.htm

 

  2. 출처

  - http://www.soqool.com/servlet/board?cmd=view&cat=100&subcat=1030&seq=448&page=1&position=1

반응형

'ORACLE > SQL' 카테고리의 다른 글

oracle vs ms-sql 함수 비교  (0) 2008.11.24
Oracle 과 Mssql 날짜비교 함수  (0) 2008.11.24
Oracle 날짜 관련 함수  (0) 2008.10.29
Oracle 날짜형 데이터의 연산  (0) 2008.06.17
PL/SQL  (0) 2008.02.22
Posted by [PineTree]
ORACLE/ADMIN2008. 11. 21. 13:20
반응형

 
배경
 
1. 하드웨어 장애로 인해 신규 시스템 구입
2. DB가 저장되어 있는 하드디스크는 건재
3. 10.2.0.1은 Windows XP버젼 10.2.0.3은 Windows Vista 버젼
 
물리설계의 변경
 
1. 이전버젼은 오라클 프로덕트, 백업영역이 데이타파일과 동일한 디스크에 저장
2. 신규버젼은 오라클 프로덕트, 백업영역을 데이타파일과 다른 디스크에 저장
 
순서
 
1. 오라클 인스톨
    인스톨 드라이브 : C 드라이브
 
2. 환경변수 설정
 ORACLE_BASE=C:\Oracle
 ORACLE_HOME=C:\oracle\product\10.2.0\db_1\
 ORA_NLS=C:\oracle\product\10.2.0\db_1\/nls
 TNS_ADMIN=C:\oracle\product\10.2.0\db_1\\network\admin
 ORACLE_SID=OSITDB99
 NLS_DATE_FORMAT=YYYY/MM/DD HH24:MI:SS
 NLS_LANG=JAPANESE_JAPAN.JA16SJIS
 
3. 화일카피 (이전시스템의 디스크에서 신규시스템의 디스크로)
F:\u01\oradata\OSITDB99
F:\u02\oradata\OSITDB99
C:\oracle\admin
C:\oracle\flash_recover_area
4. init.ora화일 편집
F:\oracle\admin\OSITDB99\adump → C:\oracle\admin\OSITDB99\adump
F:\oracle\admin\OSITDB99\bdump → C:\oracle\admin\OSITDB99\bdump
F:\oracle\admin\OSITDB99\cdump → C:\oracle\admin\OSITDB99\cdump
F:\oracle\admin\OSITDB99\udump → C:\oracle\admin\OSITDB99\udump
 
5. 서비스 등록
OracleServiceOSITDB99
6. DB리커버리
불완전리커버리실시 (완전리커버리용 백업파일이 존재하지 않았기 때문)
7. alter database open upgrade
버젼이 upgrade되었기 때문에 alter database open으로는 DB오픈 실패
8. catupgrd.sql
$ORACLE_HOME/rdbms/admin 에 있는 catupgrd.sql실행
 
주의점
1. 버젼이 다르기 때문에 데이타파일을 그대로 카피해도 데이타베이스 기동이 안됨
   (OS에 의한 백업과 동일한 결과였지만 버젼이 문제)
2. cataupgrd.sql을 실행시키지 않으면 정상적인 DB조작이 안됨
반응형

'ORACLE > ADMIN' 카테고리의 다른 글

oracle유저 이외의 유저가 sqlplus등을 사용하는 방법  (0) 2008.11.27
DBNAME, SID 변경하기.  (0) 2008.11.26
[Oracle] Datafile Size 변경하기  (0) 2008.11.19
sqlplus 사용법 (ORACLE)  (0) 2008.11.04
Oracle Data Dictionary Views  (0) 2008.09.12
Posted by [PineTree]
PineTree/T2008. 11. 21. 00:45
반응형

*이 글은 200자 원고지 100매 분량이다. 처음부터 끝까지 모조리 읽지 않을 것이라면 읽지 않는 편을 권한다.



서태지 인터뷰 전문: 2008년


8집 첫 싱글을 낸 서태지를 지난 9월 29일에 만났다. 지난 2004년 3월에 그를 만나고 처음이니 4년 6개월만의 인터뷰였다. 이번에도 서태지 인터뷰는 성사까지 시간이 오래 걸렸다. 서태지컴퍼니측은 인터뷰 요청 때마다 “알았다. 노력하겠다”고 말했으나 대답은 오지 않았다. 결국 9월 27일 연락을 받았다. 9월 29일 오후 8시에 서태지컴퍼니에서 보자는 것이었다.

서태지는 8시를 조금 넘겨 인터뷰 장소인 회의실에 들어왔다. 얼굴이 약간 부스스했고 피부는 까칠해 보였다. 그와 오랜 시간 이야기를 했으나 역시 신문에 그 모든 내용을 소화할 수는 없었다. 지면 특성상 음악 이야기를 많이 쓸 수가 없었고 사람과 그의 삶에 대한 이야기들 위주로 기사화해야 했다. 4년 6개월 전 인터뷰 때 인터뷰 전문을 인터넷에 올려 서태지 팬들이 즐거워했던 기억이 났다. 그렇게 만나고 싶어하는 사람들이 많은데 인터뷰 내용을 내 수첩 속에 가둬두는 것 역시 예의가 아니라는 생각이 들었다.

인터뷰를 시작하기에 앞서 MP3 플레이어를 꺼냈다. 이왕이면 전부를 녹취해서 서태지의 말투까지 소상하게 써주는 게 좋을 것 같았다. 그러나 이것은 순진한 생각이었다. 서태지는 녹음하지 말아달라고 부탁했다. “방송 인터뷰도 하는데 녹음이 안되나요?” 하고 묻자 “방송은 말할 때 아예 방송용으로 말해요. 녹음기가 있으면 편하게 말하지 못해요” 라고 답했다. MP3 플레이어를 거둘 수 밖에 없었다. 덕분에 수첩을 20페이지 넘게 채웠다. 가능한 한 서태지의 모든 말들을 담으려고 했으나 아마도 빠지거나 잘못 적은 부분도 있을 것이다. 다음은 (수첩에 적힌) 인터뷰 전문이다.

- 회사가 언제 이리로 이사했어요?
“2년쯤 된 것 같은데요. 그때쯤 한국에 몰래 왔거든요. 7집 활동 끝내고 인도하고 미국 여행을 좀 했고, 여기에 스튜디오 연습실 다 작업 끝났다고 해서 들어왔어요. 그러니까 여기가 ‘스튜디오 T’죠. 이번엔 여기서 음반작업을 다 했어요.”

- 심포니 공연은 잘 봤습니다.
“어떠셨어요?”

- 전반적으로 좋았어요. 기대했던 것보다는 사운드가 안좋았죠. 어떨 땐 보컬이 너무 크고, 후반부엔 보컬이 잘 안 들리기도 하고?. 아무래도 클래식과 록을 함께 한다는 데 쉽지 않겠죠.
“영국 엔지니어팀과 우리쪽에서 원하는 사운드가 완전히 달랐어요. 우리는 밝고 댐핑(damping)이 있는 사운드가 필요했고? 클래식은 완전히 달랐어요. 서로 양보해서 절충안을 찾은 게 이번 사운드였어요. 게다가 상암 자체가 록 사운드를 잡기 어려운 곳이에요. 그래도 음향점수가 70~80점은 되지 않았나 싶어요.”

- 합창단이 깜짝 출연해서 놀랐습니다. ‘컴백홈’ 때는 무척 감동적이었어요. 반면에 ‘교실 이데아’ 때는 합창단이 노래를 방해한다는 느낌이 들었습니다. 클래식 현악 파트의 디테일이 록 사운드에 가려진 것은 좀 아쉬웠습니다. 그건 딥퍼플이나 메탈리카도 마찬가지 아니었을까 싶어요.
“그래서 믹싱을 따로 해서 그런 부분을 보완할 계획입니다.”

- DVD로 내나요?
“아니오. 방송할 때 말이죠. DVD나 CD는 확정은 안됐는데 가능하자면 내자는 쪽이에요. 사운드를 제대로 잡아야겠죠.”

- 오케스트라와의 협연은 오랜 꿈이었죠?
“‘영원’ 만들 때만 해도 클래식 교향곡에 보컬을 넣어서 디즈니 영화음악 같은 장엄한 음악을 해보고 싶었어요. 이후에 메탈리카 ‘S & M’도 보고 ‘언젠가는 해야겠다고 생각했어요. 8집을 내면서 뭔가 큰 공연을 하고 싶었어요. 7집 때 블라디보스토크에 간 것처럼 실험적이든 새로운 시도든, 뭔가 색다른걸 해야겠다고 생각했어요. 클래식과 협연을 하기로 마음 먹은 건 음반 작업을 시작하기 전에 결정한 거예요. 그러니까 지금으로부터 2년 전쯤인 거죠. 당시엔 어떻게 해야겠다는 건 없었고, 오케스트라를 일단 섭외해보자고 생각했어요. 그런데 톨가씨 얘기는 그때부터 했어요. 톨가 말고는 내 음악을 제대로 이해해 줄 사람이 없다고 판단했어요. 그래서 공연기획사와 계약할 때부터 ‘톨가가 섭외되면 공연을 하고 아니면 이 계약은 무효다’라고 계약서에 쓸 정도였어요. 톨가의 화성이 맞을 것 같았어요. 로열 필과 하게 된 건 (샌프란시스코 심포니와 메탈리카가 했던) S & M도 좋긴 하지만 톨가가 로열 필과 친한 점도 있고 해서 그렇게 됐어요. 꼭 로열필과 해야겠다고 작정했던 건 아니죠. RPO(로열 필하모닉 오케스트라)와 RPCO(로열 필하모닉 콘서트 오케스트라) 논쟁이 있었던 걸로 아는데, 제 음악에 박자 맞추기로는 RPCO가 더 낫더라고요. 톨가와 함께 했을 때 연주가 좋았던 사람들 위주로 모았고요. 그리고 나머지는 RPO 멤버들이에요.”

- 딥퍼플이 로열필, 런던필과 했던 공연이나 메탈리카가 샌프란시스코 심포니와 했던 것을 라이브로 보지 못해서 잘 모르겠지만, 라이브 음반 역시 그다지 찬사를 받지는 못했죠. 록과 클래식의 협연이란 게 그만큼 어려운 게 아닐까 합니다. 그리고 그때마다 파트별 수석연주자를 제외하고는 대부분 객원연주자로 오케스트라가 구성됐다고 하죠. 오케스트라가 크로스오버를 할 때 연주자가 바뀌는 건 드물지 않은 일 같습니다만.
“그러게요. 아마도 클갤(디씨인사이드 클래식 갤러리)에서 넥스트 사건을 고려해서 RPO에 대한 의문점을 찾아 올리고 거기에 루머를 반 섞고 해서 그 뉴스가 뜬 것 같은데요. 그래서 결국 해당 매체에서 사과를 하기도 했고요.(이것은 한 인터넷 매체가 ‘서태지 공연측, 떳떳하면 계약서 공개하라’는 기사를 써서 논란이 인 뒤, “서태지 심포니에 서는 오케스트라는 RPCO로 확인됐다. 그러나 가짜 로열필하모닉이 오는 것 아니냐는 뉘앙스로 보도된 것에 대해 사과한다”는 글을 올린 것을 뜻한다. RPO는 세계적 명성을 누리는 오케스트라이지만 RPCO는 그에 못 미친다. 비유하자면 메이저리그와 마이너리그쯤으로 표현할 수 있을 것이다. 서태지측은 보도자료에서 ‘로열필하모닉’이라고만 표기했지만, 이는 RPO로 오해되기 쉬운 표현이다.)”

- 톨가 카쉬프는 클래식계에서는 무명에 가까운 사람인데, 굳이 이 사람을 택한 이유가 있나요.
“어차피 클래식 씬에서 유명한지 아닌지 여부는 중요한 변수가 아니었어요. 톨가는 약간 이단아 같은 존재예요. 만나보니까 나하고 비슷한 것 같기도 하고. 음악 이력에서 나와서 새로운 것을 시도하고 성공하고 욕도 먹고요. 얘기하면 동질의식도 느끼고.”

- 욕을 먹는 게 똑같다니오?
“욕 먹는 건 옛날에 록 할 때도 그랬어요. 삼표음악 들으면 저런 거 왜 듣냐고 형들이 욕했죠.”

- 공연 얘기를 좀 더 해보죠. 영상이 무척 좋던데, 직접 아이디어를 내나요.
“물론 제가 직접 회의에 참여하고 아이디어를 내죠. 영상은 이번에 (있는 걸 갖다 쓰지 않고) 새로 제작을 많이 했어요. VJ팀이 만들어서 ETP 때도 해보고 결과가 좋아서 조금 더 해봤어요. 회의에는 물론 참석하죠. 처음에 우리 자료를 주고 느낌을 설명해주죠. 그러면 그분들이 시안을 가져와서 보여줘요. 그러면 미세 조정을 하죠.”

- 클래식 협연 꿈은 어찌됐든 이뤘네요. 만족하나요?
“클래식 협연 꿈은 완전히 이뤘죠. 만족도는 물론 100%는 아니죠. 그리고 100%가 되면 안되겠죠. ‘영원’ 때는 시행착오를 많이 했어요. 그때 편곡을 아는 분을 소개받아서 했는데 굉장히 잘 됐어요. 셋째 할아버지가 음대 총장이셔서(그의 셋째 할아버지 정희석씨는 연세대 음대 학장이었다) 소개를 받았어요. 제가 클래식을 전혀 모르니까요. 일본팀이 영원을 편곡했다는 소리도 있었는데, 일본팀이 연주를 한 거죠. 지금 들어도 편곡과 레코딩이 모두 다 잘됐다고 생각해요.”

- 로열 필 협연 연습은 어떻게 했습니까. 영국에 가서 며칠 한 걸로는 안될텐데요.
“이번엔 그쪽(영국)에서 미디로 받은 걸 밴드에 얹혀서 연습했어요. 그러니까 가상의 오케스트라가 우리 연습실에서 함께 연습한 셈이죠. 어느 정도 연습이 됐을 때 런던으로 간 거예요. 처음엔 런던 리허설을 할 생각이 없었어요. 그런데 가상 연습을 하다보니까 점점 욕심이 생긴거죠. 그래서 영국에 가게 됐어요.”

- 런던에서 연습은 얼마나 했어요.
“이틀간 하루 12시간씩 했어요. 톨가가 단원들을 아주 잡더라구요. 특히 관악 파트는 너무 지쳐서 톨가가 ‘살살 불어라’고 할 정도였어요. 처음에는 힘들었는데 나중에는 재미있었어요. 잘은 모르겠지만 단원들이 처음엔 ‘동양에서 온 사람이구나’ 하는 정도였던 것 같아요. 그런데 나중에는 재미있다는 느낌을 받은 모양이더라고요. 단원들 중에도 록을 좋아하는 젊은 단원들이 있어서 ‘음악 정말 죽인다’고 악수를 청해오기도 하고.”

- 런던 연습장면 동영상을 보고 팬들끼리 ‘대경성’이다, ‘컴백홈’이다 알아맞추기도 하더라고요.
“아, 제가 점프하는 거요? 그거 컴백홈이에요.”

- 단원들 중에 서태지를 이미 아는 사람이 있던가요.
“아니오. 아마 서태지가 누군지 전혀 모르겠죠.”

- 싱글 이야기를 좀 해보겠습니다. ‘모아이’는 오리지널과 리믹스 버전의 느낌이 각각 다른데, 혹시 오리지널에서 피아노를 비롯한 특정 트랙들을 많이 들어낸 게 리믹스 버전 아닌가요? 그래서 ‘모아이’ 창작과정이 드러나도록 한 것 아닌가 하는 생각을 해봤습니다.
“아니오. 그 두 곡은 보컬 빼고는 인트로 비트만 같고 완전히 다른 곡이에요. 1번 곡은 각 악기 파트를 모두 리얼악기로 연주했고, 4번 곡은 일렉트로니카죠. 1번은 네이처 파운드, 4번은 일렉트로닉 네이처 파운드라고나 할까요. 리듬을 계속 쪼개서, 드럼만 해도 무척 복잡해요. 끊임없이 고스트(ghost·드럼의 하이햇을 들릴듯 말듯 하게 연주하는 것)가 등장하죠. 편곡도 피아노 기타 베이스가 모두 무척 복잡해요. 그래서 1번 모아이는 뭔가 복잡하게 들리죠.”

- 그렇군요. 저는 1번곡의 트랙 수가 훨씬 많지만 그것이 모이니까 뭔가 좀 단순하게 들리고, 4번 곡은 트랙수가 적지만 극도로 잘게 쪼개진 드럼 앤 베이스의 형식을 쓰고 있어서 오히려 복잡하고 난해하게 들리던데요.
“그 반대로 들린다는 사람들이 더 많던데요. 일렉트로니카로 만든 4번 곡이 더 단순하게 들린다는 거죠. 채널 수 역시 4번 곡이 더 많아요. 4번은 보컬과 베이스 일정 부분 빼고는 리얼 악기가 없어요. 4번은 곡에 공간을 많이 주고 여유가 있고 숨을 쉴 수 있도록 만들었어요. 숲의 청명함을 표현하려고 했죠.”

- 그럼 이번 클래식 편곡까지, 모아이는 세 개 버전이 있는 거군요.
“그래도 곡의 주제는 똑같아요. ‘여행’과 평온함을 찾을 수 있도록 의도했어요.”

- 박자를 그렇게 잘게 쪼개면 드러머가 고생이 많았겠네요.
“혜승은 와서 한 달간 연습만 했어요. 그리고 녹음 들어갔지요. 고생을 정말 많이 했어요. 그 대신 제가 맘 편하게 해주고 될 때까지 녹음하고, 되면 이야기하라고 했어요. 바세린 드럼(최현진)은 연습을 더 했어요. 제가 볼 때 우리 곡 드럼 칠 사람은 혜승하고 현진 밖에 없어요.”

- 그 두 사람이 국내 최고란 말로 들립니다만.
“그럼요. 장담할 수 있어요.”

- 어떻게 장담을 할 수 있죠?
“이번에 오버와 인디 합쳐서 드러머는 거의 다 봤다고 할 수 있어요. 저랑 현진은 언젠가 우리가 세계 1등을 하자고 했어요. 실력이라기보다 연주스타일로 봐서는 지금 우리 음악을 연주할 수 있는 사람이 혜승과 현진 밖에 없어요. 혜승은 한 달 연습하고 1주일간 녹음하고 피아로 돌아갔죠. 현진은 오디션 10명쯤 보고 뽑았어요. 녹음 때는 오디션 볼 필요도 없이 혜승이 할 수 있느냐 없느냐만 판단해야 했죠. 혜승이 고스트가 정말 탁월해요. 그루브도 외국 연주자 같고. 혜승이 못 치면 또 외국에서 구해야 하는 거죠. 지난번 헤프처럼.”

- 헤프는 지금 어떻게 됐나요?
“우리 밴드는 늘 앨범 한 장씩 계약하거든요. 지난번 음반 활동 계약 끝나고 미국에 돌아갔죠. 다른 멤버들도 마찬가지에요.”

- 최현진씨는 연주를 금세 잘 하던가요.
“현진은 한 달동안 연주스타일만 고쳐야 했어요. 그래서 ‘매일 여기 나와서 연습할 수 있느냐’고 물으니 ‘할 수 있다. 하루 종일 드럼만 치는 게 내 꿈이다’라고 했어요. 그리고 나서 여기서 먹고자면서 연습했어요. 한 달 넘게 연습하고 이젠 됐다고 했죠. 현진은 전공이 재즈예요. 현진이 연습 끝내면서 둘이 얼싸안고 말했죠. ‘우리가 일단 한국 최고는 된 것 같다. 이제 세계 최고가 되자’고 말이죠.”

- 인디에 있는 사람들을 잘 알고 지내나요? 어떻게 무명 밴드에 있는 사람들을 찾아내죠?
“(서태지는 이 질문을 잘못 알아들었는지 다른 대답을 했다) 탑, 락 때도 그랬고 다들 서태지가 인디 빼가서 인디가 망한다고 하는데, 가슴 아픈 얘기예요. 서태지에 합류했다고 인디가 망한다면 그건 가슴 아픈 일이죠. 빼가는게 아니라 정말 실력있고 할 수 있는 사람들과 작업을 하고 싶은 거예요. 준영도 그렇고. 석중은 ‘독고다이’죠. 딴 작업은 안 하고 우리 일만 했어요.”

- 베이스 주자도 실력이 뛰어난 것 같던데요.
“준영은 연주는 최고예요. 그러나 비주얼과 액션이 좀 더 필요했어요. 워낙 연주가 좋아서 일단 하기로 하고 나머지를 보완했죠. 액션은 자신만의 기본 필이란 게 있어요. 라이브에서 액션이 매우 중요하다고 생각하거든요.”

- 그럼 무대 위 액션도 서태지씨가 직접 디렉팅을 하나요?
“액션은 꽤 자율적이에요. 연주는 자율적이지 않지만요. 연주가 그런 건 편곡자와 실제 녹음자가 저니까. 또 선배이기도 하고. 그러니까 아무래도 제가 디렉팅을 하게 되죠.”
(서태지 이번 싱글을 MP3로 변환하려고 하자 CDDB에서 ‘Helter Skelter’라는 곡명이 떴다. 인터넷을 뒤져보니 이와 같은 경험을 한 사람들이 또 있었다. ‘Helter Skelter’는 비틀스 화이트 앨범에 실렸던 실험성 짙은 노래여서 이것을 서태지의 의도가 담긴 그 무엇으로 생각하고 있었는데, 최근에 보니까 ‘Helter Skelter’라는 글램록 밴드가 있었고, 그들의 앨범에 실린 곡들이 서태지 새 싱글에 실린 네 곡의 MP3 버전으로 바뀌어있는 사실을 알게 됐다. 이 질문을 서태지에게 했으나, 매우 허탈한 대답을 들었다.)

- 헬터 스켈터는 무슨 의도를 갖고 MP3에 이름 붙인 건가요?
“예? 그게 뭐예요?”

- 이번 음반을 MP3로 바꾸려면 곡명이 ‘Helter Skelter’의 노래들로 나오잖아요.
“처음 듣는 이야긴데요? 그거 무슨 fake file 같은 건가요?”

- 아니...저는 당연히 이게 서태지씨가 의도한 무엇일 거라고 생각했는데...
“아니오. 전혀 처음 듣는 얘기예요. 인터넷 DB에 보면 길이가 똑같은 다른 곡 제목이 붙는 경우가 있더라고요. 그런 종류 아닐까요?” (결국 helter skelter에 얽힌 비밀은 아직 풀리지 않았다)

- ‘버뮤다 트라이앵글’이란 신곡의 일부가 인터넷에 있더라고요. 그건 다음 싱글에 실릴 곡인가요.
“그건 KTF용 신곡을 염두에 두고 만든 거예요. 다음번 싱글이나 정규앨범에 들어가게 될 거예요. 아직 어느 앨범에 넣을지는 결정 못했어죠. 컨셉은 역시 8집 전체의 컨셉과 같은 노래고요. 7집 때 Watch out도 먼저 만들어놓고 나중에 공개한 거죠.”

- 다음 싱글은 언제 낼 계획인가요.
“아직 정해지지 않았지만 아마도 올 연말 연초쯤이 될 거예요. ‘휴먼 드림’에도 기대를 걸고 있거든요. 좀 대중적인 멜로디이고?. ‘휴먼 드림’ 반응이 좋으면 다음 싱글이 조금 더 늦어질 수도 있고요. 다음 싱글은 첫 번째 싱글과 곡 수가 비슷할 거예요. 정규 앨범 시기는 다음 싱글보다 더 미지수예요. 활동하다가 심심해지면 이렇게 해볼까 하기 때문이죠. 프로모션은 시기가 중요하다는 걸 알지만, 시간에 얽매이다 보면 음악하는 게 재미 없어져요. 거기서 벗어나면 편안하고 행복해져요. 그게 음악하는 사람으로서 좋은 점이에요. FM 비즈니스에서 벗어나보자 하는 것이죠. 서태지와 아이들 시절에도 어느 날까지 새 음악을 내놓아야 한다는 게 굉장히 스트레스를 줬어요.”

- 그렇게 계약이 돼 있었던 건가요?
“아니오. 계약은 문제가 없었어요. 팬들과 약속을 그렇게 한 거죠. 1집 때는 활동을 끝내면서 6개월 만에 새 음반을 내겠다고 했고, 이게 너무 짧아서 그 다음은 8개월로 조금 늘였죠. 그때는 ‘방송활동 중단’이란 게 큰 뉴스였어요. 1집은 아무 부담 없이 냈는데 방송활동을 하면서 다음 작업을 할 수는 없는 노릇이잖아요. 그런데 그때는 다들 그렇게 했던 것 같아요. 그래서 방송 중단을 하면서 ‘사라지는 게 아니라 6개월만에 돌아오는 것’이라고 했죠.”

- 그런 스트레스가 결국 서태지와 아이들 해체로 이어진 건가요?
“그것 때문만은 아니었지만 그것도 영향을 줬죠.”

- 이번 음반에서도 이모(Emo) 계열의 영향이 느껴집니다만.
“이번 음반에 이모계열 정서는 전혀 없다고 봐요. 외국의 새로운 장르를 들여오고 싶다는 생각을 예전에는 한 적이 있는데 이번에는 전혀 그런 생각 없이 ‘여행’의 느낌만으로 만들었어요. 그러다보니 외국에도 없는 음악이 나온 것 같아요. 그래서 장르 상관없이 내가 갖고 있는 걸로 음악을 하다보면 새로운 음악이 나오는구나, 하는 것도 배웠어요. 그렇게 만들어놓고 장르 이름을 뭐라고 할까 하다가 ‘네이처 파운드’라는 말을 생각해냈어요.”

그의 대답은 약간 의외였다. 사실 이모라는 장르 자체가 이제 거의 사라지다시피 한 애매모호한 장르이기도 하지만, 이모의 특성을 서태지의 음악은 갖고 있다. 물론 ‘이모코어’의 특징인 그로울링은 없어졌다. 그러나 ‘휴먼 드림’의 ‘그런지하고 더러운(서태지의 표현)’ 기타 사운드는 이모의 특징적 기타 톤과 닮았다. 그리고 서태지의 이번 패션 역시 이모의 그것과 닮은 데가 있다. 앞머리를 길러서 한 쪽으로 빗고 스키니진을 입는 등등의 패션이 그렇다. 그러나 어쩌랴. 아티스트가 “이모 아니다”라고 한다면 이모가 아닌 것이다.

- 애초에 생각하던 대로 음반이 나왔습니까.
“이번 음반이 처음에는 무척 후지게 생각했어요. 이렇게 해서 음반을 내겠나 싶을 정도였죠. 그런데 차차 풀리더라고요. 이번에는 외국 스튜디오를 빌리지 않아도 되고 한국에서 다 했으니까, 녹음하고 그 다음날 또 바꿔보고 하면서 조금씩 좋아졌어요. 그러니까 제가 레코딩 엔지니어지아 믹싱 엔지니어죠.”

- 믹싱에 시간을 무척 많이 쓰는 것 같은데요.
“예전에는 하루 한 곡 정도 믹싱을 했어요. 또 믹싱 엔지니어를 두면 그 사람의 의견도 존중해줘야 하니까 아무래도 제가 하고 싶은대로 다 할 수가 없죠. 그래서 이곳 스튜디오 만들고 나서는 ‘믹싱은 시간을 정해두지 말고 하자’고 생각했어요. 왜냐하면 믹싱 할 때는 완벽하다고 생각했는데 한 달 뒤쯤 뭔가 발견하는 경우가 있어요. 이번에 그렇게 시간을 정하지 않고 믹싱을 하다보니 이번 싱글 믹싱에만 한 달이 걸렸어요.”

- 네 곡 믹싱하는 데 한 달이면 정말 엄청난 시간이 들었군요.
“물론 다른 곡들도 기본 믹싱은 돼 있죠.”

- 그러다보니 공백기간은 길어질 수 밖에 없군요. 4년 6개월이면 좀 지나치게 길지 않나요?
“이번 메탈리카 음반이 몇 년 만에 나왔죠?”

- 5년만이죠.
“그보다는 짧은 거잖아요.”

- 그렇지만 메탈리카는 투어를 계속 하고, 실제 공백기간은 그렇게 길지 않죠.”
“한국도 미국처럼 전국 투어가 가능하다면 1년 정도는 활동을 할 수 있겠죠.”
이후 우리는 메탈리카 새 음반에 대해 이야기를 나눴다. 서태지는 새 음반에서 타이틀곡 ‘The Day That Never Comes’만 들어봤다고 했다. 그는 “메탈리카 음악은 전부 좋아한다. ‘얼터리카’ 시절 곡들도 모두 좋아한다”고 말했다.





서태지는 2000년 '울트라맨이야' 컴백 후 단독인터뷰 때 사진촬영을 허락지 않았다. 대신 자신이 찍은 사진을 직접 골라 보내줬다. 이번에는 "인터뷰를 위해 사진을 따로 찍어서 보내달라"고 특별히 요청했다. 이 사진은 10월 1일 찍은 것으로, 서태지는 신문에 실린 사진과 이 사진을 함께 보내왔었다. /서태지컴퍼니 제공



- 한국에서 작업하면 새로운 음악은 어떻게 접하나요.
“한국에서는 접하기가 어렵죠. 외국에 있을 때는 늘 TV든 라디오든 음악채널을 틀어놓고 있으면 자연스럽게 새 음악을 듣게 되죠. 내가 뭔가 발전한다는 느낌이 들어요. 한국에 2년 전에 들어오면서 새 음악을 거의 못 들었어요. 음악을 내가 듣고 즐길 때는 편한데, 작업을 시작하면 내 생활이 차단되면서 일로 음악을 듣게 되니까, 그러면 도움이 안돼요. 새 음반을 내야 한다는 약속을 지키려고 허겁지겁 듣게 되니까 도움이 안돼요. 그래서 휴식시간이 절대로 필요한 거죠.”
(이 부분에서 나는 서태지와 관련해 오랜 논쟁이 돼 온 표절시비의 실마리를 잡은 듯 했다. 그는 "일로 음악을 들으면 도움이 안된다"고 말했던 것이다. 그러나 멍청하게도 "일로 음악을 듣는다"라는 것이 무슨 뜻일까 하는 생각은 인터뷰가 끝나고 컴퓨터에 인터뷰를 정리하면서 떠올랐다. 결국 그것을 물어보지 못했다. 친한 뮤지션들과 이 부분에 대해 이야기했더니, "그게 바로 서태지 표절의 증거"라는 과격한 주장부터, "사실 표절로 드러난 게 하나도 없는데, 그냥 남의 음악을 얻으면서 영감을 얻는 수준 아니냐"는 주장까지 다양했다)

- 싱글 두 장과 정규앨범으로 음반을 나눠내는 건 서태지씨 아이디어인가요.
“예. ‘8집 음반은 그렇게 하고 싶었다’고 말하는 게 맞는 얘기일 것 같아요. 한 음반에 7~8곡이 넘으면 일단 제가 집중이 안되고 관리가 안돼요. 그게 제 스타일이에요. 활동을 길게 하고 싶은데 그러려면 새 음악을 전달하는 방법이 그렇게(음반을 나눠서 내는 게) 가장 좋은 방법 아닌가 싶었어요.

- 이미 다 해놓은 음반으로 최대한 우려먹는다는 비판도 있지요.
“우려먹는다는 소리가 있는 건 알아요. 그렇지만 세번에 나눠서 내면서 제 느낌을 신선하게 전달하겠다는 거예요. 두번째 싱글에 나오는 곡들에 대한 팬들의 기대감이 커지고 있고요. 오히려 팬들이 반응 안좋으면 어떨까 생각도 했는데, 팬들이 지금 다음 싱글을 굉장히 기다리고 있고 그 기다림을 즐기고 있어요. 그런 모든 것들을 생각해볼 때, 잘 선택한 것 같아요.”

- 네 곡 담긴 싱글이 1만1000원 안팎에 팔리는 건 너무 비싸다는 의견도 꽤 있습니다.
“음반 값은 다른 음반보다는 좀 비싸게 팔자고 했어요. 제 음악에 대한 가치를 그렇게 부여하고 싶었습니다. 음반에 쏟아부은 정성, 비용, 시간이 그 정도 가치는 있다고 생각해요. 최종 가격결정은 제가 한 거예요. CD를 10만원 주고도 사고 싶은 사람은 사요. 그런 논쟁은 중요하지 않은 것 같아요. 무엇보다 그 안에 들어있는 내용물이 중요하죠. 5집 때는 러닝타임이 짧은데 비싸다고 했죠. 노래 길이 때문에 음반값이 싸야 한다면, 그림의 경우 극장 간판이 가장 비싸야 한다는 논리와 같아요. 그만큼 자신감이 있으니까 좀 비싸게 받아도 되지 않을까 하는 것이죠.”

- 공연 제작비를 너무 많이 들이는 것 아닌가요. 물론 관객들이야 좋아하지만 그만큼 티켓값이 올라가고, 같은 무대로 투어하는 게 아니니까 제작비가 빠지지도 않을 텐데요.
“제 공연은 (이윤을) 남기려고 하는 게 아니에요. 공연에 들어가는 정성과 비용을 따져보면 다른 공연에 비해서 워낙 들어가는 게 많아요. 제작비가 무모한 수준이죠. 욕심이 과하다고 볼 수도 있지만 일단 하고 싶은 것을 한다고 생각해요. 완전히 무리라고 생각되면 중간에 캔슬할 수도 있겠지만 할 수 있다고 생각했으니까 한 것이죠.”

이 시점에서 우리는 서태지 심포니 공연 준비과정에서 드러났던 문제점들에 대해 이야기를 나눴다. 그것이 법적으로 서태지가 책임져야 할 문제는 아니었지만, 서태지는 대부분 묻는 질문에 고개를 끄덕이며 공감을 표했다. 그는 “주변에 서태지에게 올바른 조언을 할 수 있는 전문가 집단이 없는 것 아니냐”는 물음에 “컴퍼니 안에 그런 그룹이 있다. 그들이 믿음직하기 때문에 이렇게 큰 공연을 할 수 있었던 것”이라고 대답했다. 그는 “FM 비즈니스를 부를 때 특히 감정이 격앙돼 있었던 것 같은데 혹시 그런 문제가 라이브에 영향을 미친 것 아니냐”고 묻자 “지금 생각해보면 그런 감정이 섞여있었을 수도 있겠다”고 답했다.

- ‘교실 이데아’를 부르기 전 “한국 교육은 지금도 엉망진창”이라고 말했습니다. 교육 문제에 특히 관심이 높은 건가요.
“엉망진창이니까 엉망진창이라고 한 거죠. 실제로 달라진 게 없어요. 젊은 시절에 너무 많은 것을 파괴당하고 있다고 생각해요. 여전히 주입식 교육이고. 제가 중학교 3학년때 느낀 걸 교실이데아로 표현했었어요. 그게 94년인가요. 그 이후에 뭐가 바뀌었지요? 제 팬들 중에는 벌써 어머니가 된 사람도 있고 학생도 있어요. 스스로 바꾸지 않으면 아무도 바꿔주지 않는다는 말을 하고 교실이데아를 부르고 싶었어요. 저 스스로가, 최소한 저한테는 제도교육이 도움이 될 것 같지 않다고 생각해서 그만뒀기 때문이에요.”

- 가출 경험도 무대 위에서 말했었는데요. 실제 가출을 몇 번이나 했나요.
“가출 횟수는 셀 수 없을 정도예요. 한번 집을 나가면 1, 2주 정도 사라진 적도 있고 며칠 있다가 나타난 적도 있죠. 중2인가 중3때 처음 가출을 한 것 같아요. 음악을 하기 시작했고 학교에서 폭력에 저항하기 시작했을 때였죠. 체벌에 대항하고요. 사랑의 매든 아니든 폭력은 아니다 라고 그때 확신했어요. 중 3때 우리반 한 명이 잘못했다고 반 전체가 매를 맞는 단체기합을 받은 적이 있어요. 그때 교실을 나가 버렸어요. 그 이후 우리 반에서 체벌이 사라졌죠. 그날 이후 애들이 저한테 고마워했죠.”

- 중 3때 담임선생님을 존경한다고 하지 않았나요.
“그 선생님이 그 체벌을 했던 선생님이에요. 그 분이 정말 교육자였죠. 나를 위해서 체벌을 없애버리고 나를 끝까지 이끌어줬죠. 그 선생님이 아니었으면 중 3때 자퇴했을 거예요. 그때 중학교 졸업사진은 아주 얌전하게 찍었는데, 그것 역시 선생님이 졸업사진은 오랫동안 남는 거니까 그렇게 찍으라고 해서 그랬던 거예요.”

- 자퇴한 뒤의 생활은 어땠습니까.
“같은 시기에 부모님의 체벌도 있었어요. 저는 사춘기였고. 외부에서 음악을 하면서 겉멋도 들고 집이든 학교든 나와는 상관이 없다고 생각했죠. 정말 어린 생각이죠. 학교는 몰라도 집은 버리면 안되는 건데. 돈도 많이 벌겠다고 일도 굉장히 많이 했어요. 그렇지만 일한 것에 비해 번 돈은 정말 적었죠.”

- 문제아였군요.
“쉽게 말해서 양아치였죠. 남자들끼리 서열을 정한다고 싸우고. 학교든 집이든 매만 들으면 나갔으니까요. 그런데 그때 배운게 지금은 많은 도움을 주는 것 같아요. 깡 같은 게 생기고 어떤 일이 생겨도 할 수 있다는 그런 것 말이죠.”

- 그런데 왜 고등학교 때 자퇴를 했죠. 가출벽이 도진 건가요?
“아니에요. 고 1 올라가면서 좀 컸어요. 어렸을 때부터 건축에 관심이 있어서 건축을 공부하려고 공고에 갔죠. 그런데 마음을 다잡고 공부하려고 하는데 음악의 비중이 커지면서 음악에 더 집중하게 된 거죠. 중학교 때만 해도 (남을) 설득하려고 하지 않았지만 학교를 그만 둔 뒤에 부모님 앞에서 열심히 기타를 연습하고 그런 다음에 시나위를 하면서 차를 샀죠. 그때 머리가 너무 길고 하니까 첫 차인 르망을 샀죠. 그게 1989년이었어요.”

- 이른바 문제아에 대한 애정과 동질의식이 있는 건가요.
“그렇죠. 금방 대답하기 어려운 질문이긴 한데. 컴백홈 만들 때 그런 느낌이었어요. 심장이 터질 것 같고, 생명이 태어났는데 부모의 제압이 시작됐고. 물론 집으로 돌아가라는 내용이긴 하지만, 결국 그런 친구들에 대한 제 대답이 컴백홈이에요. 거기에 모든 그런 생각들을 담았어요. 그때는 이렇게 해라 한다고 들을 것도 아니죠. 세상의 중심이 다 자신일 테니까.”

- 서태지 팬들에 대해 이야기해 볼까요. 이번 심포니 공연에서도 서태지의 말투가 싫다는 사람들이 있었습니다. 이른바 매니아만 상대한다는 거죠.
“저는 그냥 제가 하고 싶은 말을 해요. 그래도 ETP나 심포니 때는 존댓말을 많이 한 편이고, 전국 투어를 하면 반말이 90%는 되죠. 기본적으로 관객 대다수가 저보다 나이가 적고 하니까 동아리 같은 느낌이 들어요. 매니아만 상대한다는 말, 일리 있는 것 같아요. 그렇지만 저에게 집중하는 사람들과 대화하는 것이라고 생각해주면 좋겠어요. 저의 말이 안들리는 사람들도 있을 거예요. 같은 관객인데 소외감을 느낄 수도 있고요. 완전팬들이야 그렇지 않죠.”

- 완전팬은 어떤 팬을 뜻하나요.
“완전팬이란 팬덤 안에서, 닷컴 회원이고 주기적으로 활동하면서 닷컴 내의 대화를 다 알아듣는 사람들이라고 할 수 있죠. 공연에서 제 대화의 절반은 그런 팬들을 향한 것이죠. 나머지는 다른 팬들까지 포함하는 것이고요. 물론 팬들을 그룹으로 나눌 수는 없지만요. 그런데 이번 심포니때는 긴장해서 혀가 엉키긴 했어요. 저도 말이 좀 이상하다는 느낌이 들었어요. 오늘 왜 이렇게 말이 꼬이지, 하고 생각했죠. 특히 이번 공연은 생각할 게 많아서 그랬던 것 같아요.”

- 완전팬에 대해 이야기하니까 생각이 나네요. 심포니 공연 때, 공연이 다 끝나고 20대로 보이는 여자팬 4명이 나란히 무대를 향해서 “오빠, 이렇게 좋은 공연 보게 해 주셔서 감사합니다!”하고 외치더니 큰 절을 하더라고요.
“큰 절 한 번이오? ETP 때는 어떤 남자 관객이 백배를 했대요. 그 분이 ‘만약 서태지가 맨슨과 유즈드를 데리고 오면 백배를 하겠다’고 약속을 했었대요. 그리고 실제 맨슨과 유즈드가 오니까 백배를 했다는 거예요. 그 분은 제 팬은 아닐 수도 있죠. 하여튼 그런 것은 일종의 퍼포먼스라고 봐요. 주변을 의식하지 않고 자기 스스로 즐길 줄 아는 정말 재미있는 공연문화라고 생각해요.”

- ETP 앞두고 기자회견에서 “매년 ETP를 열겠다”고 했습니다. 매년 ETP에 참여할 생각인가요. 그리고 만약 참여하지 않는다면 서태지가 없는 ETP에 관객이 줄어들지 않을까요.
“매년 하고 싶다, 라고 말하는 게 정확할 것 같습니다. 아직은 목표 수준이고요. 제가 서지 않아도 관객은 줄지 않는 퀄리티를 유지할 생각이에요.”

- ETP는 오즈페스트에서 아이디어를 얻은 건가요.
“그런 건 아니에요. 물론 오즈페스트를 알고는 있죠. 그래서 오즈페스트와는 좀 다른 페스티벌이 ETP예요. 고품격 도심형 페스티벌이라고 할까요.”

- ETP 이름은 직접 만든 건가요.
“예. 제가 주최를 했기 때문에 제 이름을 넣는 것도 재미있겠다 싶어서 ETP라고 했어요. eerie란 단어도 제가 골랐어요.”

- 오즈페스트는 모든 종류의 하드록과 메탈 페스티벌입니다. ETP도 그런 컨셉이 있나요.
“ETP에는 장르적 제한이 전혀 없습니다. 포크나 일렉트로니카 무엇이든 할 수 있지요.”

- 무대에 너무 많은 돈을 들이는 것 아닌가요. 물론 관객들은 좋지만 무대 만드는 비용이 너무 많이 들고, 그 무대로 전국 투어를 할 것도 아니니까 결국 그 부담이 티켓 값으로 올라가지 않습니까.
“좋은 무대를 선사하고 싶은 것이 가장 기본적인 생각이에요. 제가 할 수 있는 선에서 최대치로 하고 싶어요. 노력이든 비용이든 음악 하면서 후회없고 모두가 행복할 만한 것을 하고 싶어요. 그러나 중심은 음악이라는 생각은 변함이 없습니다.”

- 한국에도 펜타포트나 쌈싸페, 동두천 같은 페스티벌이 많이 생겼습니다. 이런 무대에 설 생각은 있습니까.
“다른 페스티벌에 서지 않겠다는 건 아니에요. 펜타포트였는지 잘 모르겠는데 주최측에서 혹시 설 수 있겠느냐고 타진해온 적이 있어요. 그렇지만 이런저런 사정 때문에 설 수 없었죠.”

- 이번 음반 출시를 앞두고 마케팅이 화제가 됐습니다. 크롭 서클이며 UFO 같은 것이었죠. 지나친 신비주의라는 얘기도 있었습니다만, 저는 개인적으로 귀엽고 재미있는 마케팅이라고 생각했습니다.
“귀여운 마케팅 맞죠. 크롭 서클, UFO 전부 제 아이디어였고요. 그것이 서태지의 마케팅이라는 것을 마치 발견한 것처럼 처음 블로그에 올린 사람도 우리 스태프예요. 예전부터 미스터리와 여행이 이번 음반의 큰 테마였어요. 음악은 여행, 가사는 미스터리 식으로요.”

- 팬들 사이에는 그래서 이번 싱글은 lie, 다음 싱글은 truth, 그리고 정규앨범은 서태지의 초이스다, 이런 식으로 해석하는 얘기도 있습니다.
“(웃으며)그런가요? 저는 모르겠는데요? 그게 뭘까요?”

- 음악 일반에 관한 질문을 하겠습니다. 이제 디지털 음악시대로 완전히 접어들었다고 해도 과언이 아닌데요. 시장 변화에 대한 서태지씨의 생각은 무엇인가요.
“저는 mp3를 찬성한 사람이었어요. 음악을 공유하고 편하게 들을 수 있는 건 획기적인 사건이라고 생각했어요. 320kb 이상으로 mp3를 제대로 인코딩하면 보통 사람들은 CD와 구별할 수 없다고 생각해요. 제대로 된 스피커로 320kb 이상으로 인코딩된 mp3 파일을 듣는다면, 일반인이 느끼기에 음질이 CD보다 떨어진다는 것에 저는 동의하지 않아요.”

- 그렇지만 CD가 갖고 있는 매력은 mp3가 대체할 수 없는 것 아닌가요.
“상황은 언제든 달라질 수 있는 것 아닌가요. mp3가 wav 파일로 바뀔 수도 있죠. 그러니까,. wav 파일을 mp3 플레이어처럼 간편하게 담아갖고 다닐 수도 있다는 거죠. 그런 변화를 저는 즐겨요. 그래서 오래 살고 싶어요. 하늘을 나는 자동차를 타는 게 제 목표거든요. 기술이 발전하면, 어쩌면 음악을 들을 때 뇌파나 신경세포를 자극하는 시스템도 나오지 않을까 싶어요.”

- 과거에 ‘시대유감’이 심의에 걸렸을 때 가사를 왕창 들어낸다든가 ‘내맘이야’의 파격적인 가사라든가 하는 것을 ‘서태지 정신’이라고 할 수 있다면, 그 정신은 아직도 유효한가요. 7, 8집을 보면 그런 과격함은 많이 사라진 것 같은데요.
“정신이오? 똘끼 아닌가요? 지금은....모르겠어요. 그렇지만 그런 상황이 오면 제 생각은 똑같을 것 같아요. 7, 8집은 그런 가사가 필요했었죠. 그렇지만 예전같은 가사가 필요하면 또 그럴 것 같아요. 저는 마음은 여전히 10대예요. 중학교 3학년, 15살에 머물고 싶어요. 그때 방황했던 것을 소중하게 생각해요. 이번에 활동하면서 대학생들이 저를 잘 모른다는 말을 듣고 어떻게 그럴 수 있나, 하면서도 곰곰이 생각해보면 그럴 수도 있겠다는 생각을 했어요. 제가 한창 음악할 때 그 친구들이 몇살이었나 생각해보면 말이죠. 그래서 중고생 팬들을 보면 귀엽죠. 제가 ‘난 알아요’를 부를 때 수정(受精)도 되지 않은 무존재였으니까.”

- ‘난 알아요’는 서태지에게 어떤 의미를 갖는 노래인가요.
“세상에 나를 알린 노래죠. 의도하지도 않았고 기대하지도 않았었지만요. 습작을 하다가 나온 음반이 1집인데, 그때는 차트에도 들어가지 않겠지 했던 곡이 그렇게 돼버리니까 얼떨떨했어요. 준비도 안됐고. 그때부터 4집까지 그냥 달린 거죠. 그러다가 지쳤고 그래서 아련한 느낌을 갖고 있는 괴물같은 노래죠.”

- 이번 활동이 끝나면 역시 외국으로 가나요.
“외국에 여행하러 갈 것 같아요. 이번 음악작업은 한국에서 하는 게 좋다고 생각했지만요. 창작을 할 때는 자유가 필요해요. 길거리를 돌아다녀도 아무도 알아보지 못하는 그런 자유요. 길을 가다가 진열장을 봐도, 대중교통을 타도 뭘 느낄 수가 있고 영감을 얻을 수 있거든요. 그런데 한국에서는 그걸 하지 못하니까 인풋(input)이 없어요. 인풋이 없으니까 아무 것도 만들어낼 수가 없어요.”

- 한국에서 자유롭지 못하다는 건 팬들 때문일텐데, 그렇다면 팬들이 서태지를 구속하는 것인가요.
“나를 구속하는 건 한국이죠. 팬들이 나를 구속하지는 않아요. 다만 그렇게 느끼는 내가 변태죠. 시나위 시절부터 사람들이 나를 보면 깜짝 놀라는 게 정말 미안했어요. 화장실에 가도 머리가 기니까 여자인 줄 알고 깜짝 놀라고. ‘난 알아요’가 이걸 증폭시켰죠. 어느 날 명동에 그냥 옷 구경 하러 갔는데 사람들이 우리를 포위해서 교통이 마비되고 경찰이 끌어내고....차를 한 잔 마셔도 사람들이 웅성웅성 하는 걸, 그런 걸 못 견뎌요. 그래서 혼자 지내는 게 습관이 굳어졌어요. 지금도 밖에 나가면 똑같을 것 같아요.”

- 그럼 2년 전에 한국에 와서 한번도 밖에 나가지 않았단 말인가요.
“스키장에 한 번 가고 아무도 없는 시골에 한 번 놀러가고...그게 전부예요.”

- 밥 먹으러라도 나가지 않나요.
“밥은 시켜 먹거나, 여기서 일하는 아주머니가 해주시죠. 어머니가 오셔서 해주실 때도 있고요.”

- 한국에서 버스나 지하철을 타고 다니다가 얻을 수 있는 영감도 있을 텐데, 그런 걸 못하는 것은 일종의 불행이네요.
“그렇죠.”

- 외국 진출에 대해 물어보겠습니다. 1집에 실린 ‘난 알아요’ 영어버전은 혹시 외국 진출을 염두에 두고 한 건가요.
“아니오. 그건 그냥 영어 랩으로 한번 해보고 싶어서 만들었을 뿐이죠. 그때 랩이란 게 제대로 없었고, 영어로 하는 게 한국말로 하는 것보다 나아보였으니까요. 지금도 미국 진출은 좋은 기회 있으면 해보고 싶어요. 그렇지만 체계적으로 준비하고 있지는 않아요. 성과가 없을 가능성이 높거든요. 지금은 시기가 아닌 것 같아요. 미국의 메이저 레이블에서 아마도 우리를 알고 있을 거고, 그사람들이 우리를 필요로 한다면 연락이 오겠죠. 한국에서 즐기고 있는 활동을 침해받으면서까지 시간과 노력을 들여서 미국 진출을 시도해보고 싶지는 않아요. 섣불리 하지 않겠다는 생각도 있고요.”

- 인터뷰를 앞두고 서태지 모든 음반을 들어봤더니 과거에 느끼지 못했던 것을 발견하게 됐습니다. 이를테면 ‘마지막 축제’의 경우 도입부는 완전히 재즈인데요.
“‘마지막 축제’는 처음에 비트를 정하고 큰 그림을 정한 게 아니고, 이것저것 시도하다가 곡이 확정된 것 같아요. 스윙 박자가 되고 인트로는 재즈로 하자 이런 식이었죠. 그런가 하면 ‘하여가’는 처음부터 계획적인 노래였죠. 스래쉬와 국악, 랩을 섞어야겠다고 생각하고 만든 곡이죠. 제가 음악을 만드는 게 대부분 뭘 하겠다는 식으로 시작하는 게 아니고, 하다 보면 방향이 정해지는 식이에요. 그래서 저도 모르게 여러가지 장르가 섞이는 것 같아요.”

- 3집을 보면 정통 스래쉬 곡이 많습니다. 인트로부터 시작해서 말이죠. 서태지가 이런 정통 스래쉬를 했어도 좋았을 것 같다는 생각도 했습니다만.
“제가 스래쉬를 제일 좋아하던 시절이 시나위에 있을 때였어요. 그때 그래서 (스래쉬를 하던) 아발란쉬 형들과 합주하면서 한을 풀기도 했죠. 예전에 제일 좋아했던 장르가 스래쉬예요. 그게 하여가 때부터 조금씩 묻어나온 것 같아요. 저한테 많은 시간이 있다면 최고의 스래쉬 음반을 만들 자신이 있어요. 그리고 재즈도 정말 해보고 싶어요. 음악을 만들고 공연할 때 재미있으니까요. 그렇지만 너무 할 일이 많아요. 그 모든 걸 다 할 시간이 없죠.”

- 괴수인디진은 아직 있나요. 계속 뮤지션을 뽑을 계획인가요.
“그럼요. 피아가 있잖아요. 지금은 계획이 없지만 언제나 피아나 넬 같은 팀이 있으면 함께 하고 싶어요.”

- 이번 8집 활동은 언제까지 할 계획인가요.
“딱 정하지는 않았지만 내년을 넘기지는 않을 거예요. 아마도 내년 여름 전에는 마무리하지 않을까 싶어요. 전국 투어를 연말부터 7개 도시 정도 하고. 다음 싱글 발표를 전후해서 그쯤 전국 투어를 시작할 수 있을 것 같아요.”

인터뷰는 4시간30분 가까이 이어졌다. 자리에서 일어나니 시계는 자정을 훌쩍 넘어 있었다. 헤어지면서 그에게 “앞으로 4년 후에나 또 만날 수 있느냐”고 물었더니, 그는 웃으며 “그건 좀 길죠?”라고 했다. 그때까지 아무 말도 않고 배석해있던 서태지컴퍼니 직원이 “지금 손님이 2시간째 와서 기다리고 계십니다”라고 말했다. 서태지는 깜짝 놀라며 “시간이 그렇게 됐어?” 하고 말했다. 서태지는 헤어지면서 악수를 청했다. 그는 지하에 남았고, 나를 태운 엘리베이터는 지상으로 올라갔다.




*부록: 탑(안성훈: 서태지밴드 기타리스트) 전화인터뷰: 2008년 10월 2일

“서태지는 개인적으로 고마운 사람이라고 생각하고 있습니다. 우리나라에 기타리스트가 많고 저보다 테크닉도 좋고 뛰어난 사람이 많죠. 제가 어떻게 보면 선택받은 사람이라고 할 수도 있어요. 세 장의 앨범 활동하면서 두 장 앨범 녹음을 했죠. 그러면서 내가 모자라다는 걸 많이 느꼈습니다. 그래도 밀어내지 않고 후보자 생각하지 않고, 격려해주고 가르쳐주고 했지요. 내가 아니고 다른 뮤지션이 왔으면 어떻게 됐을까 생각도 했고. 그런 불안함을 많이 정리해줬어요. 언더에서는 이런 경험 못해서, 그런 면에서 고마운 존재로 생각합니다.
서태지씨는 소문난 그대로 열정적이고 고집스런 사람입니다. 뮤지션이라면 누구나 다 갖고 있는 것이기도 하죠. 노력형이고요. 이미 다 알려져 있는 게 다 사실이에요.
서태지씨는 아무래도 베이시스트가 더 어울리고 멋있지 않나 생각해요. 원래 베이스로 처음 시작한 사람이죠. 테크닉이 장난이 아니에요. 핑거링으로 치는데 파워가 장난 아닙니다. 왜소한 체격이지만, 연주는 체격과 무관해요. 만약 서태지씨한테 베이스만 하라고 했다면 톱클래스가 되지 않을까 생각해요.
6집 컴백때 태지씨가 몸이 되게 안좋았어요. 컴백공연 전날이었죠. 몸이 아파서 잠을 자야 하는데 그날 잠을 안자고 작업을 했던 기억이 나요. 정말 독종이에요. 이렇게까지 해서 모든 걸 준비하는 걸 보면 정말 프로구나 하는 생각을 했어요.
인디 멤버 발굴은 인터넷으로 가능해요. 나도 인디 경력이 10년이에요. 매니저 중 한 명이 인디밴드들과 친하고요. 저도 알고 매니저들도 알고. 그래서 멤버 후보 고를 때 1차 동영상 오디션을 보고, 그 다음에 실제 오디션을 하죠.
힘든 점도 있어요. 개인시간이 안 나니까 가족들도 많이 못보고 술자리도 많이 못가고 하죠. 활동 앞두고는 하루 12시간은 연습실에 있어요. 연습은 컴백할 때 한 달 반 정도 해요. ETP도나 심포니 연습은 한달씩 하고요. 멤버들이 밴드를 같이해오던 사람들이 아니기 때문에 필(feel)이 맞아야 되고 해서 연습을 많이 해야 하죠. 라이브 자주 안해 봐서 연습이 많이 필요해요. 실제 라이브처럼 거울을 보면서 같이 뛰면서 연습합니다.
지하 연습실에만 있으면 답답하죠. 우리끼리 하는 말로 ‘감금생활’을 하다보면 답답한데, 태지씨는 이게 몸에 밴 것 같아요. 스무살 때부터 이런 생활 하다보니까 말이죠. 벌써 17년이 됐잖아요. 이 밴드에 있으면 욕심이 생겨서 힘든 걸 잊어버리게 돼요. 공연을 해보면 항상 아쉬우니까, 그래서 연습을 하게 되는거죠."

한현우 조선일보 문화부 기자

반응형
Posted by [PineTree]