시스템 설정¶
성능과 동작에 영향을 미칠 수 있는 시스템 파라미터의 설정 정보를 제공한다. 시스템 파라미터는 시스템의 전체적인 성능과 동작을 결정한다. 이 장에서는 데이터베이스 서버, 브로커에 적용하는 설정 파일의 사용법과 개별 파라미터의 의미를 설명한다. CUBRID 매니저 서버 환경 설정과 관련해서는 CUBRID 매니저 매뉴얼 을 참고한다.
이 장에서 설명하는 주요 내용은 다음과 같다.
- 데이터베이스 서버 설정
- 브로커 설정
데이터베이스 서버 설정¶
데이터베이스 서버 설정이 미치는 범위¶
CUBRID는 데이터베이스 서버, 브로커, CUBRID 매니저로 구성되며, 각 구성요소에 대한 설정 파일이 존재한다. 데이터베이스 서버의 시스템 파라미터 설정 파일은 cubrid.conf이며 $CUBRID/conf 디렉터리에 위치한다. cubrid.conf 에 설정되는 시스템 파라미터는 데이터베이스 시스템의 전체적인 성능과 동작에 영향을 준다. 따라서, 데이터베이스 서버 설정을 이해하는 작업은 매우 중요하다.
CUBRID 데이터베이스 서버는 클라이언트/서버 구조로 구성된다. 구체적으로 서버 라이브러리와 링크되어 있는 데이터베이스 서버 프로세스와 클라이언트 라이브러리와 링크되어 있는 브로커 프로세스로 나뉜다. 서버 프로세스는 데이터베이스 저장 구조를 관리하고 동시성과 트랜잭션 기능을 제공하며, 클라이언트 프로세스는 질의 실행을 위한 준비 단계와 객체 관리 및 스키마 관리 기능을 수행한다.
cubrid.conf 파일에서 설정할 수 있는 데이터베이스 서버의 시스템 파라미터는 적용되는 범위에 따라 클라이언트 파라미터, 서버 파라미터, 클라이언트/서버 파라미터로 구분할 수 있다. 클라이언트 파라미터는 브로커와 같은 클라이언트 프로세스에만 적용되는 파라미터이며, 서버 파라미터는 서버 프로세스의 동작에 영향을 주는 파라미터이다. 클라이언트/서버 파라미터는 서버와 클라이언트에 적용된다.
cubrid.conf 파일의 위치와 적용
- 데이터베이스 서버 프로세스는 $CUBRID/conf/cubrid.conf 파일만 참조한다. 데이터베이스별 설정은 cubrid.conf 파일 내에서 섹션으로 구분한다.
- 클라이언트 프로세스는 1) $CUBRID/conf/cubrid.conf 파일을 참조한 후에, 2) 현재 디렉터리( $PWD )에 있는 cubrid.conf 파일을 추가로 참조한다. 현재 디렉터리 파일( $PWD/cubrid.conf ) 파일의 설정이 $CUBRID/conf/cubrid.conf 파일의 설정을 덮어쓴다. 즉, $PWD/cubrid.conf와 $CUBRID/conf/cubrid.conf 에서 동일한 파라미터에 대한 설정이 존재하면, $PWD/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';
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 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 generic_vol_prealloc_size 서버 byte 50M 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 오류 메시지 관련 파라미터 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 SYNTAX DBA만 가능 error_log_warning 클라이언트/서버 bool no DBA만 가능 error_log_size 클라이언트/서버 int 8,000,000 DBA만 가능 동시성/잠금 파라미터 deadlock_detection_interval_in_secs 서버 float 1.0 DBA만 가능 isolation_level 클라이언트 O int 3 가능 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 10,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 128 * 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 가능 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 가능 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 가능 질의 계획 캐시 관련 파라미터 max_plan_cache_entries 클라이언트/서버 O int 1,000 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 auto_restart_server 서버 O bool yes DBA만 가능 index_scan_in_oid_order 클라이언트 O bool no 가능 index_unfill_factor 서버 float 0.05 java_stored_procedure 서버 bool no multi_range_optimization_limit 서버 O int 100 DBA만 가능 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만 가능
- 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>] 섹션
여기서 <database>는 파라미터를 개별적으로 적용할 데이터베이스 이름이며, [common]에 설정된 파라미터가 [@<database>]에 설정된 파라미터와 동일한 경우 [@<database>]에 설정된 파라미터가 최종 적용된다.
기본 제공 파라미터
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=4M # 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=1523testdb 만 data_buffer_size를 128M로, max_clients를 10으로 설정하고 싶은 경우 다음과 같이 설정한다.
[service] service=server,broker,manager [common] data_buffer_size=512M log_buffer_size=4M 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 | 10,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 |
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 파라미터 값을 조정할 수 있다.
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 | 20M | 20G |
dont_reuse_heap_file | bool | no | ||
generic_vol_prealloc_size | byte | 50M | 0 | 20G |
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 |
db_volume_size
db_volume_size는 다음과 같은 값을 설정하는 파라미터이다. 값 뒤에 B, K, M, G, T로 단위를 붙일 수 있으며, 각각 Bytes, Kilobytes, Megabytes, Gigabytes, Terabytes를 의미한다. 단위를 생략하면 바이트 단위가 적용된다. 기본값은 512M이다.
- cubrid createdb와 cubrid addvoldb 유틸리티에서 --db-volume-size 옵션을 생략했을 때 생성되는 데이터베이스 볼륨의 기본 크기
- 데이터베이스 볼륨 공간을 모두 사용하면 자동으로 추가되는 범용(generic) 볼륨의 기본 크기
dont_reuse_heap_file
dont_reuse_heap_file은 테이블 삭제(DROP TABLE)로 인해 삭제된 힙 파일을 새로운 테이블 생성(CREATE TABLE) 시 재사용하지 않도록 설정하는 파라미터로, no로 설정되면 삭제된 힙 파일을 재사용하고, yes로 설정되면 삭제된 힙 파일을 새로운 테이블 생성 시 재사용하지 않는다. 기본값은 no이다.
generic_vol_prealloc_size
generic 볼륨이 항상 유지해야 할 여유 공간(free space)의 크기를 지정한다. 여유 공간이 지정한 값보다 줄어들게 되면 generic 볼륨의 여유 공간을 추가로 확보한다.
여유 공간의 검사는 generic, data, 또는 index 볼륨에 대한 새로운 페이지 요청이 있을 때만 이루어진다.
값 뒤에 B, K, M, G, T로 단위를 붙일 수 있으며, 각각 Bytes, Kilobytes, Megabytes, Gigabytes, Terabytes를 의미한다. 단위를 생략하면 바이트 단위가 적용된다. 기본값은 50M, 최소값은 0, 최대값은 20G이다.
log_volume_size
log_volume_size는 cubrid 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는 질의 또는 인덱스 생성 등을 위해 데이터를 정렬하는 과정에서 중간 결과 및 최종 결과를 저장하기 위해 일시적 임시 볼륨(temporary temp volume)이 사용될 때, 질의 하나가 수행될 때 사용할 수 있는 임시 공간의 최대 크기를 페이지 개수로 명시하는 파라미터로 기본값은 -1이다.
중간 결과 저장소의 크기와 최종 결과 저장소의 크기는 각각 별개로 측정되므로, 그들 중 하나의 크기가 파라미터가 명시한 크기보다 큰 경우 에러가 발생하면서 해당 질의의 수행이 취소된다. 기본값으로 설정되면 temp_volume_path 파라미터에서 지정된 디스크 공간 이내에서 무제한으로 일시적 임시 볼륨(temporary temp volume)이 저장되고, 0으로 설정되면 일시적 임시 볼륨이 생성되지 않는다.
질의 수행 시 필요한 임시 볼륨(temp 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_path는 cubrid addvoldb 유틸리티로 추가 볼륨을 생성할 때 추가 볼륨의 경로를 지정하는 -F 옵션을 생략하면 기본 경로로 사용할 경로를 지정하는 파라미터이다. 기본값은 데이터베이스 생성 시에 설정된 볼륨 위치이다.
오류 메시지 관련 파라미터¶
다음은 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 | SYNTAX |
error_log_warning | bool | no |
error_log_size | int | 8,000,000 |
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) 수준에 따라 에러 로그 파일에 저장할 에러 메시지를 지정할 수 있는 서버 파라미터이다. 에러 심각성 수준은 가장 낮은 수준인 NOTIFICATION 부터 가장 심각한 수준인 FATAL 까지 총 5단계로 구성되며, 그에 따른 에러 메시지 포함 관계는 FATAL < ERROR < SYNTAX < WARNING < NOTIFICATION이다. 기본값은 SYNTAX이며, 이 경우 FATAL, ERROR, SYNTAX 에 해당하는 에러 메시지만 에러 로그 파일에 기록된다.
error_log_warning
error_log_warning은 에러 심각성(severity) 수준이 WARNING 인 에러 메시지의 출력 여부를 설정할 수 있는 서버 파라미터이다. 기본값은 no이므로, error_log_level 의 값이 NOTIFICATION 으로 설정된 경우에도 WARNING 메시지를 제외한 나머지 수준의 에러 메시지만 저장될 것이다. 따라서, WARNING 메시지가 에러 로그 파일에 저장되도록 하려면, error_log_warning 의 값을 yes로 설정해야 한다.
error_log_size
error_log_size는 에러 로그 파일에서 기록되는 최대 라인 수를 지정하는 파라미터로 기본값은 8,000,000이다. 에러 로그 파일의 라인 수가 이 파라미터의 설정값에 도달하면 <database_name>_<date>_<time>.err.bak 파일이 생성된다.
동시성/잠금 파라미터¶
다음은 데이터베이스 서버의 동시성 제어 및 잠금에 관한 파라미터로 각 파라미터의 타입과 설정 가능한 값의 범위는 다음과 같다.
파라미터 이름 | 타입 | 기본값 | 최소값 | 최대값 |
---|---|---|---|---|
deadlock_detection_interval_in_secs | float | 1.0 | 0.1 | |
isolation_level | int | 3 | 1 | 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 파라미터는 격리 수준을 의미하는 1에서 6까지의 정수값 또는 문자열로 설정하며, 기본값은 TRAN_REP_CLASS_UNCOMMIT_INSTANCE이다. 각 격리 수준 및 파라미터 설정값에 대한 자세한 내용은 트랜잭션 격리 수준 과 다음 표를 참조한다.
격리 수준 isolation_level 파라미터 설정값 SERIALIZABLE "TRAN_SERIALIZABLE" or 6 REPEATABLE READ CLASS with REPEATABLE READ INSTANCES "TRAN_REP_CLASS_REP_INSTANCE" or "TRAN_REP_READ" or 5 REPEATABLE READ CLASS with READ COMMITTED INSTANCES (or CURSOR STABILITY) "TRAN_REP_CLASS_COMMIT_INSTANCE" or "TRAN_READ_COMMITTED" or "TRAN_CURSOR_STABILITY" or 4 REPEATABLE READ CLASS with READ UNCOMMITTED INSTANCES "TRAN_REP_CLASS_UNCOMMIT_INSTANCE" or "TRAN_READ_UNCOMMITTED" or 3 READ COMMITTED CLASS with READ COMMITTED INSTANCES "TRAN_COMMIT_CLASS_COMMIT_INSTANCE" or 2 READ COMMITTED CLASS with READ UNCOMMITTED INSTANCES "TRAN_COMMIT_CLASS_UNCOMMIT_INSTANCE" or 1
- TRAN_SERIALIZABLE : 가장 높은 수준의 일관성을 보장하는 격리 수준이며, SERIALIZABLE 을 참고한다.
- TRAN_REP_CLASS_REP_INSTANCE : 유령 읽기(phantom read)가 발생될 수 있는 격리 수준이며, REPEATABLE READ CLASS with REPEATABLE READ INSTANCES 를 참고한다.
- TRAN_REP_CLASS_COMMIT_INSTANCE : 반복 불가능한 읽기(unrepeatable read)가 발생될 수 있는 격리 수준이며, REPEATABLE READ CLASS with READ COMMITTED INSTANCES 를 참고한다.
- TRAN_REP_CLASS_UNCOMMIT_INSTANCE : 더티 읽기(dirty read)가 발생될 수 있는 격리 수준이며, REPEATABLE READ CLASS with READ UNCOMMITTED INSTANCES 를 참고한다.
- TRAN_COMMIT_CLASS_COMMIT_INSTANCE : 반복 불가능한 읽기(unrepeatable read)가 발생될 수 있고, 데이터 조회 중에 다른 트랜잭션에 의한 테이블 스키마의 변경이 허용되는 격리 수준이며, READ COMMITTED CLASS with READ COMMITTED INSTANCES 를 참고한다.
- TRAN_COMMIT_CLASS_UNCOMMIT_INSTANCE : 더티 읽기(dirty read)가 발생될 수 있고, 데이터 조회 중에 다른 트랜잭션에 의한 테이블 스키마의 변경이 허용되는 격리 수준이며, READ COMMITTED CLASS with READ UNCOMMITTED INSTANCES 를 참고한다.
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 | 128 * log_page_size | 3 * 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에서 체크포인트는 3가지 방법으로 제공되는데, 다음의 2가지는 cubrid.conf의 설정에 의해 제공된다.
- checkpoint_interval: 체크포인트가 완료된 이후 이 파라미터의 설정값이 경과된 시간마다 체크포인트 작업이 주기적으로 수행된다.
- checkpoint_every_size: 트랜잭션 로그 파일의 크기가 이 파라미터의 설정값에 도달하는 시점마다 체크포인트 작업이 주기적으로 수행된다.
이상 두 개의 파라미터 조건 중 하나만 만족하면 체크포인트가 수행된다.
다음의 한 가지는 사용자의 명령으로 제공된다.
- 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_archives는 log_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가 설치된 시스템의 메모리 크기 및 작업 연산의 크기를 고려하여 적당한 값으로 설정할 것을 권장한다.
- 필요한 메모리 크기 = 로그 버퍼 크기(log_buffer_size)
log_max_archives
log_max_archives는 보존할 보관 로그 파일의 최대 개수를 설정하는 파라미터이다. 최소값은 0이며, 기본값은 INT_MAX (2,147,483,647)이다. CUBRID 설치 시 cubrid.conf 에는 0으로 설정되어 있다. 이 파라미터는 force_remove_log_archives 의 설정에 따라 동작이 달라질 수 있다.
예를 들어, cubrid.conf의 log_max_archives가 3이고 force_remove_log_archives가 yes이면, 최근 3개의 보관 로그 파일만 유지하고 네 번째 보관 로그가 생성될 때에는 이전에 생성된 보관 로그 파일을 자동으로 삭제한다. 이때 삭제되는 보관 로그 파일의 정보는 *_lginf 파일에 기록된다.
하지만 활성화된 트랜잭션이 기존 보관 로그 파일을 여전히 참조하고 있다면, 해당 보관 로그 파일은 삭제되지 않는다. 즉, 어떤 트랜잭션이 첫 번째 보관 로그 파일이 생성되는 시점에서 시작되어 다섯 번째 보관 로그 파일이 생성되는 시점까지도 종료되지 않았다면 첫 번째 보관 로그 파일은 삭제되지 않는다.
그리고 보관 로그 파일의 정보가 데이터베이스 볼륨에 아직 반영되어 있지 않은 경우에도 해당 보관 로그 파일은 삭제되지 않는다. (체크포인트가 발생한 이후의 보관 로그는 데이터 버퍼의 수정된 페이지 정보를 가지고 있으므로 데이터베이스 복구를 위해 필요하다.)
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 | ||
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 | |||
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 |
add_column_update_hard_default
add_column_update_hard_default는 ALTER 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 0SET 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이다.
default_week_format
group_concat_max_len
group_concat_max_len은
GROUP_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_lang은 TIME, 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로 쓰인다.
지정된 언어의 숫자 형식에 따라 입력 문자열을 인식하는 함수는 다음과 같다.
지정된 언어의 숫자 형식에 따라 문자열을 출력하는 함수는 다음과 같다.
no_backslash_escapes
no_backslash_escapes은 이스케이프 문자로 백슬래시(\) 사용 여부에 관한 파라미터로서, 기본값은 yes이다. 이 파라미터 값이 no이면 백슬래시(\)가 이스케이프 문자로 사용되며, yes이면 백슬래시는 일반 문자로 사용된다. 예를 들어, 이 값이 no 일 때 "\n"은 개행(new line) 문자를 의미한다. 그러나 이 값이 yes이면 "\n"은 "\"과 "n" 두 개의 문자를 의미한다.
백슬래시가 이스케이프 문자로 사용되는 경우에 대한 자세한 설명은 특수 문자 이스케이프 를 참고한다.
only_full_group_by
only_full_group_by는 GROUP 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)을 Oracle DBMS와 마찬가지로 NULL로 처리할 것인지 지정한다. oracle_style_empty_string 파라미터를 no로 설정하면 빈 문자열을 유효한 문자열로 처리하고, yes로 설정하면 Oracle DBMS와 마찬가지로 빈 문자열을 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+000SELECT '1'+'a';ERROR: Cannot coerce 'a' to type double.
require_like_escape_character
require_like_escape_character는 LIKE 절의 이스케이프 문자 사용 여부에 관한 파라미터로서, 기본값은 no이다. 이 파라미터 값이 yes이고 no_backslash_escapes 가 no이면 LIKE 절의 문자열에서 백슬래시(\)가 이스케이프 문자로 사용되며, 그렇지 않으면 LIKE... ESCAPE 절을 사용하여 이스케이프 문자를 명시해야 한다. 자세한 내용은 LIKE 을 참고한다.
return_null_on_function_errors
return_null_on_function_errors는 일부 SQL 함수에서 에러가 발생할 때의 동작을 정의하는 파라미터로서, 기본값은 no이다. 이 파라미터 값이 yes이면 함수에서 에러가 발생할 때 NULL을 반환하며, no이면 함수에서 에러가 발생할 때 에러를 반환하고 관련 메시지를 출력한다.
다음 SQL 함수가 이 시스템 파라미터의 영향을 받는다.
날짜/시간 함수
ADDDATE()
ADDTIME()
DATEDIFF()
DAY()
DAYOFMONTH()
DAYOFWEEK()
DAYOFYEAR()
FROM_DAYS()
FROM_UNIXTIME()
HOUR()
LAST_DAY()
MAKEDATE()
MAKETIME()
MINUTE()
MONTH()
QUARTER()
SEC_TO_TIME()
SECOND()
TIME()
TIME_TO_SEC()
TIMEDIFF()
TO_DAYS()
WEEK()
WEEKDAY()
YEAR()
문자열 함수
수치 함수
ABS()
ACOS()
ASIN()
ATAN()
ATAN2()
CEIL()
CONV()
COS()
COT()
DEGREES()
EXP()
FLOOR()
LN()
LOG2()
LOG10()
MOD()
POW()
RADIANS()
SIGN()
SIN()
SQRT()
TAN()
TRUNC()
WIDTH_BUCKET()
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)이다.
이 파라미터에 영향을 받는 함수 및 연산식은 다음과 같다.
SPACE()
CONCAT()
CONCAT_WS()
- +: 문자열이 피연산자
REPEAT()
GROUP_CONCAT()
: 이 함수는 string_max_size_bytes 파라미터뿐만 아니라 group_concat_max_len 파라미터의 영향도 받는다.INSERT()
함수
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)는 별개로 동작하지 않는다.
클라이언트 응용 프로그램이 텍스트 데이터를 분해된 형태로 CUBRID에 보낸다면, unicode_input_normalization을 yes로 설정하여 CUBRID가 결합된 코드로 다루게 한다.
클라이언트 응용 프로그램이 분해된 형태로만 데이터를 다룰 수 있다면 unicode_output_normalization을 yes로 설정하여 CUBRID가 항상 분해된 코드로 데이터를 보내도록 한다.
클라이언트 응용 프로그램이 입력과 출력의 형태에 대해 모두 알고 있다면, unicode_input_normalization과 unicode_output_normalization을 no 인 상태로 둔다(기본 설정).
로캘과 콜레이션에 대한 자세한 설명은 다국어 지원 을 참고한다.
unicode_output_normalization
시스템 수준에서 저장된 유니코드를 분해된 코드로 출력할 것인지 여부를 설정하는 파라미터로 기본값은 no이다. 보다 자세한 설명은 위의 unicode_input_normalization 설명을 참고한다.
질의 계획 캐시 관련 파라미터¶
다음은 질의 계획에 대한 캐시 기능과 관련된 파라미터로 각 파라미터의 타입과 설정 가능한 값의 범위는 다음과 같다.
파라미터 이름 | 타입 | 기본값 | 최소값 | 최대값 |
---|---|---|---|---|
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_bytes는 cubrid 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_only는 compactdb 유틸리티와 관련된 파라미터로 이미 할당된 저장 영역의 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 | |||
auto_restart_server | bool | yes | ||
index_scan_in_oid_order | bool | no | ||
index_unfill_factor | float | 0.05 | 0 | 0.5 |
java_stored_procedure | bool | no | ||
multi_range_optimization_limit | int | 100 | 0 | 10,000 |
pthread_scope_process | bool | yes | ||
server | string | |||
service | string | |||
session_state_timeout | sec | 21,600(6시간) | 60(1분) | 31,536,000(1년) |
sort_limit_max_count | int | 1,000 | 0 | INT_MAX |
sql_trace_slow | msec | -1(무제한) | 0 | 86,400,000(24시간) |
sql_trace_execution_plan | bool | yes | ||
use_orderby_sort_limit | bool | yes |
access_ip_control
access_ip_control은 서버 접속을 허용하는 IP를 제한하는 기능 사용 여부를 지정하는 파라미터이다. 기본값은 no이다. 자세한 내용은 데이터베이스 서버 접속 제한 을 참고한다.
access_ip_control_file
access_ip_control_file은 서버가 허용하는 IP 목록을 저장한 파일 이름을 지정하는 파라미터이다. access_ip_control 값이 yes이면 데이터베이스 서버는 이 파라미터로 지정한 파일에 저장된 IP의 접속만 허용한다. 자세한 내용은 데이터베이스 서버 접속 제한 을 참고한다.
auto_restart_server
auto_restart_server는 데이터베이스 서버 프로세스에 심각한 오류가 발생해서 프로세스가 중단될 경우에 자동으로 재시작할 것인가를 지정하는 파라미터이다. auto_restart_server를 yes로 설정하면 서버 프로세스가 오류로 중단되었을 때 자동으로 재시작한다. 정상적인 종료 절차(CUBRID 서버의 STOP 명령)에 의해 종료된 경우에는 해당하지 않는다.
index_scan_in_oid_order
index_scan_in_oid_order는 인덱스를 스캔한 후 검색 결과 데이터를 가져오는 순서를 OID 순으로 지정하기 위한 파라미터이다. 기본값인 no로 설정하면 데이터 순서대로 결과를 가져오고, yes로 설정하면 OID 순서대로 결과를 가져온다.
index_unfill_factor
최초 인덱스 생성 후 INSERT 나 UPDATE를 실행할 때 인덱스 페이지가 꽉 차서 여유 공간이 없으면 인덱스 페이지 노드 분할(split)이 발생하는데, 이는 오퍼레이션 시간을 증가시켜 성능에 영향을 미친다. index_unfill_factor는 인덱스를 생성할 때 각 인덱스 페이지 노드의 여유 공간을 확보하는 비율을 지정하는 파라미터이다. index_unfill_factor 설정값은 인덱스를 처음 생성할 때만 적용되며, 페이지에 지정된 빈 공간의 비율을 동적으로 유지하지 않는다. 값의 범위는 0부터 0.5까지이고 기본값은 0.05이다.
인덱스를 생성할 때 인덱스의 페이지 노드에 여유 공간이 없이(index_unfill_factor를 0으로 설정) 생성한다면, 추가로 삽입할 때마다 매번 인덱스 페이지 노드의 분할이 발생하여 성능에 영향을 끼친다.
index_unfill_factor 값이 크면 인덱스 생성 시 노드 여유 공간을 많이 확보한다. 따라서 최초 인덱스 생성 후 노드 여유 공간이 꽉 찰 때까지 상대적으로 긴 시간 동안 인덱스 노드의 분할이 발생하지 않으므로, 상대적으로 성능이 나을 수 있다. 이 값이 작으면 인덱스 생성 시 노드 여유 공간이 작기 때문에, 인덱스 노드의 여유 공간이 금방 꽉 차게 될 가능성이 높으므로, 상대적으로 INSERT 나 UPDATE 에 의한 인덱스 노드 분할 발생 가능성이 높다.
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로 설정해야 한다.
multi_range_optimization_limit
multi_range_optimization_limit은 다중 범위(col IN (? , ?, ... ,?))의 조건을 가지며 인덱스 사용이 가능한 질의에서, LIMIT 절이 지정하는 행의 개수가 이 파라미터가 지정하는 숫자 이내이면 인덱스 정렬 방식에 대한 최적화를 수행한다. 기본값은 100이다.
예를 들어, 이 파라미터의 값이 50일 때 LIMIT 10이면 이 파라미터가 지정한 값 이내이므로 각 조건에 해당하는 범위의 값을 정렬하면서 결과를 생성한다. LIMIT 60이면 파라미터 설정값을 초과하므로 각 조건에 해당하는 범위의 값을 모두 가져온 후 정렬한다.
이 값의 설정에 따라 중간 값의 정렬을 진행하면서(on-the-fly) 결과를 수집하느냐, 결과 값을 먼저 수집한 후 정렬하느냐의 차이가 발생하므로, 이 값이 너무 크면 오히려 성능에 불리할 수 있다.
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_plan은 sql_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_limit은 ORDER BY ... LIMIT row_count 절을 포함하는 구문에서 질의의 정렬 및 합병(sort and merge) 과정의 중간 결과를 row_count 만큼만 유지할 것인지를 지정하는 파라미터이다. yes이면 중간 정렬 결과를 row_count 만큼만 유지하기 때문에 불필요한 비교 및 합병 과정을 줄일 수 있다. 기본값은 yes이다.
브로커 설정¶
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 가능 로그 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 가능 샤드 SHARD string OFF SHARD_CONNECTION_FILE string shard_connection.txt SHARD_DB_NAME string SHARD_DB_PASSWORD string SHARD_DB_USER string SHARD_IGNORE_HINT string OFF SHARD_KEY_FILE string shard_key.txt SHARD_KEY_FUNCTION_NAME string SHARD_KEY_LIBRARY_NAME string SHARD_KEY_MODULAR int 256 SHARD_MAX_CLIENTS int 256 SHARD_MAX_PREPARED_STMT_COUNT int 2,000 SHARD_NUM_PROXY int 1 SHARD_PROXY_LOG string ERROR 가능 SHARD_PROXY_LOG_DIR string log/broker/proxy_log SHARD_PROXY_LOG_MAX_SIZE KB 100,000 가능 SHARD_PROXY_SHM_ID int SHARD_PROXY_TIMEOUT sec 30(초) 기타 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_LIMIT는 APPL_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_SIZE는 APPL_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_conf 의 MAX_NUM_APPL_SERVER 파라미터에 의해 제한되므로 설정할 수 있는 CAS의 통신 포트의 개수 역시 최대 MAX_NUM_APPL_SERVER 파라미터의 설정값으로 제한된다.
Windows 운영체제에서 응용 클라이언트와 CUBRID 브로커 사이에 방화벽이 존재한다면 반드시 BROKER_PORT 및 APPL_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로 지정되며, 기본값은 120s이다.
유휴 상태(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의 설정이 무시되어 항상 ON인 상태로 동작하므로, 프로그램에서 자동 커밋 여부를 직접 설정해야 한다.
LONG_QUERY_TIME
LONG_QUERY_TIME은 장기 실행 질의(long-duration query)로 판단될 질의 실행 시간을 설정하는 파라미터이다. 값 뒤에 ms, s, min, h의 단위 지정이 가능하며, 각각 milliseconds, seconds, minutes, hours를 의미한다. 단위가 생략되면 s로 지정된다. 기본값은 60 (초)이고, 최대값은 86,400(하루)이다.
소수점을 사용하여 밀리초(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.
로그¶
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이 생성된다.
샤드¶
SHARD 기능을 사용하려면 cubrid_broker.conf.shard를 참고하여 cubrid_broker.conf에 다음 파라미터들을 설정해야 한다.
SHARD
SHARD 기능의 활성화 여부를 지정하는 파라미터이다. ON 또는 OFF로 설정하며, 기본값은 OFF이다.
SHARD_CONNECTION_FILE
shard 연결 파일의 경로이다. shard 연결 파일은 $CUBRID/conf 내에 위치해야 한다. 자세한 설명은 shard 연결 파일 을 참고한다.
SHARD_DB_NAME
shard DB의 이름으로서 응용의 연결 요청이 유효한지 검사하는 데 사용된다.
SHARD_DB_PASSWORD
backend shard DB의 사용자 비밀번호로서, CAS 프로세스에서 backend DBMS와 연결을 수행하는데 사용되며, 응용의 연결 요청이 유효한지 검사하는 데에도 사용된다. 모든 shard DB의 사용자 비밀번호는 동일해야 한다.
- cubrid_broker.conf에 SHARD_DB_PASSWORD의 값을 노출시키고 싶지 않은 경우 환경 변수를 사용할 수 있다. 환경 변수 이름의 포맷은 <broker_name>_SHARD_DB_PASSWORD
- 이고, <broker_name>은 항상 대문자로 변환되어야 한다. 예를 들어, 브로커의 이름이 shard1이라면 shard DB 암호를 설정하는 환경 변수 이름은 SHARD1_SHARD_DB_PASSWORD가 된다. 단, "cubrid broker restart" 명령으로 SHARD 기능이 재구동되는 경우 SHARD_DB_PASSWORD의 환경 변수 또는 cubrid_broker.conf의 SHARD_DB_PASSWORD 파라미터 값이 반드시 설정되어 있어야 한다.
export SHARD1_SHARD_DB_PASSWORD=shard123Note
SHARD_DB_USER/SHARD_DB_PASSWORD 파라미터는 제거될 예정(deprecated)이므로, 응용 프로그램을 통해 접속 정보를 입력할 것을 권장한다.
SHARD_DB_USER
backend shard DB의 사용자 이름으로서, CAS 프로세스에서 backend DBMS와 연결을 수행하는데 사용되며, 응용의 연결 요청이 유효한지 검사하는 데에도 사용된다. 모든 shard DB의 사용자 이름은 동일해야 한다.
Note
SHARD_DB_USER/SHARD_DB_PASSWORD 파라미터는 제거될 예정(deprecated)이므로, 응용 프로그램을 통해 접속 정보를 입력할 것을 권장한다.
SHARD_IGNORE_HINT
이 값이 ON이면 특정 shard로 연결하기 위해 제공되는 힌트가 무시되고, 정해진 규칙에 따라 접속할 데이터베이스를 선택한다. 기본값은 OFF 이다. 모든 데이터베이스가 같은 데이터로 복제되어 있는 상태에서 읽기 부하를 자동으로 로드 밸런싱하여 처리하고자 할 때 사용할 수 있는 방식이다. 예를 들어 응용 프로그램의 부하를 여러 개의 복제 노드 중 하나에 접속하고자 할 때 특정 shard 하나의 연결만 제공하면 어느 노드(데이터베이스)에 연결할지는 proxy가 자동으로 결정한다.
SHARD_KEY_FILE
shard key 설정 정보 파일의 경로이다. shard key 설정 파일은 $CUBRID/conf 내에 위치해야 한다. 자세한 설명은 shard key 설정 파일 을 참고한다.
SHARD_KEY_FUNCTION_NAME
shard key에 대한 사용자 해시 함수의 이름을 지정하기 위한 파라미터이다. 자세한 내용은 사용자 정의 해시 함수 를 참고한다.
SHARD_KEY_LIBRARY_NAME
shard key에 대한 사용자 해시 함수를 지정하기 위해 실행 시간에 로딩 가능한 라이브러리 경로를 지정한다. SHARD_KEY_LIBRARY_NAME 파라미터가 설정된 경우 반드시 SHARD_KEY_FUNCTION_NAME 파라미터도 설정되어야 한다. 자세한 내용은 사용자 정의 해시 함수 을 참고한다.
SHARD_KEY_MODULAR
내장된 shard key 해시 함수 결과의 범위를 지정하기 위한 파라미터로서, 기본 shard key 해시 함수의 결과는 shard_key(정수형) % SHARD_KEY_MODULAR이다. 최소값은 1, 최대값은 256이다. 관련된 내용은 shard key 설정 파일 과 사용자 정의 해시 함수 을 참고한다.
SHARD_MAX_CLIENTS
proxy로 동시에 연결 가능한 응용의 개수이다. 기본값은 256이며, 최대값은 proxy 당 10,000이다.
proxy가 관리하는 statement pool의 최대 크기이다.
SHARD_NUM_PROXY
proxy 프로세스의 개수이다. 기본값은 1 이며, 최대값은 8이다.
SHARD_PROXY_LOG
proxy 로그 레벨로서 다음의 값 중 하나로 설정 가능하다.
- ALL: 모든 로그 기록
- ON: 모든 로그 기록
- SHARD: shard DB 선택과 처리에 대한 로그 기록
- SCHEDULE: 작업 할당에 대한 로그 기록
- NOTICE: 주요한 알림에 대한 로그 기록
- TIMEOUT: 임계 시간 초과에 대한 로그 기록
- ERROR: 에러 로그 기록
- NONE: 로그 기록하지 않음
- OFF: 로그 기록하지 않음
SHARD_PROXY_LOG_DIR
proxy 로그를 저장할 디렉터리 경로이다.
SHARD_PROXY_LOG_MAX_SIZE
proxy 로그 파일의 최대크기이다. 값 뒤에 B, K, M, G의 단위 지정이 가능하며, 각각 Bytes, Kilobytes, Megabytes, Gigabytes를 의미한다. 단위 생략 시 K로 지정된다. 최대 1,000,000(KB)까지 설정할 수 있다.
SHARD_PROXY_SHM_ID
proxy가 이용하는 공유 메모리 ID 를 지정하기 위한 파라미터로 시스템 내에서 유일한 값이어야 한다.
SHARD_PROXY_TIMEOUT
proxy에서 CAS가 사용 가능해지기를 기다리거나 statement가 준비(prepare)되기를 기다리는 최대 시간. 대기 시간이 만료되면 드라이버의 요청을 에러 처리함. 기본값: 30(초). 이 값이 0이면 시스템 파라미터 query_timeout의 값에 의해 대기 시간이 결정되며, query_timeout의 값도 0이면 무한 대기한다. SHARD_PROXY_TIMEOUT의 값이 0보다 크면 query_timeout 값과 SHARD_PROXY_TIMEOUT 값 중 큰 값에 의해 대기 시간이 결정된다. 값 뒤에 ms, s, min, h의 단위 지정이 가능하며, 각각 milliseconds, seconds, minutes, hours를 의미한다. 단위가 생략되면 s로 지정된다.
Note
proxy 설정을 위해 필요한 파라미터
CUBRID proxy 설정을 위해서는 SHARD_MAX_CLIENTS, MAX_NUM_APPL_SERVER, SHARD_NUM_PROXY의 설정이 필요하다.
- Linux에서 proxy 프로세스 한 개당 사용되는 파일 디스크립터(fd)는 다음과 같이 제한된다.
- "((SHARD_MAX_CLIENTS + MAX_NUM_APPL_SERVER) / SHARD_NUM_PROXY) + 256" <= 10,000
위의 공식을 자세히 설명하면 다음과 같다.
- SHARD_MAX_CLIENTS는 SHARD 구성 시스템에 접속하는 응용 프로그램들의 최대 접속 개수를 나타낸다.
- MAX_NUM_APPL_SERVER는 proxy 시스템에 접속하는 모든 CAS들의 최대 접속 개수를 나타낸다.
- SHARD_NUM_PROXY는 SHARD 구성 시스템에서 사용하는 proxy 프로세스의 개수를 나타낸다.
- "SHARD_MAX_CLIENTS / SHARD_NUM_PROXY"는 proxy 프로세스 한 개당 접속하는 응용 프로그램들의 최대 접속 개수이다.
- "MAX_NUM_APPL_SERVER / SHARD_NUM_PROXY"는 proxy 프로세스 한 개당 접속하는 CAS들의 최대 접속 개수이다.
- 256은 Linux에서 proxy 프로세스 한 개당 내부적으로 사용되는 fd의 개수이다.
Linux 시스템에서 SHARD 파라미터를 설정하는 예로, 응용 프로그램의 최대 동시 접속 개수(SHARD_MAX_CLIENTS)를 5,000으로 하고, CAS의 최대 개수(MAX_NUM_APPL_SERVER)를 200으로 하며, proxy 프로세스의 최대 개수(SHARD_NUM_PROXY)를 1로 하면,(5,000 + 200)/1 + 256 = 5,456 이 되어 10,000보다 작으므로 이러한 설정은 가능하다.
이와 관련하여 각 프로세스 간 연결 관계를 살펴보면 다음과 같다. "proxy"는 "응용 client"와 "CAS" 사이에서 연결을 중재하는 역할을 수행한다.
아래에서 []는 프로세스를 나타내며, ->는 요청하는 방향을 나타낸다.
[응용 client] --(최초 접속 요청)---------------> [broker] (proxy 선택)
<--(연결할 proxy 알려줌)----
---------------------------------> [proxy] --(CAS 선택)--> [CAS] ---> [DB server]
<--------------------------------- <-------------- <---
<--(이후 같은 proxy 사용)--------> <-------------> <-->
broker는 응용 client가 최초 접속을 요청할 때 proxy를 선택하기 위해 한 번만 사용되고, 이후 CUBRID는 [응용 client] - [proxy] - [CAS] - [DB Server]의 연결을 유지한다.
또한, CAS는 DB server와 연결된 이후 계속 연결을 유지한다.
기타¶
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이다.