시스템 설정

이 장에서는 시스템의 전체적인 성능과 동작을 결정하는 시스템 파라미터의 설정 정보에 대해 설명하며, 데이터베이스 서버 및 브로커에 적용할 설정 파일의 사용법과 개별 파라미터의 의미에 대해 설명한다.

이 장에서 설명하는 주요 내용은 다음과 같다.

  • 데이터베이스 서버 설정

  • 브로커 설정

데이터베이스 서버 설정

데이터베이스 서버 설정이 미치는 범위

CUBRID는 데이터베이스 서버, 브로커, CUBRID 매니저로 구성되며, 각 구성요소에 대한 설정 파일이 존재한다. 데이터베이스 서버의 시스템 파라미터 설정 파일은 cubrid.conf이며 $CUBRID/conf 디렉터리에 위치한다. cubrid.conf 에 설정되는 시스템 파라미터는 데이터베이스 시스템의 전체적인 성능과 동작에 영향을 준다. 따라서, 데이터베이스 서버 설정을 이해하는 작업은 매우 중요하다.

CUBRID 데이터베이스 서버는 클라이언트/서버 구조로 구성된다. 구체적으로 서버 라이브러리와 링크되어 있는 데이터베이스 서버 프로세스와 클라이언트 라이브러리와 링크되어 있는 브로커 프로세스로 나뉜다. 서버 프로세스는 데이터베이스 저장 구조를 관리하고 동시성과 트랜잭션 기능을 제공하며, 클라이언트 프로세스는 질의 실행을 위한 준비 단계와 객체 관리 및 스키마 관리 기능을 수행한다.

cubrid.conf 파일에서 설정할 수 있는 데이터베이스 서버의 시스템 파라미터는 적용되는 범위에 따라 클라이언트 파라미터, 서버 파라미터, 클라이언트/서버 파라미터로 구분할 수 있다. 클라이언트 파라미터는 브로커와 같은 클라이언트 프로세스에만 적용되는 파라미터이며, 서버 파라미터는 서버 프로세스의 동작에 영향을 주는 파라미터이다. 클라이언트/서버 파라미터는 서버와 클라이언트에 적용된다.

Note

cubrid.conf 파일의 위치와 적용

cubrid.conf 파일은 $CUBRID/conf 디렉터리에 위치하며, 데이터베이스 별 설정은 cubrid.conf 파일 내에서 섹션으로 구분한다.

데이터베이스 서버 설정값 변경

환경 설정 파일 편집

$CUBRID/conf 디렉터리에 있는 시스템 파라미터 설정 파일( cubrid.conf )을 직접 편집하여 시스템 파라미터를 추가 및 삭제할 수 있으며, 파라미터의 설정값을 변경할 수 있다.

설정 파일에서 파라미터를 설정할 때 파라미터 구문 규칙은 다음과 같다.

  • 파라미터 이름은 대/소문자를 구분하지 않는다.

  • 파라미터 이름과 설정값은 동일한 라인에 입력되어야 한다.

  • 파라미터 값을 설정하기 위해 등호 기호(=)를 사용하며, 등호 기호의 양 옆에는 공백 문자를 사용할 수 있다.

  • 파라미터 값이 문자열인 경우 따옴표 없이 문자열만 입력한다. 다만, 해당 문자열에 공백 문자가 포함된 경우에는 따옴표를 사용한다.

SQL 문을 사용

SQL 문을 이용하여 CSQL 인터프리터나 CUBRID 매니저의 질의 편집기에서 시스템 파라미터의 값을 설정할 수 있다. 단, 갱신할 수 있는 파라미터는 한정되어 있으므로 주의한다. 갱신할 수 있는 파라미터는 cubrid.conf 설정 파일과 기본 제공 파라미터를 참고한다.

SET SYSTEM PARAMETERS 'parameter_name=value [{; name=value}...]'

parameter_name 은 설정값 변경이 가능한 클라이언트 파라미터 이름이고, value 는 해당 파라미터의 값을 의미한다. 세미콜론(;)으로 구분하여 여러 개의 파라미터 값을 변경할 수 있다.

다음은 인덱스 스캔 작업의 결과를 OID 순으로 가져오고, CSQL 인터프리터에서 히스토리 내역으로 저장하는 질의 개수를 70개로 설정하는 예제이다.

SET SYSTEM PARAMETERS 'index_scan_in_oid_order=1; csql_history_num=70';

valueDEFAULT 값을 주면 call_stack_dump_activation_list 파라미터를 제외하고 해당 파라미터를 기본값으로 재설정한다.

SET SYSTEM PARAMETERS 'lock_timeout=DEFAULT';

CSQL 인터프리터의 세션 명령어 사용

CSQL 인터프리터 내에서 세션 명령어(;SEt)를 이용하여 시스템 파라미터의 값을 설정할 수 있다. 단, 갱신할 수 있는 파라미터는 한정되어 있으므로 주의한다. 갱신할 수 있는 파라미터는 cubrid.conf 설정 파일과 기본 제공 파라미터를 참고한다.

다음은 데이터 정의문 수행이 허용되지 않도록 block_ddl_statement 파라미터를 1로 설정하는 예제이다.

csql> ;se block_ddl_statement=1
=== Set Param Input ===
block_ddl_statement=1

cubrid.conf 설정 파일과 기본 제공 파라미터

CUBRID는 데이터베이스 서버, 브로커, CUBRID 매니저로 구성된다. 각 구성 요소를 수행하기 위한 설정 파일 이름은 다음과 같고, 모두 $CUBRID/conf 디렉터리에 위치한다.

  • 데이터베이스 서버 설정 파일 : cubrid.conf

  • 브로커 설정 파일 : cubrid_broker.conf

  • CUBRID 매니저 서버 설정 파일 : cm.conf

cubrid.conf 파일은 CUBRID 데이터베이스 서버에 대한 시스템 파라미터를 지정하는 설정 파일로 데이터베이스 시스템의 전체적인 성능과 동작을 결정한다. cubrid.conf 파일은 시스템 설치에 필요한 몇 가지 중요한 파라미터가 기본으로 설정된 상태로 제공된다.

데이터베이스 서버 시스템 파라미터

다음은 cubrid.conf 설정 파일에 사용 가능한 데이터베이스 서버 시스템 파라미터이다. 아래 표에서 “적용 구분”의 “클라이언트 파라미터”는 브로커 응용서버(CAS), CSQL, cubrid 유틸리티에 적용되는 파라미터를 의미하며, “서버 파라미터”는 DB 서버(cub_server 프로세스)에 적용되는 파라미터를 의미한다. 자세한 의미는 데이터베이스 서버 설정이 미치는 범위 를 참조한다.

SET SYSTEM PARAMETERS 구문이나 CSQL 인터프리터의 세션 명령인 ;set을 통해 DB 구동 중 동적으로 설정값 변경이 가능한 파라미터를 변경할 수 있다. DB 사용자의 권한이 DBA인 경우 적용 구분에 상관없이 파라미터 값의 변경이 가능하며, DBA가 아닌 경우 “세션” 파라미터(아래 표에서 “세션” 항목의 값이 O인 파라미터)의 값만 변경이 가능하다.

아래 표에서 “적용 구분” 항목이 “서버”인 파라미터는 cub_server 프로세스에 영향을 끼치며, “클라이언트”인 파라미터는 CAS, CSQL 또는 클라이언트/서버 모드(–CS-mode)로 실행하는 “cubrid” 유틸리티에 영향을 끼친다. “클라이언트/서버”인 파라미터는 cub_server 프로세스와 CAS, CSQL, “cubrid” 유틸리티에 모두 영향을 끼친다.

아래 표에는 “동적 변경”과 “세션” 파라미터 여부가 표시되어 있다. “동적 변경”이 “가능”한 파라미터는 “적용 구분”과 “세션” 파라미터 여부에 따라 적용 범위가 다음과 같이 달라진다.

  • “동적 변경”이 “가능”한 파라미터 중 “적용 구분”이 “서버”이면 변경된 파라미터 값이 DB 서버에 적용되어, 이후에 접속하는 응용 프로그램들은 변경된 값을 사용하며, DB를 재구동하기 전까지는 변경된 값을 유지한다.

  • “동적 변경”이 “가능”한 파라미터 중 “적용 구분”이 “클라이언트”이면 “세션” 파라미터에 해당하며, DB 세션 당 변경된 값이 유지된다. 즉, 변경을 요청한 응용 프로그램에만 변경된 값이 적용된다. 예를 들어, block_ddl_statement 파라미터의 값이 yes로 변경되면 변경을 요청한 응용 프로그램에서만 DDL 문을 사용할 수 없게 된다.

  • “동적 변경”이 “가능”한 파라미터 중 “적용 구분”이 “클라이언트/서버”이고

    • “세션” 파라미터에 해당하면 DB 세션 당 변경된 값이 유지된다. 즉, 변경을 요청한 응용 프로그램에만 변경된 값이 적용되며, 서버에는 영향을 미치지 않는다. 예를 들어, add_column_update_hard_default 파라미터의 값이 yes로 변경되면, 변경을 요청한 응용 프로그램만이 NOT NULL 제약조건으로 새로 추가한 칼럼이 고정 기본값(hard default)을 갖게 한다.

    • “세션” 파라미터에 해당하지 않으면 “클라이언트” 단과 “서버” 단의 값이 변경된다. 예를 들어, error_log_level 파라미터는 “서버” 단과 “클라이언트” 단에 각각 적용되는 파라미터로, 이 값이 “ERROR”에서 “WARNING”으로 변경되면 “서버”(cub_server 프로세스)와 해당 변경을 요청한 “클라이언트”(CAS 또는 CSQL)에만 WARNING이 적용되고, 나머지 “클라이언트”에는 “ERROR”가 유지된다.

Note

파라미터의 값을 영구히 변경하려면 cubrid.conf의 설정값을 변경한 후 DB 서버와 브로커 모두 재구동해야 한다.

용도 구분

파라미터 이름

적용 구분

세션

타입

기본값

동적 변경

접속 관련 파라미터

cubrid_port_id

클라이언트

int

1,523

check_peer_alive

클라이언트/서버

O

string

both

가능

db_hosts

클라이언트

O

string

NULL

가능

max_clients

서버

int

100

tcp_keepalive

클라이언트/서버

bool

yes

메모리 관련 파라미터

data_buffer_size

서버

byte

32,768 * db_page_size

index_scan_oid_buffer_size

서버

byte

4 * db_page_size

max_agg_hash_size

서버

byte

2,097,152(2M)

sort_buffer_size

서버

byte

128 * db_page_size

temp_file_memory_size_in_pages

서버

int

4

thread_stacksize

서버

byte

1,048,576

디스크 관련 파라미터

db_volume_size

서버

byte

512M

dont_reuse_heap_file

서버

bool

no

log_volume_size

서버

byte

512M

temp_file_max_size_in_pages

서버

int

-1

temp_volume_path

서버

string

NULL

unfill_factor

서버

float

0.1

volume_extension_path

서버

string

NULL

double_write_buffer_size

서버

byte

2M

data_file_os_advise

서버

int

0

오류 메시지 관련 파라미터

call_stack_dump_activation_list

클라이언트/서버

string

DEFAULT

DBA만 가능

call_stack_dump_deactivation_list

클라이언트/서버

string

NULL

DBA만 가능

call_stack_dump_on_error

클라이언트/서버

bool

no

DBA만 가능

error_log

클라이언트/서버

string

cub_client.err, cub_server.err

error_log_level

클라이언트/서버

string

NOTIFICATION

DBA만 가능

error_log_warning

클라이언트/서버

bool

no

DBA만 가능

error_log_size

클라이언트/서버

int

512M

DBA만 가능

동시성/잠금 파라미터

deadlock_detection_interval_in_secs

서버

float

1.0

DBA만 가능

isolation_level

클라이언트

O

int

4

가능

lock_escalation

서버

int

100,000

lock_timeout

클라이언트

O

msec

-1

가능

rollback_on_lock_escalation

서버

bool

no

DBA만 가능

로깅 관련 파라미터

adaptive_flush_control

서버

bool

yes

DBA만 가능

background_archiving

서버

bool

yes

DBA만 가능

checkpoint_every_size

서버

byte

100,000 * log_page_size

checkpoint_interval

서버

msec

6min

DBA만 가능

checkpoint_sleep_msecs

서버

msec

1

DBA만 가능

force_remove_log_archives

서버

bool

yes

DBA만 가능

log_buffer_size

서버

byte

16k * log_page_size

log_max_archives

서버

int

INT_MAX

DBA만 가능

log_trace_flush_time

서버

msec

0

DBA만 가능

max_flush_size_per_second

서버

byte

10,000 * db_page_size

DBA만 가능

remove_log_archive_interval_in_secs

서버

sec

0

DBA만 가능

sync_on_flush_size

서버

byte

200 * db_page_size

DBA만 가능

트랜잭션 처리 관련 파라미터

async_commit

서버

bool

no

group_commit_interval_in_msecs

서버

msec

0

DBA만 가능

구문/타입 관련 파라미터

add_column_update_hard_default

클라이언트/서버

O

bool

no

가능

alter_table_change_type_strict

클라이언트/서버

O

bool

no

가능

ansi_quotes

클라이언트

bool

yes

block_ddl_statement

클라이언트

O

bool

no

가능

block_nowhere_statement

클라이언트

O

bool

no

가능

compat_numeric_division_scale

클라이언트/서버

O

bool

no

가능

cte_max_recursions

클라이언트/서버

O

int

2000

가능

default_week_format

클라이언트/서버

O

int

0

가능

group_concat_max_len

서버

O

byte

1,024

DBA만 가능

intl_check_input_string

클라이언트

O

bool

no

가능

intl_collation

클라이언트

O

string

가능

intl_date_lang

클라이언트

O

string

가능

intl_number_lang

클라이언트

O

string

가능

json_max_array_idx

서버

O

string

65,536

가능

no_backslash_escapes

클라이언트

bool

yes

only_full_group_by

클라이언트

O

bool

no

가능

oracle_style_empty_string

클라이언트/서버

bool

no

pipes_as_concat

클라이언트

bool

yes

plus_as_concat

클라이언트

bool

yes

require_like_escape_character

클라이언트

bool

no

return_null_on_function_errors

클라이언트/서버

O

bool

no

가능

string_max_size_bytes

클라이언트/서버

O

byte

1,048,576

가능

unicode_input_normalization

클라이언트

O

bool

no

가능

unicode_output_normalization

클라이언트

O

bool

no

가능

update_use_attribute_references

클라이언트

O

bool

no

가능

스레드 관련 파라미터

thread_connection_pooling

서버

bool

yes

thread_connection_timeout_seconds

서버

int

300

thread_worker_pooling

서버

bool

yes

thread_worker_timeout_seconds

서버

int

300

loaddb_worker_count

서버

int

8

타임존 파라미터

server_timezone

서버

string

OS의 타임존

가능

timezone

클라이언트/서버

O

string

server_timezone의 값

가능

tz_leap_second_support

서버

bool

no

가능

질의 계획 캐시 관련 파라미터

max_plan_cache_entries

클라이언트/서버

int

1,000

max_plan_cache_clones

서버

int

1,000

xasl_cache_time_threshold_in_minutes

서버

int

360

max_filter_pred_cache_entries

클라이언트/서버

int

1,000

유틸리티 관련 파라미터

backup_volume_max_size_bytes

서버

byte

0

communication_histogram

클라이언트

O

bool

no

가능

compactdb_page_reclaim_only

서버

int

0

csql_history_num

클라이언트

O

int

50

가능

HA 관련 파라미터

ha_mode

서버

string

off

기타 파라미터

access_ip_control

서버

bool

no

access_ip_control_file

서버

string

agg_hash_respect_order

클라이언트

O

bool

yes

가능

auto_restart_server

서버

O

bool

yes

DBA만 가능

enable_string_compression

클라이언트/서버

O

bool

yes

index_scan_in_oid_order

클라이언트

O

bool

no

가능

index_unfill_factor

서버

float

0.05

java_stored_procedure

서버

bool

no

java_stored_procedure_jvm_options

서버

string

multi_range_optimization_limit

서버

O

int

100

DBA만 가능

optimizer_enable_merge_join

클라이언트

O

bool

no

가능

pthread_scope_process

서버

bool

yes

server

서버

string

service

서버

string

session_state_timeout

서버

sec

21,600

sort_limit_max_count

클라이언트

O

int

1,000

가능

sql_trace_slow

서버

O

msec

-1

DBA만 가능

sql_trace_execution_plan

서버

O

bool

no

DBA만 가능

use_orderby_sort_limit

서버

O

bool

yes

DBA만 가능

vacuum_prefetch_log_mode

서버

int

1

DBA만 가능

vacuum_prefetch_log_buffer_size

서버

int

3200 * log_page_size

DBA만 가능

data_buffer_neighbor_flush_pages

서버

int

8

DBA만 가능

data_buffer_neighbor_flush_nondirty

서버

bool

no

DBA만 가능

  • log_page_size: 데이터베이스 생성–log-page-size 옵션으로 지정한 로그 볼륨 페이지 크기. 기본값: 16KB. 관련 파라미터의 설정 값은 페이지 단위로 버림된다. 예를 들어 checkpoint_every_size 의 값은 16KB로 나누어 소수점 이하를 버림한 값에 16KB를 곱한 값이 된다.

  • db_page_size: 데이터베이스 생성–db-page-size 옵션으로 지정한 DB 볼륨 페이지 크기. 기본값: 16KB. 관련 파라미터의 설정 값은 페이지 단위로 버림된다. 예를 들어 data_buffer_size 의 값은 16KB로 나누어 소수점 이하를 버림한 값에 16KB를 곱한 값이 된다.

파라미터의 섹션별 분류

cubrid.conf에 지정된 파라미터는 다음과 같이 네 가지 섹션으로 제공된다.

  • CUBRID 서비스를 시작할 때 사용 : [service] 섹션

  • 전체 데이터베이스에 공통으로 적용 : [common] 섹션

  • 각 데이터베이스에 개별적으로 적용 : [@<database>] 섹션

  • cubrid 유틸리티가 독립 모드(stand-alone, –SA-mode)로 구동할 때만 사용 : [standalone] 섹션

여기서 <database>는 파라미터를 개별적으로 적용할 데이터베이스 이름이며, [common]에 설정된 파라미터가 [@<database>]에 설정된 파라미터와 동일한 경우 [@<database>]에 설정된 파라미터가 최종 적용된다.

.....
[common]
.....
sort_buffer_size=2M
.....
[standalone]

sort_buffer_size=256M
.....

[standalone] 섹션에 정의된 설정은 “cubrid”로 시작하는 cubrid 유틸리티들이 독립 모드로 구동할 때만 사용된다. 예를 들어, 위와 같이 설정한 상태에서 –CS-mode(기본값)으로 DB를 구동(cubrid database start db_name)하면 “sort_buffer_size=2M”가 적용된다. 하지만 DB를 정지하고 “cubrid loaddb –SA-mode”를 실행할 때는 “sort_buffer_size=256M”가 적용된다. “cubrid loaddb –SA-mode”를 실행할 때 인덱스 생성 과정에서 정렬 버퍼(sort buffer)를 더 많이 사용할 것으로 예상되므로 이를 늘려주는 것이 “loaddb” 수행 성능에 도움이 된다.

기본 제공 파라미터

CUBRID 설치 시 생성되는 기본 데이터베이스 환경 설정 파일(cubrid.conf)에는 데이터베이스 서버 파라미터 중 반드시 변경해야 할 일부 파라미터가 기본적으로 포함된다. 기본으로 포함되지 않는 파라미터의 설정값을 변경하기 원할 경우 직접 추가/편집해서 사용하면 된다.

다음은 cubrid.conf 파일 내용이다.

# Copyright (C) 2008 Search Solution Corporation. All rights reserved by Search Solution.
#
# $Id$
#
# cubrid.conf#

# For complete information on parameters, see the CUBRID
# Database Administration Guide chapter on System Parameters

# Service section - a section for 'cubrid service' command
[service]

# The list of processes to be started automatically by 'cubrid service start' command
# Any combinations are available with server, broker and manager.
service=server,broker,manager

# The list of database servers in all by 'cubrid service start' command.
# This property is effective only when the above 'service' property contains 'server' keyword.
#server=demodb,testdb

# Common section - properties for all databases
# This section will be applied before other database specific sections.
[common]

# Read the manual for detailed description of system parameters
# Manual > System Configuration > Database Server Configuration > Default Parameters

# Size of data buffer are using K, M, G, T unit
data_buffer_size=512M

# Size of log buffer are using K, M, G, T unit
log_buffer_size=256M

# Size of sort buffer are using K, M, G, T unit
# The sort buffer should be allocated per thread.
# So, the max size of the sort buffer is sort_buffer_size * max_clients.
sort_buffer_size=2M

# The maximum number of concurrent client connections the server will accept.
# This value also means the total # of concurrent transactions.
max_clients=100

# TCP port id for the CUBRID programs (used by all clients).
cubrid_port_id=1523

testdb 만 data_buffer_size를 128M로, max_clients를 10으로 설정하고 싶은 경우 다음과 같이 설정한다.

[service]

service=server,broker,manager

[common]

data_buffer_size=512M
log_buffer_size=256M
sort_buffer_size=2M
max_clients=100

# TCP port id for the CUBRID programs (used by all clients).
cubrid_port_id=1523

[@testdb]
data_buffer_size=128M
max_clients=10

접속 관련 파라미터

다음은 데이터베이스 서버와 관련된 파라미터로 각 파라미터의 타입과 설정 가능한 값의 범위는 다음과 같다.

파라미터 이름

타입

기본값

최소값

최대값

cubrid_port_id

int

1,523

1

check_peer_alive

string

both

db_hosts

string

NULL

max_clients

int

100

10

2,000

tcp_keepalive

bool

yes

cubrid_port_id

cubrid_port_id는 마스터 프로세스가 사용하는 포트를 설정하기 위한 파라미터로 기본값은 1,523이다. CUBRID를 설치한 서버에서 이미 1,523 포트를 사용하고 있거나, 방화벽에 의해 1523 포트가 차단된 경우에는 마스터 프로세스가 정상적으로 구동할 수 없으므로, 마스터 서버와 연결할 수 없다는 에러 메시지가 나타날 수 있다. 이와 같이 포트 충돌이 발생하는 경우, 관리자는 서버 환경을 고려하여 cubrid_port_id 의 설정값을 변경해야 한다.

check_peer_alive

check_peer_alive는 클라이언트 프로세스와 서버 프로세스가 정상 동작하는지 각각 확인하는 과정의 수행 여부를 결정하는 파라미터이다. 기본값은 both이다.

서버 프로세스와 접속하는 클라이언트 프로세스에는 브로커 응용 서버(cub_cas) 프로세스, 복제 로그 반영 프로세스(copylogdb), 복제 로그 복사 프로세스(applylogdb), CSQL 인터프리터(csql) 등이 있다. 서버 프로세스와 클라이언트 프로세스는 접속이 이루어진 후 네트워크를 통해 데이터를 기다리는 중 오랫동안(예: 5초 이상) 응답을 받지 못하면 설정에 따라 상대방이 정상 동작하는지 확인하는 과정을 거친다. 서로 확인하는 과정에서 정상 동작하지 않는다고 판단되면 연결된 접속을 강제 종료한다.

값의 종류 및 동작 방식은 다음과 같다.

  • both: 서버 프로세스는 클라이언트 프로세스의 ECHO(7) 포트에 주기적으로 접속하여 클라이언트 프로세스가 정상 동작하는지 확인하고, 클라이언트 프로세스는 서버 프로세스의 ECHO(7) 포트에 주기적으로 접속하여 서버 프로세스가 정상 동작하는지 확인한다(기본값).

  • server_only: 서버 프로세스만 클라이언트 프로세스가 정상 동작하는지 확인한다.

  • client_only: 클라이언트 프로세스만 서버 프로세스가 정상 동작하는지 확인한다.

  • none: 클라이언트 프로세스와 서버 프로세스 둘 다 상대방이 정상 동작하는지 확인하지 않는다.

특히, ECHO(7) 포트가 방화벽(firewall) 설정으로 막혀있으면 서버 프로세스 또는 클라이언트 프로세스가 각각 서로의 상태를 확인할 때 상대방 프로세스가 종료된 것으로 오인할 수 있으므로, none으로 설정하여 이 문제를 회피해야 한다.

db_hosts

db_hosts는 클라이언트에서 연결할 수 있는 데이터베이스 서버 호스트의 목록 및 연결 순서를 지정하기 위한 파라미터이다. 서버 호스트 목록은 한 개 이상의 서버 호스트 이름을 나열하며, 각 호스트는 이름 사이에 공백 또는 콜론(:) 기호를 사용하여 구분한다. 이 때, 중복되거나 존재하지 않는 호스트 이름은 무시된다.

다음은 db_hosts 파라미터의 설정값을 보여주는 예제로 host1, host2, host3 의 순서대로 연결이 시도된다.

db_hosts="hosts1:hosts2:hosts3"

한편, 클라이언트는 서버 연결을 위하여 데이터베이스 위치 정보 파일(databases.txt)을 참조하여 지정된 서버 호스트에 1차적으로 연결을 시도한다. 연결이 실패하면 데이터베이스 설정 파일(cubrid.conf)의 db_hosts 파라미터의 설정값을 참조하여 2차적으로 지정된 서버 호스트 중 첫 번째 서버 호스트에 연결을 시도한다.

max_clients

max_clients는 데이터베이스 서버에 동시 연결을 허용하는 클라이언트(일반적으로 브로커 용용 서버(CAS))의 최대 개수를 지정하기 위한 파라미터이다. 즉, max_clients 파라미터는 데이터베이스 서버 프로세스 하나 당 동시에 접속할 수 있는 클라이언트의 최대 개수를 의미한다. 이 파라미터의 기본값은 100이다.

CUBRID 환경에서 동시 사용자 수를 증가시키기 위해서는 질의 성능을 고려하여 max_clients 파라미터(cubrid.conf) 및 MAX_NUM_APPL_SERVER 파라미터(cubrid_broker.conf)를 적절한 값으로 설정해야 한다. 즉, max_clients 파라미터를 통해 데이터베이스 서버가 허용하는 동시 접속 개수를 설정하고, MAX_NUM_APPL_SERVER 파라미터를 통해 해당 브로커가 허용하는 동시 접속 개수를 설정한다.

예를 들어, cubrid_broker.conf 파일에서 [%query_editor]의 MAX_NUM_APPL_SERVER 값이 50이고 [%BROKER1]의 MAX_NUM_APPL_SERVER 값이 50인 브로커 노드 2개가 하나의 데이터베이스 서버에 접속하는 경우, 데이터베이스 서버가 허용하는 동시 접속 개수인 max_clients 의 값은 다음과 같이 설정할 수 있다.

  • (각 브로커 노드 당 최대 100개) * (브로커 노드 2개) + (CSQL 인터프리터의 데이터베이스 서버 접속, HA 로그 복사 프로세스와 같은 CUBRID 내부 프로세스의 데이터베이스 서버 접속 등에 대한 여유분 10개) = 210

특히, HA 환경에서는 failover 등으로 인해 여러 브로커 노드 접속이 하나의 데이터베이스 서버에 집중될 수 있으므로, 같은 데이터베이스에 접속하는 모든 브로커 노드의 MAX_NUM_APPL_SERVER 값을 합한 값 보다 크게 설정해야 한다.

클라이언트의 데이터베이스 접속 여부에 관계 없이 max_clients의 개수를 크게 설정할수록 메모리 사용량이 증가하므로 주의한다.

Note

Linux 시스템에서 max_clients 파라미터는 “ulimit -n” 명령과 관련이 있는데, “ulimit -n” 명령은 프로세스 하나가 사용할 수 있는 file descriptor의 최대 개수를 지정한다. file descriptor는 파일 뿐 아니라 네트워크 소켓도 포함하므로, “ulimit -n”의 개수는 max_clients의 개수보다 크게 설정해야 한다.

tcp_keepalive

tcp_keepalive는 TCP 네트워크 프로토콜에 SO_KEEPALIVE 옵션을 적용할지 여부를 지정하는 파라미터로, 기본값은 yes*이다. 이 값이 **no이면 마스터 노드와 슬레이브 노드 간 방화벽이 설정되어 있는 환경에서 장시간 동안 트랜잭션 로그가 복사되지 않을 때 DB 서버 쪽 연결이 종료되는 현상이 발생할 수 있다.

메모리 관련 파라미터

다음은 데이터베이스 서버 또는 클라이언트에서 사용하는 메모리와 관련된 파라미터로 각 파라미터의 타입과 설정 가능한 값의 범위는 다음과 같다.

파라미터 이름

타입

기본값

최소값

최대값

data_buffer_size

byte

32,768 * db_page_size

1,024 * db_page_size

2G(32비트), INT_MAX * db_page_size (64비트)

index_scan_oid_buffer_size

byte

4 * db_page_size

0.05 * db_page_size

16 * db_page_size

max_agg_hash_size

byte

2,097,152(2M)

32,768(32K)

134,217,728(128MB)

sort_buffer_size

byte

128 * db_page_size

1 * db_page_size

2G(32비트), INT_MAX * db_page_size (64비트)

temp_file_memory_size_in_pages

int

4

0

20

thread_stacksize

byte

1,048,576

65,536

data_buffer_size

data_buffer_size는 데이터베이스 서버가 메모리 내에 캐시하는 데이터 버퍼의 크기를 설정하기 위한 파라미터이다. 값 뒤에 B, K, M, G, T로 단위를 붙일 수 있으며, 각각 Bytes, Kilobytes, Megabytes, Gigabytes, Terabytes를 의미한다. 단위를 생략하면 바이트 단위가 적용된다. 기본값은 32,768 * db_page_size (db_page_size가 16K일 때 512M) 이고, 최소값은 1,024 * db_page_size (db_page_size가 16K일 때 16M)이다. CUBRID 64비트 버전에서는 최대값이 INT_MAX * db_page_size이다. CUBRID 32비트 버전에서는 최대값이 2G임에 주의한다.

data_buffer_size 파라미터의 값이 클수록 버퍼에 캐시되는 데이터 페이지가 많아지므로 디스크 I/O 비용을 줄일 수 있다는 장점이 있다. 반면, 이 파라미터의 값을 너무 크게 설정하면 과도하게 시스템 메모리가 점유되므로 운영체제에 의해 버퍼 풀이 스와핑(swapping)되는 현상이 발생할 수 있다. data_buffer_size 파라미터는 필요한 메모리 크기가 시스템 메모리의 2/3 이내가 되도록 설정할 것을 권장한다.

  • 필요한 메모리 크기 = 데이터 버퍼 크기(data_buffer_size)

index_scan_oid_buffer_size

index_scan_oid_buffer_size는 인덱스 스캔을 수행할 때 OID 리스트의 임시 저장을 위한 버퍼의 크기를 설정하기 위한 파라미터이다. K 단위를 설정할 수 있으며, KB(kilobytes)를 의미한다. 단위를 생략하면 바이트 단위가 적용된다. 기본값은 4 * db_page_size (db_page_size가 16K일 때 64K)이다. 최소값은 0.05 * db_page_size (db_page_size가 16K일 때 약 1K)이고, 최대값은 16 * db_page_size (db_page_size가 16K일 때 256K)이다.

index_scan_oid_buffer_size 파라미터 값과 데이터베이스 생성 시 설정한 단위 페이지의 크기에 비례하여 OID 버퍼의 크기가 결정되고, 이러한 OID버퍼의 크기가 클수록 인덱스 스캔 비용이 증가하는 경향을 보인다. 이를 고려하여 index_scan_oid_buffer_size 파라미터 값을 조정할 수 있다.

max_agg_hash_size

max_agg_hash_size는 집계를 포함하는 질의에서 투플 그룹을 해싱하기 위해 할당한 트랜잭션 당 최대 메모리 크기를 설정하는 파라미터이다. 기본값은 2,097,152(2M), 최소값은 32,768(32K), 그리고 최대값은 134,217,728(128MB)이다.

NO_HASH_AGGREGATE 힌트가 명시되면, 집계 작업 시 해싱 방식이 사용되지 않을 것이다. agg_hash_respect_order를 참고한다.

sort_buffer_size

sort_buffer_size는 정렬을 수행하는 질의에서 사용되는 버퍼의 크기를 설정하기 위한 파라미터이다. 서버는 각 클라이언트의 정렬 요청마다 하나의 정렬 버퍼를 할당하며, 정렬을 완료한 후에는 할당되었던 버퍼 메모리를 해제한다. 정렬을 수행하는 질의로는 SELECT 정렬 질의 뿐만 아니라 인덱스 생성 질의도 포함된다.

값 뒤에 B, K, M, G, T로 단위를 붙일 수 있으며, 각각 Bytes, Kilobytes, Megabytes, Gigabytes, Terabytes를 의미한다. 단위를 생략하면 바이트 단위가 적용된다. 기본값은 128 * db_page_size (db_page_size가 16K일 때 2M)이고, 최소값은 1 * db_page_size (db_page_size가 16K일 때 16K)이다.

temp_file_memory_size_in_pages

temp_file_memory_size_in_pages는 질의에 관한 임시 결과를 캐시하는 버퍼 페이지 개수를 설정하기 위한 파라미터로 기본값은 4이며, 최대값은 20까지 허용된다.

  • 필요한 메모리 크기 = 임시 메모리 버퍼 페이지 수(temp_file_memory_size_in_pages) * 데이터베이스 페이지 크기(page size)

  • 임시 메모리 버퍼 페이지 수 = temp_file_memory_size_in_pages 파라미터 설정값

  • 데이터베이스 페이지 크기 = 데이터베이스 생성 시 cubrid createdb 유틸리티의 -s 옵션에 의해 지정된 페이지 크기 값

임시 결과를 저장하는 공간은 다음과 같다.

  • 임시 결과 캐시 버퍼(temp_file_memory_size_in_pages 시스템 파라미터에 의해 확보된 메모리)

  • 일시적 데이터 저장을 위한 영구적 볼륨

  • 일시적 볼륨

기존의 저장 공간이 소진되면 일시적 결과 저장을 위해 캐시 버퍼 -> 영구적 볼륨 -> 일시적 볼륨의 순서로 저장 공간이 사용된다.

thread_stacksize

thread_stacksize는 스레드의 스택 크기를 설정하기 위한 파라미터로 기본값은 1048576 바이트이다. thread_stacksize 파라미터의 설정값은 운영체제가 허용하는 스택 크기를 초과할 수 없다.

디스크 관련 파라미터

다음은 데이터베이스 볼륨 정의 및 파일 저장을 위한 디스크 관련 파라미터로 각 파라미터의 타입과 설정 가능한 값의 범위는 다음과 같다.

파라미터 이름

타입

기본값

최소값

최대값

db_volume_size

byte

512M

0

20G

dont_reuse_heap_file

bool

no

log_volume_size

byte

512M

20M

4G

temp_file_max_size_in_pages

int

-1

temp_volume_path

string

NULL

unfill_factor

float

0.1

0.0

0.3

volume_extension_path

string

NULL

double_write_buffer_size

byte

2M

0

32M

data_file_os_advise

int

0

0

6

db_volume_size

db_volume_size는 다음과 같은 값을 설정하는 파라미터이다. 값 뒤에 B, K, M, G, T로 단위를 붙일 수 있으며, 각각 Bytes, Kilobytes, Megabytes, Gigabytes, Terabytes를 의미한다. 단위를 생략하면 바이트 단위가 적용된다. 기본값은 512M이다.

  • cubrid createdbcubrid addvoldb 유틸리티에서 –db-volume-size 옵션을 생략했을 때 생성되는 데이터베이스 볼륨의 기본 크기

  • 데이터베이스 볼륨 공간을 모두 사용하면 자동으로 추가되는 볼륨의 기본 크기

Note

실제 볼륨 크기는 항상 64개 디스크 섹터의 배수로 올림된다. 섹터 크기는 페이지의 크기에 따라 달라지므로, 64개 섹터 크기는 페이지 크기 4k, 8k 또는 16k 각각에 대해 16M, 32M 또는 64M이다.

dont_reuse_heap_file

dont_reuse_heap_file 은 테이블 삭제(DROP TABLE)로 인해 삭제된 힙 파일을 새로운 테이블 생성(CREATE TABLE) 시 재사용하지 않도록 설정하는 파라미터로, no로 설정되면 삭제된 힙 파일을 재사용하고, yes로 설정되면 삭제된 힙 파일을 재사용하지 않는다. 기본값은 no 이다.

log_volume_size

log_volume_sizecubrid createdb 유틸리티에서 –log-volume-size 옵션이 생략되었을 때 로그 볼륨 파일의 기본 크기를 설정하는 파라미터이다. 값 뒤에 B, K, M, G, T로 단위를 붙일 수 있으며, 각각 Bytes, Kilobytes, Megabytes, Gigabytes, Terabytes를 의미한다. 단위를 생략하면 바이트 단위가 적용된다. 기본값은 512M 이다.

temp_file_max_size_in_pages

temp_file_max_size_in_pages 는 일시적 볼륨을 확장할 수 있는 최대 페이지 수를 설정하는 파라미터이다. 기본값은 -1 이며 일시적 볼륨이 무제한 디스크 공간을 차지할 수 있음을 뜻한다. 제한을 두기 위해서는 양수 값으로 설정할 수 있으며 설정된 값을 초과하면 오류가 표시되고 일부 큰 질의가 취소될 수 있다.

이 파라미터를 0**으로 설정하면 일시적 볼륨이 자동으로 생성되지 않으며 관리자가 **cubrid addvoldb 유틸리티를 사용해 일시적 데이터를 저장하기 위한 용도로 영구적 볼륨을 생성해야 한다.

자세한 사항은 다음을 참고하도록 한다. 일시적 볼륨(Temporary Volume)

temp_volume_path

temp_volume_path는 복잡한 질의문이나 정렬 수행을 위하여 자동으로 생성되는 일시적 임시 볼륨(temporary temp volume)의 디렉터리를 지정하는 파라미터로 기본값은 데이터베이스 생성 시에 설정된 볼륨 위치이다.

unfill_factor

unfill_factor는 데이터 갱신에 대비하여 힙(heap) 페이지로 할당되는 디스크 공간의 비율을 정의하기 위한 파라미터로 기본값은 0.1로 10%의 여유 공간이 설정된다. 원칙적으로, 테이블의 데이터는 물리적인 순서대로 삽입되지만, 데이터가 원래 크기보다 큰 데이터로 갱신되어 해당 페이지의 저장 공간이 부족하면 갱신된 데이터는 다른 페이지에 재배치되어야 하므로 성능이 저하될 수 있다. 이를 방지하기 위하여 unfill_factor 파라미터를 통해 힙 페이지 공간 비율을 설정할 수 있고, 최대값은 0.3(30%)까지 허용된다. 한편, 데이터 갱신이 거의 발생하지 않는 데이터베이스에서는 이 파라미터를 0.0으로 설정하여 데이터 갱신을 위한 힙 페이지 공간을 할당하지 않을 수 있고, unfill_factor 파라미터의 값이 음수거나 최대값보다 크게 설정되는 경우에는 기본값(0.1)이 적용된다.

volume_extension_path

volume_extension_pathcubrid addvoldb 유틸리티로 추가 볼륨을 생성할 때 추가 볼륨의 경로를 지정하는 -F 옵션을 생략하면 기본 경로로 사용할 경로를 지정하는 파라미터이다. 기본값은 데이터베이스 생성 시에 설정된 볼륨 위치이다.

double_write_buffer_size

double_write_buffer_size는 이중 쓰기 버퍼 (Double Write Buffer, DWB)의 메모리와 디스크 공간을 설정할 수 있는 파라미터이다. 이 크기를 0으로 설정함으로써 Partial I/O를 방지하기 위한 DWB를 사용하지 않을 수 있다. 기본적으로 DWB는 활성화되어 있으며, 기본값은 2M 이다.

data_file_os_advise

data_file_os_advise는 I/O 성능을 향상시키기 위해 사용되는 유닉스 전용 파라미터이다. 파라미터 설정값은 posix_fadvise() 플래그로 변환된다. (플래그에 대한 자세한 내용은 여기 를 참고하자.)

파라미터 값

posix_fadvise 플래그

0

0

1

POSIX_FADV_NORMAL

2

POSIX_FADV_SEQUENTIAL

3

POSIX_FADV_RANDOM

4

POSIX_FADV_NOREUSE

5

POSIX_FADV_WILLNEED

6

POSIX_FADV_DONTNEED

Warning

posix_fadvise 플래그와 데이터 액세스 방법을 완벽히 이해해야 한다. 파라미터 설정은 성능 향상을 도울 수도 있지만 잘못 사용할 경우 성능을 하락시킬 수도 있다. 대부분의 시나리오에서 디폴트 값을 사용하는 것이 가장 좋다.

오류 메시지 관련 파라미터

다음은 CUBRID에 의해 기록되는 오류 메시지의 처리에 관한 파라미터로 각 파라미터의 타입과 설정 가능한 값의 범위는 다음과 같다.

파라미터 이름

타입

기본값

call_stack_dump_activation_list

string

DEFAULT

call_stack_dump_deactivation_list

string

NULL

call_stack_dump_on_error

bool

no

error_log

string

cub_client.err, cub_server.err

error_log_level

string

NOTIFICATION

error_log_warning

bool

no

error_log_size

int

512M

call_stack_dump_activation_list

call_stack_dump_activation_list는 모든 오류에 대해 콜-스택을 서버 에러 로그 파일($CUBRID/log/server 디렉터리에 위치)에 덤프하지 않기로 설정한 상태에서, 예외적으로 콜-스택을 덤프할 특정 오류 번호를 지정하기 위한 파라미터이다. 따라서, call_stack_dump_activation_list 파라미터는 call_stack_dump_on_error 의 값이 no 인 경우에만 효력이 있다.

값을 설정하지 않을 경우 기본값은 “DEFAULT” 키워드이며, 다음 오류들을 포함한다. “DEFAULT” 키워드는 다른 오류 번호와 함께 사용될 수 있다.

오류 번호

오류 메시지

-2

Internal system failure: no more specific information is available.

-7

Trying to format disk volume xxx with an incorrect value xxx for number of pages.

-13

An I/O error occurred while reading page xxx of volume xxx.

-14

An I/O error occurred while writing page xxx of volume xxx.

-17

Internal error: fetching deallocated pageid xxx of volume xxx.

-19

Internal error: pageptr = xxx of page xxx of volume xxx is not fixed.

-21

Internal error: unknown sector xxx of volume xxx.

-22

Internal error: unknown page xxx of volume xxx.

-45

Slot xxx on page xxx of volume xxx is allocated to an anchored record. A new record cannot be inserted here.

-46

Internal error: slot xxx on page xxx of volume xxx is not allocated.

-48

Accessing deleted object xxx|xxx|xxx.

-50

Internal error: relocation record of object xxx|xxx|xxx may be corrupted.

-51

Internal error: object xxx|xxx|xxx may be corrupted.

-52

Internal error: object overflow address xxx|xxx|xxx may be corrupted.

-76

Your transaction (index xxx, xxx@xxx|xxx) timed out waiting on xxx on page xxx|xxx. You are waiting for user(s) xxx to release the page lock.

-78

Internal error: an I/O error occurred while reading logical log page xxx (physical page xxx) of xxx.

-79

Internal error: an I/O error occurred while writing logical log page xxx (physical page xxx) of xxx.

-81

Internal error: logical log page xxx may be corrupted.

-90

Redo logging is always a page level logging operation. A data page pointer must be given as part of the address.

-96

Media recovery may be needed on volume xxx.

-97

Internal error: unable to find log page xxx in log archives.

-313

Object buffer underflow while reading.

-314

Object buffer overflow while writing.

-407

Unknown key xxx referenced in B+tree index {vfid: (xxx, xxx), rt_pgid: xxx, key_type: xxx}.

-414

Unknown class identifier: xxx|xxx|xxx.

-415

Invalid class identifier: xxx|xxx|xxx.

-416

Unknown representation identifier: xxx.

-417

Invalid representation identifier: xxx.

-583

Trying to allocate an invalid number (xxx) of pages.

-603

Internal Error: Sector/page table of file VFID xxx|xxx seems corrupted.

-836

LATCH ON PAGE(xxx|xxx) TIMEDOUT

-859

LATCH ON PAGE(xxx|xxx) ABORTED

-890

Partition failed.

-891

Appropriate partition does not exist.

-976

Internal error: Table size overflow (allocated size: xxx, accessed size: xxx) at file table page xxx|xxx(volume xxx)

-1040

HA generic: xxx.

-1075

Descending index scan aborted because of lower priority on B+tree with index identifier: (vfid = (xxx, xxx), rt_pgid: xxx).

다음은 -115, -116번의 오류 번호에 대해서만 콜-스택 덤프가 수행되도록 파라미터를 설정한 예제이다.

call_stack_dump_on_error= no
call_stack_dump_activation_list=-115,-116

다음은 -115, -116번의 오류 번호와 “DEFAULT” 오류 번호에 대해 콜-스택 덤프가 수행되도록 파라미터를 설정한 예제이다.

call_stack_dump_on_error= no
call_stack_dump_activation_list=-115,-116, DEFAULT

call_stack_dump_deactivation_list

call_stack_dump_deactivation_list는 모든 오류에 대해 콜-스택 덤프를 설정한 상태에서, 예외적으로 콜-스택을 덤프하지 않는 특정 오류 번호를 지정하기 위한 파라미터이다. 따라서, call_stack_dump_deactivation_list 파라미터는 call_stack_dump_on_error 의 값이 yes 인 경우에만 효력이 있다.

다음은 -115, -116번의 오류 번호를 제외한 나머지 오류에 대해서 콜-스택 덤프를 수행하기 위해 파라미터를 설정한 예제이다.

call_stack_dump_on_error= yes
call_stack_dump_deactivation_list=-115,-116

call_stack_dump_on_error

call_stack_dump_on_error 는 데이터베이스 서버에서 오류가 발생했을 때 콜-스택을 덤프할지 결정하기 위한 파라미터이다. “no” 로 설정되면 모든 오류에 대해서 콜-스택을 덤프하지 않고, “yes” 로 설정되면 모든 오류에 대해서 콜스택을 덤프한다. 기본값은 no 이다.

error_log

error_log 는 데이터베이스 서버에 오류가 발생하는 경우, 에러 로그가 저장되는 파일 이름을 지정하기 위한 서버/클라이언트 파라미터이다. 에러 로그가 저장되는 파일명의 작성 규칙은 <database_name>_<date>_<time>.err 이다. 한편 시스템이 데이터베이스 서버 정보를 찾을 수 없는 오류에 대해서는 에러 로그 파일명의 작성 규칙을 따를 수 없다. 따라서, cubrid.err 파일에 오류 로그를 기록한다. cubrid.err 에러 로그 파일은 $CUBRID/log/server 디렉터리에 저장된다.

error_log_level

error_log_level 은 에러 심각성(severity) 수준에 따라 에러 로그 파일에 저장할 에러 메시지를 지정할 수 있는 서버 파라미터이다. 에러 심각성 수준은 가장 낮은 수준인 WARNING 부터 가장 심각한 수준인 FATAL 까지 총 5단계로 구성되며, 그에 따른 에러 메시지 포함 관계는 FATAL < ERROR < SYNTAX < NOTIFICATION < WARNING 이다. 기본값은 NOTIFICATION 이며, 이 경우 FATAL , ERROR , SYNTAX , NOTIFICATION 에 해당하는 에러 메시지가 에러 로그 파일에 기록된다.

error_log_warning

error_log_warning 은 에러 심각성(severity) 수준이 WARNING 인 에러 메시지의 출력 여부를 설정할 수 있는 서버 파라미터이다. 기본값은 no이다. WARNING 메시지가 에러 로그 파일에 저장되도록 하려면, error_log_warning 의 값을 yes 로 설정해야 한다.

error_log_size

error_log_size 는 에러 로그 파일에서 기록되는 최대 라인 수를 지정하는 파라미터로 기본값은 512M 이다. 에러 로그 파일의 라인 수가 이 파라미터의 설정값에 도달하면 <database_name>_<date>_<time>.err.bak 파일이 생성된다.

동시성/잠금 파라미터

다음은 데이터베이스 서버의 동시성 제어 및 잠금에 관한 파라미터로 각 파라미터의 타입과 설정 가능한 값의 범위는 다음과 같다.

파라미터 이름

타입

기본값

최소값

최대값

deadlock_detection_interval_in_secs

float

1.0

0.1

isolation_level

int

4

4

6

lock_escalation

int

100,000

5

lock_timeout

msec

-1(무제한)

0(대기안함)

INT_MAX

rollback_on_lock_escalation

bool

no

deadlock_detection_interval_in_secs

deadlock_detection_interval_in_secs는 중단된 트랜잭션에 대해 교착 상태 여부를 탐지하는 주기를 초 단위로 설정하기 위한 파라미터이다. CUBRID 시스템은 교착 상태에 있는 트랜잭션 중 하나를 롤백시켜 교착 상태를 해결한다. 기본값은 1초이며, 최소값은 0.1초이다. 이 값은 0.1초 단위로 올림하여 동작한다. 즉, 입력값이 0.12초이면 0.2초를 입력한 것과 같이 동작한다. 탐지 주기가 길면 오랜 시간동안 교착 상태를 탐지할 수 없으므로 주의한다.

isolation_level

isolation_level은 트랜잭션의 격리 수준을 설정하기 위한 파라미터로 격리 수준이 높을수록 트랜잭션의 동시성이 적고 다른 동시성 트랜잭션에 의해 간섭받지 않는다. isolation_level 파라미터는 격리 수준을 의미하는 4에서 6까지의 정수값 또는 문자열로 설정하며, 기본값은 READ COMMITTED이다. 각 격리 수준 및 파라미터 설정값에 대한 자세한 내용은 트랜잭션 격리 수준 과 다음 표를 참조한다.

격리 수준

isolation_level 파라미터 설정값

SERIALIZABLE

“TRAN_SERIALIZABLE” or 6

REPEATABLE READ

“TRAN_REP_CLASS_REP_INSTANCE” or “TRAN_REP_READ” or 5

READ COMMITTED

“TRAN_REP_CLASS_COMMIT_INSTANCE” or “TRAN_READ_COMMITTED” or “TRAN_CURSOR_STABILITY” or 4

  • TRAN_SERIALIZABLE : 가장 높은 수준의 일관성을 보장하는 격리 수준이며, SERIALIZABLE 격리 수준 을 참고한다.

  • TRAN_REP_READ : 유령 읽기(phantom read)가 발생할 수 있는 격리 수준이며, REPEATABLE READ 격리 수준 를 참고한다.

  • TRAN_READ_COMMITTED : 반복 불가능한 읽기(unrepeatable read)가 발생할 수 있는 격리 수준이며, READ COMMITTED 격리 수준 를 참고한다.

Note

9.3 이하 버전에서는 다음의 격리 수준을 추가로 지원한다. 10.0부터는 다량의 동시 트랜잭션 처리 시 MVCC 기법을 적용하여 격리 수준을 낮추지 않고도 동시성을 더 잘 보장할 수 있게 되었기 때문에, 아래의 낮은 격리 수준을 더 이상 사용하지 않게 되었다.

  • TRAN_REP_CLASS_UNCOMMIT_INSTANCE : 더티 읽기(dirty read)가 발생될 수 있는 격리 수준이다.

  • TRAN_COMMIT_CLASS_COMMIT_INSTANCE : 반복 불가능한 읽기(unrepeatable read)가 발생될 수 있고, 데이터 조회 중에 다른 트랜잭션에 의한 테이블 스키마의 변경이 허용되는 격리 수준이다.

  • TRAN_COMMIT_CLASS_UNCOMMIT_INSTANCE : 더티 읽기(dirty read)가 발생될 수 있고, 데이터 조회 중에 다른 트랜잭션에 의한 테이블 스키마의 변경이 허용되는 격리 수준이다.

lock_escalation

lock_escalation 은 행에 대한 잠금이 테이블 잠금으로 확대되기 전에 개별 행에 허용되는 최대 잠금의 개수를 설정하기 위한 파라미터로 기본값은 100,000 이다. lock_escalation 파라미터의 설정값이 작으면, 메모리 잠금 관리에 의한 오버헤드가 적은 반면 동시성은 줄어든다. 반대로 설정값이 크면 메모리 잠금 관리에 의한 오버헤드가 큰 반면 동시성이 향상된다.

lock_timeout

lock_timeout 은 잠금 대기 시간을 지정하기 위한 클라이언트 파라미터로 지정된 시간 이내에 잠금이 허용되지 않으면 해당 트랜잭션이 취소되고 오류가 반환된다. 기본값인 -1 로 설정하면 잠금이 허용될 때까지의 대기 시간이 무제한이고, 0으로 설정하면 잠금을 대기하지 않는다.

s, min, h 단위를 지정할 수 있으며 각각 seconds, minutes, hours를 의미한다. 단위 생략 시 기본 단위는 밀리초(ms)이며, 밀리초로 설정한 값은 초 단위로 올림된다. 예를 들어, 1ms는 1s가 되며, 1001ms는 2s가 된다.

rollback_on_lock_escalation

잠금 에스컬레이션 발생 시 트랜잭션의 롤백 여부를 지정한다. 기본값은 no이다.

이 파라미터가 yes로 설정되면, 잠금 에스컬레이션 발생 시점에 에스컬레이션 없이 에러 로그를 기록하고, 해당 잠금 요청은 실패하면서 트랜잭션을 롤백한다. no로 설정되면 잠금 에스컬레이션이 수행되고 트랜잭션을 계속 진행한다.

잠금 에스컬레이션이 발생하면 레코드 잠금이 테이블 잠금으로 전환되고, 잠금(lock)을 해제하는 시간이 오래 걸리면서 해당 테이블에 대한 다른 트랜잭션의 접근이 불가하게 되는 상황이 발생할 수 있다. 그렇다고 잠금 에스컬레이션이 발생하는 레코드 잠금 개수를 지정하는 lock_escalation 파라미터 값을 크게 하면 메모리 자원을 많이 사용하는 문제가 발생할 수 있다.

로깅 관련 파라미터

다음은 CUBRID 데이터베이스의 백업과 복구에 이용되는 로그에 관련된 파라미터로 각 파라미터의 타입과 설정 가능한 값의 범위는 다음과 같다.

파라미터 이름

타입

기본값

최소값

최대값

adaptive_flush_control

bool

yes

background_archiving

bool

yes

checkpoint_every_size

byte

10,000 * log_page_size

10 * log_page_size

log_page_size

checkpoint_interval

msec

6min

1min

35,791,394min

checkpoint_sleep_msecs

msec

1

0

force_remove_log_archives

bool

yes

log_buffer_size

byte

16k * log_page_size

128 * log_page_size

INT_MAX * log_page_size

log_max_archives

int

INT_MAX

0

INT_MAX

log_trace_flush_time

int

0

0

INT_MAX

max_flush_size_per_second

byte

10,000 * db_page_size

1 * db_page_size

INT_MAX * db_page_size

remove_log_archive_interval_in_secs

sec

0

0

sync_on_flush_size

byte

200 * db_page_size

1 * db_page_size

INT_MAX * db_page_size

adaptive_flush_control

adaptive_flush_control는 내려쓰기(flush) 작업 중에 50ms마다 작업 상태에 따라 내려쓰기할 용량(flush capacity)을 자동 조정하는 파라미터이며, 기본값은 yes이다. 즉, 특정 시점에 INSERT 또는 UPDATE 연산이 집중되어 내려쓰기한 페이지 수가 max_flush_pages_per_second 파라미터 값에 도달하면 이 용량을 증가시키고, 이에 도달하지 못하면 이 용량을 감소시킨다. 이처럼 워크로드에 따라 주기적으로 내려쓰기 용량을 조정하여 I/O 부하를 분산할 수 있다.

background_archiving

background_archiving은 특정 시점마다 주기적으로 임시 보관 로그를 생성하도록 하는 파라미터로서, 보관 로그 작업으로 인한 디스크 I/O 부하를 분산시키고자 할 때 유용하다. 기본값은 yes이다.

checkpoint_every_size

checkpoint_every_size는 체크포인트가 수행되는 주기를 로그 페이지 단위로 설정하는 파라미터이다. 값 뒤에 B, K, M, G, T로 단위를 붙일 수 있으며, 각각 Bytes, Kilobytes, Megabytes, Gigabytes, Terabytes를 의미한다. 단위를 생략하면 바이트 단위가 적용된다. 기본값은 10,000 * log_page_size (log_page_size가 16K이면 156.25M)이다.

특정 시간대에 INSERT / UPDATE 가 집중되는 서비스 환경에서는 checkpoint_every_size 파라미터의 설정값을 작게 설정하여 체크포인트 시점에 I/O 부하를 분산할 수 있다.

체크포인트는 특정 시점에 데이터 버퍼에 있는 모든 수정된 페이지를 데이터베이스 볼륨(디스크)에 기록하는 작업이다. 체크포인트는 데이터베이스 장애 발생 이후 복구 시 체크포인트가 발생하기 전의 트랜잭션 로그를 반영할 필요가 없게 하여 복구 시간을 단축시키는 효과가 있다. 다만, 체크포인트 작업으로 인해 디스크 I/O가 발생하여 DB 운영에 영향을 끼칠 수 있으므로 체크포인트 주기를 적절하게 설정해야 한다.

Note

CUBRID에서 체크포인트는 4가지 방법으로 제공되는데, 다음의 2가지는 cubrid.conf의 설정에 의해 제공된다.

  • checkpoint_interval: 체크포인트가 완료된 이후 이 파라미터의 설정값이 경과된 시간마다 체크포인트 작업이 주기적으로 수행된다.

  • checkpoint_every_size: 트랜잭션 로그 파일의 크기가 이 파라미터의 설정값에 도달하는 시점마다 체크포인트 작업이 주기적으로 수행된다.

이상 두 개의 파라미터 조건 중 하나만 만족하면 체크포인트가 수행된다.

다음의 2가지는 사용자의 명령으로 제공된다.

  • CSQL 인터프리터를 “DBA” 사용자로 실행한 이후 “;checkpoint” 명령을 수행하면 체크포인트가 수행된다.

참고로 체크포인트 수행 도중에 백업을 수행하면, 체크포인트가 종료될 때까지 백업 명령은 대기 상태가 된다.

checkpoint_interval

checkpoint_interval은 체크포인트가 수행되는 주기를 설정하는 파라미터이다. ms, s, min, h 단위를 지정할 수 있으며 각각 milliseconds, seconds, minutes, hours를 의미한다. 단위 생략 시 기본 단위는 밀리초(ms)이며, 밀리초로 설정한 값은 초 단위로 올림된다. 예를 들어, 1ms는 1s가 되며, 1001ms는 2s가 된다. 기본값은 6min이고, 최소값은 1min이다. 최대값은 35791394min이다.

checkpoint_sleep_msecs

체크포인트가 발생할 때 버퍼의 데이터를 디스크에 플러시하는 작업을 천천히 진행하게 하는 파라미터이다. 기본값은 1 (밀리초)이다.

force_remove_log_archives

force_remove_log_archiveslog_max_archives로 지정한 개수의 최근 보관 로그(log archive) 파일을 제외한 나머지 파일의 삭제 허용 여부를 지정하는 파라미터로서, 기본값은 yes이다.

파라미터 값을 yes 로 설정하면, log_max_archives로 지정한 개수의 최근 보관 로그 파일을 제외한 나머지 파일이 삭제된다.

파라미터 값을 no 로 설정하면, 보관 로그 파일이 삭제되지 않지만, 예외적으로 ha_mode를 on으로 설정하면 HA 관련 프로세스에 필요한 보관 로그 파일과 log_max_archvies로 지정한 개수의 최근 보관 로그 파일을 제외한 나머지 파일이 삭제된다.

CUBRID HA 환경을 구축하고자 하는 사용자는 환경 설정을 참고한다.

log_buffer_size

log_buffer_size 는 메모리에 캐시되는 로그 버퍼의 크기를 설정하는 파라미터이다. 값 뒤에 B, K, M, G, T로 단위를 붙일 수 있으며, 각각 Bytes, Kilobytes, Megabytes, Gigabytes, Terabytes를 의미한다. 단위를 생략하면 바이트 단위가 적용된다. 기본값은 128 * log_page_size (log_page_size가 16K이면 2M) 이다.

log_buffer_size 파라미터의 설정값이 크면 데이터베이스 수정 연산이 많고, 수행 시간이 긴 트랜잭션 많은 환경에서는 디스크 I/O가 감소되어 성능이 향상될 수 있다. CUBRID의 MVCC 시스템은 이전 버전의 값에 접근하는 것과 데이터베이스에서 삭제된 값을 회수하기 위해 로그에 의존한다. 따라서 CUBRID가 설치된 시스템의 메모리 크기 및 작업 연산의 크기를 고려하여 적당한 값으로 설정할 것을 권장한다.

  • 필요한 메모리 크기 = 로그 버퍼 크기(log_buffer_size)

log_max_archives

log_max_archives는 보존할 보관 로그 파일의 최대 개수를 설정하는 파라미터이다. 최소값은 0이며, 기본값은 INT_MAX (2,147,483,647)이다. CUBRID 설치 시 cubrid.conf 에는 0으로 설정되어 있다. 이 파라미터는 force_remove_log_archives 의 설정에 따라 동작이 달라질 수 있다.

하지만 활성화된 트랜잭션이 기존 보관 로그 파일을 여전히 참조하고 있다면, 해당 보관 로그 파일은 삭제되지 않는다. 즉, 어떤 트랜잭션이 첫 번째 보관 로그 파일이 생성되는 시점에서 시작되어 다섯 번째 보관 로그 파일이 생성되는 시점까지도 종료되지 않았다면 첫 번째 보관 로그 파일은 삭제되지 않는다.

그리고 보관 로그 파일의 정보가 데이터베이스 볼륨에 아직 반영되어 있지 않은 경우에도 해당 보관 로그 파일은 삭제되지 않는다. (체크포인트가 발생한 이후의 보관 로그는 데이터 버퍼의 수정된 페이지 정보를 가지고 있으므로 데이터베이스 복구를 위해 필요하다.)

DB 운영 중에 log_max_archives의 값을 동적으로 변경하는 경우, 변경된 값은 새로운 보관 로그 파일이 생성될 때 적용된다. 예를 들어, 해당 값을 10에서 5로 변경한 경우, 새로운 보관 로그 파일이 생성되는 시점에 오래된 파일 5개를 삭제한다.

CUBRID HA 환경을 구축하고자 하는 사용자는 환경 설정을 참고한다.

Note

2008 R4.3 이하 버전과 9.1 버전에서 log_max_archives는 HA 환경에서 복제 로그 파일의 최대 보존 개수를 지정할 때도 사용되었으나, 2008 R4.4와 9.2 이상 버전에서는 cubrid_ha.conf의 ha_copy_log_max_archives 파라미터가 그 역할을 대신하게 되었다.

log_trace_flush_time

이 파라미터에 설정한 시간보다 로그 플러싱 시간이 오래 걸리는 경우 해당 이벤트가 데이터베이스 서버 로그에 기록된다.

기록되는 정보의 예는 다음과 같다.

03/18/14 10:20:45.889 - LOG_FLUSH_THREAD_WAIT
  total flush count: 1 page(s)
  total flush time: 310 ms
  time waiting for log writer: 308 ms
  last log writer info
    client: DBA@cdbs037.cub|copylogdb(15312)
    time spent by log writer: 308 ms
  • LOG_FLUSH_THREAD_WAIT: 이벤트 이름

  • total flush count: 이벤트 발생 당시 플러시(flush)한 페이지 수

  • total flush time: 총 플러시 소요 시간

  • time waiting for log writer: LFT(Log Flushing Thread)가 LWT(Log Writer Thread)를 대기한 시간

  • last log writer info

    • DBA@cdbs037.cub|copylogdb(15312): LFT를 대기하게 한 LWT와 관련된 copylogdb 정보 <사용자@호스트명|클라이언트명(pid)>

    • time spent by log writer: LWT에서 측정한 LWT 소요 시간(일반적으로 time waiting for log writer와 동일)

max_flush_size_per_second

max_flush_size_per_second는 버퍼로부터 디스크로 내려쓰기(flush) 작업을 수행할 때, 내려쓰기할 최대 용량 (flush capacity)을 설정하기 위한 파라미터이다. 값 뒤에 B, K, M, G, T로 단위를 붙일 수 있으며, 각각 Bytes, Kilobytes, Megabytes, Gigabytes, Terabytes를 의미한다. 단위를 생략하면 바이트 단위가 적용된다. 기본값은 10,000 * db_page_size (db_page_size가 16K이면 156.25M)이다. 즉, 이 파라미터 설정을 통해 1초당 내려쓰기할 최대 용량을 제어하여, 특정 시점에 I/O 부하가 집중되는 현상을 방지할 수 있다.

만약, 특정 시점에 INSERT 또는 UPDATE 연산이 집중되어 이 파라미터에 의해 설정된 최대 용량에 도달하면, 로그 페이지만 내려쓰기를 수행하고 데이터 페이지는 더 이상 디스크로 내려쓰지 않는다. 따라서, 이 파라미터는 서비스 환경의 워크로드를 고려하여 적절한 값을 설정해야 한다.

remove_log_archive_interval_in_secs

log_max_archives에서 지정한 개수를 초과한 보관 로그는 체크포인트가 발생하는 시점에 삭제하게 되는데, 데이터 마이그레이션이나 대량 배치와 같은 작업이 수행되는 경우 많은 양의 보관 로그가 쌓였다가 일시에 지워지는 일이 자주 발생한다. 이렇게 파일 삭제가 한꺼번에 발생한다면 데이터베이스 서버의 I/O 부하가 급격히 증가하므로, 이 부담을 줄일 필요가 있다.

remove_log_archive_interval_in_secs 파라미터는 이러한 부담을 줄이고자 보관 로그의 삭제를 천천히 진행하게 한다. 기본값은 0(초)이다. 대량 배치와 같은 작업이 자주 발생하는 상황에서, 디스크 공간이 충분하다면 삭제 간격을 60초 정도로 줄 것을 권장한다.

sync_on_flush_size

sync_on_flush_size는 버퍼로부터 데이터 페이지 및 로그 페이지를 내려쓰기한 후, 운영 시스템의 FILE I/O와 동기화를 수행하는 주기를 페이지 단위로 설정하는 파라미터이다. 값 뒤에 B, K, M, G, T로 단위를 붙일 수 있으며, 각각 Bytes, Kilobytes, Megabytes, Gigabytes, Terabytes를 의미한다. 단위를 생략하면 바이트 단위가 적용된다. 기본값은 200 * db_page_size (db_page_size가 16K이면 3.125M)이다. 즉, 200페이지만큼 내려쓰기 작업이 수행될 때마다 CUBRID 서버는 운영 체제의 FILE I/O와 동기화를 수행한다. I/O 부하와 관련된 파라미터이다.

트랜잭션 처리 관련 파라미터

다음은 트랜잭션의 커밋 성능 향상을 위한 파라미터로 각 파라미터의 타입과 설정 가능한 값의 범위는 다음과 같다.

파라미터 이름

타입

기본값

최소값

최대값

async_commit

bool

no

group_commit_interval_in_msecs

msec

0

0

async_commit

async_commit은 비동기식 커밋 기능을 활성화시키는 파라미터로 기본값인 no로 설정하면 비동기식 커밋을 수행하지 않고, yes로 설정하면 비동기식 커밋을 수행한다. 비동기식 커밋이란 커밋 로그가 디스크에 플러시되기 전에 클라이언트에게 커밋을 완료 처리하고, 로그 플러시 스레드(LFT)가 로그 플러시를 백그라운드에서 수행하여 커밋 작업의 성능을 향상시키는 기능이다. 로그 플러시가 수행되기 전에 데이터베이스 서버에 장애가 발생하면 이미 커밋 완료된 트랜잭션을 복구할 수 없으므로 주의한다.

group_commit_interval_in_msecs

group_commit_interval_in_msecs은 그룹 커밋을 수행하는 간격을 밀리초(mesc) 단위로 지정하는 파라미터로 기본값인 0 으로 설정되면 그룹 커밋을 수행하지 않는다. 그룹 커밋이란 지정된 시간동안 발생한 여러 번의 커밋을 그룹으로 취합하여 커밋 로그가 동시에 디스크에 플러시되도록 하여 커밋 작업의 성능을 향상시키는 기능이다.

구문/타입 관련 파라미터

다음은 CUBRID에서 지원하는 SQL 구문 및 데이터 타입에 관한 파라미터로 각 파라미터의 타입과 설정 가능한 값의 범위는 다음과 같다.

파라미터 이름

타입

기본값

최소값

최대값

add_column_update_hard_default

bool

no

alter_table_change_type_strict

bool

no

ansi_quotes

bool

yes

block_ddl_statement

bool

no

block_nowhere_statement

bool

no

compat_numeric_division_scale

bool

no

cte_max_recursions

int

2,000

2

1,000,000

default_week_format

int

0

group_concat_max_len

byte

1,024

4

33,554,432

intl_check_input_string

bool

no

intl_collation

string

intl_date_lang

string

intl_number_lang

string

json_max_array_idx

int

65,536

1,024

1,048,576

no_backslash_escapes

bool

yes

only_full_group_by

bool

no

oracle_style_empty_string

bool

no

pipes_as_concat

bool

yes

plus_as_concat

bool

yes

require_like_escape_character

bool

no

return_null_on_function_errors

bool

no

string_max_size_bytes

byte

1,048,576

64

33,554,432

unicode_input_normalization

bool

no

unicode_output_normalization

bool

no

update_use_attribute_references

bool

no

add_column_update_hard_default

add_column_update_hard_defaultALTER TABLE … ADD COLUMN 절로 새로운 칼럼을 추가할 때 이 칼럼에 입력할 값을 고정 기본값(hard_default)으로 제공할지 여부를 설정하는 파라미터로서, 기본값은 no이다.

NOT NULL 제약 조건이 있고 DEFAULT 제약 조건이 없을 때 이 파라미터 값이 yes이면 칼럼의 새로운 입력값을 고정 기본값(hard default value)으로 입력하며, no이면 에러를 반환한다. 이 파라미터의 값이 yes일 때 추가하려는 칼럼의 타입에 고정 기본값이 없으면 에러를 반환한다. 각 타입별 고정 기본값에 대해서는 ALTER TABLE 문의 CHANGE/MODIFY 절을 참고한다.

SET SYSTEM PARAMETERS 'add_column_update_hard_default=yes';

CREATE TABLE tbl (i int);
INSERT INTO tbl VALUES (1),(2);
ALTER TABLE tbl ADD COLUMN j INT NOT NULL;

SELECT * FROM tbl;
            i          j
=========================
            1          0
            2          0
SET SYSTEM PARAMETERS 'add_column_update_hard_default=no';

CREATE TABLE tbl (i INT);
INSERT INTO tbl VALUES (1),(2);
ALTER TABLE tbl ADD COLUMN j INT NOT NULL;
ERROR: Cannot add NOT NULL constraint for attribute "j": there are existing NULL values for this attribute.

alter_table_change_type_strict

alter_table_change_type_strict 는 타입 변경에 따른 해당 칼럼 값들의 변환 허용 여부를 지정하는 파라미터로서, 기본값은 no 이다. 이 파라미터 값이 no이면 칼럼의 타입 변경이나 NOT NULL 제약 조건을 추가할 때 값의 변경이 발생하며, yes이면 값의 변경이 발생하지 않는다. 자세한 내용은 ALTER TABLE 문의 CHANGE/MODIFY 절 을 참고한다.

ansi_quotes

ansi_quotes 는 식별자 처리를 위한 기호 또는 문자열을 감싸는 기호에 관한 파라미터로 기본값은 yes 이다. 이 파라미터 값이 yes이면 큰따옴표는 식별자 처리 기호로 해석되고, 작은따옴표는 문자열 처리 기호로 해석된다. 이 값이 no이면 큰 따옴표와 작은 따옴표 모두 문자열 처리 기호로 해석된다.

block_ddl_statement

block_ddl_statement 는 클라이언트가 수행하는 데이터 정의문(Data Definition Language, DDL)을 제한하기 위한 파라미터로 no로 설정하면 해당 클라이언트의 데이터 정의문 수행을 허용하며, yes로 설정하면 해당 클라이언트의 데이터 정의문 수행을 허용하지 않는다. 기본값은 no 이다.

block_nowhere_statement

block_nowhere_statement 는 클라이언트가 수행하는 조건절(WHERE)이 없는 UPDATE / DELETE 문을 제한하기 위한 파라미터로 no 로 설정하면 해당 클라이언트의 조건절이 없는 UPDATE / DELETE 문을 허용하며, yes로 설정하면 해당 클라이언트의 조건절이 없는 UPDATE / DELETE 문의 수행을 허용하지 않는다. 기본값은 no 이다.

compat_numeric_division_scale

compat_numeric_division_scale 은 나눗셈 연산의 결과 값(몫)에 대하여 소수점 이하 자릿수를 몇 자리까지 표시할 것인가를 지정하기 위한 파라미터로 no 로 설정하면 몫의 소수점 이하 자릿수가 9개가 되고, yes 로 설정하면 몫의 소수점 이하 자릿수가 피연산자의 소수점 이하 자릿수에 따라 결정된다. 기본값은 no 이다.

cte_max_recursions

cte_max_recursions 는 CTE(Common Table Expressions) 질의문의 반복되는 부분을 수행할 때 최대 반복 횟수를 제한하는 파라미터이다. 이 파라미터는 무한 반복과 임시 결과의 크기로 인해 발생할 수 있는 이슈를 예방한다.

default_week_format

default_week_formatWEEK() 함수 mode 인자의 기본값을 설정한다. 기본값은 0이다. 자세한 내용은 WEEK() 함수를 참고한다.

group_concat_max_len

group_concat_max_lenGROUP_CONCAT() 함수의 리턴 값의 크기를 제한하는 파라미터이다. 값 뒤에 B, K, M, G, T로 단위를 붙일 수 있으며, 각각 Bytes, Kilobytes, Megabytes, Gigabytes, Terabytes를 의미한다. 단위를 생략하면 바이트 단위가 적용된다. 기본값은 1,024 바이트이며, 최소값은 4 바이트, 최대값은 33,554,432 바이트이다. GROUP_CONCAT() 함수의 결과가 제한을 넘으면 오류가 반환된다.

이 함수는 string_max_size_bytes 파라미터의 영향을 받으며, string_max_size_bytes 보다 group_concat_max_len 이 크고 GROUP_CONCAT() 함수의 결과가 string_max_size_bytes 의 크기 제한을 넘으면 오류가 반환된다.

intl_check_input_string

intl_check_input_string은 입력되는 문자열이 사용하는 문자셋에 맞게 입력되는지에 대한 검사 여부를 설정하는 파라미터이다. 기본값은 no 이다. 예를 들어, 이 값이 no이고 문자셋이 UTF-8일 때 UTF-8 바이트 순서(byte sequence)에 맞지 않는 데이터가 들어오는 경우 비정상적인 동작을 보이거나 심하면 데이터베이스 서버 혹은 응용 프로그램이 비정상 종료될 수도 있다. 하지만 이러한 문제가 없다는 것이 보장된다면 검사하지 않는 것이 성능상 좀더 유리하다.

UTF-8과 EUC-KR만이 검사 대상이며, ISO-8859-1은 한 바이트 인코딩이고 모든 바이트가 유효하므로 검사할 필요가 없다.

intl_collation

intl_collation 은 특정 응용 클라이언트에 대해 콜레이션 이름을 지정하는 파라미터로서, 이 파라미터를 지정하면 “SET NAMES” 문을 통해 응용 클라이언트의 콜레이션을 변경하는 것과 같은 동작을 수행한다. 콜레이션 지정은 문자셋을 포함한다.

아래의 두 문장은 같은 동작을 수행한다.

SET NAMES utf8;
SET SYSTEM PARAMETERS 'intl_collation=utf8_bin';

intl_collation 의 값으로 사용할 수 있는 값은 콜레이션 을 참고한다.

intl_date_lang

intl_date_langTIME, DATE, DATETIME, TIMESTAMP 타입의 값을 입력 또는 출력하는 함수의 인자로 언어 이름이 생략되는 경우, 문자열의 지역화된(localized) 캘린더(월 이름과 요일 이름, 오전/오후 이름) 형식을 지정하는 파라미터이다.

사용할 수 있는 값은 다음과 같다. 단, 이 값들을 모두 사용하려면 내장된 로캘(locale)을 제외한 나머지 로캘에 대해서는 원하는 로캘 라이브러리를 설정해야 한다. 로캘 설정에 대해서는 로캘 설정 을 참고한다.

언어

언어의 로캘 이름

영어

en_US

독일어

de_DE

스페인어

es_ES

프랑스어

fr_FR

이태리어

it_IT

일본어

ja_JP

캄보디아어

km_KH

한국어

ko_KR

터키어

tr_TR

베트남어

vi_VN

중국어

zh_CN

루마니아어

ro_RO

지정된 언어의 캘린더 형식에 따라 입력 문자열을 인식하는 함수는 다음과 같다.

지정된 언어의 캘린더 형식에 따라 문자열을 출력하는 함수는 다음과 같다.

intl_number_lang

intl_number_lang 은 문자열을 숫자로, 또는 숫자를 문자열로 변환하는 함수들에서 입력되거나 출력되는 문자열에 숫자 형식을 부여할 때 적용할 로캘을 지정하는 파라미터이다. 숫자에 대해 지역화되는 것들은 자릿수 구분 기호와 소수점 기호이다. 일반적으로는 쉼표(,)와 마침표(.)가 쓰이는데, 로캘에 따라 서로 바뀔 수 있다. 예를 들어, 숫자 1000.12(천 소수점 이하 일이)는 대부분의 로캘에서는 1,000.12로 쓰이는 반면, tr_TR 로캘에서는 1.000,12로 쓰인다.

지정된 언어의 숫자 형식에 따라 입력 문자열을 인식하는 함수는 다음과 같다.

지정된 언어의 숫자 형식에 따라 문자열을 출력하는 함수는 다음과 같다.

json_max_array_idx

json_max_array_idx 는 JSON 함수가 배열의 크기를 변경할 때 크기의 제한을 설정하는데 사용되는 파라미터이다.

만약 매우 큰 인덱스 값을 JSON_ARRAY_INSERT 와 같은 함수에 잘못 입력한다면, JSON 문서는 많은 메모리와 디스크 공간을 차지할 것이다. 이 파라미터는 이러한 위험을 제한하기 위해 사용한다.

문자열로부터 생성된 배열에는 이 제한이 적용되지 않는다.

no_backslash_escapes

no_backslash_escapes 은 이스케이프 문자로 백슬래시(\) 사용 여부에 관한 파라미터로서, 기본값은 yes 이다. 이 파라미터 값이 no 이면 백슬래시(\)가 이스케이프 문자로 사용되며, yes 이면 백슬래시는 일반 문자로 사용된다. 예를 들어, 이 값이 no 일 때 “\n”은 개행(new line) 문자를 의미한다. 그러나 이 값이 yes 이면 “\n”은 “\”과 “n” 두 개의 문자를 의미한다. 백슬래시가 이스케이프 문자로 사용되는 경우에 대한 자세한 설명은 특수 문자 이스케이프 를 참고한다.

only_full_group_by

only_full_group_byGROUP BY 절 사용에 관한 확장된 문법의 사용 여부를 설정하는 파라미터이다.

이 파라미터 값이 no이면 확장된 문법이 적용되므로 GROUP BY 절에 명시되지 않은 칼럼을 SELECT 칼럼 리스트에 명시할 수 있고, 이 값이 yes이면 GROUP BY 절에 명시된 칼럼만 SELECT 칼럼 리스트에 명시할 수 있다.

기본값은 no 이므로, SQL 표준에 따라 질의를 수행하려면 only_full_group_by 파라미터 값을 yes로 설정한다. 이 경우에는 확장된 문법이 적용되지 않으므로 실행 결과로 아래와 같은 에러가 출력된다.

ERROR: Attributes exposed in aggregate queries must also appear in the group by clause.

oracle_style_empty_string

oracle_style_empty_string 은 다른 DBMS(Database Management System)와의 호환성을 향상시키기 위한 파라미터로, 빈 문자열(empty string)과 NULL 을 같은 값으로 처리하도록 지정한다. 기본값은 no 이다. oracle_style_empty_string 파라미터를 no 로 설정하면 빈 문자열을 유효한 문자열로 처리하고, yes 로 설정하면 함수에 따라 빈 문자열을 NULL 로 처리하거나, NULL 을 빈 문자열로 처리한다.

Note

이하에 언급된 함수들을 제외한 나머지 함수들은 oracle_style_empty_string 파라미터의 영향을 받지 않는다.

Note

REPLACE() 함수는 10.0 미만에서 oracle_style_empty_string=yes 일 때의 동작이 다르다.

SELECT REPLACE ('abc', 'a', '');

위의 질의에 대해 10.0 이상 버전에서는 빈 문자열 입력을 빈 문자열로 처리하여 ‘bc’를 출력하지만, 10.0 미만 버전에서는 빈 문자열 입력을 NULL로 처리하여 NULL을 출력한다.

pipes_as_concat

pipes_as_concat 은 이중 파이프 기호(||)의 사용에 관한 파라미터로서, 기본값은 yes 이다. 이 파라미터 값이 yes이면 이중 파이프 기호가 문자열의 병합 연산자로 해석되고, no 이면 불리언(boolean) 연산자인 OR 로 해석된다.

plus_as_concat

plus_as_concat+ 연산자의 사용에 관한 파라미터로서, 기본값은 yes 이다. 이 파라미터 값이 yes 이면 + 연산자가 문자열의 병합 연산자로 해석되고, no 이면 수치 연산자로 해석된다.

-- plus_as_concat = yes
SELECT '1'+'1';
         '1'+'1'
======================
         '11'
SELECT '1'+'a';
         '1'+'a'
======================
         '1a'
-- plus_as_concat = no
SELECT '1'+'1';
                '1'+'1'
==========================
 2.000000000000000e+000
SELECT '1'+'a';
ERROR: Cannot coerce 'a' to type double.

require_like_escape_character

require_like_escape_characterLIKE 절의 이스케이프 문자 사용 여부에 관한 파라미터로서, 기본값은 no 이다. 이 파라미터 값이 yes 이고 no_backslash_escapesno 이면 LIKE 절의 문자열에서 백슬래시(\)가 이스케이프 문자로 사용되며, 그렇지 않으면 LIKE… ESCAPE 절을 사용하여 이스케이프 문자를 명시해야 한다. 자세한 내용은 LIKE 을 참고한다.

return_null_on_function_errors

return_null_on_function_errors 는 일부 SQL 함수에서 에러가 발생할 때의 동작을 정의하는 파라미터로서, 기본값은 no 이다. 이 파라미터 값이 yes 이면 함수에서 에러가 발생할 때 NULL을 반환하며, no 이면 함수에서 에러가 발생할 때 에러를 반환하고 관련 메시지를 출력한다.

다음 SQL 함수가 이 시스템 파라미터의 영향을 받는다.

날짜/시간 함수

문자열 함수

수치 함수

SET SYSTEM PARAMETERS 'return_null_on_function_errors=no';
SELECT YEAR('12:34:56');
ERROR: Conversion error in time format.
SET SYSTEM PARAMETERS 'return_null_on_function_errors=yes';
SELECT YEAR('12:34:56');
   year('12:34:56')
======================
   NULL

string_max_size_bytes

string_max_size_bytes 는 문자열 함수 또는 연산에서 문자열 인자로 사용할 수 있는 최대 바이트 크기를 정의하는 파라미터이다. 값 뒤에 B, K, M, G, T로 단위를 붙일 수 있으며, 각각 Bytes, Kilobytes, Megabytes, Gigabytes, Terabytes를 의미한다. 단위를 생략하면 바이트 단위가 적용된다. 기본값은 1,048,576 바이트(1M)이다. 최소값은 64 바이트, 최대값은 33,554,432 바이트(32M)이다.

이 파라미터에 영향을 받는 함수 및 연산식은 다음과 같다.

unicode_input_normalization

시스템 수준에서 입력할 유니코드를 결합된 코드로 저장할지 여부를 설정하는 파라미터로 기본값은 no 이다.

일반적으로 유니코드 텍스트는 “완전히 결합된(fully composed)” 혹은 “완전히 분해된(fully decomposed)” 상태로 저장될 수 있다. 예를 들면 “완전히 결합된” 문자 ‘Ä’는 하나의 코드포인트인 00C4를 갖는데, 이는 UTF-8 인코딩으로 C3 84의 2바이트가 된다. 이와 달리 “완전히 분해된” 모드에서는 두 개의 코드포인트/문자 0041(문자 “A”)과 0308(COMBINING DIAERESIS)이 되며, UTF-8 인코딩으로는 41 CC 88의 3바이트가 된다.

CUBRID는 완전히 결합된 유니코드만 가지고 동작할 수 있다. 완전히 분해된 문자열을 가진 응용 클라이언트에 대해서는 unicode_input_normalization 의 값을 yes로 설정하여 완전히 결합된 코드로 변환하여 동작한 후 unicode_output_normalization 의 값을 yes로 설정하여 다시 완전히 분해된 텍스트로 되돌려줄 수 있다. 일반적으로 유니코드 정규화는 결합 이후 분해 시 역변환이 불가능하지만 CUBRID는 가능한 한 많은 문자들의 역변환을 가능하게 하기 위해 간략화한 유니코드 정규화 방식을 적용한다. CUBRID 정규화의 특징은 다음과 같다.

  • 정규화는 언어 특징적인 요소가 아니며 로캘에 의존하지 않는다.

    일단 하나 이상의 로캘을 사용할 수 있다면, 모든 CAS/CSQL 프로세스에서 이를 사용할 수 있다. 하지만 정규화는 CUBRID 서버 프로세스에 적용되는 것이 아니다. unicode_input_normalization 시스템 파라미터는 시스템 수준에서 정규화에 의한 입력 코드의 결합 여부를 지정한다. unicode_output_normalization 시스템 파라미터는 시스템 수준에서 정규화에 의한 출력 코드의 분해 여부를 지정한다.

  • 콜레이션과 정규화는 직접 관련이 없다.

    unicode_input_normalization 값이 no임에도 불구하고, 확장이 있는 콜레이션(utf8_de_exp, utf8_jap_exp, utf8_km_exp) 문자열이 완전히 분해된 상태에서 제대로 정렬되지만 이는 의도한 사항이 아니며 UCA(Unicode Collation Algorithm)의 우연한 효과(side-effect)일 뿐이다. 확장이 있는 콜레이션은 오직 완전히 결합된 텍스트만 가지고 동작하도록 구현되었다.

  • CUBRID에서 유니코드 정규화를 위한 결합(composition)과 분해(decomposition)는 별개로 동작하지 않는다.

    일반적으로 unicode_input_normalizationunicode_output_normalization 의 값을 yes로 사용한다. 이 경우 클라이언트로부터 입력된 코드는 결합 모드로 저장되고 출력은 분해 모드로 저장된다.

클라이언트 응용 프로그램이 텍스트 데이터를 분해된 형태로 CUBRID에 보낸다면, unicode_input_normalizationyes 로 설정하여 CUBRID가 결합된 코드로 다루게 한다.

클라이언트 응용 프로그램이 분해된 형태로만 데이터를 다룰 수 있다면 unicode_output_normalizationyes 로 설정하여 CUBRID가 항상 분해된 코드로 데이터를 보내도록 한다.

클라이언트 응용 프로그램이 입력과 출력의 형태에 대해 모두 알고 있다면, unicode_input_normalizationunicode_output_normalizationno 인 상태로 둔다(기본 설정).

로캘과 콜레이션에 대한 자세한 설명은 다국어 개요 을 참고한다.

unicode_output_normalization

시스템 수준에서 저장된 유니코드를 분해된 코드로 출력할 것인지 여부를 설정하는 파라미터로 기본값은 no 이다. 보다 자세한 설명은 위의 unicode_input_normalization 설명을 참고한다.

update_use_attribute_references

update_use_attribute_referencesUPDATE 문에서 갱신 대상 칼럼을 명시할 때 먼저 명시한 칼럼의 값이 질의문에서 해당 칼럼을 사용하는 또 다른 칼럼의 갱신에 영향을 줄 것인지 여부를 설정하는 파라미터로서, 기본값은 no 이다.

아래의 UPDATE 문 결과는 update_use_attribute_references 파라미터의 값에 따라 달라진다.

CREATE TABLE tbl(a INT, b INT);
INSERT INTO tbl values (10, NULL);

UPDATE tbl SET a=1, b=a;

이 파라미터의 값이 yes이면, 위의 UPDATE 질의에서 갱신되는 b의 값은 “a=1”의 영향을 받아 1이 된다.

SELECT * FROM tbl;
1, 1

이 파라미터의 값이 no이면, 위의 UPDATE 질의에서 갱신되는 b의 값은 “a=1”의 영향을 받지 않고 해당 레코드에 저장되어 있는 a 값의 영향을 받아 NULL이 된다.

SELECT * FROM tbl;
1, NULL

스레드 관련 파라미터

스레드 파라미터 설정을 통해 스레드를 관리할 수 있다. 각 파라미터의 타입과 설정 가능한 값의 범위는 다음과 같다.

파라미터 이름

타입

기본값

최소값

최대값

thread_connection_pooling

bool

true

thread_connection_timeout_seconds

int

300

-1

3600

thread_worker_pooling

bool

true

thread_worker_timeout_seconds

int

300

-1

3600

loaddb_worker_count

bool

8

2

64

thread_connection_pooling

thread_connection_pooling 파라미터가 true이면, 서버 부팅 시 클라이언트 연결을 관리하는 모든 스레드가 풀링된다.

thread_connection_timeout_seconds

**thread_connection_timeout_seconds**는 연결을 관리하는 스레드가 종료하기 전에 대기하는 시간을 설정하는 파라미터이다. 스레드는 연결이 종료된 후 새로운 연결을 할당받기 위해 파라미터 설정값(초 단위) 동안 대기한다. 대기 시간을 초과할 때까지 새로운 연결을 할당받지 못하면, 스레드는 종료하게 된다. 이후 새로운 연결 요청이 발생하게 되면 다른 스레드가 시작될 것이다. 파라미터 값이 **-1**로 설정된 경우 스레드는 종료하지 않고, 새로운 연결이 할당될 때까지 정지한다.

thread_worker_pooling

thread_worker_pooling 파라미터가 true이면, 서버 부팅 시 클라이언트가 요청한 작업을 실행하는 모든 스레드가 풀링된다.

thread_worker_timeout_seconds

**thread_worker_timeout_seconds**는 클라이언트가 요청한 작업을 처리하는 스레드가 종료하기 전에 대기하는 시간을 설정하는 파라미터이다. 스레드는 클라이언트가 요청한 작업을 실행한 후 새로운 작업을 할당받기 위해 파라미터 설정값(초 단위) 동안 대기한다. 대기 시간을 초과할 때까지 새로운 클라이언트 요청 작업을 할당받지 못하면, 스레드는 종료하게 된다. 이후 새로운 클라이언트 요청 작업이 발생하게 되면 다른 스레드가 시작될 것이다. 파라미터 값이 **-1**로 설정된 경우 스레드는 종료하지 않고, 새로운 작업이 할당될 때까지 정지한다.

loaddb_worker_count

loaddb_worker_count**는 **loaddb 세션에 전용으로 할당되는 최대 스레드 개수를 설정하는 파라미터이다. 단일 loaddb**세션이 수행되는 경우 모든 스레드가 이 작업을 수행할 수도 있다. 여러 **loaddb 세션이 동시에 수행되는 경우 모든 세션에 할당된 스레드의 총 수는 이 파라미터 설정값을 초과할 수 없다.

타임존 파라미터

다음은 타임존과 관련된 파라미터로 각 파라미터의 타입과 설정 가능한 값의 범위는 다음과 같다.

파라미터 이름

타입

기본값

최소값

최대값

server_timezone

string

OS의 타임존

timezone

string

server_timezone

tz_leap_second_support

bool

no

  • timezone

    세션에 대한 타임존을 설정한다. 기본값은 server_timezone 의 값이다. 타임존 오프셋(예: +01:00, +02) 또는 타임존 지역 이름(예: Asia/Seoul)으로 설정 가능하며, 데이터베이스 운영 중 변경이 가능하다.

  • server_timezone

    서버에 대한 타임존을 설정한다. 기본값은 OS의 타임존이다. 변경된 값을 반영하려면 데이터베이스를 재시작해야 한다. 운영 체제의 타임존은 운영 체제와 운영 체제 설정 파일에 있는 정보에 따라 다를 수 있다.

    • Windows의 경우, tzset() 함수와 tzname[0] 변수를 사용해 Windows 스타일 타임존명을 검색한다. 이 이름은 CUBRID 매핑 데이터를 사용하는 IANA/CUBRID 스타일명으로 변환된다(매핑 파일은 %CUBRID%\timezones\tzdata\windowsZones.xml임).

    • Linux의 경우, CUBRID에서 “/etc/sysconfig/clock” 파일을 읽고 구문을 분석하려 시도한다. 이 파일이 없는 경우 “/etc/localtime”의 값을 읽고 사용한다.

    • AIX의 경우, “TZ” 운영 체제 환경 변수의 값을 사용한다.

    모든 운영 체제에서 server_timezone이 지정되지 않은 경우 “Asia/Seoul” 타임존을 서버 타임존으로 사용한다.

  • tz_leap_second_support

    윤초(leap second)에 대한 지원 여부를 yes 또는 no로 설정한다. 기본값은 no 이다.

    윤초(閏秒)란 태양시 평균에 근접한 하루의 시간을 유지하기 위해 협정 세계시(UTC)에서 발생하는 오차를 보정하기 위해 가끔 추가하는 1초이다.

    변경된 값을 반영하려면 데이터베이스를 재시작해야 한다.

질의 계획 캐시 관련 파라미터

다음은 질의 계획에 대한 캐시 기능과 관련된 파라미터로 각 파라미터의 타입과 설정 가능한 값의 범위는 다음과 같다.

파라미터 이름

타입

기본값

최소값

최대값

max_plan_cache_entries

int

1,000

max_filter_pred_cache_entries

int

1,000

max_plan_cache_entries

max_plan_cache_entries 는 메모리에 캐시하는 질의 실행 계획의 최대 개수를 설정하는 파라미터이다. max_plan_cache_entries 파라미터가 -1이나 0으로 설정되면 작성된 질의 실행 계획을 메모리 캐시에 저장하지 않는 것이며, 1 이상의 정수값이 설정되면 설정된 개수만큼의 질의 실행 계획을 메모리 캐시한다.

다음은 최대 1,000개의 질의에 대해 질의 실행 계획 캐시 기능을 수행하는 예제이다.

max_plan_cache_entries=1000

max_filter_pred_cache_entries

max_filter_pred_cache_entries 는 메모리에 캐시하는 필터링된 인덱스 표현식의 최대 개수를 설정하는 파라미터이다. 필터링된 인덱스 표현식은 컴파일된 상태로 저장되므로, 서버에서 즉시 사용할 수 있다. 캐시에 저장되어 있지 않을 경우, 필터링된 인덱스 표현식을 데이터베이스 스키마에서 가져와서 해석하는 과정이 필요하다.

유틸리티 관련 파라미터

다음은 CUBRID에서 사용되는 유틸리티와 관련된 파라미터로 각 파라미터의 타입과 설정 가능한 값의 범위는 다음과 같다.

파라미터 이름

타입

기본값

최소값

최대값

backup_volume_max_size_bytes

byte

0

32K

communication_histogram

bool

no

compactdb_page_reclaim_only

int

0

csql_history_num

int

50

1

200

backup_volume_max_size_bytes

backup_volume_max_size_bytescubrid backupdb 유틸리티에 의해 생성되는 백업 볼륨 파일의 분할 크기를 바이트 단위로 설정하는 파라미터이다. 값 뒤에 B, K, M, G, T로 단위를 붙일 수 있으며, 각각 Bytes, Kilobytes, Megabytes, Gigabytes, Terabytes를 의미한다. 단위를 생략하면 바이트 단위가 적용된다. 기본값은 0이고, 최소값은 32K이다.

기본값인 0 으로 설정하면 생성되는 백업 볼륨이 분할되지 않으며, 0보다 큰 값을 설정하면 지정된 크기의 단위로 백업 볼륨 파일을 분할하여 생성한다.

communication_histogram

communication_histogram 은 csql 인터프리터의 세션 명령어;.h “와 관련된 파라미터이며, 기본값은 no 이다. CSQL 실행 통계 정보 출력 를 참고한다.

compactdb_page_reclaim_only

compactdb_page_reclaim_onlycompactdb 유틸리티와 관련된 파라미터로 이미 할당된 저장 영역의 OID를 재사용하기 위하여 이미 삭제된 객체의 저장 영역을 정리하는 유틸리티이다. compactdb 유틸리티에 의해 저장 영역이 재정렬되는 작업은 3단계로 구분할 수 있으며, compactdb_page_reclaim_only 파라미터를 통해 재정렬 작업의 단위를 선택할 수 있다. 기본값인 0 으로 설정하면 1, 2, 3단계를 모두 수행하므로 데이터 단위, 테이블 단위, 파일 단위로 저장 영역을 재정렬한다. 1로 설정하면 1단계를 생략하므로 테이블 및 파일 단위로 저장 영역을 재정렬하고, 2로 설정하면 1, 2단계를 생략하므로 파일 단위로만 저장 영역을 재정렬한다.

  • 1단계 : 데이터 단위로 저장 영역을 재정렬한다.

  • 2단계 : 테이블 단위로 저장 영역을 재정렬한다.

  • 3단계 : 파일 단위(heap file)로 저장 영역을 재정렬한다.

csql_history_num

csql_history_num 은 CSQL 인터프리터와 관련된 파라미터로 CSQL 인터프리터 내에서 히스토리 내역으로 저장되는 SQL 문의 개수를 설정하는 파라미터이다. 기본값은 50 이다.

HA 관련 파라미터

다음은 HA 관련 파라미터로, 각 파라미터의 타입과 설정 가능한 값의 범위는 다음과 같다.

파라미터 이름

타입

기본값

ha_mode

string

off

ha_mode

ha_mode 는 CUBRID HA 기능을 설정하기 위한 파라미터이며, 기본값은 off 이다.

  • off : CUBRID HA 기능을 사용하지 않는다.

  • on : 설정한 노드는 failover의 대상이 되는 노드로, CUBRID HA 기능을 사용한다.

  • replica : 설정한 노드는 failover의 대상이 되지 않는 노드로, CUBRID HA 기능을 사용한다.

CUBRID HA 기능을 사용하려면 ha_mode 파라미터를 설정하는 것 외에 cubrid_ha.conf 파일에서 HA 관련 파라미터를 설정해야 한다. 자세한 내용은 CUBRID HA 를 참고한다.

기타 파라미터

다음은 기타 파라미터 정보로 각 파라미터의 타입과 설정 가능한 값의 범위는 다음과 같다.

파라미터 이름

타입

기본값

최소값

최대값

access_ip_control

bool

no

access_ip_control_file

string

agg_hash_respect_order

bool

yes

auto_restart_server

bool

yes

enable_string_compression

bool

yes

index_scan_in_oid_order

bool

no

index_unfill_factor

float

0.05

0

0.5

java_stored_procedure

bool

no

java_stored_procedure_jvm_options

string

multi_range_optimization_limit

int

100

0

10,000

optimizer_enable_merge_join

bool

no

pthread_scope_process

bool

yes

server

string

service

string

session_state_timeout

sec

21,600 (6 hours)

60(1 minute)

31,536,000 (1 year)

sort_limit_max_count

int

1000

0

INT_MAX

sql_trace_slow

msec

-1(inf)

0

86,400,000 (24 hours)

sql_trace_execution_plan

bool

no

use_orderby_sort_limit

bool

yes

vacuum_prefetch_log_mode

int

1

0

1

vacuum_prefetch_log_buffer_size

int

50M

25M

INT_MAX

data_buffer_neighbor_flush_pages

int

8

0

32

data_buffer_neighbor_flush_nondirty

bool

no

access_ip_control

access_ip_control 은 서버 접속을 허용하는 IP를 제한하는 기능 사용 여부를 지정하는 파라미터이다. 기본값은 no 이다. 자세한 내용은 데이터베이스 서버 접속 제한 을 참고한다.

access_ip_control_file

access_ip_control_file 은 서버가 허용하는 IP 목록을 저장한 파일 이름을 지정하는 파라미터이다. access_ip_control 값이 yes이면 데이터베이스 서버는 이 파라미터로 지정한 파일에 저장된 IP의 접속만 허용한다. 자세한 내용은 데이터베이스 서버 접속 제한 을 참고한다.

agg_hash_respect_order

agg_hash_respect_order 는 집계 함수에서 그룹이 순서대로 반환되는지 여부를 설정하는 파라미터이다. 기본값은 yes 이다. max_agg_hash_size 를 참고한다.

이 모든 그룹(키와 누적 결과)이 해시 메모리에 상주할 수 있으면, “agg_hash_respect_order=no” 설정은 결과를 출력하기 전에 정렬하는 과정을 생략할 것이므로, 순서가 보장되지 않을 것이라고 예측할 수 있다. 그러나, 오버플로우가 발생하면 정렬 과정이 수행되어야 하며 “agg_hash_respect_order=false”로 설정되었더라도 정렬된 결과를 얻게 된다.

auto_restart_server

auto_restart_server 는 데이터베이스 서버 프로세스에 심각한 오류가 발생해서 프로세스가 중단될 경우에 자동으로 재시작할 것인가를 지정하는 파라미터이다. auto_restart_serveryes 로 설정하면 서버 프로세스가 오류로 중단되었을 때 자동으로 재시작한다. 정상적인 종료 절차(CUBRID 서버의 STOP 명령)에 의해 종료된 경우에는 해당하지 않는다.

enable_string_compression

enable_string_compression 은 문자열 타입 값을 힙, 인덱스 또는 리스트에 저장할 때 문자열 압축 사용 여부를 설정하는 파라미터이다. enable_string_compression 값을 yes 로 설정하면 문자열 크기가 255바이트 이상이고, 압축된 문자열이 원래 문자열의 크기보다 작을 경우 압축된 문자열로 저장된다.

index_scan_in_oid_order

index_scan_in_oid_order 는 인덱스를 스캔한 후 검색 결과 데이터를 가져오는 순서를 OID 순으로 지정하기 위한 파라미터이다. 기본값인 no 로 설정하면 데이터 순서대로 결과를 가져오고, yes로 설정하면 OID 순서대로 결과를 가져온다.

index_unfill_factor

최초 인덱스 생성 후 INSERTUPDATE 를 실행할 때 인덱스 페이지가 꽉 차서 여유 공간이 없으면 인덱스 페이지 노드 분할(split)이 발생하는데, 이는 오퍼레이션 시간을 증가시켜 성능에 영향을 미친다. index_unfill_factor 는 인덱스를 생성할 때 각 인덱스 페이지 노드의 여유 공간을 확보하는 비율을 지정하는 파라미터이다. index_unfill_factor 설정값은 인덱스를 처음 생성할 때만 적용되며, 페이지에 지정된 빈 공간의 비율을 동적으로 유지하지 않는다. 값의 범위는 0부터 0.5까지이고 기본값은 0.05 이다.

인덱스를 생성할 때 인덱스의 페이지 노드에 여유 공간이 없이(index_unfill_factor 를 0으로 설정) 생성한다면, 추가로 삽입할 때마다 매번 인덱스 페이지 노드의 분할이 발생하여 성능에 영향을 끼친다.

index_unfill_factor 값이 크면 인덱스 생성 시 노드 여유 공간을 많이 확보한다. 따라서 최초 인덱스 생성 후 노드 여유 공간이 꽉 찰 때까지 상대적으로 긴 시간 동안 인덱스 노드의 분할이 발생하지 않으므로, 상대적으로 성능이 나을 수 있다.

이 값이 작으면 인덱스 생성 시 노드 여유 공간이 작기 때문에, 인덱스 노드의 여유 공간이 금방 꽉 차게 될 가능성이 높으므로, 상대적으로 INSERTUPDATE 에 의한 인덱스 노드 분할 발생 가능성이 높다.

java_stored_procedure

java_stored_procedure 는 Java 가상 머신(Java Virtual Machine, JVM)을 실행하여 Java 저장 프로시저(Java stored procedure)를 사용하게 하기 위한 파라미터이다. 기본값인 no로 설정하며 JVM이 실행되지 않고, yes로 설정하면 JVM이 실행되어 Java 저장 프로시저(Java stored procedure)를 사용할 수 있다. 따라서, Java 저장 프로시저를 사용할 계획이 있는 경우에는 파라미터를 yes로 설정해야 한다.

java_stored_procedure_jvm_options

java_stored_procedure_jvm_options 는 Java 저장 프로시저(Java stored procedure)가 실행되는 Java 가상 머신(Java Virtual Machine, JVM)과 Java 옵션을 설정하기 위한 파라미터이다. 각 옵션 문자열은 공백으로 구분해야한다. JVM 옵션의 경우 표준 옵션, 비표준 옵션 그리고 고급 옵션이 있다. 비표준과 고급 옵션의 경우 모든 JVM 구현에서 지원하는 것을 보장하지 않는다. 기본값은 빈 문자열이다. 만약 파라미터가 [@<database>] 섹션에 설정되면, [common] 섹션에서 설정된 옵션은 해당 데이터베이스에 적용되지 않는다.

.....
[common]
.....
java_stored_procedure_jvm_options="-Xms1024m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m"
.....
[@testdb]
.....
java_stored_procedure=yes

# -XX:PermSize=512m and -XX:MaxPermSize=512m 옵션은 [common] 섹션에 설정되었더라도 testdb에 적용되지 않는다.
java_stored_procedure_jvm_options="-Xms2048m -Xmx2048m"
.....

multi_range_optimization_limit

multi_range_optimization_limit 은 다중 범위(col IN (? , ?, … ,?))의 조건을 가지며 인덱스 사용이 가능한 질의에서, LIMIT 절이 지정하는 행의 개수가 이 파라미터가 지정하는 숫자 이내이면 인덱스 정렬 방식에 대한 최적화를 수행한다. 기본값은 100 이다.

예를 들어, 이 파라미터의 값이 50일 때 LIMIT 10이면 이 파라미터가 지정한 값 이내이므로 각 조건에 해당하는 범위의 값을 정렬하면서 결과를 생성한다. LIMIT 60이면 파라미터 설정값을 초과하므로 각 조건에 해당하는 범위의 값을 모두 가져온 후 정렬한다.

이 값의 설정에 따라 중간 값의 정렬을 진행하면서(on-the-fly) 결과를 수집하느냐, 결과 값을 먼저 수집한 후 정렬하느냐의 차이가 발생하므로, 이 값이 너무 크면 오히려 성능에 불리할 수 있다.

optimizer_enable_merge_join

optimizer_enable_merge_join 는 정렬 병합 조인(sort merge join) 계획을 질의 실행 계획의 후보에 포함할 것인지 여부를 지정하는 파라미터이다. 기본값은 no 이다. 정렬 병합 조인과 관련된 내용은 SQL 힌트 를 참고한다.

pthread_scope_process

pthread_scope_process 는 스레드의 경쟁 범위를 설정하는 파라미터로 AIX 시스템에서만 적용된다. no로 설정하면 경쟁 범위가 PTHREAD_SCOPE_SYSTEM 이 되고, yes로 설정하면 PTHREAD_SCOPE_PROCESS 가 된다. 기본값은 yes 이다.

server

server 는 CUBRID 서비스 시작 시 자동으로 시작하도록 하는 데이터베이스 서버 프로세스들의 이름을 등록하는 파라미터이다. 해당 데이터베이스들의 이름을 쉼표(,)로 구분하여 나열한다.

service

service 는 CUBRID 서비스 시작 시 자동으로 시작하는 프로세스를 등록하는 파라미터로 server, broker, manager, heartbeat 의 네 종류 프로세스가 있다. 일반적으로 service=server,broker,manager 와 같이 세 종류 프로세스를 등록한다. 각 프로세스에 따른 동작은 다음과 같다.

  • server : @server 파라미터에서 지정한 데이터베이스 프로세스를 시작한다.

  • broker : 브로커 프로세스를 시작한다.

  • manager : 매니저 프로세스를 시작한다.

  • heartbeat : HA 관련 프로세스를 시작한다.

session_state_timeout

session_state_timeout 은 DB 서버 프로세스 내에서 세션 데이터가 유지되는 시간을 정의하는 시스템 파라미터이다. 세션 데이터는 드라이버가 연결을 종료하거나 세션 기간이 만료될(expired) 때 삭제되며, 응용 클라이언트가 비정상 종료되면 지정한 시간 이후에 세션 기간이 만료된다.

CUBRID 세션 데이터에 해당하는 것은 SET 으로 정의된 사용자 변수, PREPARE 문, 가장 마지막에 삽입한 ID(LAST_INSERT_ID), 가장 마지막에 실행한 문장에 영향받은 레코드의 개수(ROW_COUNT)이다. SET 으로 정의된 사용자 변수와 PREPARE 문은 세션 기간이 만료되기 전에 DROP / DEALLOCATE 문을 수행하여 삭제할 수 있다.

기본값은 21,600 (6시간)이고, 단위는 초이다.

sort_limit_max_count

“ORDER BY … LIMIT N ” 구문에 의해 top-N개의 행이 정렬될 때 적용될 수 있는 SORT-LIMIT 최적화와 관련하여, 해당 최적화를 적용하는 것을 제한하는 LIMIT 행 개수를 명시한다. N 의 값이 sort_limit_max_count 의 값보다 작을 때 SORT-LIMIT 최적화가 적용된다. 기본값은 1,000 이며, 최소값은 0(최적화를 항상 안 한다는 뜻), 최대값은 INT_MAX이다.

좀더 자세한 사항은 SORT-LIMIT 최적화 를 참고한다.

sql_trace_slow

sql_trace_slow 는 장기 실행 질의(long running query)로 판단될 질의 실행 시간을 설정하는 파라미터이다. ms, s, min, h 단위를 지정할 수 있으며 각각 milliseconds, seconds, minutes, hours를 의미한다. 단위 생략 시 기본 단위는 밀리초(ms)이다. 기본값은 -1 이고 최대값은 86,400,000 밀리초(24h)이다. -1은 무한대 시간을 의미하며 어떤 질의도 장기 실행 질의로 판단되지 않는다. 자세한 내용은 아래의 sql_trace_execution_plan 의 설명을 참고한다.

Note

sql_trace_slow 는 서버의 질의 실행 시간을 기준으로 실행 시간 초과 여부를 판단하며, MAX_QUERY_TIMEOUT 브로커 파라미터는 브로커 단에서의 질의 실행 시간을 기준으로 이를 판단한다.

sql_trace_execution_plan

sql_trace_execution_plansql_trace_slow 파라미터 값의 설정 시간을 초과한 장기 실행 질의(long running query)의 실행 계획을 출력할지 여부를 설정하는 파라미터이다. 기본값은 no 이다.

이 값이 yes이면 서버 에러 로그 파일($CUBRID/log/server 이하의 파일), CAS 로그 파일($CUBRID/log/broker/sql_log 이하의 파일)에 해당 SQL 문, 질의 실행 계획, cubrid statdump 명령의 출력 정보를 기록하며, cubrid plandump를 실행할 때 해당 SQL 문과 질의 실행 계획을 출력한다.

이 값이 no면 서버 에러 로그 파일, CAS 로그 파일에 해당 SQL문만 기록하며, cubrid plandump를 실행할 때 해당 SQL 문만 출력한다.

예를 들어 5초를 초과하면 느린 질의(slow query)로 규정하고 해당 질의의 실행 계획을 로그 파일에 출력하고 싶은 경우, sql_trace_slow 의 값을 5,000(ms)로 설정하고 sql_trace_execution_plan 의 값을 yes로 설정한다.

단, 서버 에러 로그 파일에는 error_log_level 파라미터의 값이 NOTIFICATION인 경우에만 해당 정보를 기록한다.

use_orderby_sort_limit

use_orderby_sort_limitORDER BY … LIMIT row_count 절을 포함하는 구문에서 질의의 정렬 및 합병(sort and merge) 과정의 중간 결과를 row_count 만큼만 유지할 것인지를 지정하는 파라미터이다. yes 이면 중간 정렬 결과를 row_count 만큼만 유지하기 때문에 불필요한 비교 및 합병 과정을 줄일 수 있다. 기본값은 yes 이다.

vacuum_prefetch_log_mode

vacuum_prefetch_log_mode 는 vacuum을 위하여 로그 페이지의 프리패치(prefetch) 모드를 설정하는 파라미터이다.

모드 0에서는 vacuum 마스터 스레드가 공유 버퍼에서 필요한 로그 페이지를 프리패치한다. 모드 1(기본값)에서는 각 vacuum 작업자가 자체 버퍼에서 필요한 로그 페이지를 프리패치한다. 또한 모드 0에서는 vacuum_prefetch_log_buffer_size 시스템 파라미터를 설정해야 하지만, 모드 1에서는 이 파라미터를 무시하고 각 vacuum 작업자가 전체 vacuum 로그 블록(기본 32개의 로그 페이지)을 프리패치한다.

vacuum_prefetch_log_buffer_size

vacuum_prefetch_log_buffer_size 는 vacuum의 로그 프리패치 버퍼 크기를 설정하는 파라미터이다. 이 파라미터는 vacuum_prefetch_log_mode 를 0으로 설정한 경우에만 사용한다.

data_buffer_neighbor_flush_pages

data_buffer_neighbor_flush_pages 는 백그라운드 플러시(희생자 후보 플러시) 기능을 이용해 플러시될 인접 페이지 수를 관리하는 파라미터이다. 이 값이 1 이하인 경우 인접 플러시 기능이 비활성화된 것으로 간주한다.

data_buffer_neighbor_flush_nondirty

data_buffer_neighbor_flush_nondirty 인접 플러시 기능이 활성화상태이고(data_buffer_neighbor_flush_pages 가 1보다 큰 경우) 희생자 후보 페이지가 플러시될 때 , 더티 페이지에 인접한 더티가 아닌 단일 페이지들도 함께 플러시된다.

브로커 설정

cubrid_broker.conf 설정 파일과 기본 제공 파라미터

브로커 시스템 파라미터

다음은 cubrid_broker.conf 설정 파일에 사용할 수 있는 브로커 파라미터이다. 각 파라미터에 대한 설명은 공통 적용 파라미터브로커별 파라미터 를 참조한다. 동적으로 설정값 변경이 가능한 파라미터는 broker_changer 유틸리티를 이용하여 한시적으로 변경할 수 있다. cubrid broker restart 로 전체 브로커를 재시작한 후에도 값이 적용되도록 하려면 cubrid_broker.conf 에 설정된 값을 변경해 두어야 한다.

적용 구분

용도

파라미터 이름

타입

기본값

동적 변경

공통 적용 파라미터

접속

ACCESS_CONTROL

bool

no

ACCESS_CONTROL_FILE

string

로그

ADMIN_LOG_FILE

string

log/broker/cubrid_broker.log

브로커 서버(cub_broker)

MASTER_SHM_ID

int

30,001

브로커별 파라미터

접속

ACCESS_LIST

string

ACCESS_MODE

string

RW

가능

BROKER_PORT

int

30,000(최대값: 65,535)

CONNECT_ORDER

string

SEQ

가능

ENABLE_MONITOR_HANG

string

OFF

KEEP_CONNECTION

string

AUTO

가능

MAX_NUM_DELAYED_HOSTS_LOOKUP

int

-1

PREFERRED_HOSTS

string

가능

RECONNECT_TIME

sec

600

가능

REPLICA_ONLY

string

OFF

브로커 응용 서버(CAS)

APPL_SERVER_MAX_SIZE

MB

Windows 32비트: 40, Windows 64비트: 80, Linux: 0 (최대값: 2,097,151)

가능

APPL_SERVER_MAX_SIZE_HARD_LIMIT

MB

1,024(최대값: 2,097,151)

가능

APPL_SERVER_PORT

int

BROKER_PORT+1

APPL_SERVER_SHM_ID

int

30,000

AUTO_ADD_APPL_SERVER

string

ON

MAX_NUM_APPL_SERVER

int

40

MIN_NUM_APPL_SERVER

int

5

TIME_TO_KILL

sec

120

가능

트랜잭션 및 질의

CCI_DEFAULT_AUTOCOMMIT

string

ON

LONG_QUERY_TIME

sec

60(최대값: 86,400)

가능

LONG_TRANSACTION_TIME

sec

60(최대값: 86,400)

가능

MAX_PREPARED_STMT_COUNT

int

2,000(최소값: 1)

가능

MAX_QUERY_TIMEOUT

sec

0(최대값: 86,400)

가능

SESSION_TIMEOUT

sec

300

가능

STATEMENT_POOLING

string

ON

가능

TRIGGER_ACTION

string

ON

가능

로그

ACCESS_LOG

string

OFF

가능

ACCESS_LOG_DIR

string

log/broker

ACCESS_LOG_MAX_SIZE

KB

10M(최대값: 2G)

가능

ERROR_LOG_DIR

string

log/broker/error_log

가능

LOG_DIR

string

log/broker/sql_log

가능

SLOW_LOG

string

ON

가능

SLOW_LOG_DIR

string

log/broker/sql_log

가능

SQL_LOG

string

ON

가능

SQL_LOG_MAX_SIZE

KB

10000

가능

기타

MAX_STRING_LENGTH

int

-1

SERVICE

string

ON

SOURCE_ENV

string

cubrid.env

기본 제공 파라미터

CUBRID 설치 시 생성되는 기본 브로커 설정 파일인 cubrid_broker.conf 에는 브로커 파라미터 중에서 반드시 변경해야 할 일부 파라미터가 기본으로 포함된다. 기본으로 포함되지 않는 파라미터의 설정값을 변경하기 원할 경우 직접 추가/편집해서 사용하면 된다.

다음은 설치 시 기본으로 제공되는 cubrid_broker.conf 파일 내용이다.

[broker]
MASTER_SHM_ID           =30001
ADMIN_LOG_FILE          =log/broker/cubrid_broker.log

[%query_editor]
SERVICE                 =ON
BROKER_PORT             =30000
MIN_NUM_APPL_SERVER     =5
MAX_NUM_APPL_SERVER     =40
APPL_SERVER_SHM_ID      =30000
LOG_DIR                 =log/broker/sql_log
ERROR_LOG_DIR           =log/broker/error_log
SQL_LOG                 =ON
TIME_TO_KILL            =120
SESSION_TIMEOUT         =300
KEEP_CONNECTION         =AUTO

[%BROKER1]
SERVICE                 =ON
BROKER_PORT             =33000
MIN_NUM_APPL_SERVER     =5
MAX_NUM_APPL_SERVER     =40
APPL_SERVER_SHM_ID      =33000
LOG_DIR                 =log/broker/sql_log
ERROR_LOG_DIR           =log/broker/error_log
SQL_LOG                 =ON
TIME_TO_KILL            =120
SESSION_TIMEOUT         =300
KEEP_CONNECTION         =AUTO

브로커 설정 파일 관련 환경 변수

CUBRID_BROKER_CONF_FILE 환경 변수를 사용하여 cubrid_broker.conf 파일의 위치를 지정할 수 있다. 서로 다른 구성으로 여러 개의 브로커를 실행할 때 사용한다.

공통 적용 파라미터

다음은 브로커 전체에 공통으로 적용되는 파라미터로 [broker] 아래에 작성된다.

접속

ACCESS_CONTROL

ACCESS_CONTROL 은 브로커에 접속하는 응용 클라이언트를 제한하기 위한 파라미터이다. 기본값은 OFF 이다. 자세한 내용은 브로커 서버 접속 제한 을 참고한다.

ACCESS_CONTROL_FILE

ACCESS_CONTROL_FILE 은 브로커에 접속을 허용하는 데이터베이스 이름, 데이터베이스 사용자 ID, IP 목록을 저장한 파일 이름을 지정하는 파라미터이다. IP 목록은 하나의 브로커 내에서 <db_name>:<db_user> 별로 최대 256 라인까지 작성될 수 있다. 자세한 내용은 브로커 서버 접속 제한 을 참고한다.

로그

ADMIN_LOG_FILE

ADMIN_LOG_FILE 은 CUBRID 브로커의 구동에 관한 시간 기록을 저장하는 파일을 지정하기 위한 파라미터이다. 기본값은 log/broker/cubrid_broker.log 파일이다.

브로커 서버(cub_broker)

MASTER_SHM_ID

MASTER_SHM_ID 는 CUBRID 브로커를 관리하기 위해 사용되는 공유 메모리의 ID를 설정하는 파라미터로, 이 값은 시스템 내에서 유일한 값이어야 한다. 기본값은 30,001 로 설정된다.

브로커별 파라미터

다음은 브로커에 개별적으로 적용되는 파라미터로 [%broker_name] 아래에 각각 작성된다. broker_name 의 최대 길이는 영문 63자이다.

접속

ACCESS_LIST

ACCESS_LIST 는 CUBRID 브로커로 접근을 허용하는 응용 클라이언트의 IP 주소 리스트를 저장할 파일 이름을 지정하는 파라미터이다. 210.192.33.*와 210.194.34.*인 IP 주소의 접근을 허용하려면 이를 임의의 파일(ip_lists.txt)에 저장하여 이 파라미터의 값으로 파일명을 설정한다.

ACCESS_MODE

ACCESS_MODE 는 브로커의 모드를 설정하는 파라미터로 기본값은 RW 이다. 자세한 내용은 cubrid_broker.conf 를 참고한다.

BROKER_PORT

BROKER_PORT 는 해당 브로커의 포트 번호를 지정하기 위한 파라미터로 시스템 내에서 유일한 값이면서 65,535 이하의 값이어야 한다. query_editor 의 브로커 포트는 기본값이 30,000 으로 설정되며, broker1 의 브로커 포트는 기본값이 33,000 으로 설정된다.

CONNECT_ORDER

CAS가 연결할 호스트 순서를 결정할 때 $CUBRID_DATABASES/databases.txt 에 설정된 호스트에서 순서대로 연결을 시도할지 랜덤한 순서대로 연결을 시도할지를 지정하는 파라미터이다. 기본값은 SEQ 이며 순서대로 연결을 시도한다. 이 값이 RANDOM 이면 랜덤한 순서대로 연결을 시도한다. PREFERRED_HOSTS 파라미터 값이 명시되어 있으면 먼저 PREFERRED_HOSTS 에 명시된 호스트의 순서대로 연결을 시도한 후 실패할 경우에만 $CUBRID_DATABASES/databases.txt 의 설정 값을 사용한다.

ENABLE_MONITOR_HANG

ENABLE_MONITOR_HANG 은 일정 비율 이상의 CAS가 멈춘(hang) 것으로 판단되면 응용 프로그램이 해당 브로커로의 접속을 차단할 것인지 지정하는 파라미터이다. 이 값이 ON이면 해당 기능을 수행한다. 기본값은 OFF로, 해당 기능을 수행하지 않는다.

브로커 프로세스는 CAS의 멈춤(hang)이 1분 이상 지속되는 경우 CAS를 멈춘(hang) 상태로 판단하고, 해당 CAS의 개수에 따라 해당 브로커 프로세스가 비정상으로 판단되면 정상화되기 전까지 해당 브로커로 접속을 시도하는 응용 프로그램을 차단하여, 접속 URL에 설정한 대체 호스트(altHosts)로의 접속을 유도한다.

KEEP_CONNECTION

KEEP_CONNECTION 은 CAS와 응용 클라이언트 사이의 연결 방식을 지정하는 파라미터로 ON / AUTO 중 하나로 설정된다. 이 파라미터가 ON 으로 설정되면 커넥션 단위로 CAS와 연결한다. 또한 AUTO 로 설정되면 CAS의 개수가 클라이언트 개수보다 많은 경우 커넥션 단위로 연결하고, CAS의 개수가 클라이언트의 개수보다 적은 경우 트랜잭션 단위로 연결한다. 기본값은 AUTO 이다.

MAX_NUM_DELAYED_HOSTS_LOOKUP

databases.txt의 db-host에 여러 대의 DB 서버를 명시한 HA 환경에서 거의 모든 DB 서버에서 복제 지연이 발생하는 경우, MAX_NUM_DELAYED_HOSTS_LOOKUP 파라미터에서 명시한 대수의 복제 지연 서버까지만 연결 여부를 검토한 후 연결을 결정한다(어떤 DB 서버의 복제 지연 여부는 standby 상태의 호스트만을 대상으로 판단하며, ha_delay_limit 파라미터의 설정에 따라 결정됨). 보다 자세한 사항은 MAX_NUM_DELAYED_HOSTS_LOOKUP 을 참고한다.

PREFERRED_HOSTS

PREFERRED_HOSTS 는 CAS가 우선적으로 연결할 호스트 순서를 지정하는 파라미터이다. PREFERRED_HOSTS 에 설정된 호스트 순서대로 연결을 시도했으나 실패하는 경우 $CUBRID_DATABASES/databases.txt 에 설정된 호스트 순서대로 연결을 시도한다. 기본값은 NULL 이다. 자세한 내용은 cubrid_broker.conf 를 참고한다.

RECONNECT_TIME

특정 상황에서 RECONNECT_TIME 으로 명시한 시간이 경과하면 CAS가 다른 DB 서버에 재연결을 시도한다. 기본값은 600s(10min)이다. 값 뒤에 ms, s, min, h의 단위 지정이 가능하며, 각각 milliseconds, seconds, minutes, hours를 의미한다. 단위가 생략되면 s로 지정된다.

CAS가 서버에 재연결을 시도하는 특정 상황은 다음과 같다.

  • CAS가 PREFERRED_HOSTS 에 명시한 DB 서버가 아닌 databases.txt의 db-host에 명시한 DB 서버에 연결한 경우

  • “ACCESS_MODE=RO”(Read Only)인 CAS가 standby DB 서버가 아닌 active DB 서버에 연결한 경우

  • CAS가 복제 지연 상태인 DB 서버와 연결한 경우

RECONNECT_TIME 값이 0이면 재연결을 시도하지 않는다.

REPLICA_ONLY

REPLICA_ONLY 의 값이 ON 이면 CAS가 레플리카에만 접속된다. 기본값은 OFF 이다. REPLICA_ONLY 의 값이 ON 이더라도 ACCESS_MODE 의 값이 RW 이면 레플리카 DB에 직접 접속하여 쓰기 작업을 수행할 수 있다. 단, 레플리카에 직접 쓰는 데이터는 복제되지 않는다.

Note

레플리카에 직접 데이터를 쓰는 경우 복제 불일치가 발생함에 주의해야 한다.

브로커 응용 서버(CAS)

APPL_SERVER_MAX_SIZE

APPL_SERVER_MAX_SIZE 는 CAS가 처리하는 프로세스 메모리 사용량의 최대 크기를 지정하는 파라미터이다. 값 뒤에 B, K, M, G로 단위를 붙일 수 있으며, 각각 Bytes, Kilobytes, Megabytes, Gigabytes를 의미한다. 단위 생략 시 M으로 지정된다.

이 파라미터는 진행 중인 트랜잭션이 있을 경우 사용자에 의해 정상 종료(커밋 혹은 롤백)되기를 기다렸다가 CAS를 재구동하는 동작에 영향을 준다. APPL_SERVER_MAX_SIZE_HARD_LIMITAPPL_SERVER_MAX_SIZE 와 비슷하지만, 진행 중인 트랜잭션이 있을 경우 이를 강제 종료(롤백)하고 CAS를 재구동하는 동작에 영향을 준다는 점이 다르다.

APPL_SERVER_MAX_SIZE 파라미터는 Windows 버전과 Linux 버전의 기본값이 다르므로 주의한다.

Windows 버전의 CUBRID는 32비트 버전에서는 APPL_SERVER_MAX_SIZE 의 기본값이 40 (MB)이고, 64비트 버전에서는 80 (MB)이다. 최대값은 Windows 버전과 Linux 버전 모두 동일하며 2,097,151 (MB)이다. 현재 프로세스의 크기가 APPL_SERVER_MAX_SIZE 의 값을 초과하면, 브로커가 해당 CAS를 재구동한다.

Linux 버전의 CUBRID는 APPL_SERVER_MAX_SIZE 의 기본값이 0 이고, 다음의 경우에 해당 CAS를 재구동한다.

  • APPL_SERVER_MAX_SIZE 의 값이 0 또는 음수인 경우: 현재 프로세스의 크기가 CAS의 초기 메모리의 2배가 될 때

  • APPL_SERVER_MAX_SIZE 의 값이 양수인 경우: APPL_SERVER_MAX_SIZE 의 설정 값을 초과할 때

Note

이 값을 너무 작게 설정하면 CAS가 빈번하게 재구동될 수 있으므로 주의한다. 일반적으로 APPL_SERVER_MAX_SIZE_HARD_LIMIT 의 값을 APPL_SERVER_MAX_SIZE 의 값보다 크게 설정한다. 자세한 내용은 APPL_SERVER_MAX_SIZE_HARD_LIMIT 의 설명을 참고한다.

APPL_SERVER_MAX_SIZE_HARD_LIMIT

APPL_SERVER_MAX_SIZE_HARD_LIMIT 는 CAS가 처리하는 프로세스 메모리 사용량의 최대 크기를 지정하는 파라미터이다. 값 뒤에 B, K, M, G로 단위를 붙일 수 있으며, 각각 Bytes, Kilobytes, Megabytes, Gigabytes를 의미한다. 단위 생략 시 M으로 지정된다. 기본값은 1,024 (MB)이며, 최대값은 2,097,151 (MB)이다.

이 파라미터는 진행 중인 트랜잭션이 있어도 이를 강제 종료(롤백)하고 CAS를 재구동하는 동작에 영향을 준다. APPL_SERVER_MAX_SIZEAPPL_SERVER_MAX_SIZE_HARD_LIMIT 와 비슷하지만, 진행 중인 트랜잭션이 있을 경우 사용자에 의해 정상 종료(커밋 혹은 롤백)되기를 기다렸다가 CAS를 재구동하는 동작에 영향을 준다는 점이 다르다.

Note

이 값을 너무 작게 설정하면 CAS가 빈번하게 재구동될 수 있으므로 주의한다. CAS를 재구동할 때 메모리 사용량이 증가해도 트랜잭션이 정상 종료되기까지 기다리기 위해 APPL_SERVER_MAX_SIZE 를 설정하고, 메모리 사용량이 허용하는 기준을 넘으면 트랜잭션을 강제 종료하기 위해 APPL_SERVER_MAX_SIZE_HARD_LIMIT 를 설정한다. 따라서, 일반적으로 APPL_SERVER_MAX_SIZE_HARD_LIMIT 의 값을 APPL_SERVER_MAX_SIZE 의 값보다 크게 설정한다.

APPL_SERVER_PORT

APPL_SERVER_PORT 는 Windows 운영체제에서만 추가하는 파라미터로 응용 클라이언트와 통신하는 CAS의 통신 포트를 지정하는 파라미터이다. Linux 운영체제에서는 응용 클라이언트와 CAS가 통신하기 위해 유닉스 도메인 소켓(unix domain socket)을 사용하므로, APPL_SERVER_PORT 가 사용되지 않는다. 기본값은 BROKER_PORT 파라미터 값에 1을 더한 값으로 설정되며, 지정한 번호의 포트부터 1씩 더한 번호의 포트들이 CAS의 개수만큼 사용된다. 예를 들어, BROKER_PORT 의 값이 30,000이고 APPL_SERVER_PORT 의 값을 설정하지 않은 상태에서 MIN_NUM_APPL_SERVER 의 값이 5이면 브로커 초기 구동 시 5개의 CAS가 각각 30,001~30,005의 포트를 사용한다. 같은 조건이고 APPL_SERVER_PORT 의 값만 35,000라면 브로커 초기 구동 시 5개의 CAS가 각각 35,000~35,004의 포트를 사용한다. CAS의 최대 개수가 cubrid_broker_confMAX_NUM_APPL_SERVER 파라미터에 의해 제한되므로 설정할 수 있는 CAS의 통신 포트의 개수 역시 최대 MAX_NUM_APPL_SERVER 파라미터의 설정값으로 제한된다.

Windows 운영체제에서 응용 클라이언트와 CUBRID 브로커 사이에 방화벽이 존재한다면 반드시 BROKER_PORTAPPL_SERVER_PORT 에서 설정된 통신 포트를 열어야 한다.

Note

cub_master, cub_broker 프로세스의 유닉스 도메인 소켓 파일 경로를 지정하는 CUBRID_TMP 환경 변수에 대한 내용은 환경 변수 설정 을 참고한다.

APPL_SERVER_SHM_ID

APPL_SERVER_SHM_ID 는 CAS가 이용하는 공유 메모리 ID를 지정하기 위한 파라미터로 시스템 내에서 유일한 값이어야 한다. 기본값은 해당 브로커의 포트와 동일한 값이다.

AUTO_ADD_APPL_SERVER

AUTO_ADD_APPL_SERVER 는 필요한 경우 CAS를 MAX_NUM_APPL_SERVER 값까지 자동으로 증가시킬지 설정하는 파라미터로 ON과 OFF를 가지며, 기본값은 ON 이다.

MAX_NUM_APPL_SERVER

MAX_NUM_APPL_SERVER 는 해당 브로커에 동시 접속할 수 있는 CAS의 최대 개수를 설정하는 파라미터로, 기본값은 40 이다.

MIN_NUM_APPL_SERVER

MIN_NUM_APPL_SERVER 는 해당 브로커에 대한 연결 요청이 없더라도 기본적으로 대기하고 있는 CAS 프로세스의 최소 개수를 설정하는 파라미터로, 기본값은 5 이다.

TIME_TO_KILL

TIME_TO_KILL 은 자동 추가된 CAS 중 유휴 상태의 CAS를 제거하기 위한 기준 시간을 설정하는 파라미터이다. 값 뒤에 ms, s, min, h의 단위 지정이 가능하며, 각각 milliseconds, seconds, minutes, hours를 의미한다. 단위가 생략되면 s로 지정되며, 기본값은 120 s이다.

유휴 상태(idle)란 작업이 없이 쉬고 있는 상태로, 이 상태가 TIME_TO_KILL 시간 이상 유지되면 해당 CAS를 제거한다.

이 파라미터에 설정된 값은 자동 추가된 CAS에만 적용되므로 AUTO_ADD_APPL_SERVER 파라미터가 ON 인 경우에만 적용된다. TIME_TO_KILL 파라미터의 값을 너무 작게 설정하면 CAS의 제거/추가가 너무 빈번하게 발생할 수 있으므로 주의한다.

트랜잭션 및 질의

CCI_DEFAULT_AUTOCOMMIT

CCI_DEFAULT_AUTOCOMMIT 은 CCI 인터페이스 또는 CCI기반 인터페이스(PHP, OLE DB, Perl, Python, Ruby 등)로 개발된 응용 프로그램의 자동 커밋 여부를 설정하는 파라미터로 기본값은 ON 이다. 이 파라미터는 JDBC로 개발된 응용 프로그램에는 영향을 끼치지 않는다.

CCI_DEFAULT_AUTOCOMMIT 파라미터의 값이 OFF인 경우 트랜잭션이 종료될 때까지 브로커 응용 서버(CAS) 프로세스를 점유한 상태가 되므로, SELECT 문 수행 시에도 fetch 완료 후 반드시 커밋을 수행할 것을 권장한다.

Note

CCI_DEFAULT_AUTOCOMMIT 파라미터는 2008 R4.0부터 지원하기 시작했고, 이 때 기본값은 OFF였다. CCI_DEFAULT_AUTOCOMMIT 을 설정하지 않은 2008 R4.0 혹은 그 전 버전 사용자는 자동 커밋 모드가 OFF이므로, 2008 R4.1 이상 버전으로 업그레이드한 사용자가 기존 응용 프로그램을 그대로 사용하고자 하는 경우, 이 값을 OFF로 설정해야 의도하지 않은 트랜잭션의 자동 커밋을 방지할 수 있다.

Warning

ODBC 드라이버는 CCI_DEFAULT_AUTOCOMMIT 의 설정이 무시되어 항상 OFF인 상태로 동작하므로, 프로그램에서 자동 커밋 여부를 직접 설정해야 한다.

LONG_QUERY_TIME

LONG_QUERY_TIME 은 장기 실행 질의(long-duration query)로 판단될 질의 실행 시간을 설정하는 파라미터이다. 값 뒤에 ms, s, min, h의 단위 지정이 가능하며, 각각 milliseconds, seconds, minutes, hours를 의미한다. 단위가 생략되면 s로 지정된다. 기본값은 60 (초)이고, 최대값은 86,400(하루)이다. 어떤 질의를 수행할 때 이 값을 초과한 시간이 소요되는 경우, “cubrid broker status” 명령에서 출력하는 LONG-Q의 값이 하나 증가하고, 해당 SQL은 CAS의 SQL SLOW 로그 파일($CUBRID/log/broker/sql_log/*.slow.log)에 기록된다. SLOW_LOG 파라미터를 참고한다.

소수점을 사용하여 밀리초(msec) 단위의 값을 설정할 수 있다. 예를 들어 500밀리초로 설정하려면 값을 0.5로 설정한다.

파라미터 값을 0 으로 설정하면 장기 실행 질의를 판단하지 않는다.

LONG_TRANSACTION_TIME

LONG_TRANSACTION_TIME 은 장기 실행 트랜잭션(long-duration transaction)으로 판단될 트랜잭션의 실행 시간을 설정하는 파라미터이다. 값 뒤에 ms, s, min, h의 단위 지정이 가능하며, 각각 milliseconds, seconds, minutes, hours를 의미한다. 단위가 생략되면 s로 지정된다. 기본값은 60 (초)이고, 최대값은 86,400(하루)이다.

소수점을 사용하여 밀리초(msec) 단위의 값을 설정할 수 있다. 예를 들어 값을 0.5로 설정하여 500밀리초로 설정할 수 있다.

파라미터 값을 0 으로 설정하면 장기 실행 트랜잭션을 판단하지 않는다.

MAX_PREPARED_STMT_COUNT

MAX_PREPARED_STMT_COUNT 은 사용자(응용 프로그램) 접속 당 허용하는 prepared statement의 개수를 제한하는 파라미터이다. 기본값은 2,000 이며 최소값은 1이다. 이 파라미터 값을 사용자가 적절히 지정함으로써, 응용 프로그램의 작성 실수로 인해 시스템이 허용하는 메모리를 초과하여 prepared statement 문을 생성하는 것을 사전에 방지할 수 있다.

Note

broker_changer 명령을 이용하여 MAX_PREPARED_STMT_COUNT 의 값을 동적으로 변경하고자 하는 경우 이전의 설정 값보다 큰 값으로 설정하는 경우만 허용하며, 이전의 설정 값보다 작은 값으로 설정하는 것은 허용하지 않는다.

MAX_QUERY_TIMEOUT

MAX_QUERY_TIMEOUT 은 질의 수행의 타임아웃을 설정하는 브로커 파라미터로, 질의 수행을 시작한 후 지정 시간을 초과하면 수행하던 질의를 멈추고 롤백한다. 값 뒤에 ms, s, min, h의 단위 지정이 가능하며, 각각 milliseconds, seconds, minutes, hours를 의미한다. 단위가 생략되면 s로 지정된다. 기본값은 0 이며, 무한 대기를 의미한다. 값의 범위는 0부터 86400초(1일)까지이다.

응용 프로그램에서 질의 타임아웃을 설정한 경우, 0을 제외하고 MAX_QUERY_TIMEOUT 값과 응용 프로그램의 질의 타임아웃 값 중 작은 값을 적용한다.

Note

CCI 응용 프로그램의 질의 타임아웃 설정은 cci_connect_with_url() 함수, cci_set_query_timeout() 함수를 참고하며, JDBC 응용 프로그램의 질의 타임아웃 설정은 setQueryTimeout 메서드를 참고한다.

SESSION_TIMEOUT

SESSION_TIMEOUT 은 응용 클라이언트에 대한 CAS의 세션 타임 아웃 값을 설정하는 파라미터이다. 값 뒤에 ms, s, min, h의 단위 지정이 가능하며, 각각 milliseconds, seconds, minutes, hours를 의미한다. 단위가 생략되면 s로 지정된다. 기본값은 300 (초)이다.

트랜잭션 시작 이후 커밋 혹은 롤백하지 않은 채로 아무런 요청이 없는 상태에서 이 파라미터가 설정한 시간을 초과하면 해당 응용 클라이언트와 CAS 간의 접속이 종료된다.

STATEMENT_POOLING

STATEMENT_POOLING 은 statement 풀링 기능의 사용 여부를 설정하는 파라미터로 기본값은 ON 이다.

CUBRID는 트랜잭션이 커밋 또는 롤백되는 경우, 해당 클라이언트 세션에 존재하는 prepared statement의 핸들을 모두 close하는데, STATEMENT_POOLING 의 값이 ON 인 경우에는 prepared statement의 핸들을 지속적으로 풀에 유지하므로 이를 재사용할 수 있다. 따라서, prepared statement를 재사용하는 일반 응용 프로그램 또는 statement pooling이 구현된 DBCP와 같은 라이브러리가 적용된 환경에서는 반드시 기본 설정(ON)을 유지해야 한다.

STATEMENT_POOLING 의 값이 OFF 인 상태에서 트랜잭션 커밋 또는 종료 이후 해당 prepared statement를 실행하면 다음과 같은 메시지가 출력된다.

Caused by: cubrid.jdbc.driver.CUBRIDException: Attempt to access a closed Statement.

TRIGGER_ACTION

이 파라미터를 지정한 브로커에 대해 트리거의 동작을 켜거나 끈다. ON 또는 OFF 로 값을 지정하며, 기본값은 ON 이다.

로그

ACCESS_LOG

ACCESS_LOG 는 해당 브로커의 접속 로그를 저장할 것인지 지정하는 파라미터로 기본값은 OFF 이다. 브로커 접속 로그 파일명은 broker_name.access이고, $CUBRID/log/broker 디렉터리에 저장된다.

ACCESS_LOG_DIR

ACCESS_LOG_DIR 은 브로커 접속 로그(ACCESS_LOG) 파일이 생성되는 디렉토리를 지정한다. 기본값은 log/broker 이다.

ACCESS_LOG_MAX_SIZE

ACCESS_LOG_MAX_SIZE 는 브로커 접속 로그(ACCESS_LOG) 파일의 최대 크기를 지정하며, 브로커 접속 로그 파일이 지정한 크기보다 커지면 broker_name.access.YYYYMMDDHHMISS 형식의 이름으로 백업된 후 새 파일(broker_name.access)에 로그가 기록된다. 기본값은 10M 이고, 최대 2G로 설정할 수 있으며, 브로커 구동중 동적으로 변경이 가능하다.

ERROR_LOG_DIR

ERROR_LOG_DIR 은 브로커에 대한 에러 로그가 저장되는 디렉터리를 지정하는 파라미터로, 기본값은 log/broker/error_log 이다. 브로커 에러 로그 파일명은 broker_ name_id.err이다.

LOG_DIR

LOG_DIR 은 SQL 로그가 저장되는 디렉터리를 지정하는 파라미터로, 기본값은 log/broker/sql_log 이다. SQL 로그가 기록되는 파일명은 broker_name_id.sql.log 이다.

SLOW_LOG

SLOW SQL 로깅 여부를 지정하는 파라미터이다. 기본값은 ON 이다. 이 값이 ON 이면 LONG_QUERY_TIME 시간을 초과한 장기 실행(long-duration query) 질의문 또는 에러가 발생한 질의문이 SLOW SQL 로그 파일에 저장된다. 생성되는 파일의 이름은 broker_name_id.slow.log 이며, SLOW_LOG_DIR 이하에 생성된다.

SLOW_LOG_DIR

SLOW SQL 로그 파일이 생성되는 디렉터리를 지정한다. 기본값은 log/broker/sql_log 이다.

SQL_LOG

SQL_LOG 는 응용 클라이언트의 요청에 따라 CAS가 처리한 SQL 문에 대해 어떤 로그를 기록할 것인지 결정하는 파라미터로 기본값은 ON 이다. 이 파라미터가 ON 으로 설정되면, 모든 로그를 기록한다. SQL 로그가 기록되는 파일명은 broker_name_id.sql.log 이며, 설치 디렉터리의 log/broker/sql_log 디렉터리에 생성된다. 파라미터 값은 다음과 같다.

  • OFF : 모든 로그를 기록하지 않음

  • ERROR : 에러가 발생한 질의에 대한 로그만 기록

  • NOTICE : 설정된 시간을 초과한 장기 실행 질의/트랜잭션의 로그, 에러가 발생한 질의에 대한 로그 기록

  • TIMEOUT : 설정된 시간을 초과한 장기 실행 질의/트랜잭션의 로그 기록

  • ON / ALL : 모든 로그 기록

SQL_LOG_MAX_SIZE

SQL_LOG_MAX_SIZE 는 SQL 로그 파일과 SLOW SQL 로그 파일의 최대 크기를 지정하는 파라미터이다. 값 뒤에 B, K, M, G로 단위를 붙일 수 있으며, 각각 Bytes, Kilobytes, Megabytes, Gigabytes를 의미한다. 단위 생략 시 K로 지정된다. 기본값은 10,000 (KB)이다.

  • SQL_LOG 파라미터가 ON 으로 설정된 경우에 생성되는 SQL 로그 파일의 크기가 파라미터의 설정값에 도달하면 broker_name_id.sql.log.bak 이 생성된다.

  • SLOW_LOG 파라미터가 ON 으로 설정된 경우에 생성되는 SLOW SQL 로그 파일의 크기가 이 파라미터의 설정값에 도달하면 broker_name_id.slow.log.bak 이 생성된다.

기타

MAX_STRING_LENGTH

MAX_STRING_LENGTH 는 BIT, VARBIT, CHAR, VARCHAR인 데이터 타입에 대해서 최대 문자열 길이를 지정하는 파라미터이다. 기본값인 -1 로 설정되면 데이터베이스에서 정의된 문자열 길이가 그대로 사용되고, 파라미터의 값이 100 으로 설정되면 임의의 속성이 VARCHAR(1000)으로 정의되었어도 100으로 정의된 것처럼 동작한다.

SERVICE

SERVICE 는 해당 브로커의 구동 여부를 결정하기 위한 파라미터로, ON 또는 OFF 의 값으로 설정된다. 기본값은 ON 이며, 이 파라미터가 ON 으로 설정된 경우에만 해당 브로커를 구동할 수 있다.

SOURCE_ENV

SOURCE_ENV 는 브로커 각각에 대해 개별적으로 운영체제 환경 변수를 설정할 수 있는 파일을 정하는 파라미터로, 파일 확장자는 반드시 env 여야 한다. cubrid.conf 에서 지정하는 모든 파라미터는 환경 변수를 통해서도 설정할 수 있다. 예를 들어, cubrid.conf 에서 lock_timeout 은 환경 변수 CUBRID_LOCK_TIMEOUT 으로 지정할 수 있다. 또 다른 예로, broker1에서만 데이터 정의문 수행을 차단하려면 SOURCE_ENV 에서 지정한 파일에 CUBRID_BLOCK_DDL_STATEMENT 를 1로 설정하면 된다.

환경변수가 있으면 cubrid.conf 보다 우선한다. 기본값은 cubrid.env 이다.

HA 설정

HA 설정은 환경 설정을 참고한다.