ALTER SESSION
세션 단위의 자원을 관리하거나 설정을 변경하는 구문이다.
SET SQL_LOGGING=Flag
이 명령은 해당 세션의 Trace Log에 메시지를 남길지 여부를 결정한다. 이 메시지를 비트 플래그로서 다음의 값을 사용하면 된다.
- Parsing, Validation, Optimization 단계에서 발생하는 에러를 남긴다.
- DDL을 수행한 결과를 남긴다.
즉, 해당 플래그의 값이 2일 경우에는 DDL만 로깅하고, 3일 경우에는 에러 및 DDL을 함께 로깅하는 것이다.
아래는 해당 세션의 로깅 플래그를 변경하고, 에러 로깅을 남기는 예제이다.
ALTER SESSION SET SQL_LOGGING=Flag;
[mach@localhost bin]$ machsql ================================================================= Machbase Client Query Utility Release Version 3.0.0 Copyright 2014, Machbase Inc. or its subsidiaries. All Rights Reserved. ================================================================= Machbase server address (Default:127.0.0.1): Machbase user ID (Default:SYS) Machbase user password: MACHBASE_CONNECT_MODE=INET, PORT=5656 Mach> alter session set SQL_LOGGING=1; Altered successfully. Mach> exit
SET DEFAULT_DATE_FORMAT=String
이 명령은 해당 세션의 Default Date Format을 설정하는 명령어이다. 서버가 구동되면, 전역 프로퍼티인 DEFAULT_DATE_FORMAT의 값이 세션 속성으로 설정이 되고 그 값은 "YYYY-MM-DD HH24:MI:SS mmm:uuu:nnn"이다. 만일 사용자가 특정 Date Format을 수정할 경우에 이 명령어를 사용한다. v$session에 해당 세션마다 설정된 Default Date Format 이 있고 확인도 할 수 있다. 아래는 해당 세션의 값을 확인 및 변경하는 예제이다.
ALTER SESSION SET DEFAULT_DATE_FORMAT='YYYY-MM-DD';
Mach> CREATE TABLE time_table (time datetime); Created successfully. Mach> SELECT DEFAULT_DATE_FORMAT from v$session; default_date_format ----------------------------------------------- YYYY-MM-DD HH24:MI:SS mmm:uuu:nnn [1] row(s) selected. Mach> INSERT INTO time_table VALUES(TO_DATE('2016-11-11')); [ERR-00300 : Invalid date format or input string.([2016-11-11]:[%Y-%m-%d %H:%M:%S %0:%1:%2])] Mach> ALTER SESSION SET DEFAULT_DATE_FORMAT='YYYY-MM-DD'; Altered successfully. Mach> SELECT DEFAULT_DATE_FORMAT from v$session; default_date_format ---------------------------------------------- YYYY-MM-DD [1] row(s) selected. Mach> INSERT INTO time_table VALUES(TO_DATE('2016-11-11')); 1 row(s) inserted. Mach> SELECT * FROM time_table; TIME ---------------------------------- 2016-11-11 [1] row(s) selected.
SET SHOW_HIDDEN_COLS=Value
이 명령은 해당 세션의 select 수행시 *로 표현된 컬럼에서 숨은 컬럼 (_arrival_time)을 출력할 것인지를 결정하는 명령어이다. 서버가 구동되면, 전역 프로퍼티인 SHOW_HIDDEN_COLS의 값이 세션 속성으로 0이 설정된다. 만일 사용자가 자기 세션의 기본 동작을 변경하고자 할 경우에는 이 값을 1로 설정하면 된다. v$session에 해당 세션마다 설정된 SHOW_HIDDEN_COLS 값이 있으며, 확인할 수 있다.
ALTER SESSION SET SHOW_HIDDEN_COLS = column_value;
Mach> SELECT * FROM v$session; ID CLOSED USER_ID LOGIN_TIME SQL_LOGGING SHOW_HIDDEN_COLS ----------------------------------------------------------------------------------------------------------------- DEFAULT_DATE_FORMAT HASH_BUCKET_SIZE ------------------------------------------------------------------------------------------------------ 1 0 1 2015-04-29 17:23:56 248:263:000 3 0 YYYY-MM-DD HH24:MI:SS mmm:uuu:nnn 20011 [1] row(s) selected. Mach> ALTER SESSION SET SHOW_HIDDEN_COLS=1; Altered successfully. Mach> SELECT * FROM v$session; _ARRIVAL_TIME ID CLOSED USER_ID LOGIN_TIME SQL_LOGGING -------------------------------------------------------------------------------------------------------------------------------- SHOW_HIDDEN_COLS DEFAULT_DATE_FORMAT HASH_BUCKET_SIZE ------------------------------------------------------------------------------------------------------------------------ 1970-01-01 09:00:00 000:000:000 1 0 1 2015-04-29 17:23:56 248:263:000 3 1 YYYY-MM-DD HH24:MI:SS mmm:uuu:nnn 20011 [1] row(s) selected.
SET FEEDBACK_APPEND_ERROR=flag
이 명령은 해당 세션의 Append 에러 메시지를 Client program으로 보낼 것인지를 설정한다. 에러 메시지는 다음의 값을 사용하면 된다.
- 에러 메시지를 보내지 않는다.
- 에러 메시지를 보낸다.
아래는 사용 예제이다.
ALTER SESSION SET FEEDBACK_APPEND_ERROR=flag;
mach> ALTER SESSION SET FEEDBACK_APPEND_ERROR=0; Altered successfully.
SET HASH_BUCKET_SIZE=Value
이 명령은 해당 세션의 GROUP BY 또는 Distinct 연산을 수행하기 위해서 사용되는 Hash Table의 크기를 설정한다. 이 값을 너무 큰 값으로 설정하면 매 Hash 연산마다 메모리를 많이 사용하게 되며, 너무 작은 값을 지정하면 Hash bucket conflict가 발생하여 질의 성능이 저하될 수 있다. 전체 GROUP의 수 * 1.5 에서 3.0 정도의 값을 지정하는것이 좋다.
ALTER SESSION SET HASH_BUCKET_SIZE=value;
Mach> ALTER SESSION SET HASH_BUCKET_SIZE=65536; Altered successfully. Mach> SELECT * FROM v$session; _ARRIVAL_TIME ID CLOSED USER_ID LOGIN_TIME SQL_LOGGING -------------------------------------------------------------------------------------------------------------------------------- SHOW_HIDDEN_COLS DEFAULT_DATE_FORMAT HASH_BUCKET_SIZE ------------------------------------------------------------------------------------------------------------------------ 1970-01-01 09:00:00 000:000:000 1 0 1 2015-04-29 17:23:56 248:263:000 3 1 YYYY-MM-DD HH24:MI:SS mmm:uuu:nnn 65536 [1] row(s) selected.
SET MAX_QPX_MEM=Value
이 명령은 해당 세션의 하나의 SQL Statement가 GROUP BY, DISTINCT, ORDER BY 연산을 수행할때 사용하는 최대 메모리의 크기를 지정한다. 만약 최대 메모리 이상의 메모리 할당을 시도하면, 시스템은 그 SQL문의 수행을 취소하고 오류로 처리하며, iflux.trc에 해당 질의문을 포함한 에러코드 및 에러메시지를 기록한다.
ALTER SESSION SET MAX_QPX_MEM=Value;
Mach> ALTER SESSION SET MAX_QPX_MEM=1073741824; Altered successfully. Mach> SELECT * FROM v$session; ID CLOSED USER_ID LOGIN_TIME SQL_LOGGING SHOW_HIDDEN_COLS FEEDBACK_APPEND_ERROR ---------------------------------------------------------------------------------------------------------------------------------------- DEFAULT_DATE_FORMAT HASH_BUCKET_SIZE MAX_QPX_MEM ---------------------------------------------------------------------------------------------------------------------------- 324 0 1 2015-07-14 10:53:46 124:627:000 11 0 0 YYYY-MM-DD HH24:MI:SS mmm:uuu:nnn 20011 1073741824 [1] row(s) selected. Mach>
BACKUP/MOUNT
데이터베이스의 영속성을 보장하기 위해서 메모리에 저장된 데이터는 최대한 빨리 Disk에 저장된다. 그리고 Process Failure와 같은 일반적인 장애상황이 발생할 경우, Restart Recovery를 통해서 데이터베이스를 Consistent한 상태로 만든다. 하지만 Power Failure나 화재에 의한 Hardware의 피해가 발생할 경우, 데이터베이스의 복구는 불가하다. 이런 문제를 해결하기 위해서 별도의 디스크나 Hardware에 데이터를 주기적으로 다른 영역에 저장하여, 유사시 해당 데이터를 이용하여 데이터를 복구하는 기능이 데이터베이스 백업과 복구 기능이다.
데이터베이스 백업은 언제 수행하느냐에 따라서 크게 두 가지로 나누어 진다.
- Offline Backup
- Online Backup
첫번째, Offline Backup 기능은 DBMS를 Shutdown하고 데이터베이스를 복사하는 기능으로 Cold Backup이라고 부르기도 한다. 매우 간단하지만, 사용자의 서비스가 중단되는 단점이 있으므로 운영 중에는 사용하는 경우가 거의 없으며 초기 테스트나 데이터 구축 시에만 사용하는 경향이 있다.
두 번째, Online Backup은 DBMS가 동작 중일 때, 데이터베이스를 Backup하는 기능으로 Hot Backup이라고 부르기도 한다. 이 기능은 서비스를 중단하지 않고 수행될 수 있어 사용자의 Service Availability를 증가시켜 대부분의 DBMS Backup은 Online Backup을 의미한다. 다른 데이터베이스의 Backup과 달리 시계열 데이터베이스인 InfiniFlux는 Duration Backup을 제공한다. 이는 Backup시 백업될 Database의 시간을 지정하여 원하는 시간대의 데이터만 Backup할 수 있다.
backup database into disk = 'backup'; backup database from to_date('2015-07-14 00:00:00','YYYY-MM-DD HH24:MI:SS') to to_date('2015-07-14 23:59:59 999:999:999','YYYY-MM-DD HH24:MI:SS mmm:uuu:nnn') into disk = 'backup_20150714';
Backup된 데이터베이스는 장애 복구 과정을 거쳐서 기존 데이터베이스처럼 사용될 수 있다. 이 복구 방법을 Restore라고 한다. 이 Restore 기능은 파손된 데이터베이스를 삭제하고 백업된 데이터베이스 이미지를 Primary Database로 복구한다. 때문에 복구시 기존 데이터베이스를 삭제하고 ifluxadmin -r 기능을 이용하여 복구한다.
machadmin -r 'backup'
Mount/unmount 기능은 Online으로 동작하는 기능으로 Backup된 데이터베이스를 현재 운영 중인 데이터베이스에 Attach하는 기능이다.
mount database 'backup' to mountName; umount database mountName;
Database Backup
InfiniFlux에서는 데이터 백업을 할 때 두 가지 옵션을 제공한다. 운영 중인 DB의 정보를 백업하는 DATABASE 백업과 필요한 Table만 선택하여 백업할 수 있는 TABLE 백업 기능을 제공한다.
DB에서 제공하는 백업 명령은 다음과 같다.
BACKUP [ DATABASE | TABLE table_name ] [ time_duration ] INTO [ DISK | IBFILE ] = 'path/backup_name'; time_duration = FROM start_time TO end_time path = 'absolute_path' or 'relative_path'
# Directory backup BACKUP DATABASE INTO DISK = 'backup_dir_name'; # a single file backup BACKUP DATABSE INTO IBFILE = backup_ibfile_name; # Set backup duration - Directory backup BACKUP DATABASE FROM TO_DATE('2015-07-14 00:00:00','YYYY-MM-DD HH24:MI:SS') TO TO_DATE('2015-07-14 23:59:59','YYYY-MM-DD HH24:MI:SS') INTO DISK = '/home/machbase/backup_20150714' - File backup BACKUP DATABASE FROM TO_DATE('2015-07-14 00:00:00','YYYY-MM-DD HH24:MI:SS') TO TO_DATE('2015-07-14 23:59:59','YYYY-MM-DD HH24:MI:SS') INTO IBFILE = '/home/machbase/backup_20150714.ibf' # a single table backup BACKUP TABLE SYSLOG_TABLE INTO IBFILE = '/home/machbase/backup/syslog_table';
DB 백업을 수행할 때 옵션은 백업 타입, Time duration, 경로를 입력해야 한다. DATABASE 전체를 백업할 때는 백업 타입에 DATABASE를 입력하고, 특정 Table만 백업하려면 TABLE을 입력한 후 백업하려는 Table_Name을 입력한다. TIME_DURATION 구문은 필요한 기간의 데이터만 백업하도록 설정할 수 있다. FROM 항목에 백업을 원하는 날짜의 시작 시간을 입력하고 TO 항목에 백업의 마지막 날짜의 시간을 입력하면 그 기간의 데이터만 선택하여 백업할 수 있다. 예제 3번을 보면 TIME_DURATION 항목의 FROM에 '2015년 7월 14일 0시 0분 0초'로 설정하고 TO에 '2015년 7월 14일 23시 59분 59초'로 설정하여 2015년 7월 14일의 데이터만 백업되도록 설정하였다. 만약 DURATION 항목에 대한 정보를 입력하지 않으면 FROM 항목에는 '1970년 1월 1일 9시 0분 0초'로 설정되고 TO 항목에는 명령을 수행하는 시간으로 자동 설정된다.
마지막으로, 백업 수행의 결과를 저장할 저장 매체에 대한 설정이 필요하다. 백업을 단일 파일로 생성하고 싶으면 생성 타입을 IBFILE로 설정하고, 디렉터리 단위로 생성하려면 DISK를 입력한다. 주의할 점은 생성물 저장되는 PATH 정보를 지정할 수 있는데 만약 상대 경로를 입력하면 현재 운영 중인 DB의 환경설정의 DB_PATH 항목에 지정된 경로에 생성된다. 만약 DB_PATH가 아닌 다른 곳에 저장하고 싶다면 '/'로 시작하는 절대 경로를 입력해야 한다.
Database Restore
Database Restore기능은 구문으로 제공되지 않고, Offline으로 ifluxadmin -r 기능을 통해 복구할 수 있다. 복구전에 다음 사항을 체크해야 한다.
- InfiniFlux가 종료되었는가?
- 이전에 생성한 DB를 삭제하였는가?
machadmin -r backup_database_path;
backup database into disk = '/home/machbase/backup';
machadmin -k machadmin -d machadmin -r /home/machbase/backup;
Extract Single File
백업시 INTO IBFILE 형태로 생성한 단일 백업 파일은 바로 Restore가 불가능하며 ifluxadmin을 이용하여 디렉터리 형태로 변환해야 한다.
변환 이후에는 target_path/backup_file_name 의 경로에 디렉터리 백업 형태의 파일들이 생성된다.
machadmin -x single_file_backup_file_name extract_target_path
machadmin -x backup_20150101.ibf /db/data/ machadmin -r /db/data/backup_20150101.ibf/
단일 백업 파일 정보 조회
백업 명령어로 생성한 단일 백업 파일에 대한 정보는 ifluxadmin -w 명령으로 조회할 수 있다.
machadmin -w single_backup_file_name
machadmin -w ib_backup01 ----------------------------------------------------------------- Machbase Administration Tool Release Version - 3.0.0 official Copyright 2014, Machbase Inc. or its subsidiaries All Rights Reserved ----------------------------------------------------------------- Display information of Backup Image successfully. ----------------------------------------------------------------- File name - mach_backup_19700101090000_20150725142017_3 Create time - 2015-07-25 14:19:22 Data duration - 1970-01-01 09:00:00 ~ 2015-07-25 14:20:17 Backup duration - 2015-07-25 14:20:18 ~ 2015-07-25 14:20:18 Version - DB(4.0) Meta(1.6) CM(1.5) ---------------------------------------------------------
Database Mount
장애상황을 대비하여 대량의 데이터베이스를 주기적으로 Backup 하고 데이터를 계속 추가하는 경우, 다음과 같은 문제점이 발생한다.
- 데이터를 저장하기 위한 디스크 비용 증가
- 운영 중인 Machine의 물리적 Disk공간의 한계
이 문제점을 해결하기 위해서 주기적으로 현재 서비스를 위해 필요한 데이터만을 남기고 삭제를 수행한다. 그러나 과거 데이터에 대한 참조가 필요할 경우에는 Backup 된 데이터베이스를 Restore하여 참조해야 하는데, 대단히 큰 Backup Image일 경우 복구시간이 많이 걸리고 또한 별도의 장비도 필요하다. 왜냐하면 Restore기능은 현재 운영 중인 데이터베이스를 삭제해야 수행할 수 있기 때문이다. 이런 문제를 해결하기 위해서 Infiniflux는 Database Mount 기능을 제공한다.
Database Mount기능은 Online으로 동작하는 기능으로 Backup된 데이터베이스를 현재 운영 중인 데이터베이스에 Attach하는 기능이다. 그리고 여러 개의 Backup Database을 운영 중인 Primary Database에 Attach하여 사용자는 여러 개의 Backup Database를 하나의 Database인 것처럼 참조 가능한다. 단 Mount한 Database에 대해서는 Read만 가능하다.
Mount DATABASE 명령은 기존에 Backup으로 생성된 데이터베이스 혹은 테이블 DATA를 현재 운영 중인 데이터베이스에서 조회 가능한 상태로 준비시켜 주는 기능이다. 그래서 Mount 된 DATABASE는 동일한 DB 명령어를 사용하여 사용하여 데이터를 조회할 수 있다.
현재 Database Mount 기능의 제약 사항 다음과 같다.
- Backup 정보는 Mount할 Database와 DB의 Major 번호와 Meta의 Major 번호가 호환 가능한 버전이어야 한다.
- Backup Data를 Mount할 경우 읽기만 가능하여 Index 생성, 데이터 입력 및 삭제 등은 지원하지 않는다.
- 현재 Mount된 DATABASE의 정보는 V$STORAGE_MOUNT_DATABASES를 조회하여 확인할 수 있다.
Mount
Mount 명령을 수행하기 위해서는 Backup_database_path 정보와 DatabaseName이 필요하다. Backup_database_path는 Backup 명령을 통하여 생성된 DB의 위치 정보를 입력해야 하고, DatabaseName에는 Database에 Mount 할 때 구분할 수 있는 이름을 지정한다. Backup_database_path는 Backup 할 때와 동일하게 상대 경로를 입력할 경우 DB의 환경변수에 설정된 DB_PATH에 지정된 디렉터리를 기준으로 검색한다.
MOUNT DATABASE 'backup_database_path' TO mount_name;
MOUNT DATABASE '/home/machbase/backup' TO mountdb;
Unmount
Mount된 Database를 더 이상 사용하지 않을 경우 Umount 명령을 사용하여 제거할 수 있다.
UNMOUNT DATABASE mount_name;
UNMOUNT DATABSE mountdb;
MOUNT DB에서 데이터 조회
Backup DB의 DATA를 조회할 때 운영 중인 DB의 DATA를 조회하는 것과 동일한 SQL문을 이용하여 조회할 수 있다.
Mount 된 DB는 운영중인 DB의 SYS 권한의 사용자만 데이터를 조회할 수 있다. 데이터를 조회하기 위해서는 조회할 TableName 앞에 MountDBName과 UserName을 입력하고, 각각의 구분자로 '.'을 붙여서 사용해야 한다. MountDBName은 현재 Mount된 DB들 중 특정 DB를 지칭하기 위해 사용하고, UserName은 Mount된 DB의 Table을 소유한 User의 정보를 지칭하는 것이다.
SELECT column_name FROM mount_name.user_name.table_name;
SELECT * FROM mountdb.sys.backuptable;