Contents

CUBRID 2008 R4.4 릴리스 노트

릴리스 노트 정보

본 문서는 CUBRID 2008 R4.4(빌드번호 8.4.4.0227)에 관한 정보를 포함한다. CUBRID 2008 R4.4는 CUBRID 2008 R4.3에서 발견된 오류 수정 및 기능 개선과 이전 버전들에 반영된 모든 오류 수정 및 기능 개선을 포함한다.

CUBRID 2008 R4.3을 포함한 이전 버전에 대한 정보는 http://release.cubrid.org/ko에서 확인할 수 있다.

릴리스 특징

CUBRID 2008 R4.4는 CUBRID 2008 R4.3을 안정화하고 운영 편의성을 개선한 업그레이드 버전이다.

CUBRID 2008 R4.4는 CUBRID 2008 R4.3과 데이터베이스 볼륨이 호환되므로 데이터베이스를 마이그레이션하지 않아도 되며, 이와 관련하여 업그레이드 절을 참고한다.

운영 편의성 개선

  • SQL 프로파일링 기능을 추가했다.
  • 각종 상태 정보 출력 또는 트랜잭션 관리 등을 수행하는 CUBRID 운영 도구(유틸리티)의 기능을 추가 또는 개선했다.
  • 각종 상태 정보의 확인이 용이하도록 로그 메시지를 강화했다.

HA 복제 안정화

  • 특정 질의문에 대해 복제가 되지 않는 현상들을 수정했다.
  • 접속 오류 또는 복제 지연 현상들을 수정했다.

Sharding 기능 개선 및 안정화

  • SHARD key에 해당하는 shard ID를 확인할 수 있도록 하는 명령을 추가했다.
  • SHARD proxy에 대한 CAS의 개수가 동적으로 조정될 수 있도록 수정했다.
  • 접속 오류 또는 질의 처리 오류 등을 수정했다.

동작 변경

  • 레코드가 있는 테이블에 "ALTER .. ADD COLUMN" 수행 시 PRIMARY KEY 또는 NOT NULL 제약 조건을 위배하는 경우가 없도록 수정했다.
  • 브로커 파라미터인 SELECT_AUTO_COMMIT이 제거되었다.
  • 브로커 파라미터 APPL_SERVER_MAX_SIZE_HARD_LIMIT의 값의 범위가 1과 2,097,151 사이의 값으로 제한되었다.
  • SQL 로그 파일 크기를 지정하는 브로커 파라미터 SQL_LOG_MAX_SIZE의 기본 설정값이 100MB에서 10MB로 변경되었다.
  • JDBC에서 연결 URL의 zeroDateTimeBehavior 속성 값이 "round"일 때, TIMESTAMP의 zero date를 '0001-01-01 00:00:00'에서 '1970-01-01 00:00:00'(GST)로 변경했다.

설정

  • 시간 또는 용량을 입력하는 파라미터에 시간 단위 또는 용량 단위를 지정할 수 있게 했다.

드라이버 호환성

  • 2008 R4.4 버전의 JDBC와 CCI 드라이버는 2008 R4.3 또는 이전 버전의 CUBRID DB 서버와 호환된다.

보다 자세한 변경 사항은 아래의 내용을 참고하며, 이전 버전 사용자는 동작 변경 절과 신규 주의 사항 절을 반드시 확인하도록 한다.

기능 추가

운영 편의성

SQL 프로파일링 기능 추가(CUBRIDSUS-10984)

질의 성능 분석을 위한 SQL 프로파일링(profiling) 기능을 추가했다.

다음과 같이 "SET TRACE ON" 문장을 실행하고 질의를 실행한 후, "SHOW TRACE" 문장을 실행하면 SQL 프로파일링 정보가 출력된다.

csql> SET TRACE ON;
csql> SELECT /*+ RECOMPILE */ o.host_year, o.host_nation, o.host_city, n.name, SUM(p.gold), SUM(p.silver), SUM(p.bronze)
        FROM OLYMPIC o, PARTICIPANT p, NATION n
        WHERE o.host_year = p.host_year AND p.nation_code = n.code AND p.gold > 10
        GROUP BY o.host_nation;
csql> SHOW TRACE;

  trace
======================
  '
Query Plan:
  SORT (group by)
    NESTED LOOPS (inner join)
      NESTED LOOPS (inner join)
        TABLE SCAN (o)
        INDEX SCAN (p.fk_participant_host_year) (key range: (o.host_year=p.host_year))
      INDEX SCAN (n.pk_nation_code) (key range: p.nation_code=n.code)

  rewritten query: select o.host_year, o.host_nation, o.host_city, n.[name], sum(p.gold), sum(p.silver), sum(p.bronze) from OLYMPIC o, PARTICIPANT p, NATION n where (o.host_year=p.host_year and p.nation_code=n.code and (p.gold> ?:0 )) group by o.host_nation

Trace Statistics:
  SELECT (time: 1, fetch: 1059, ioread: 2)
    SCAN (table: olympic), (heap time: 0, fetch: 26, ioread: 0, readrows: 25, rows: 25)
      SCAN (index: participant.fk_participant_host_year), (btree time: 1, fetch: 945, ioread: 2, readkeys: 5, filteredkeys: 5, rows: 916) (lookup time: 0, rows: 38)
        SCAN (index: nation.pk_nation_code), (btree time: 0, fetch: 76, ioread: 0, readkeys: 38, filteredkeys: 38, rows: 38) (lookup time: 0, rows: 38)
    GROUPBY (time: 0, sort: true, page: 0, ioread: 0, rows: 5)
'

tranlist 유틸리티 추가(CUBRIDSUS-9601)

데이터베이스의 트랜잭션 정보를 출력하는 cubrid tranlist 유틸리티를 추가했다. DBA 또는 DBA 그룹에 속한 사용자만 사용할 수 있다.

% cubrid tranlist -s testdb

Tran index         User name      Host name      Process id          Program name
-------------------------------------------------------------------------------------
   1(ACTIVE)         PUBLIC        myhost            1822           broker1_cub_cas_1
   2(ACTIVE)            dba        myhost            1823           broker1_cub_cas_2
   3(COMMITTED)         dba        myhost            1824           broker1_cub_cas_3
-------------------------------------------------------------------------------------

tranlist 명령에 지정된 칼럼으로 정렬하여 출력하는 기능 추가(CUBRIDSUS-9655)

"cubrid tranlist"에 지정된 칼럼으로 정렬하여 출력하는 기능을 추가했다.

다음은 네 번째 칼럼인 "Process id"를 지정하여 정렬한 정보를 출력하는 예이다.

% cubrid tranlist --sort-key=4 tdb

Tran index    User name Host name Process id           Program name  Query time Tran time Wait for lock holder  SQL_ID         SQL Text
--------------------------------------------------------------------------------------------------------------------------------------------------------------
   1(ACTIVE)     PUBLIC    myhost      20080 query_editor_cub_cas_1        0.00      0.00                   -1  *** empty ***
   3(ABORTED)    PUBLIC    myhost      20081 query_editor_cub_cas_2        0.00      0.00                   -1  *** empty ***
   2(ACTIVE)     PUBLIC    myhost      20082 query_editor_cub_cas_3        0.00      0.00                   -1  *** empty ***
   4(ACTIVE)     PUBLIC    myhost      20083 query_editor_cub_cas_4        1.80      1.80              2, 3, 1  cdcb58552e320  update ta set a=5 where a > ?
--------------------------------------------------------------------------------------------------------------------------------------------------------------

Tran index : 4
update ta set a=5 where a > ?

killtran 유틸리티에 특정 SQL을 수행 중인 트랜잭션을 제거할 수 있는 옵션 추가(CUBRIDSUS-9653)

"cubrid killtran" 유틸리티에 SQL ID를 통해 특정 트랜잭션을 제거하는 --kill-sql-id 옵션을 추가했다.

% cubrid killtran --query-exec-info testdb

Tran index  Process id  Program name             Query time   Tran time  Wait for lock holder     SQL ID      SQL Text
--------------------------------------------------------------------------------------------------------------------------------------------
  1(ACTIVE)    26650    query_editor_cub_cas_1        0.00         0.00                    -1  *** empty ***
  2(ACTIVE)    26652    query_editor_cub_cas_3        0.00         0.00                    -1  *** empty ***
  3(ACTIVE)    26651    query_editor_cub_cas_2        0.00         0.00                    -1  *** empty ***
  4(ACTIVE)    26653    query_editor_cub_cas_4        1.80         1.80               2, 1, 3  cdcb58552e320  update ta set a = 5 where a > 0
--------------------------------------------------------------------------------------------------------------------------------------------

SQL_ID: cdcb58552e320
Tran index : 4
update ta set a = 5 where a > 0

% cubrid killtran --kill-sql-id=cdcb58552e320 -f testdb

killtran 유틸리티에 여러 트랜잭션을 한꺼번에 종료할 수 있도록 -i 옵션 확장(CUBRIDSUS-9601)

"cubrid killtran" 유틸리티의 -i 옵션에 강제 종료하고자 하는 트랜잭션 ID들을 쉼표로 구분하여 입력할 수 있도록 확장하였다.

% cubrid killtran -i 1,3,8 testdb

브로커 및 샤드의 실행중인 파라미터 정보를 확인하는 명령 추가(CUBRIDSUS-10901)

브로커의 실행 중인 파라미터 정보를 확인하는 "cubrid broker info" 명령과 샤드의 파라미터 정보를 확인하는 "cubrid shard info" 명령을 추가했다.

질의 성능에 영향을 주는 상태를 기록하는 이벤트 로그 파일 추가(CUBRIDSUS-10986)

질의 성능에 영향을 주는 SLOW_QUERY, MANY_IOREADS, LOCK_TIMEOUT, DEADLOCK, TEMP_VOLUME_EXPAND 상태를 기록하는 별도의 이벤트 로그 파일을 추가했다.

보다 자세한 사항은 매뉴얼의 이벤트 로그 절을 참고한다.

HA 상태 출력 시 cub_master 로그 파일에 각 노드 정보를 포함하도록 수정(CUBRIDSUS-11113)

split-brain, fail-over, fail-back이 발생하면 cub_master 프로세스의 로그 파일에 각 노드 정보를 포함하여 기록하도록 수정했다. 해당 로그 파일은 $CUBRID/log/<host_name>.cub_master.err로 존재한다.

split-brain 상태를 해소하기 위해 스스로 종료하는 마스터 노드의 cub_master 로그 파일은 다음과 같이 노드 정보를 포함한다.

Time: 05/31/13 17:38:29.138 - ERROR *** file ../../src/executables/master_heartbeat.c, line 714 ERROR CODE = -988 Tran = -1, EID = 19
Node event: More than one master detected and local processes and cub_master will be terminated.

Time: 05/31/13 17:38:32.337 - ERROR *** file ../../src/executables/master_heartbeat.c, line 4493 ERROR CODE = -988 Tran = -1, EID = 20
Node event:HA Node Information
================================================================================
 * group_id : hagrp   host_name : testhost02    state : unknown
--------------------------------------------------------------------------------
name                priority   state          score      missed heartbeat
--------------------------------------------------------------------------------
testhost03          3          slave          3          0
testhost02          2          master         2          0
testhost01          1          master         -32767     0
================================================================================

fail-over 후 마스터로 변경되는 노드 혹은 fail-back 후 슬레이브로 변경되는 노드의 cub_master 로그 파일은 다음과 같이 노드 정보를 포함한다.

Time: 06/04/13 15:23:28.056 - ERROR *** file ../../src/executables/master_heartbeat.c, line 957 ERROR CODE = -988 Tran = -1, EID = 25
Node event: Failover completed.

Time: 06/04/13 15:23:28.056 - ERROR *** file ../../src/executables/master_heartbeat.c, line 4484 ERROR CODE = -988 Tran = -1, EID = 26
Node event: HA Node Information
================================================================================
 * group_id : hagrp   host_name : testhost02    state : master
--------------------------------------------------------------------------------
name                 priority   state           score      missed heartbeat
--------------------------------------------------------------------------------
testhost03           3          slave           3          0
testhost02           2          to-be-master    -4094      0
testhost01           1          unknown         32767      0
================================================================================

HA

"cubrid heartbeat stop" 명령 실행 시 -i 옵션 추가 및 절체 방식 변경(CUBRIDSUS-9572)

"cubrid heartbeat stop" 명령을 수행하면 기존에는 HA 서버와 유틸리티들이 모두 종료될 때까지 기다린 후 절체가 진행되었으며, 일정 시간 동안 서버 프로세스와 유틸리티들이 스스로 종료되지 않으면 강제 종료시켰다. 하지만 수정 후에는 서버 프로세스가 미처 종료되지 않았어도 종료 과정 중 복제 불일치를 발생시키지 않는 상황이 되면, 남아있는 유틸리티들을 종료하고 즉시 절체를 진행한다.

수정 이후 서버 프로세스가 강제 종료되지 않기 때문에 HA 재구동 시 DB 복구 시간이 들지 않게 되었다.

수정 버전에서 "cubrid heartbeat stop" 명령에 -i 옵션이 주어지는 경우 서버와 유틸리티들을 즉시 종료시키고 절체를 진행한다.

Sharding

Shard key로 해당 shard ID 값을 얻는 "cubrid shard getid" 명령 추가(CUBRIDSUS-9547)

Shard key로 해당 shard id를 얻는 "cubrid shard getid" 명령을 추가했다.

다음은 shard1이라는 shard proxy에서 shard key 1에 대한 shard ID 정보를 출력하는 명령이다.

% cubrid shard getid -b shard1 1

-f 옵션을 통해 shard id에 대한 전체 정보를 출력할 수 있다.

% cubrid shard getid -b shard1 -f 1

cci_set_db_parameter 함수를 사용할 수 있도록 수정(CUBRIDSUS-10125)

SHARD 환경에서 cci_set_db_parameter 함수를 사용할 수 있도록 수정했다. 이로 인해, SHARD 환경에서 isolation level, lock timeout을 설정할 수 있게 되었다.

shard DB의 암호를 환경 변수로 지정할 수 있도록 수정(CUBRIDSUS-11570)

shard.conf의 SHARD_DB_PASSWORD를 환경 변수로 지정할 수 있도록 수정했다. shard.conf에 SHARD_DB_PASSWORD를 노출시키고 싶지 않은 경우 환경 변수를 사용할 수 있다. 환경 변수 이름의 형식은 "<shard_broker_name>_SHARD_DB_PASSWORD"이며, <shard_broker_name>이 shard1이면 환경 변수의 이름은 SHARD1_SHARD_DB_PASSWORD가 된다.

export SHARD1_SHARD_DB_PASSWORD=shard123

설정

"cubrid service" 명령으로 shard 관련 프로세스들도 시작 또는 종료할 수 있도록 수정(CUBRIDSUS-10078)

cubrid.conf의 "service" 파라미터에 "shard"를 추가하여, "cubrid service" 명령으로 shard 관련 프로세스들도 시작 또는 종료할 수 있도록 수정했다.

복제 로그의 최대 보존 개수를 조절하는 파라미터 추가(CUBRIDSUS-11377)

복제 로그의 최대 보존 개수를 조절하는 ha_copy_log_max_archives 파라미터를 추가했다. 수정 이전 버전에서는 log_max_archives 파라미터를 통해서 트랜잭션 보관 로그 파일의 최대 보존 개수와 복제 로그 파일의 최대 보존 개수를 모두 지정했다.

잠금 에스컬레이션 발생 시 트랜잭션의 롤백 여부를 지정하는 시스템 파라미터 추가(CUBRIDSUS-11384)

잠금 에스컬레이션 발생 시 트랜잭션의 롤백 여부를 지정하는 rollback_on_lock_escalation 파라미터를 추가했다.

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

동작 변경

SQL

레코드가 있는 테이블에 ALTER 문으로 기본 값 없는 칼럼 추가 시 PRIMARY KEY 또는 NOT NULL 제약 조건을 위배하는 경우가 발생하지 않도록 수정(CUBRIDSUS-9725)

ALTER ... ADD COLUMN 문을 통해 기본 값이 없는 칼럼을 추가할 때 추가된 칼럼의 값이 모두 NULL이 되면서 PRIMARY KEY 또는 NOT NULL 제약 조건을 위배하는 경우가 발생하지 않도록 수정했다.

수정된 버전에서는

  • 레코드가 있는 테이블에 추가하려는 칼럼의 제약 조건이 PRIMARY KEY이면 에러를 반환하고,
  • 추가하려는 칼럼의 제약 조건이 NOT NULL이고 cubrid.conf의 add_column_update_hard_default 설정값이 no이면 에러를 반환한다.

드라이버

[JDBC] 연결 URL의 zeroDateTimeBehavior 속성 값이 "round"일 때 TIMESTAMP의 zero date를 '0001-01-01 00:00:00'에서 '1970-01-01 00:00:00'(GST)로 변경(CUBRIDSUS-11612)

연결 URL의 zeroDateTimeBehavior 속성 값이 "round"일 때 TIMESTAMP의 zero date를 '0001-01-01 00:00:00'에서 '1970-01-01 00:00:00'(GST)로 변경하도록 수정했다.

[JDBC][CCI] 배치 처리 함수에 질의 타임아웃 적용(CUBRIDSUS-10088)

CCI의 cci_execute_batch 함수나 cci_execute_array 함수를 사용하거나, cci_execute 함수에 CCI_EXEC_QUERY_ALL 플래그를 지정하거나, JDBC의 executeBatch 메서드를 사용하는 경우에 질의 타임아웃(queryTimeout)이 적용되도록 수정했다. 배치 처리 함수에 대한 질의 타임아웃은 개별적인 SQL 단위가 아니라, 함수(또는 메서드) 단위로 적용된다.

유틸리티

"cubrid broker status" 명령 변경(CUBRIDSUS-9602)

"cubrid broker status" 명령을 통해 브로커의 상태를 출력할 때 아래와 같이 몇 가지 사항이 추가 또는 변경되었다.

  • "cubrid broker status SERVICE=ON" 명령을 실행하면 구동 중인 브로커의 상태만 출력하게 되었다.

    $ cubrid broker status SERVICE=ON
    
    % query_editor
    ----------------------------------------------------------------------
            ID   PID                  QPS        LQS   PSIZE STATUS
    ----------------------------------------------------------------------
             1 20370                    0          0   52456 IDLE
             2 20371                    0          0   52456 IDLE
             3 20372                    0          0   52456 IDLE
             4 20373                    0          0   52456 IDLE
             5 20374                    0          0   52456 IDLE
    
  • -b 옵션으로 브로커 상태 출력 시

    • 브로커 이름은 최대 20자까지만 출력하고, 이를 초과하는 경우 이름 뒤에 ...을 출력한다.
    • REQ 항목은 더 이상 출력하지 않는다.
    • QPS, TPS 항목 출력 시 UINT64 최대 값까지 출력한다. 수정 이전에는 해당 항목이 음수로 출력되는 경우가 존재했다.
    • 브로커 응용 서버(CAS) 별 응용 프로그램 연결 개수의 합을 출력하는 #CONNECT가 추가되었다.
    • 질의 종류 별 수행 회수를 출력하는 SELECT, INSERT, UPDATE, DELETE, OTHERS 항목을 추가하게 되었다. 단, -f 옵션이 있는 경우는 해당 항목들이 출력되지 않는다.
    • 고유 키 위반 오류 회수를 출력하는 UNIQUE-ERR-Q 항목이 추가되었다.
  • -b 옵션 없이 브로커 상태 출력 시

    • STATUS 항목 출력 시 "CLIENT WAIT", "CLOSE WAIT"가 각각 "CLIENT_WAIT", "CLOSE_WAIT"로 출력되도록 변경되었다.
    • 브로커 설정 정보가 출력에서 제외되었다.
  • -l 옵션 사용 시 상태가 "CLOSE_WAIT"인 CAS의 정보는 출력에서 제외되었다.

설정

시간 또는 용량을 입력하는 파라미터에 시간 단위 또는 용량 단위를 지정할 수 있도록 수정(CUBRIDSUS-10412)

시간 또는 용량을 입력하는 시스템(cubrid.conf), 브로커(cubrid_broker.conf), 그리고 샤드(shard.conf) 파라미터의 값에 시간 단위 또는 용량 단위를 지정할 수 있도록 수정했다.

아래 표에서 왼쪽의 파라미터는 사용을 권장하지 않으며, 대신 오른쪽의 파라미터를 사용할 것을 권장한다.

deprecated new
lock_timeout_in_secs lock_timeout
checkpoint_every_npages checkpoint_every_size
checkpoint_interval_in_mins checkpoint_interval
max_flush_pages_per_second max_flush_size_per_second
sync_on_nflush sync_on_flush_size
sql_trace_slow_msecs sql_trace_slow

파라미터의 입력 단위 및 의미는 다음과 같다.

구분 입력 단위 의미
용량 B Bytes
K Kilobytes
M Megabytes
G Gigabytes
T Terabytes
시간 ms milliseconds
s seconds
min minutes
h hours

단위를 사용하는 파라미터 및 해당 파라미터가 허용하는 단위는 다음과 같다.

구분 파라미터 이름 허용 단위
시스템 backup_volume_max_size_bytes B,K,M,G,T
checkpoint_every_size B,K,M,G,T
checkpoint_interval ms, s, min, h
group_concat_max_len B,K,M,G,T
lock_timeout ms, s, min, h
max_flush_size_per_second B,K,M,G,T
sql_trace_slow ms, s, min, h
sync_on_flush_size B,K,M,G,T
string_max_size_bytes B,K,M,G,T
thread_stacksize B,K,M,G,T
브로커 APPL_SERVER_MAX_SIZE_HARD_LIMIT B, K, M, G
LONG_QUERY_TIME ms, s, min, h
LONG_TRANSACTION_TIME ms, s, min, h
MAX_QUERY_TIMEOUT ms, s, min, h
SESSION_TIMEOUT ms, s, min, h
SQL_LOG_MAX_SIZE B, K, M, G
TIME_TO_KILL ms, s, min, h
샤드 PROXY_LOG_MAX_SIZE B, K, M, G
PROXY_TIMEOUT ms, s, min, h

시스템 파라미터 sort_buffer_size의 최대 크기를 2G로 제한(CUBRIDSUS-9582)

시스템 파라미터인 sort_buffer_size의 최대 크기를 2G로 제한했다. 수정 이전 버전에서 sort_buffer_size의 크기를 2G보다 크게 설정하고, 인덱스 생성과 같은 정렬이 필요한 작업에서 2G보다 큰 sort_buffer를 사용하게 되면 해당 작업이 비정상 종료되었다.

브로커 파라미터 KEEP_CONNECTION에서 OFF 옵션 사용 금지(CUBRIDSUS-5316)

2008 R4.4 이하 버전에서 해당 파라미터의 값을 OFF로 설정하면 사용자 정의 변수, LAST_INSERT_ID, ROW_COUNT, PREPARE 문이 정상 수행되지 않으므로, 사용을 금한다.

APPL_SERVER_MAX_SIZE_HARD_LIMIT 브로커 파라미터 변경(CUBRIDSUS-10260)

브로커 파라미터 APPL_SERVER_MAX_SIZE_HARD_LIMIT의 값의 범위를 1과 2,097,151 사이의 값으로 제한하고 이를 벗어나는 경우 브로커 구동을 하지 못하도록 수정했다. 이와 함께 broker_changer를 이용해서 APPL_SERVER_MAX_SIZE_HARD_LIMIT의 값을 APPL_SERVER_MAX_SIZE보다 작게 변경하면 경고 메시지를 출력하도록 수정했다.

SQL 로그 파일 크기를 지정하는 브로커 파라미터의 기본 설정값을 100MB에서 10MB로 줄임(CUBRIDSUS-9944)

cubrid_broker.conf의 SQL_LOG_MAX_SIZE의 기본 설정값을 100MB에서 10MB로 줄였다. 기존 버전 사용자가 새 버전으로 업그레이드 한 이후에도 기존과 동일한 양의 SQL 로그를 남기고 싶다면 SQL_LOG_MAX_SIZE의 값을 100,000(단위: KB)으로 설정해야 한다.

기타

비동기 질의 기능 지원 중단(CUBRIDSUS-11265)

CSQL 인터프리터에서 질의를 수행하거나 cci_execute 함수에 CCI_EXEC_ASYNC 플래그를 지정하여 질의를 수행할 때 중간 질의 결과를 전달받을 수 있는 비동기 질의 기능을 더 이상 지원하지 않는다.

개선 및 오류 수정

성능 및 최적화

데이터가 매우 작은 상태에서 만든 플랜은 데이터가 증가한 경우 플랜을 다시 만들도록 수정(CUBRIDSUS-3382)

같은 질의문에 대해 prepare를 재수행할 때 이전에 prepare 한 이후로 변경된 데이터 양이 임계치를 초과하면 질의 계획을 재작성하도록 수정했다.

아래 질의에서 첫 번째 SELECT 문 수행 시 idx1 인덱스를 사용하지만, 두 번째 SELECT 문 수행 시 질의 계획을 재작성하여 idx2 인덱스를 활용하게 된다.

CREATE TABLE foo (a INT, b INT, c STRING);
INSERT INTO foo VALUES(1, 1, REPEAT('c', 3000));
CREATE UNIQUE INDEX idx1 ON foo (a, c);
CREATE INDEX idx2 ON foo (a);

SELECT a, b FROM foo WHERE a = 1; -- 1st

INSERT INTO foo SELECT a+1, b, c FROM foo;
INSERT INTO foo SELECT a+2, b, c FROM foo;
INSERT INTO foo SELECT a+4, b, c FROM foo;
INSERT INTO foo SELECT a+8, b, c FROM foo;
INSERT INTO foo SELECT a+16, b, c FROM foo;
INSERT INTO foo SELECT a+32, b, c FROM foo;
INSERT INTO foo SELECT a+64, b, c FROM foo;
INSERT INTO foo SELECT a+128, b, c FROM foo;

SELECT a, b FROM foo WHERE a = 1; -- 2nd

인덱스 추가 시 해당 인덱스의 통계 정보만 갱신되도록 수정(CUBRIDSUS-10709)

이전 버전에서는 인덱스 추가 시 기존의 모든 인덱스의 통계 정보가 갱신되면서 시스템의 부하로 작용했으나, 추가되는 인덱스의 통계 정보만 생성하도록 수정했다.

브로커 응용 서버(CAS)를 최대 접속 개수까지 구동하는데 소요되는 시간 개선(CUBRIDSUS-10825)

브로커를 구동하면 처음에는 브로커 파라미터 MIN_NUM_APPL_SERVER 값만큼 CAS가 구동되어 있으며, 해당 CAS와 접속하는 응용 프로그램의 개수가 늘어나면서 최대 MAX_NUM_APPL_SERVER 값까지 CAS가 구동된다. 2008 R4.4, 9.1 버전에서는 MAX_NUM_APPL_SERVER까지 많은 수의 CAS가 구동되는데 소요되는 시간을 개선했다.

예를 들어 MIN_NUM_APPL_SERVER이 100이고 MAX_NUM_APPL_SERVER가 400일 때, 접속을 400개까지 늘리면 브로커가 101 번째 접속부터 CAS를 400개까지 하나씩 늘어나는데 기존에는 30초가 소요되었으나 수정 이후 3초로 줄어들었다.

계층 질의문에서 START WITH 절에 부질의를 조건으로 부여하는 경우 인덱스를 사용하도록 수정(CUBRIDSUS-9613)

SELECT /*+ RECOMPILE use_idx*/ a, b
FROM foo
START WITH a IN ( SELECT a FROM foo1 )
CONNECT BY PRIOR a = b;

리소스

주기적으로 샤드 상태 정보를 출력하는 명령에 존재했던 메모리 누수 수정(CUBRIDSUS-10393)

주기적으로 샤드 상태 정보를 출력하는 "cubrid shard status -c -s 1" 명령에 존재했던 메모리 누수(leak)를 수정했다.

브로커의 SQL_LOG 모드를 동적으로 OFF로 변경했는데도 디스크 쓰기 작업이 계속되는 문제(CUBRIDSUS-10765)

DB 운영 중에 브로커의 SQL_LOG 모드를 ON에서 OFF로 변경해도, SQL 로그로 인한 디스크 쓰기(IO write)가 없어지지 않는 문제를 해결했다. 기존에는 SQL LOG 모드를 동적으로 OFF로 변경하면 디스크에 로그를 쓴 뒤, 파일 포인터를 되돌리는 방식으로 SQL 로그가 써지지 않는 것처럼 동작했으나 수정 후에는 실제로 디스크에 로그가 써지지 않도록 변경했다.

DB 볼륨이 매우 큰 DB의 백업 볼륨을 복구하는 경우 많은 메모리를 사용하는 문제(CUBRIDSUS-11843)

DB 볼륨이 매우 큰 DB의 백업 볼륨을 복구하는 경우 많은 메모리를 사용하는 문제를 수정했다. 예를 들어, 수정 이전 버전에서 DB 페이지 크기가 16KB인 2.2TB 크기의 DB에 대해 수준(level) 0 백업 파일을 복구할 때 최소 8G의 메모리를 필요로 했으나, 수정 이후에는 해당 메모리를 필요로 하지 않는다.

그러나, 수정 이후 버전에서도 수준 1 또는 수준 2 백업 파일을 복구할 때는 많은 메모리가 필요할 수 있다.

안정성

인덱스를 스캔하는 질의가 종료되지 않는 현상(CUBRIDSUS-11945)

인덱스를 스캔하는 질의가 종료되지 않으면서 일시적 임시(temporary temp) 볼륨이 무한히 증가하는 현상을 수정했다.

드라이버 연결 후 DB가 재시작되면 이후 첫 번째 질의 수행에 실패하는 현상(CUBRIDSUS-10773)

드라이버 연결 후 DB가 재시작되면 이후 첫 번째 질의 수행에서 아래의 오류 메시지와 함께 실패하는 현상을 수정했다.

Server no longer responding.... Invalid argument
Your transaction has been aborted by the system due to server failure or mode change.
A database has not been restarted.

CAS의 종료와 시작이 자주 발생하는 상황에서 새로운 접속 요청이 30초 이상 걸리는 문제(CUBRIDSUS-10891)

cubrid_broker.conf의 MIN_NUM_APPL_SERVER 값이 MAX_NUM_APPL_SERVER 보다 작게 설정된 경우, 접속하려는 드라이버 요청의 개수에 따라 CAS가 시작되거나 또는 종료될 수 있다. 이렇게 CAS의 시작과 종료가 자주 발생하는 환경에서, 가끔 새로운 접속 요청이 30초 이상 걸리는 문제를 해결하였다.

잠금 관리자의 내부 문제로 인해 DB 서버 프로세스의 동작이 멈추는(hang) 현상(CUBRIDSUS-10329)(CUBRIDSUS-11983)

잠금 관리자의 문제로 인해서 잠금 획득 과정에서 서버 프로세스가 더 이상 진행하지 못하고 멈출 수 있는 문제점과 잠금 대기 과정에서의 내부 오류로 인해서 잠금을 잘못 대기하여 결국 서버가 진행하지 못하는 문제점들을 수정했다.

교착 상태 감지시 발생 가능한 메모리 누수와 서버가 비정상 종료될 수 있는 문제(CUBRIDSUS-10378)

교착 상태 감지시 특정 상황에서 발생할 수 있는 메모리 누수 문제와 서버가 비정상 종료될 수 있는 문제를 수정했다.

독립 모드에서 새로운 페이지 할당 도중에 체크포인트가 발생하면 오류가 발생할 수 있는 문제(CUBRIDSUS-10444)

독립(Stand Alone) 모드에서 데이터가 입력되는 등으로 인해 새로운 페이지가 할당되는 도중에 체크포인트가 발생하면 "Skip invalid page in checkpoint." 오류가 발생할 수 있는 문제를 수정했다.

CAS가 CLIENT WAIT인 상태에서 동작을 멈출 수 있는 문제(CUBRIDSUS-10238)

CAS가 특정 시점에 시그널로 인해 종료되거나 비정상 종료되면 그 이후로 해당 번호의 CAS 또는 브로커 프로세스가 정상적으로 동작하지 못하고 무한히 대기할 수 있는 문제를 수정했다.

CAS에서 DB 서버 에러 수신 도중 네트워크 소켓 에러가 발생하면 CAS가 비정상 종료하는 현상(CUBRIDSUS-10401)

CAS에서 DB 서버 에러를 수신하는 도중에 네트워크 소켓 에러가 발생하는 경우 CAS가 비정상 종료하는 현상을 수정했다.

수정 이전 버전에서 shard.conf의 MAX_NUM_APPL_SERVER(shard CAS 프로세스의 개수를 설정) 값을 cubrid.conf의 max_clients(서버가 허용하는 최대 접속 개수를 설정) 값보다 크게 설정했을 때 "cubrid shard start"를 수행하면 SHARD CAS가 비정상 종료하는 현상이 발생한다.

체크포인트 이후에도 보관 로그가 정리되지 않는 현상(CUBRIDSUS-10757)

복구 시간 단축을 위해 데이터를 DB 볼륨에 갱신(flush)하는 체크포인트 수행 이후에도 보관 로그가 정리되지 않는 현상을 수정했다. 데이터의 갱신이 빈번한 상황에서 체크포인트가 수행되면 이 현상이 발생할 가능성이 높다. 수정 이전 버전에서는 해당 현상 발생 시 체크포인트 발생 시점이 갱신되지 않아 보관 로그를 유지해야 했으나, 수정 이후 체크포인트 발생 시점 이전의 보관 로그는 정리될 수 있도록 수정했다.

Windows에서 DB 서버를 재시작할 때 멈춰있는(hang) 문제(CUBRIDSUS-12028)

Windows에서 DB 서버를 재시작할 때 멈춰있는 문제를 수정했다. 이 문제는 Windows XP 이하, Windows 2003 이하 버전에서만 발생하며, Windows 7, Windows 2008에서는 발생하지 않는다.

SQL

다중 왼쪽 조인 질의에 WHERE 절 조건이 있으면 잘못된 질의 결과를 출력하는 문제(CUBRIDSUS-8867)

아래의 예와 같이 왼쪽 조인(left outer join)이 세 번 이상 중첩된 질의에 WHERE 절 조건이 있으면 잘못된 질의 결과를 출력하는 문제를 수정했다.

SELECT *
FROM tblA LEFT OUTER JOIN tblB ON tblA.pkey = tblB.pkey
          LEFT OUTER JOIN tblC ON tblB.p2key = tblC.p2key
          LEFT OUTER JOIN tblD ON tblC.p3key = tblD.p3key
WHERE tblD.p3key = 1;

AUTO_INCREMENT 칼럼이 있는 테이블을 RENAME할 수 없는 문제(CUBRIDSUS-9691)

AUTO_INCREMENT 속성을 가지는 칼럼을 포함한 테이블의 이름을 변경할 때 오류가 발생되는 문제를 수정했다.

자동 커밋 OFF인 상태에서 테이블 생성 후 고유 키 위반 오류 이후 INSERT 문 재수행 시 -96 오류가 발생하는 현상(CUBRIDSUS-10239)

자동 커밋 OFF인 상태에서 테이블 생성 후 INSERT 문 수행 도중 고유 키 위반 오류가 발생한 이후, INSERT 문을 재수행하면 -96번 오류가 발생하는 현상을 수정했다.

% csql testdb --no-auto-commit
CREATE TABLE tbl(col1 INTEGER UNIQUE);
INSERT INTO tbl SELECT 500 + ROWNUM FROM db_class a, db_class b;
INSERT INTO tbl SELECT ROWNUM FROM db_class a, db_class b;
ERROR: Operation would have caused one or more unique constraint violations. INDEX u_t_i(B+tree: 0|139|540) ON CLASS t(CLASS_OID: 0|486|2). key: 501(OID: 0|551|358).
INSERT INTO tbl SELECT 500 + ROWNUM FROM db_class a, db_class b;
ERROR: Media recovery may be needed on volume "/home1/cubrid1/CUBRID/databases/testdb/testdb".

중복되는 키가 많아지면서 인덱스 노드의 분할 오류로 인해 INSERT 문 수행에 실패하는 문제(CUBRIDSUS-9829)

중복되는 키가 많아 중복되는 레코드들의 주소 목록이 커진 상태에서, 인덱스의 리프 노드(leaf node)를 분할하며 위치할 노드를 잘못 선택하여 INSERT 문 수행에 실패하는 현상을 수정하였다.

OR 연산자의 피연산자로 항상 거짓인 조건들이 주어졌을 때 질의 결과가 잘못되는 문제(CUBRIDSUS-10475)

CREATE TABLE tab0 (col1 INTEGER);
INSERT INTO tab0 VALUES (514);
INSERT INTO tab0 VALUES (698);

-- 아래 질의는 0건을 출력해야 하나 수정 이전 버전에서 2건을 출력하는 오류가 존재한다.
SELECT * FROM tab0 WHERE (col1 BETWEEN 9 AND 2) OR (col1 BETWEEN 5 AND 4);

질의 계획만 보도록 설정했음에도 불구하고 SELECT 문을 제외한 나머지 질의문 수행 시 응용 프로그램이 비정상 종료하는 문제(CUBRIDSUS-9771)

질의 최적화 수준을 질의 계획만 보도록 설정했음에도 불구하고 SELECT 문을 제외한 INSERT, UPDATE, DELETE, REPLACE, TRIGGER, SERIAL 문 등 일부 SQL에 대해서는 응용 프로그램이 비정상 종료되는 문제가 존재했으나 SELECT 문을 제외한 나머지 질의문은 질의 계획이 출력되지 않게 수정했다.

SET OPTIMIZATION LEVEL 514;
REPLACE INTO tbl (col1, col2, col3) VALUES (1, 2, 3);

IN 절에 호스트 변수가 있으면 질의 실행 계획이 출력되지 않는 오류(CUBRIDSUS-9705)

IN 절이 (?, ?, ...) 형태의 호스트 변수를 포함하면 질의 실행 계획이 출력되지 않는 오류를 수정했다.

;plan detail

SELECT * FROM tbl WHERE id IN (?, ?, ?);

GROUP BY 절의 WITH ROLLUP 수정자 지정 시 수행 결과가 잘못될 수 있는 문제(CUBRIDSUS-9926)

GROUP BY 절의 WITH ROLLUP 수정자를 지정하면 수행 결과가 잘못될 수 있는 문제를 수정했다.

-- 수정 이전 버전에서 다음 질의 수행 시, ROLLUP된 결과 값이 출력되지 않았다.

SELECT a FROM t1
GROUP BY A WITH ROLLUP;

-- 수정 이전 버전에서 다음 질의 수행 시, ROLLUP된 결과 레코드의 a 칼럼 값이 NULL인데 a>1 이므로 출력되지 않아야 하나 출력되었다.
SELECT a, COUNT(*) FROM t1
GROUP BY a WITH ROLLUP HAVING a > 1;

FROM 절을 생략한 질의문에서 SQL 함수의 입력 인자로 부질의가 지정되면 오류가 발생하는 현상(CUBRIDSUS-9949)

FROM 절을 생략한 질의문에서 SQL 함수의 입력 인자로 부질의가 지정되면 "ERROR: syntax is ambiguous" 오류가 발생하는 현상을 수정했다.

SELECT INET_NTOA ((SELECT 3232235530));

NUMERIC 타입 칼럼에 호스트 변수를 이용하여 INSERT 수행 시 실패하는 문제(CUBRIDSUS-11366)

NUMERIC 타입 칼럼에 대해 호스트변수를 이용하여 INSERT를 수행할 때, 사용자가 입력한 값이 NUMERIC의 기본 precision(15), scale(0)으로 변경되어 입력되는 문제를 수정했다.

CREATE TABLE tb2 (a NUMERIC (4,4));

PREPARE STMT FROM 'INSERT INTO tb2 VALUES (?)';
EXECUTE STMT USING 0.1;

SELECT a FROM tb2;
    a
==========
    0.0
EXECUTE STMT USING 0.5;
ERROR: A domain conflict exists on attribute "a".

PREPARE 구문으로 CASE 또는 DECODE 문 수행 시 오류(CUBRIDSUS-11060)

PREPARE 구문으로 CASE 또는 DECODE 문 수행 시 모든 인자들이 호스트 변수로 주어지는 등 타입을 결정할 수 없을 때, " ERROR: Semantic: System error (generate var) in ../../src/parser/xasl_generation.c " 오류 메시지와 함께 질의 수행에 실패하는 현상을 수정했다.

PREPARE ST FROM 'SELECT CASE WHEN col = ? THEN ? ELSE ? END FROM tbl;'

CHAR 타입 칼럼에 INT 타입을 바인딩하여 INSERT INTO ... SELECT ? ...질의 수행 시 오류(CUBRIDSUS-9293)

INSERT INTO ... SELECT ? FROM db_root 질의 수행 시 CHAR 타입 칼럼에 INT 타입을 바인딩하면 " ERROR: A domain conflict exists on attribute noname " 오류 메시지와 함께 질의 수행에 실패하는 현상을 수정했다.

CREATE TABLE t (a CHAR (1));
PREPARE s FROM 'INSERT INTO t SELECT ? FROM db_root';
EXECUTE s USING 1;

뷰 생성에 사용된 테이블의 이름을 변경한 후에 뷰에 대한 질의 수행 시 변경 이전의 테이블로 동작하는 문제(CUBRIDSUS-10741)

뷰 생성에 사용된 테이블의 이름을 변경한 후에 뷰에 대한 질의를 수행하면 변경 이전의 테이블로 동작하는 문제를 수정했다.

CREATE TABLE foo (a INTEGER PRIMARY KEY, b VARCHAR (20));
INSERT INTO foo VALUES (1, 'foo');

CREATE TABLE bar (a INTEGER PRIMARY KEY, b VARCHAR (20));
INSERT INTO bar VALUES (1, 'bar');
CREATE VIEW v1 (a INTEGER, b VARCHAR (20)) AS SELECT * FROM foo;

-- foo를 foo_old, bar를 foo로 이름을 변경한다.
RENAME foo AS foo_old;
RENAME bar AS foo;

-- 수정 이전 버전에서는 Q1의 결과로 'bar', Q2의 결과로 'foo'를 출력하며, 수정 이후 버전에서는 둘 다 'bar'를 출력한다.
SELECT b FROM foo; -- Q1
SELECT b FROM v1;  -- Q2

UNION 질의에서 앞쪽 VARCHAR 타입 칼럼의 크기가 뒤쪽 칼럼의 크기보다 작을 때 오류가 발생하는 현상(CUBRIDSUS-9292)

UNION 질의에서 앞쪽 VARCHAR 타입 칼럼의 크기가 뒤쪽 칼럼의 크기보다 작으면 "ERROR: Execute: Query execution failure #1336." 오류 메시지와 함께 수행에 실패하는 현상을 수정했다.

CREATE TABLE u1 (a VARCHAR (1));
CREATE TABLE u2 (a VARCHAR (2));
INSERT INTO u1 VALUES ('1');
INSERT INTO u2 VALUES ('22');

SELECT a FROM (SELECT a FROM u1 UNION ALL SELECT a FROM u2) t(a);

PREPARE 문에서 ELSE 절 없는 CASE .. WHEN 절 또는 DEFAULT 인자 없는 DECODE 함수의 마지막 인자가 호스트 변수일 때 오류가 발생하는 현상(CUBRIDSUS-10405)

수정 이전 버전의 CASE .. WHEN 절에서 ELSE 절을 지정하지 않고 마지막 THEN 절의 인자가 호스트 변수이면 오류가 발생하는 현상을 수정했다.

PREPARE st FROM 'select CASE ? WHEN 1 THEN 1 WHEN -1 THEN ? END';
EXECUTE st USING -1, 3;

ERROR: Cannot coerce value of domain "integer" to domain "*NULL*".

수정 이전 버전의 DECODE 함수에서 DEFAULT 인자가 없고 result 인자가 호스트 변수이면 오류가 발생하는 문제를 수정했다.

PREPARE st FROM 'select DECODE (?, 1, 10,-1,?)';
EXECUTE st USING -1,-10;

ERROR: Cannot coerce value of domain "integer" to domain "*NULL*".

절대 경로를 포함한 LOB 파일 이름이 128보다 클 때 LOB 파일 경로를 출력하는 SELECT 문에서 응용 프로그램이 비정상 종료하는 문제(CUBRIDSUS-10856)

절대 경로를 포함한 LOB 파일(LOB 타입의 실제 데이터를 저장한 파일) 이름이 128보다 클 때 LOB 파일 경로를 출력하는 SELECT 문에서 응용 프로그램이 비정상 종료하는 문제를 수정했다.

CREATE TABLE clob_tbl(c1 clob);
SELECT * FROM clob_tbl;

뷰를 포함하여 테이블 셋을 SELECT할 때 응용 프로그램이 비정상 종료되는 현상(CUBRIDSUS-11016)

CREATE TABLE t (a int, b int);
CREATE TABLE u (a int, b int);
CREATE VIEW vt AS SELECT * FROM t;

SELECT * FROM (vt, u);

시스템 파라미터 max_plan_cache_entries의 값이 -1인 상태에서 INSERT 질의 수행 시 오류가 발생하면 같은 prepare문에 해당하는 질의는 계속해서 오류가 발생하는 문제(CUBRIDSUS-11038)

시스템 파라미터 max_plan_cache_entries의 값이 -1(플랜 캐시 OFF)인 상태에서 첫 번째 INSERT 질의 수행 시 오류가 발생하면 같은 prepare문에 해당하는 질의는 바인딩되는 호스트 변수 값을 바꿔서 재수행해도 계속 같은 오류가 발생하는 문제를 수정했다.

질의 계획 캐시를 사용하지 않는 질의문에서 사용되는 테이블 이름을 RENAME하고 기존 테이블을 DROP하는 경우 오류가 발생하는 문제(CUBRIDSUS-11039)

시스템 파라미터 max_plan_cache_entries의 값을 -1로 설정하여 질의 계획 캐시를 사용하지 않거나 IN 절에 호스트 변수를 사용하는 경우와 같이 질의 계획 캐시를 사용하지 않는 질의문에서 사용되는 테이블 이름을 RENAME하고 기존 테이블을 DROP하는 경우, 해당 질의를 실행하면 "INTERNAL ERROR: Assertion 'false' failed" 오류가 발생하는 문제를 수정했다.

T1 T2
SELECT * FROM foo WHERE id IN (?, ?);  
  CREATE TABLE foo_n AS SELECT * FROM foo;
RENAME foo AS foo_drop;
RENAME foo_n AS foo;
DROP TABLE foo_drop;
SELECT * FROM foo WHERE id IN (?, ?);  

플랜 캐시를 OFF하고 특정의 다중 질의문을 수행하면 응용 프로그램이 비정상 종료하는 현상(CUBRIDSUS-11055)

cubrid.conf의 max_plan_cache_entries 값을 -1로 설정하여 플랜 캐시를 OFF하고 다중 질의문을 수행하면 응용 프로그램이 비정상 종료하는 현상을 수정했다.

타입 형 변환이 필요한 비교 구문이 있는 질의 수행을 시도하면 응용 프로그램이 비정상 종료하는 현상(CUBRIDSUS-11064)

타입 형 변환이 필요한 비교 구문이 있는 질의 수행을 시도하면 응용 프로그램이 비정상 종료하는 현상을 수정했다. 수정 이전 버전에서 아래의 예처럼 SELECT LIST에 함수가 사용되고 LIMIT 절이 사용되는 경우 발생했으며, 둘 중 어느 하나가 없는 경우 정상적으로 오류 메시지를 출력했다.

SELECT MIN(col_int)
FROM cc
WHERE cc. col_int_key >= 'vf'
LIMIT 1;

다중 칼럼 인덱스의 어떤 칼럼에 DESC가 있고, 다음 칼럼의 값이 NULL인 경우 해당 인덱스를 스캔하는 SELECT 문 수행 시 잘못된 결과를 출력하는 현상(CUBRIDSUS-11354)

CREATE TABLE foo ( a integer primary key, b integer, c integer, d datetime );
CREATE INDEX foo_a_b_d_c on foo ( a , b desc , c );
INSERT INTO foo VALUES ( 1, 3, NULL, SYSDATETIME );
INSERT INTO foo VALUES ( 2, 3, NULL, SYSDATETIME );
INSERT INTO foo VALUES ( 3, 3, 1, SYSDATETIME );

SELECT * FROM foo WHERE a = 1 AND b > 3 ;
-- In the previous version, above query shows a wrong result.

            a            b            c  d
======================================================================
            1            3         NULL  12:23:56.832 PM 05/30/2013

부질의에 사용되는 ORDER BY 절의 칼럼이 부질의의 SELECT 리스트에 없는 경우 잘못된 결과를 출력하는 문제(CUBRIDSUS-11814)

부질의(subquery)에 사용되는 ORDER BY 절의 칼럼이 부질의의 SELECT 리스트에 명시되지 않은 경우에 잘못된 결과를 출력하는 문제를 수정했다.

SELECT a FROM foo WHERE a IN (SELECT a FROM foo WHERE b = 'AAA' ORDER BY b, c);

조인 계층 질의가 SELECT 리스트에 상관 부질의(correlated subquery)를 포함하고 있으면 잘못된 결과를 출력하는 현상(CUBRIDSUS-11658)

CREATE TABLE t1(i INT);
CREATE TABLE t2(i INT);
INSERT t1 VALUES (1);
INSERT t2 VALUES (1),(2);

SELECT (SELECT COUNT(*) FROM t1 WHERE t1.i=t2.i) FROM t1,t2 START WITH t2.i=1 CONNECT BY NOCYCLE 1=1;

수정 이전 버전에서는 잘못된 결과를 출력한다.

1
1

수정 이후 버전부터는 올바른 결과를 출력한다.

1
0

인덱스를 사용하며 ROWNUM 조건이 있는 계층 질의에서 질의 결과의 개수가 틀린 현상(CUBRIDSUS-9531)

인덱스를 사용하며 ROWNUM 조건이 있는 계층 질의에서 질의 결과의 개수가 ROWNUM에 의해 제한되지 못하는 현상을 수정했다.

SELECT oid
FROM foo
WHERE ROWNUM = 1
START WITH oid = '1234567'
CONNECT BY PRIOR poid = oid

CHAR 타입 칼럼이 연이어 정의된 테이블의 첫번째 칼럼을 CONV 함수에 입력하면 잘못된 결과를 반환하는 현상(CUBRIDSUS-11824)

CHAR 타입 칼럼이 연이어 정의된 테이블의 첫번째 칼럼을 CONV 함수에 입력하면 두번째 칼럼에 대한 CONV 값을 반환하는 현상을 수정했다.

CREATE TABLE tbl (h1 CHAR(1), p1 CHAR(4));
INSERT INTO tbl (h1, p1) VALUES ('0', '0001');
SELECT CONV (h1, 16, 10) from tbl;

1

INSERT ... SELECT 문에서 SELECT 리스트와 INSERT 리스트의 타입이 달라 타입 변환이 발생하고, SELECT 문에 ORDER BY 절이 존재할 때 INSERT되는 순서가 달라지는 현상(CUBRIDSUS-12031)

INSERT ... SELECT 문에서 SELECT 리스트와 INSERT 리스트의 타입이 달라 타입 변환이 발생하고, SELECT 문에 ORDER BY 절이 존재할 때 INSERT되는 순서가 달라지는 현상을 수정했다.

INSERT 리스트 칼럼 중 AUTO_INCREMENT 칼럼이 존재하는 경우 INSERT되는 순서가 중요하게 된다.

CREATE TABLE t1 (id INT AUTO_INCREMENT, a CHAR(5), b CHAR(5), c INT);
CREATE TABLE t2 (a CHAR(30), b CHAR(30), c INT);
INSERT INTO t2 VALUES ('000000001', '5', 1),('000000002','4',2),('000000003','3',3),('000000004','2',4),('000000005','1',5);
INSERT INTO t1(a,b,c) SELECT * FROM t2 ORDER BY a, b DESC;
SELECT * FROM t1;

HA

응용 프로그램에서 처음 DB에 접속했던 사용자의 소유로 슬레이브 노드에 스키마가 복제되는 현상(CUBRIDSUS-11878)

응용 프로그램에서 처음 DB에 접속했던 사용자의 소유로 슬레이브 노드에 스키마가 복제되는 현상으로, 예를 들어 user1 계정으로 DB에 접속했다가 종료한 후 다시 user2 계정으로 접속하여 테이블을 생성하면 슬레이브 노드에는 처음에 접속했던 user1 소유로 테이블이 생성되었다. 이 문제는 브로커 응용 서버(CAS)를 재시작하지 않는 한 지속되었으나, 이를 수정했다.

노드 상태가 변경되는 경우에 대한 로그 정보 추가(CUBRIDSUS-9748)

HA 환경에서 노드 상태가 변경되는 경우 다음 로그 정보를 추가하도록 수정했다. 이 정보는 error_log_level 시스템 파라미터의 값이 error 이하인 경우에 에러 로그 파일에 기록된다.

  • cub_master 프로세스의 로그 정보는 $CUBRID/log/<hostname>_master.err 파일에 저장되며 다음의 내용이 기록된다.

    HA generic: Send changemode request to the server. (state:1[active], args:[cub_server demodb ], pid:25728).
    HA generic: Receive changemode response from the server. (state:1[active], args:[cub_server demodb ], pid:25728).
    
  • cub_server 프로세스의 로그 정보는 $CUBRID/log/server/<db_name>_<date>_<time>.err 파일에 저장되며 다음의 내용이 기록된다.

    Server HA mode is changed from 'to-be-active' to 'active'.
    

생성하려는 인덱스의 이름이 예약어인 경우 슬레이브 노드에 반영되지 않는 현상(CUBRIDSUS-9669)

HA 환경에서 생성하려는 인덱스의 이름이 예약어인 경우 오류 메시지와 함께 슬레이브 노드에 반영되지 않는 현상을 수정했다.

CREATE TABLE t2 (a INT, b INT, INDEX "none" (a));
Internal system failure: [t2,'create class [t2] ( [a] integer, [b] integer, index none ([a]) ) '] In line 1, column 44 before ' ([a]) ) '

CREATE .... AS SELECT 문으로 테이블 생성 시 슬레이브 노드에 잘못된 칼럼 순서로 복제될 수 있는 문제(CUBRIDSUS-9672)

HA 환경에서 CREATE .... AS SELECT 문으로 테이블 생성 시 슬레이브 노드에 잘못된 칼럼 순서로 복제될 수 있는 문제를 수정했다.

-- 마스터 노드에서 다음을 수행
CREATE TABLE t2 (a INT PRIMARY KEY, b INT, c INT)
AS SELECT t1.c AS a, t1.a AS b, t1.b AS c FROM t1;

-- 슬레이브 노드에서 다음과 같이 칼럼 순서가 잘못 복제됨
CREATE TABLE [t2] ( [a] INTEGER, [b] INTEGER, [c] INTEGER, PRIMARY KEY ([a]) )
AS SELECT [t1].[c], [t1].[a], [t1].[b] FROM [t1];

PREFIX 칼럼에 DESC INDEX 생성 시 슬레이브 노드에 반영되지 않는 현상(CUBRIDSUS-9674)

HA 환경에서 PREFIX 칼럼에 DESC INDEX 생성 시 슬레이브 노드에 반영되지 않는 현상을 수정했다.

ALTER TABLE c2 ADD INDEX i_c (c (5) DESC);

ALTER 문으로 테이블 분할 시 슬레이브 노드에 반영되지 않는 현상(CUBRIDSUS-9675)

HA 환경에서 ALTER 문으로 테이블 분할을 수행하는 경우 슬레이브 노드에 반영되지 않는 현상을 수정했다.

ALTER TABLE range_tbl
REORGANIZE PARTITION p2 INTO
(PARTITION p3 VALUES LESS THAN (25), PARTITION p4 VALUES LESS THAN (30));

ALTER SERIAL 문이 슬레이브 노드에 반영되지 않는 현상(CUBRIDSUS-9916)

HA 환경에서 ALTER SERIAL 문이 슬레이브 노드에 반영되지 않는 현상을 수정했다.

ALTER SERIAL s1 START WITH 2;

트리거, 시리얼, 저장 함수 및 프로시저의 소유자가 슬레이브 노드에 잘못 반영되는 현상(CUBRIDSUS-10713)

트리거, 시리얼, 저장 함수 및 프로시저의 소유자가 슬레이브 노드에 항상 "DBA"로 잘못 반영되는 현상을 수정했다.

다중 칼럼으로 구성된 기본 키에 DESC 방향이 포함된 경우 데이터가 복제되지 않는 문제(CUBRIDSUS-9774)

CREATE TABLE t (a INTEGER, b INTEGER, c INTEGER, PRIMARY KEY (a, b DESC, c));
INSERT INTO t VALUES (1, 1, 1);

복제 재구축 스크립트 개선(CUBRIDSUS-10327)

ha_make_slavedb.sh 스크립트 내에 설정된 $repl_log_home 디렉터리가 존재하지 않을 경우 이를 생성하도록 수정했다. 또한, $CUBRID_DATABASES 와 $repl_log_home이 서로 다르게 생성된 경우 스크립트 수행 도중 예전에 슬레이브 노드로부터 복사해 온 마스터 노드의 복제 로그가 삭제되지 않는 문제를 수정했다.

databases.txt에 설정한 호스트 이름이 여러 개인 경우 뒤의 호스트 이름을 제대로 인식하지 못할 수 있는 문제(CUBRIDSUS-10344)

HA 환경에서 databases.txt에 설정한 호스트 이름이 여러 개이고 뒤의 호스트 이름이 앞의 호스트 이름을 포함하는 문자열인 경우 뒤의 호스트 이름을 제대로 인식하지 못하는 문제를 수정했다. 예를 들어 수정 이전 버전에서 호스트 이름 리스트가 "node:node1"으로 설정되면 node1을 제대로 인식하지 못하게 되어, "node"가 슬레이브 노드이고 "node1"이 마스터 노드가 되는 경우 RW 브로커 응용 서버(CAS)는 "node1"을 인식하지 못하면서 이에 접속하지 못하게 된다.

ASYNC 모드로 동작하는 트랜잭션 복제 로그 복사 프로세스와 연결되는 서버 프로세스에서 ETIMEOUT 오류는 정상 동작임에도 오류 로그를 기록하는 문제(CUBRIDSUS-10832)

ASYNC 모드로 동작하는 트랜잭션 복제 로그 복사 프로세스와 연결되는 서버 프로세스에서 " pthread_cond_wait() failed. " (ETIMEOUT) 오류 발생 시 오류 로그를 기록하지 않도록 수정했다. ETIMEOUT 오류는 서버 프로세스에서 트랜잭션 로그를 기록하는 스레드가 동작 대기 시간을 초과하면서 발생하는 오류이며 ASYNC 모드에서 이 오류가 발생하는 것은 정상임에도 불구하고, 이전 버전에서는 이를 오류 로그 파일에 기록하여 불필요한 디스크 I/O를 초래했다.

copylogdb가 무응답하여 DB 서버가 동작을 멈추는 현상(CUBRIDSUS-11145)

copylogdb 프로세스가 무응답할 경우 해당 copylogdb와 연결된 DB 서버의 동작이 멈추는 (hang) 현상을 수정했다. 해당 오류가 발생했을 경우 DB 서버는 copylogdb와 연결을 끊고 다음의 메시지를 출력한다.

Time: 06/11/13 10:56:40.002 - ERROR *** file ../../src/transaction/log_writer.c, line 1982 ERROR CODE = -1026 Tran = 2, CLIENT = hostname:copylogdb(6694), EID = 110
Timed out waiting for next request from client.

UNIQUE와 PRIMARY KEY를 동시에 지정하는 경우 해당 테이블에 대한 UPDATE, DELETE가 슬레이브 노드에 반영되지 않는 현상(CUBRIDSUS-9676)

같은 칼럼에 UNIQUE를 먼저 지정하고 PRIMARY KEY를 뒤이어 동시에 지정하는 경우 해당 테이블에 대한 UPDATE, DELETE가 슬레이브 노드에 반영되지 않는 현상을 수정했다.

CREATE TABLE demo(id INT);
ALTER TABLE demo ADD CONSTRAINT UNIQUE(id);
ALTER TABLE demo ADD CONSTRAINT PRIMARY KEY(id);

분할 테이블의 칼럼에 BIGINT 타입이 존재하는 경우 해당 테이블이 슬레이브 노드에 복제되지 않는 현상(CUBRIDSUS-9697)

CREATE TABLE t1 (i1 INTEGER PRIMARY KEY, b BIGINT ) PARTITION BY RANGE ( b )
(
    PARTITION p0 VALUES LESS THAN (1000) ,
    PARTITION p1 VALUES LESS THAN (10000000)
);

max_clients만큼의 연결이 맺어지면 applylogdb 또는 copylogdb 프로세스가 DB 서버에 접속하지 못하는 현상(CUBRIDSUS-10328)

HA 환경에서 max_clients만큼의 연결이 맺어지면 applylogdb 또는 copylogdb 프로세스가 DB 서버에 접속하지 못하면서 HA 구동 명령 수행에 실패하는 현상을 수정했다.

정상 판정을 받은 브로커에도 health check 메시지를 지속적으로 보내는 현상(CUBRIDSUS-10817)

HA 환경에서 연결 URL의 rctime 설정에 의해 브로커에 health check 메시지를 1분에 한 번씩 보내는데, 정상으로 판정되어도 한 번 장애 목록에 포함되면 health check 메시지를 지속적으로 보내는 현상을 수정했다.

복제 반영을 재시도해야 할 오류임에도 불구하고 재시도하지 않는 현상(CUBRIDSUS-10833)

cubrid_ha.conf의 ha_applylogdb_retry_error_list에 설정되어 복제 반영을 재시도해야 할 오류임에도 불구하고 재시도하지 않는 현상을 수정했다.

브로커의 JOB QUEUE가 가득 찬 경우 altHosts로 재접속을 시도하지 못하고 에러를 반환하는 현상(CUBRIDSUS-10851)

응용 프로그램들의 요청이 많아져 브로커의 JOB QUEUE가 가득 찬 경우, 연결 URL에 altHosts를 지정했음에도 불구하고 altHosts로 재접속을 시도하지 못하고 CAS_ER_FREE_SERVER 에러를 반환하는 문제를 수정했다.

마스터 노드에서 ASYNC로 설정했음에도 불구하고 로그 복사가 멈추면(block) 다음 트랜잭션을 진행하지 못하는 현상(CUBRIDSUS-10991)

cubrid_ha.conf의 ha_copy_sync_mode를 ASYNC로 설정했음에도 불구하고 로그 복사가 멈추면(block) 다음 트랜잭션을 진행하지 못하는 현상을 수정했다.

applylogdb 에러 메시지 중 상대편 노드의 서버 상태를 출력하는 메시지에 상대편 노드 이름 추가(CUBRIDSUS-10992)

applylogdb 에러 메시지 중 상대편 노드의 서버 상태를 출력하는 메시지에 상대편 노드 이름이 없었으나 이를 추가했다.

// 수정 이전
HA generic: change HA server state from from 'idle' to 'active'..

// 수정 이후
HA generic: change the state of HA server (testdb@cdbs037.cub) from 'idle' to 'active'.

BIGINT 타입 칼럼을 가진 뷰가 복제되지 않는 문제(CUBRIDSUS-11200)

CREATE VIEW vw AS SELECT CAST(2 AS BIGINT) FROM db_root;

Sharding

SHARD의 메타 정보를 출력하는 명령 수행 시 해당 명령이 비정상 종료되는 문제(CUBRIDSUS-10375)

shard.conf의 MAX_NUM_PROXY 파라미터 값을 2 이상으로 설정하여 다수의 shard proxy를 실행한 상태에서 "cubrid shard status -m"으로 CUBRID SHARD의 메타 정보를 출력하는 명령을 실행하면 해당 명령이 비정상 종료되는 문제를 수정했다.

shard.conf의 기본 설정에 포함된 PROXY_LOG_FILE을 PROXY_LOG_DIR로 바로 잡음(CUBRIDSUS-10381)

기본으로 설치되는 shard.conf 파일에 포함되어 있던 잘못된 파라미터 이름인 PROXY_LOG_FILE을 PROXY_LOG_DIR로 바로 잡았다.

바인딩 배열의 shard 키 값이 서로 다른 shard에 존재하면 오류 처리하도록 수정(CUBRIDSUS-9826)

Shard 환경에서 JDBC의 PreparedStatement.executeBatch(), CCI의 cci_execute_array()와 같이 여러 개의 값을 바인딩하여 질의를 일괄 처리하는 함수에서 바인딩하는 배열의 shard 키 값이 서로 다른 shard에 존재하면 해당 함수의 실행을 오류 처리하도록 수정했다.

prepare 요청이 많아지면서 응답이 오지 않는 현상(CUBRIDSUS-10041)

Shard 환경에서 동시에 동일한 질의에 대한 prepare 요청이 많아지면서 그 중 하나가 질의 타임아웃 또는 PROXY_TIMEOUT 시간 내에 처리하지 못하게 되는 경우, 처리 대기중이던 나머지 prepare 요청들도 함께 응답을 받지 못하는 문제를 수정했다.

shard proxy에서 연결 URL의 rcTime 값을 설정해도 원래의 연결로 복귀하는 동작이 정상 수행되지 않는 문제(CUBRIDSUS-10823)

shard proxy가 절체되는 경우 연결 URL에 rcTime이 설정되어 있으면 rcTime이 지난 이후 원래의 연결로 복귀하는 시도를 해야 하나, 이 동작이 정상 수행되지 않는 문제를 수정했다.

질의문에 SHARD_VAL 힌트 입력 시 SHARD CAS SQL 로그에서 이를 SHARD_ID 힌트로 치환되도록 수정(CUBRIDSUS-7156)

질의문에 SHARD_VAL 힌트를 입력하면 SHARD CAS SQL 로그에 기록되는 SQL 문에서는 이를 SHARD_ID 힌트로 치환되도록 수정했다.

shard.conf 의 MAX_CLIENT 제약으로 응용 클라이언트가 SHARD proxy로 접속 불가능한 경우, 이를 판단할 수 있도록 에러 코드 추가(CUBRIDSUS-8326)

shard.conf의 MAX_CLIENT의 제약으로 인해 SHARD proxy에 응용 클라이언트의 연결이 불가능한 경우, 수정 이전 버전에서는 단순히 네트워크 연결을 종료하기 때문에 에러 상황을 판단할 수 없었으나 이를 판단할 수 있는 에러 코드를 반환하도록 수정했다.

Proxy refused client connection. max clients exceeded

Statement 개수의 제한 또는 메모리 용량의 제한 등으로 인해 SHARD CAS가 재시작하면 트랜잭션 커밋에 대한 응답을 처리하기 전에 CAS의 연결 오류를 먼저 처리하는 문제(CUBRIDSUS-10792)

Statement 개수의 제한 또는 메모리 용량의 제한으로 인해 SHARD CAS가 재시작하면 트랜잭션 커밋에 대한 응답을 응용 프로그램이 전달받기 전에 SHARD CAS의 연결 오류(Cannot communicate with server)를 먼저 받게 되는 문제를 수정했다.

Linux 시스템에서 샤드 구동 시 필요한 fd 수보다 시스템의 "ulimit -n"의 값이 작게 설정되어 있으면 에러를 발생하도록 수정(CUBRIDSUS-10837)

Linux 시스템에서 "cubrid shard start"를 수행할 경우 필요한 fd(file descriptor) 수보다 "ulimit -n"으로 지정한 값이 작으면 응용 프로그램에서 시스템 멈춤(hang) 현상 등의 오동작이 발생했으나, 에러를 발생하도록 수정했다. Linux 시스템에서 필요한 fd의 개수는 shard.conf에서 설정하는 MAX_CLIENT에 적당한 개수를 더한 값이다.

"shard status" 명령을 통해 출력되는 CAS의 상태가 항상 IDLE로 출력되는 현상(CUBRIDSUS-10876)

"cubrid shard status" 명령을 통해 출력되는 CAS의 상태가 바뀌어야 하는 상황에서도 항상 IDLE로 출력되는 현상을 수정했다.

"shard reset" 명령 이후 응용 프로그램의 첫 번째 질의 처리에서 오류가 발생하는 문제(CUBRIDSUS-10895)

DB 서버 프로세스의 재시작 등으로 인해 SHARD CAS와 DB 서버 프로세스 사이의 기존 연결이 종료되면 "cubrid shard reset" 명령을 수행하여 재연결한 이후 모든 질의가 정상 처리되어야 하나, 응용 프로그램의 첫 번째 질의 처리에서 오류가 발생하는 문제를 수정했다.

"shard start" 명령 수행 시 공유 메모리가 요구량보다 훨씬 크게 할당되는 문제(CUBRIDSUS-10954)

"cubrid shard start" 명령 수행 시 사용되는 공유 메모리가 요구량보다 훨씬 크게 할당되어 메모리가 낭비되는 문제를 수정했다.

재시작된 SHARD CAS가 사용되지 못하는 현상(CUBRIDSUS-11271)

SHARD CAS 의 메모리 증가로 인하여 빈번하게 재시작 되는 경우, 해당 SHARD CAS가 사용자의 요청을 받지 못하는 현상을 수정했다.

"shard status -c" 명령 수행 시 출력하는 응용 프로그램의 최근 요청 시각이 갱신되지 않는 문제(CUBRIDSUS-11272)

"cubrid shard status -c" 명령 수행 시 출력하는 응용 프로그램의 최근 요청 시각(L-REQ-TIME)이 갱신되지 않는 상황이 존재했으나, 항상 갱신되도록 수정했다.

또한, 해당 명령 수행 시 출력되는 칼럼의 제목인 L-REQ-TIME, L-RES-TIME을 LAST-REQ-TIME, LAST-RES-TIME로 변경했다.

SHARD proxy에 대한 CAS의 개수가 동적으로 관리되도록 수정(CUBRIDSUS-10130)

shard.conf에서 SHARD proxy 시스템에 대한 CAS의 최소 개수인 MIN_NUM_APPL_SERVER와 최대 개수인 MAX_NUM_APPL_SERVER가 항상 동일하게 설정되어야 했으나, 이를 다르게 설정하여 설정과 부하에 따라서 실행되는 CAS 프로세스의 개수가 동적으로 늘어나거나 줄어들 수 있도록 수정했다.

또한, "cubrid shard status -b" 명령 수행 시 STMT-Q와 SHARD-Q 정보를 추가로 출력하도록 수정했다.

$ cubrid shard status -b -s 1 -t
@ cubrid shard status

  NAME           PID  PORT   Active-P   Active-C  STMT-Q SHARD-Q  TPS  QPS   SELECT   INSERT   UPDATE   DELETE   OTHERS   K-QPS  NK-QPS     LONG-T     LONG-Q   ERR-Q  UNIQUE-ERR-Q  #CONNECT
==============================================================================================================================================================================================
* shard1       18046 45511          4         16       0      12   56   65        0        0        0        0        0      65       0     0/60.0     0/60.0       0             0         0
  • STMT-Q: shard status 명령을 실행하는 시점에 prepare를 수행하려고 대기중인 클라이언트의 요청 수
  • SHARD-Q: shard status 명령을 실행하는 시점에 가용한 CAS를 대기중인 클라이언트의 요청 수

Linux에서 SHARD proxy 프로세스 당 연결 가능한 클라이언트의 개수를 최대 10,000개까지 허용하도록 수정(CUBRIDSUS-10218)

Linux에서 SHARD proxy 프로세스 당 연결 가능한 클라이언트의 개수를 기존에는 500개 정도로 제한했으나, 수정 이후 10,000개 까지 허용하도록 수정했다.

  • SHARD proxy 프로세스 한 개에서 사용하는 파일 디스크립터의(fd)는 다음과 같다. "((MAX_CLIENT + MAX_NUM_APPL_SERVER) / MAX_NUM_PROXY) + 256"

드라이버

[JDBC][CCI] 질의 타임아웃 시간 계산 방식 개선(CUBRIDSUS-9585)

응용 프로그램 단에서 사용한 시간을 제외한 나머지 시간을 서버에 전달하여 응용 프로그램이 요구하는 질의 타임아웃 기간이 만료되면 질의 수행이 중단되도록 수정했다.

[JDBC][CCI] 질의 타임아웃을 설정하면 fetch 도중에 질의 타임아웃이 발생하면서 실패하는 현상(CUBRIDSUS-9043)

브로커 파라미터 MAX_QUERY_TIMEOUT, JDBC의 setQueryTimeout 메서드, 연결 URL의 queryTimeout 속성으로 질의 타임아웃을 설정하면 fetch 도중에 질의 타임아웃이 발생하면서 실패하는 현상이 있었으나, 질의 execute 시간에만 타임아웃 발생이 가능하게 하고 fetch 도중에는 타임아웃이 발생하지 않도록 수정했다.

또한, cci_execute_batch 함수와 cci_execute_array 함수에서는 질의 타임 아웃이 동작하지 않도록 수정했다.

[JDBC][CCI] 배열/배치 실행 함수에서 질의를 실행하는 도중 교착 상태가 발생하면 나머지 질의를 수행하지 않도록 수정(CUBRIDSUS-9692)

JDBC의 PreparedStatement.executeBatch 메서드 또는 CCI의 cci_execute_array, cci_execute_batch와 같은 배열/배치 실행 함수에서 각각의 질의문을 실행하는 도중 교착 상태(deadlock)가 발생했음에도 불구하고 나머지 질의를 계속 수행했었지만, 교착 상태가 발생하면 나머지 질의 수행을 중단하도록 수정했다. 그 외에 일반적인 오류가 발생하는 경우에는 나머지 질의를 계속 수행한다.

[JDBC][CCI] 2008 R4.0 미만의 드라이버와 2008 R4.0 이상의 드라이버를 동시에 사용할 때 DB 서버 프로세스가 비정상 종료하는 문제(CUBRIDSUS-10916)

2008 R4.0 미만의 드라이버와 2008 R4.0 이상의 드라이버를 동시에 사용할 때 CHANGE CLIENT가 발생하면서 SESSION ID가 중복 사용되어 DB 서버 프로세스가 비정상 종료하는 문제를 수정했다.

[JDBC] 예외 발생 시 메시지에 다양한 정보를 출력하도록 수정(CUBRIDSUS-9611)

JDBC에서 예외 발생 시 메시지에 브로커 응용 서버(CAS) ID, CAS PID, SESSION ID, 연결 URL을 출력하도록 수정했다.

[JDBC] 응용 프로그램에서 Statement를 닫지 않았음에도 불구하고 PreparedStatement.clearParameter() 메서드 호출 시 예외 발생(CUBRIDSUS-10274)

JDBC 응용 프로그램에서 사용자가 DB 연결을 종료하지 않았고 Statement를 닫지 않았음에도 불구하고 PreparedStatement.clearParameter() 메서드를 호출하면 'Connection or Statement might be closed' 예외가 발생하는 문제를 수정했다.

[JDBC] ResultSetMetaData.isAutoIncrement() 메서드가 정상 동작하지 않는 문제(CUBRIDSUS-9710)

JDBC의 ResultSetMetaData.isAutoIncrement() 메서드 호출 시 어떤 칼럼의 AUTO_INCREMENT 설정 여부와 무관하게 false를 반환했으나, AUTO_INCREMENT 설정 여부에 맞게 동작하도록 수정했다.

[JDBC] 연결 URL에서 connectTimeout을 설정해도 altHosts로 재연결을 시도하지 않는 문제(CUBRIDSUS-10240)

JDBC에서 연결 URL에 connectTimeout을 설정해도 connectTimeout이 발생되었을 때 altHosts로의 재연결을 시도하지 않고 오류가 발생하는 문제를 수정했다.

[JDBC] 이미 close한 객체에 접근할 때 잘못된 예외 오류를 반환하는 문제(CUBRIDSUS-7251)

JDBC 응용 프로그램에서 이미 close한 java.sql.ResultSet, java.sql.Statement, java.sql.PreparedStatement, java.sql.CallableStatement, java.sql.Connection, java.sql.DatabaseMetaData object 등에 접근할 때 SQLException 예외 오류를 반환해야 하나, NullPointerException 예외 오류를 반환하는 문제를 수정했다.

[JDBC] 연결 URL의 zeroDateTimeBehavior 프로퍼티 설정이 exception일 때 zero date를 조회하면 잘못된 에러 메시지를 출력하는 문제(CUBRIDSUS-9963)

JDBC 응용 프로그램에서 연결 URL의 zeroDateTimeBehavior 프로퍼티 설정이 exception일 때 zero date에 해당하는 값을 조회하면 정상적인 에러 메시지를 출력하도록 수정했다.

// 수정 이전 에러 메시지
invalid argument

// 수정 이후 에러 메시지
Zero date can not be represented as java.sql.Timestamp.

참고로, 2008 R4.0 이하 버전에서 TIMESTAMP '1970-01-01 00:00:00'(GMT)는 TIMESTAMP의 최소값이지만, 2008 4.1 이상 버전에서는 zerodate로 인식되며 TIMESTAMP '1970-01-01 00:00:01'(GMT)이 TIMESTAMP의 최소값이다.

[JDBC] queryTimeout을 매우 큰 값으로 설정하면 정상 수행되어야 할 질의문에서 질의 타임아웃 에러가 발생하는 현상(CUBRIDSUS-10967)

JDBC 응용 프로그램에서 queryTimeout을 매우 큰 값으로 설정하면 비정상적인 질의 타임아웃 에러가 발생하는 현상을 수정했다. 이와 함께, queryTimeout을 2,000,000으로 제한했다.

[CCI] prepared statement를 실행하는 도중 -20004번 오류가 발생하는 문제(CUBRIDSUS-10937)

자동 커밋 모드가 ON인 상태로 cci_execute()를 실행하는 도중 CAS_ER_STMT_POOLING 오류가 발생하면 드라이버가 prepare를 내부적으로 재시도하는데 이와 동시에 CAS가 재시작되면 -20004 오류(CCI_ER_COMMUNICATION)가 발생하는 문제를 수정했다.

[CCI] cci_schema_info()의 수행 결과 페치 시 칼럼의 인덱스 여부에 대해 잘못된 정보를 출력하는 오류(CUBRIDSUS-9689)

cci_schema_info()의 수행 결과를 페치(fetch)하는 경우 어떤 칼럼에 인덱스 존재 여부를 나타내는 값을 잘못 출력하는 오류를 수정했다.

[CCI] 비동기 모드로 SELECT 질의 수행 이후 fetch가 완료되면 CAS_NO_MORE_DATA 오류가 발생하는 문제(CUBRIDSUS-7170)

비동기 모드로 SELECT 질의 수행 이후 fetch가 완료되면 CCI_NO_MORE_DATA 오류 대신 CAS_NO_MORE_DATA 오류가 발생하는 문제를 수정했다.

res = cci_execute (req, CCI_EXEC_ASYNC, 0, &error);

[CCI] DATASOURCE에서 사용한 연결을 닫은 후 연결 핸들을 그대로 다시 사용하는 경우 응용 프로그램이 비정상적으로 동작하는 문제(CUBRIDSUS-9586)

datasource를 사용하는 CCI 응용 프로그램에서 사용한 연결을 닫은 후 연결 핸들을 그대로 다시 사용하면 응용 프로그램이 비정상적으로 동작했으나 오류를 출력하도록 수정했다.

con_1 = cci_datasource_borrow (ds, &error);
cci_prepare_and_execute (con_1, query, 1, &exec_retval, &error);
ret = cci_datasource_release (ds, con_1, &error);

ret = cci_prepare_and_execute (con_1, query, 1, &exec_retval, &error); /* invalid access */

[CCI] pool_prepared_statement=off 상태에서 DATASOURCE 해제 후 cci_execute()를 호출하면 비정상 종료되는 문제(CUBRIDSUS-10847)

pool_prepared_statement=off 상태에서 DATASOURCE를 해제한 후에 이후 닫힌 핸들로 cci_execute() 함수를 호출하면 비정상 종료되는 문제를 수정했다.

[CCI] cci_execute 함수를 통해 다중 질의문 수행 시 두 번째로 해당 함수를 호출하면 오류가 발생하는 문제(CUBRIDSUS-10424)

cci_execute 함수를 통해 다중 질의문 수행 시 다중 질의문 중 첫 번째와 마지막의 질의 유형이 다른 경우, 예를 들어 첫 번째가 UPDATE 문이고 마지막이 SELECT 문인 경우에 두 번째로 해당 함수를 호출하면 "Invalid cursor position" 오류가 발생하는 문제를 수정했다.

static char *MULTI_STMT = "UPDATE T1 SET B = A; SELECT A FROM T1 WHERE A = ?;";

result = cci_execute (request, CCI_EXEC_QUERY_ALL, 0, error); /* 1st */

result = cci_execute (request, CCI_EXEC_QUERY_ALL, 0, error); /* 2nd */

[CCI] 정적 라이브러리를 사용하면 링크 오류가 발생하는 문제(CUBRIDSUS-10743)

CCI 정적 라이브러리를 사용하여 C 코드를 컴파일하면 링크 오류가 발생하는 문제를 수정했다.

[CCI] cci_connect_with_url_ex 함수에서 오류 버퍼에 부정확한 오류 메시지가 담기는 현상(CUBRIDSUS-10234)

cci_connect_with_url_ex 함수에서 오류가 발생하면 정확한 메시지가 오류 버퍼에 저장되지 않고 "DBMS Error"가 저장되는 현상을 수정했다. 예를 들어 잘못된 암호를 입력하면 "Incorrect or missing password" 오류 메시지가 저장되어야 한다.

[CCI] cci_datasource_borrow 호출에 성공한 이후 해당 연결을 사용 시 에러가 발생하는 현상(CUBRIDSUS-11159)

다중 응용 프로그램들이 CCI datasource를 사용하는 환경에서 cci_datasource_borrow 호출에 성공한 이후 해당 연결을 사용하려고 하면 에러가 발생하는 현상을 수정했다.

[CCI] cci_datasource_release 함수 호출 시 수행 중이던 트랜잭션의 롤백이 실패하면 다음 번 질의 수행 시 오류가 발생하는 문제(CUBRIDSUS-11841)

cci_datasource_release 함수가 트랜잭션이 종료되지 않은 상태로 호출되면 트랜잭션을 롤백시키는데, 롤백이 실패할 경우 드라이버의 트랜잭션 상태가 완료로 변경되지 않고 트랜잭션 중으로 유지되면서 다음 번 질의 수행 시 오류가 발생하는 문제를 수정했다.

[CCI] 에러 코드에 대해 누락된 에러 메시지 추가(CUBRIDSUS-11217)(CUBRIDSUS-11310)

CCI_ER_NO_PROPERTY, CCI_ER_PROPERTY_TYPE, CCI_ER_INVALID_DATASOURCE, CCI_ER_DATASOURCE_TIMEOUT, CCI_ER_DATASOURCE_TIMEDWAIT, CCI_ER_LOGIN_TIMEOUT, CCI_ER_QUERY_TIMEOUT 에러 코드에 대해 누락된 에러 메시지를 추가했다.

운영 편의성

DB 서버 시작이나 백업 볼륨 복구 시 에러 로그 파일에 로그 회복(log recovery) 시작과 끝을 알리는 NOTIFICATION 메시지를 출력하도록 수정(CUBRIDSUS-9620)

DB 서버 시작이나 백업 볼륨 복구 시 서버 에러 로그 또는 restoredb 에러 로그 파일에 로그 회복(log recovery) 시작 시간과 종료 시간에 대한 NOTIFICATION 메시지를 출력하도록 수정했다. 시작 로그에는 적용(redo)해야할 로그의 개수와 로그 페이지 개수가 함께 기록되며, 사용자는 로그를 통해 해당 작업의 소요 시간을 확인할 수 있다.

Time: 06/14/13 21:29:04.059 - NOTIFICATION *** file ../../src/transaction/log_recovery.c, line 748 CODE = -1128 Tran = -1, EID = 1
Log recovery is started. The number of log records to be applied: 96916. Log page: 343 ~ 5104.
.....
Time: 06/14/13 21:29:05.170 - NOTIFICATION *** file ../../src/transaction/log_recovery.c, line 843 CODE = -1129 Tran = -1, EID = 4
Log recovery is finished.

서버에서 질의 수행이 실패하면 해당 질의문을 NOTIFICATION 에러 메시지로 기록하도록 수정(CUBRIDSUS-10665)

서버에서 질의 수행이 실패하면 해당 질의문을 아래와 같이 NOTIFICATION 에러 메시지로 기록하도록 수정했다.

Time: 06/13/13 18:34:27.395 - NOTIFICATION *** file ../../src/communication/network_interface_sr.c, line 5803 CODE = -1122 Tran = 1, CLIENT = cdbs035.cub:query_editor_cub_cas_1(20781), EID = 7
Query execution error. ERROR_CODE = -670, /* SQL_ID: 9759b7e11189b */ update t1 set a=1 where a>?

CAS가 DB에 접속하지 못하는 경우 CAS의 SQL 로그에 연결 실패 정보를 기록하도록 수정(CUBRIDSUS-10676)

잘못된 암호 입력 등으로 CAS가 DB에 접속하지 못하는 경우 $CUBRID/log/broker/sql_log 이하에 위치하는 CAS의 SQL 로그에 연결 실패 정보를 기록하도록 수정했다. 수정 이전에는 없었던 아래의 정보가 수정 이후 추가로 기록된다.

13-05-29 11:02:54.172 (0) connect db bug_7455 user dba url cci:cubrid:10.24.18.66:38000:bug_7455:dba:********: - error:-171(Incorrect or missing password.)

통계 정보 갱신 시작 시와 종료 시에 서버 에러 로그에 NOTIFICATION 메시지를 출력하도록 수정(CUBRIDSUS-10702)

통계 정보 갱신 시작 시와 종료 시에 서버 에러 로그에 NOTIFICATION 메시지를 출력하도록 수정했다. 이를 통해 통계 정보 갱신에 걸리는 시간을 확인할 수 있다.

Time: 05/07/13 15:06:25.052 - NOTIFICATION *** file ../../src/storage/statistics_sr.c, line 123 CODE = -1114 Tran = 1, CLIENT = testhost:csql(21060), EID = 4
Started to update statistics (class "code", oid : 0|522|3).

Time: 05/07/13 15:06:25.053 - NOTIFICATION *** file ../../src/storage/statistics_sr.c, line 330 CODE = -1115 Tran = 1, CLIENT = testhost:csql(21060), EID = 5
Finished to update statistics (class "code", oid : 0|522|3, error code : 0).

오버플로우 키나 오버플로우 페이지가 발생하면 서버 에러 로그 파일에 NOTIFICATION 메시지를 출력하도록 수정(CUBRIDSUS-10703)

오버플로우 키나 오버플로우 페이지가 발생하면 서버 에러 로그 파일에 NOTIFICATION 메시지를 출력하도록 수정했다. 사용자는 이 메시지를 통해 DB 성능이 느려질 수 있음을 감지할 수 있다.

Time: 06/14/13 19:23:40.485 - NOTIFICATION *** file ../../src/storage/btree.c, line 10617 CODE = -1125 Tran = 1, CLIENT = testhost:csql(24670), EID = 6
Created the overflow key file. INDEX idx(B+tree: 0|131|540) ON CLASS hoo(CLASS_OID: 0|522|2). key: 'z ..... '(OID: 0|530|1).
...........

Time: 06/14/13 19:23:41.614 - NOTIFICATION *** file ../../src/storage/btree.c, line 8785 CODE = -1126 Tran = 1, CLIENT = testhost:csql(24670), EID = 9
Created a new overflow page. INDEX i_foo(B+tree: 0|149|580) ON CLASS foo(CLASS_OID: 0|522|3). key: 1(OID: 0|572|578).
...........

Time: 06/14/13 19:23:48.636 - NOTIFICATION *** file ../../src/storage/btree.c, line 5562 CODE = -1127 Tran = 1, CLIENT = testhost:csql(24670), EID = 42
Deleted an empty overflow page. INDEX i_foo(B+tree: 0|149|580) ON CLASS foo(CLASS_OID: 0|522|3). key: 1(OID: 0|572|192).

부하가 집중되어 특정 서버 스레드가 UPDATE를 위한 페이지 접근에 여러 번 실패하게 될 때 구체적인 오류 메시지를 출력하도록 수정(CUBRIDSUS-10704)

부하가 집중되어 특정 서버 스레드가 UPDATE를 위한 페이지 접근에 여러 번 실패하게 되면 "Internal system failure: no more specific information is available." 오류가 발생했으나, 보다 구체적인 정보를 제공하기 위해 "LATCH ON PAGE(xx|xx) ABORTED" 메시지를 출력하도록 수정했다.

드라이버 단에서 CAS 정보를 확인할 수 있도록 함수 제공 및 로그 메시지 추가(CUBRIDSUS-10818)

드라이버 단에서 CAS 정보를 확인할 수 있도록 CCI의 cci_get_cas_info 함수 또는 JDBC의 Connection.toString() 메서드를 제공했다. 또한, 드라이버의 슬로우 쿼리 로그와 에러 메시지에 CAS정보가 포함되도록 수정했다.

다음은 JDBC 응용 프로그램에서 cubrid.jdbc.driver.CUBRIDConnection 클래스의 toString() 메서드를 사용하여 CAS 정보를 출력한 예이다.

cubrid.jdbc.driver.CUBRIDConnection(CAS ID : 1, PROCESS ID : 22922)

다음은 CCI 응용 프로그램에서 cci_get_cas_info() 함수를 사용하여 CAS 정보를 출력한 예이다.

127.0.0.1:33000,1,12916

JDBC 드라이버의 슬로우 쿼리 로그에 다음처럼 CAS정보가 포함된다.

2013-05-09 16:25:08.831|INFO|SLOW QUERY
[CAS INFO]
localhost:33000, 1, 12916
[TIME]
START: 2013-05-09 16:25:08.775, ELAPSED: 52
[SQL]
SELECT * from db_class a, db_class b

CCI 의 슬로우 쿼리 로그에 다음처럼 CAS정보가 포함된다.

2013-05-10 18:11:23.023 [TID:14346] [DEBUG][CONHANDLE - 0002][CAS INFO - 127.0.0.1:33000, 1, 12916] [SLOW QUERY - ELAPSED : 45] [SQL - select * from db_class a, db_class b]

JDBC의 에러 메시지에 다음처럼 CAS정보가 포함된다.

Syntax: syntax error, unexpected IdName [CAS INFO - localhost:33000,1,30560],[SESSION-16],[URL-jdbc:cubrid:localhost:33000:demodb::********:?logFile=driver_1.log&logSlowQueries=true&slowQueryThresholdMillis=5].

CCI의 에러 메시지에 다음처럼 CAS정보가 포함된다.

Syntax: syntax error, unexpected IdName [CAS INFO - 127.0.0.1:33000, 1, 30560].

브로커의 SQL 로그 또는 브로커의 상태 출력 시 접속한 드라이버의 버전 정보를 포함하도록 수정(CUBRIDSUS-10936)

브로커의 SQL 로그를 출력할 때와 "cubrid broker status -f" 명령을 수행하여 브로커 상태를 출력할 때 접속 드라이버의 버전을 출력하도록 수정했다.

수정 이후 SQL 로그는 다음과 같이 출력된다.

13-05-27 18:50:08.584 (0) CLIENT VERSION 8.4.4.0165

수정 이후 브로커 상태 정보는 다음과 같이 출력된다.

$ cubrid broker status -f
@ cubrid broker status
% test
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   ID PID QPS LQS PSIZE STATUS LAST ACCESS TIME DB HOST LAST CONNECT TIME CLIENT IP CLIENT VERSION SQL_LOG_MODE TRANSACTION STIME #CONNECT #RESTART
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1 12236 10 0 63820 CLOSE_WAIT 2013/05/12 16:22:51 demodb localhost 2013/05/12 16:22:06 10.64.48.166 8.4.4.0165 - 2013/05/12 16:22:51 8 0
SQL:

killtran 명령에서 출력하는 질의문을 사용자가 입력한 문자열 그대로 출력하도록 수정(CUBRIDSUS-10251)

"cubrid killtran" 명령에서 질의문 출력 시 시스템이 재작성한 문자열을 출력했으나, 사용자가 입력한 문자열 그대로 출력하도록 수정했다.

유틸리티

CSQL에서 질의가 영향을 끼친 행 수, 수행 시간 등 부가 정보를 한 줄에 출력하도록 수정(CUBRIDSUS-10055)

수정 이전에는 CSQL에서 질의 수행 시 아래와 같이 여러 줄에 걸쳐 부가 정보를 출력했다.

1 rows selected.
SQL statement execution time: 0.008940 sec

Current transaction has been committed.

수정 이후 한 줄에 출력하게 되었다.

1 rows selected. (0.008940 sec) Committed.

CSQL에서 DB 서버 접속에 실패할 때 csql.err에만 원인이 남고 콘솔에는 접속 실패 메시지만 출력하는 문제(CUBRIDSUS-10073)

CSQL에서 DB 서버 접속에 실패할 때 csql.err에만 원인이 남고 콘솔에는 접속 실패 메시지만 출력했으나, 콘솔에도 접속 실패 원인을 출력하도록 수정했다.

다음은 cubrid.conf의 max_clients 설정을 초과하는 CAS 프로세스가 구동될 때 발생하는 에러 메시지이다.

$ csql testdb@localhost
Server refused client connection: max clients, (10), exceeded.
Failed to connect to database server, 'testdb', on the following host(s): localhost

ERROR: Failed to connect to database server, 'testdb', on the following host(s): localhost

다음은 DB 서버와 브로커의 버전이 서로 다를 때 발생하는 에러 메시지이다.

$ csql testdb@testhost.cub
Server release 8.4.4 is different from client release 9.2.0.
Failed to connect to database server, 'testdb', on the following host(s): testhost.cub

ERROR: Failed to connect to database server, 'testdb', on the following host(s): testhost.cub

데이터베이스 서버 종료 후 질의를 재차 수행 시 CSQL이 비정상 종료되는 현상(CUBRIDSUS-11634)

데이터베이스 서버 종료 후 CSQL 인터프리터에서 질의 수행 시 처음에는 " ERROR: Your transaction has been aborted by the system due to server failure or mode change. "라는 정상 오류를 출력하나, 질의를 다시 수행하면 CSQL 인터프리터가 비정상 종료되는 현상을 수정했다.

CSQL에서 결과 출력 시 칼럼의 길이를 제한하는 기능 추가(CUBRIDSUS-9643)

CSQL에서 결과 출력 시 칼럼의 길이를 제한하는 기능을 추가했다.

  • ;STring-width는 문자열과 비트 타입의 칼럼에 대해 출력 길이를 제한하는 CSQL 세션 명령어이다. 명령행 옵션(--string-width)도 제공한다.
  • ;COLumn-width는 타입의 구분 없이 모든 칼럼의 출력 길이를 제한하는 CSQL 세션 명령어이다.

CSQL 세션 명령어인 ";read" 수행 시 파일 이름 뒤에 공백 문자가 오면 수행에 실패하는 문제(CUBRIDSUS-10357)

아래 명령 수행 시 test.txt 뒤에 공백 문자가 오면 발생되는 오류를 수정했다.

csql> ;read test.txt
ERROR: Too many file names have been entered.

CSQL에서 주석 내에 작은 따옴표가 포함되어 있을 때 주석 처리가 제대로 되지 못하는 문제(CUBRIDSUS-9696)

다음과 같은 경우에 주석 처리가 정확히 되지 않아 세션 명령어가 수행되지 않는 문제를 수정했다.

csql> -- it's a line comment.
csql> ;exit

backupdb 명령의 -D 옵션에 존재하지 않는 경로를 입력하면 에러 처리하도록 수정(CUBRIDSUS-10642)

"cubrid backupdb" 명령의 -D 옵션에 존재하지 않는 경로를 입력하면 오동작을 수행했으나 에러 처리하도록 수정했다.

broker_log_top의 입력 파일에 년도가 바뀐 데이터가 공존하면 정상 수행되지 않는 현상(CUBRIDSUS-10435)

broker_log_top의 입력 파일인 CAS 로그 파일에 년도 정보가 없어 년도가 바뀐 데이터가 한 파일에 공존하면 정상 수행되지 않았으나, 로그의 날짜 부분에 년도를 포함(YY-MM-DD)하여 broker_log_top를 수행하면 정상 수행되도록 수정했다.

broker_log_converter와 broker_log_runner 관련 오류 수정(CUBRIDSUS-10822)

bind value에 varchar 칼럼이 존재하는 경우 broker_log_converter의 결과 파일에서 바인딩 값이 잘못되는 문제와, 바인딩 값에 datetime 칼럼이 존재하는 경우 broker_log_runner를 실행했을 때 CCI 응용 프로그램에서 "type conversion" 오류가 발생하는 문제를 수정했다.

또한, 바인딩 값에 datetime 칼럼이 존재하는 경우와 관련하여 cci_bind_param에서 날짜 문자열의 형식은 기존 버전에서는 "YYYY/MM/DD"만 허용했으나, 수정 버전부터 "YYYY/MM/DD" 또는 "YYYY-MM-DD" 형식을 허용하도록 수정했다.

cubrid lockdb 명령 수행 시 잘못된 "Run Deadlock interval" 값을 출력하는 현상(CUBRIDSUS-11798)

cubrid lockdb 명령 수행 시 아래와 같이 잘못된 "Run Deadlock interval" 값을 출력하는 현상을 수정했다.

Lock Escalation at = 100000, Run Deadlock interval = -689679844

"cubrid broker reset" 명령 수행 시 CAS와 브로커 간의 연결을 즉시 리셋하도록 수정(CUBRIDSUS-11972)

"cubrid broker reset" 명령을 수행했음에도 불구하고 CAS와 DB 서버 간에 기존의 연결을 유지하는 경우가 존재했으나 즉시 연결을 리셋하도록 수정했다.

Windows 버전의 backupdb 명령이 잘못된 입력에 대해 내부 에러를 출력하는 문제(CUBRIDSUS-10634)

Windows 버전의 "cubrid backupdb" 명령의 -D 옵션에 존재하지 않는 디렉터리를 입력하면 "pthread_cond_destroy" 오류가 발생하는 현상을 수정했다.

killtran 명령을 통해 종료된 트랜잭션의 질의문이 오류를 반환하지 않는 문제(CUBRIDSUS-10133)

질의를 수행중인 트랜잭션을 "cubrid killtran" 명령으로 종료하면 해당 트랜잭션에서 수행중인 질의문의 결과로 아무런 오류가 반환되지 않았으나, "Has been interrupted" 오류를 반환하도록 수정했다.

plandump 명령 또는 슬로우 쿼리 로그 출력 시 질의 원문이 포함되도록 수정(CUBRIDSUS-9593)

"cubrid plandump" 명령을 통해 질의 계획 대상이 되는 질의를 출력하거나 서버 에러 로그 혹은 브로커 로그에 슬로우 쿼리(slow query)를 출력할 때 기존에는 재작성된(rewritten) 질의문을 출력했으나, 사용자가 입력한 질의 원문도 포함하도록 수정했다.

SQL 로그 파일 형식이 잘못된 경우 broker_log_top 명령이 비정상 종료하는 문제(CUBRIDSUS-10072)

SQL 로그 파일 형식이 잘못되어 있는 경우에 broker_log_top, shard_broker_log_top 명령이 비정상 종료되는 문제를 수정했다.

브로커 상태 정보 출력 시 client wait CAS 개수가 전체 CAS 개수보다 크게 출력되는 현상(CUBRIDSUS-10235)

"cubrid broker status -f" 명령으로 브로커 상태 정보를 출력할 때, CAS 개수가 최소 개수보다 늘었다가 줄어들었으면 CLIENT WAIT 상태의 CAS 개수가 전체 CAS 개수보다 더 크게 출력되는 현상을 수정했다.

shard_broker_changer 명령을 통해 파라미터 값을 변경할 때 잘못된 값으로 설정되는 문제(CUBRIDSUS-9956)

SQL_LOG, SLOW_LOG, PROXY_LOG 등의 파라미터 값을 shard_broker_changer 명령을 통해 변경할 때 잘못된 값으로 설정되는 문제를 수정했다.

cubrid broker status 명령의 -s 옵션이 주어진 경우 ERR-Q 항목 값을 잘못 출력하는 문제(CUBRIDSUS-10391)

cubrid broker status 명령의 -s 옵션이 주어진 경우 ERR-Q 항목에 초당 오류 질의 개수를 출력했으나, 옵션으로 주어진 N 초 동안의 오류 질의 개수를 출력하도록 수정했다.

DB 생성 시 범위를 벗어난 볼륨 크기를 입력하면 출력하는 오류 메시지 개선(CUBRIDSUS-9761)

DB 생성 시 허용 범위를 벗어난 볼륨 크기를 입력 단위 없이 입력하면 Byte(B) 단위로 입력되었다는 것을 오류 메시지에 포함하여 출력하도록 수정했다.

% cubrid createdb testdb --db-volume-size=1121
Couldn't create database.
The given 'db_volume_size', 1121B is out of range. Choose a size between 20.0M and 20.0G.

checkdb 명령 수행을 인터럽트하지 못하는 문제(CUBRIDSUS-10831)

"cubrid checkdb" 명령의 인덱스 검사 작업을 인터럽트하여 중단시키지 못하는 문제를 수정했다.

SA모드로 checkdb 수행 시 데이터베이스 볼륨의 페이지 할당 테이블 정보가 유효한지 검사하도록 수정(CUBRIDSUS-10755)

데이터베이스 볼륨의 헤더 부분에는 현재 볼륨에서 사용중인 페이지에 대한 할당 테이블이 유지되는데, SA모드로 checkdb를 수행하면 각 볼륨의 페이지 할당 테이블 정보와 데이터베이스에서 유지되는 페이지 정보가 일치하는지 검사하도록 하였다.

두 정보가 불일치하는 경우 아래와 같은 오류 메시지를 남긴다.

Internal error: Page id 256 is allocated according to the allocation map of volume "/home1/cubrid/tdb_x001", but it does not belong to any file.
Internal error: Page id 256 of volume "/home1/cubrid/tdb_x001" is currently being used. But it is not allocated according to the allocation map of volume.

설정, 빌드 및 설치

브로커의 ACCESS_CONTROL_FILE 파라미터에 접속을 허용하는 한 브로커 내의 DB 사용자 별 IP 목록의 최대 라인 개수를 256개로 늘림(CUBRIDSUS-11985)

브로커의 ACCESS_CONTROL_FILE 파라미터에 접속을 허용하는 IP 목록의 최대 라인 개수가, 하나의 브로커 내에서 같은 DB와 같은 사용자 별로 최대 100라인이었으나 최대 256라인으로 늘어났다.

브로커 파라미터 SQL_LOG의 값이 NOTICE로 설정되어 있어도 SQL 로그에 정상 수행된 질의가 가끔 출력되는 현상(CUBRIDSUS-10286)

cubrid_broker.conf의 SQL_LOG 값이 NOTICE로 설정되어 있어도 정상 수행된 질의가 가끔 출력되는 현상이 발생할 수 있는데, 이러한 가능성을 줄이도록 수정했다.

Windows에서 CUBRID 엔진 설치 중 Java 설치 여부에 따른 알림 메시지 수정(CUBRIDSUS-9917)

Windows에서 CUBRID 엔진 설치 중 Java 1.6 이상 버전이 설치되지 않았으면 CUBRID Manager를 사용할 수 없다는 메시지를 출력했으나, 이 메시지는 CUBRID 엔진과는 무관한 메시지이므로 이 메시지 대신 자바 저장 프로시저를 사용할 수 없다는 메시지를 출력하도록 수정했다.

cubrid_broker.conf 파일 없이 브로커 유틸리티를 수행하면 잘못된 오류 메시지를 출력하는 문제(CUBRIDSUS-11243)

cubrid_broker.conf 파일 없이 브로커를 시작하면 브로커의 구동에 실패하면서 "The socket path is too long (>108): /home/CUBRID/var/CUBRID_SOCK/ "이라는 비정상적인 오류 메시지를 출력했으나 정상적인 오류 메시지를 출력하도록 수정했다.

cubrid_broker.conf 파일 없이 cubrid broker stauts, cubrid broker stop 를 수행하면 오류 메시지를 "cubrid broker is not running."으로 잘못 출력했으나, 정상적인 오류 메시지를 출력하도록 수정했다.

RPM 패키지 설치 시 /etc/init.d 설치 및 chkconfig 에 cubrid 스크립트가 추가되도록 수정(CUBRIDSUS-10657)

RPM 패키지 설치 시 /etc/init.d 설치 및 chkconfig에 cubrid 스크립트가 추가되도록 수정하여, 이후 재부팅 시 "service cubrid start" 명령을 자동으로 수행하게 되었다. 하지만 수정 이후 버전에서도 cubrid 스크립트 파일 안의 $CUBRID_USER 환경 변수를 CUBRID를 설치한 Linux 계정으로 변경하는 작업이 필요하다. 수정 이전 버전에서는 $CUBRID/share/init.d cubrid라는 스크립트가 포함되어 이 파일 안의 $CUBRID_USER라는 환경 변수를 CUBRID를 설치한 Linux 계정으로 변경한 후 /etc/init.d에 등록하는 과정이 필요했다.

RPM 패키지 설치 후 cshell을 사용하여 로그인할 때 오류가 발생하는 현상(CUBRIDSUS-9769)

RPM 패키지 설치 시 /etc/profile.d/cubrid.csh 파일이 생성되는데, cshell로 로그인하는 사용자는 해당 파일을 실행하면서 오류가 발생하는 현상을 수정했다.

2008 R4.1 Patch 2 이전 버전에서 버그로 인해 칼럼 길이보다 큰 데이터가 잘못 들어갔는데, 업그레이드 이후 해당 데이터를 읽을 수 없는 문제(CUBRIDSUS-10347)

2008 R4.1 Patch 2 이전 버전에서 버그로 인해 칼럼 길이보다 큰 데이터가 잘못 들어갔는데, 업그레이드 이후 해당 이터를 읽을 수 없는 문제가 존재했으나 해당 데이터의 경우 칼럼의 길이만큼 잘라서 읽을 수 있도록 수정했다.

Windows에서 tar.gz 소스 압축 파일이 정상적으로 풀리지 않는 문제 수정(CUBRIDSUS-10959)

Windows에서 tar.gz 소스 압축 파일이 정상적으로 풀리지 않는 문제를 수정했다. 또한, 새 버전부터는 Windows 사용자를 위해 zip 파일을 별도로 제공한다.

64bit Linux 용 바이너리로 빌드 시 cub_cmhttpd 바이너리가 빌드되지 않는 현상(CUBRIDSUS-10960)

64bit Linux 용 바이너리로 빌드하는 과정에서 아래의 오류가 발생하면서 cub_cmhttpd 바이너리가 빌드되지 않는 현상을 수정했다.

build_64 command not found

기타

자동 커밋 모드에서 내부 에러 발생 시에 커서가 닫히는 문제(CUBRIDSUS-10937)

자동 커밋 모드에서 내부적으로 -20004번 에러(CAS_ER_STMT_POOLING) 발생 시에 자동 롤백되어 유지되고 있던 커서가 모두 닫히는 문제를 수정했다.

데이터베이스 접속 요청에 대한 NOTIFICATION 메시지를 한번만 기록하도록 수정(CUBRIDSUS-9885)

데이터베이스 서버에 대한 접속 요청 시에 접속 요청에 대한 처리 시작과 끝을 나타내는 각각의 NOTIFICATION 메시지를 출력하던 것을 하나의 NOTIFICATION 메시지만 출력하도록 수정했다.

여러 클라이언트가 동일한 테이블에 대한 UPDATE 수행 시 -495번 오류가 발생할 수 있는 문제(CUBRIDSUS-10651)

여러 클라이언트가 동시에 같은 테이블에 대해 UPDATE를 수행하고 질의 타임아웃이 자주 발생하는 상황에서, 몇 가지 원인으로 인해 -495번 오류("Execute: Query execution failure #8560")가 발생하는 문제를 수정했다.

하지만 부하가 집중되어 특정 서버 스레드가 UPDATE를 위한 페이지 접근에 여러 번 실패하게 되면 수정 이전 버전에서는 -495번 오류가 발생했는데, 수정 이후 -2번 오류("Internal system failure: no more specific information is available.")가 발생한다. 이런 상황은 동일한 페이지에 대한 UPDATE 요청이 집중되는 상황에서 발생할 수 있는 문제로 사용자는 실패한 질의를 다시 시도해야 한다.

메모리 사용량 초과로 브로커 응용 서버(CAS)가 재시작될 때 메모리 사용량을 CAS 로그에 출력하도록 수정(CUBRIDSUS-10181)

브로커 응용 서버(CAS)가 메모리 사용량 최대값인 cubrid_broker.conf의 APPL_SERVER_MAX_SIZE 초과로 인해 재시작할 때 해당 프로세스의 메모리 사용량을 CAS 로그에 출력하도록 수정했다.

01/10 18:43:42.217 (0) CAS MEMORY USAGE (101M) HAS EXCEEDED MAX SIZE (101M)

Windows 버전 브로커를 통해 서버에 접속할때 cub_master가 구동되어 있지 않으면 잘못된 에러가 발생하는 문제(CUBRIDSUS-10739)

응용프로그램이 Windows 버전 브로커를 통해 서버에 접속하는 경우 cub_master 프로세스가 구동되어 있지 않으면 잘못된 에러가 발생하고 CAS가 무한 루프를 반복하는 문제를 수정했다.

수정 이전 버전에서 Windows의 경우 아래의 오류 번호를 반환한다. * 첫 번째 접속 시도 시 -21112 (An IOException was caught during reading the inputstream) 반환 * 두 번째 접속 시도 시 -21013 (Cannot connect to a broker)

수정 전후의 Linux와 수정 이후의 Windows의 경우 아래의 오류 번호를 반환한다. * 첫 번째, 두 번째 접속 시도 시 모두 -353 (Failed to connect to database server, 'basic', on the following host(s): localhost) 반환

Windows에서 브로커 파라미터 값이 잘못되었음에도 불구하고 브로커 구동 시 정상 구동되었다는 메시지가 출력되는 문제(CUBRIDSUS-11243)

Windows에서 브로커 파라미터 값이 잘못되었으면 브로커를 구동할 수 없다는 오류 메시지가 정상 출력되도록 수정했다.

브로커 파라미터 값이 잘못되었을 때 부적절한 오류 메시지를 출력하는 문제(CUBRIDSUS-11243)

브로커 파라미터 값이 잘못되었을 때 "Error: can't find cubrid_broker.conf"라는 부적절한 오류 메시지를 출력하는 문제를 수정했다.

DB 서버 프로세스가 비정상 종료된 이후 복구 도중 발생하는 ER_FILE_TABLE_CORRUPTED 에러를 WARNING으로 변경(CUBRIDSUS-10921)

DB 서버 프로세스가 비정상 종료된 이후 복구 도중 ER_FILE_TABLE_CORRUPTED 에러가 발생하는 경우가 있었으나, 이는 발생 가능한 상황이므로 WARNING으로 변경했다.

주의 사항

신규 주의 사항

SQL 로그 파일 크기를 지정하는 브로커 파라미터의 기본 설정값을 100MB에서 10MB로 줄임(CUBRIDSUS-9944)

2008 R4.4부터 cubrid_broker.conf의 SQL_LOG_MAX_SIZE의 기본 설정값이 100MB에서 10MB로 줄었으므로, 더 많은 로그 정보를 남기고 싶다면 이 값을 더 크게 설정해야 한다.

[JDBC] 연결 URL의 zeroDateTimeBehavior 속성 값이 "round"일 때 TIMESTAMP의 zero date가 '0001-01-01 00:00:00'에서 '1970-01-01 00:00:00'(GST)로 변경됨(CUBRIDSUS-11612)

2008 R4.4부터, 연결 URL의 zeroDateTimeBehavior 속성 값이 "round"일 때 TIMESTAMP의 zero date 값이 '0001-01-01 00:00:00'에서 '1970-01-01 00:00:00'(GST)로 변경되었으므로, 응용 프로그램에서 zero date를 사용하는 경우 주의해야 한다.

기존 주의 사항

CCI 응용 프로그램에서 여러 개의 질의를 한 번에 수행한 결과의 배열에 대한 에러 처리 방식 수정(CUBRIDSUS-9364)

CCI 응용에서 여러 개의 질의를 한 번에 수행할 때 2008 R3.0부터 2008 R4.1 버전까지는 cci_execute_array 함수, cci_execute_batch 함수 또는 cci_execute_result 함수에 의한 질의 수행 결과들 중 하나만 에러가 발생해도 해당 질의의 에러 코드를 반환했으나, 2008 R4.3 버전 및 9.1 버전부터는 전체 질의 개수를 반환하고 CCI_QUERY_RESULT_* 매크로들을 통해 개별 질의에 대한 에러를 확인할 수 있도록 수정했다.

수정 이전 버전에서는 에러가 발생한 경우에도 배열 내 각각의 질의들의 성공 실패 여부를 알 수 없으므로, 이를 판단해야 한다.

...
char *query = "INSERT INTO test_data (id, ndata, cdata, sdata, ldata) VALUES (?, ?, 'A', 'ABCD', 1234)";
...
req = cci_prepare (con, query, 0, &cci_error);
...
error = cci_bind_param_array_size (req, 3);
...
error = cci_bind_param_array (req, 1, CCI_A_TYPE_INT, co_ex, null_ind, CCI_U_TYPE_INT);
...
n_executed = cci_execute_array (req, &result, &cci_error);

if (n_executed < 0)
  {
    printf ("execute error: %d, %s\n", cci_error.err_code, cci_error.err_msg);

    for (i = 1; i <= 3; i++)
      {
        printf ("query %d\n", i);
        printf ("result count = %d\n", CCI_QUERY_RESULT_RESULT (result, i));
        printf ("error message = %s\n", CCI_QUERY_RESULT_ERR_MSG (result, i));
        printf ("statement type = %d\n", CCI_QUERY_RESULT_STMT_TYPE (result, i));
      }
  }
...

수정 이후 버전에서는 에러가 발생하면 전체 질의가 실패한 것이며, 에러가 발생하지 않은 경우에 대해 배열 내 각 질의들의 성공 실패 여부를 판단한다.

...
char *query = "INSERT INTO test_data (id, ndata, cdata, sdata, ldata) VALUES (?, ?, 'A', 'ABCD', 1234)";
...
req = cci_prepare (con, query, 0, &cci_error);
...
error = cci_bind_param_array_size (req, 3);
...
error = cci_bind_param_array (req, 1, CCI_A_TYPE_INT, co_ex, null_ind, CCI_U_TYPE_INT);
...
n_executed = cci_execute_array (req, &result, &cci_error);
if (n_executed < 0)
  {
    printf ("execute error: %d, %s\n", cci_error.err_code, cci_error.err_msg);
  }
else
  {
    for (i = 1; i <= 3; i++)
      {
        printf ("query %d\n", i);
        printf ("result count = %d\n", CCI_QUERY_RESULT_RESULT (result, i));
        printf ("error message = %s\n", CCI_QUERY_RESULT_ERR_MSG (result, i));
        printf ("statement type = %d\n", CCI_QUERY_RESULT_STMT_TYPE (result, i));
      }
  }
...

2008 R4.1 버전부터 CCI_DEFAULT_AUTOCOMMIT 의 기본값이 ON으로 바뀜(CUBRIDSUS-5879)

2008 R4.1 버전부터 CCI 인터페이스로 개발된 응용 프로그램의 자동 커밋 모드에 영향을 주는 브로커 파라미터인 CCI_DEFAULT_AUTOCOMMIT의 기본값이 ON으로 변경되었다. 따라서 CCI 및 CCI로 개발된 인터페이스(PHP, ODBC, OLE DB 등) 사용자는 응용 프로그램의 자동 커밋 모드가 이에 적합한지 살펴보아야 한다.

2008 R4.0 버전부터 페이지 단위의 옵션 및 파라미터가 볼륨 크기 단위로 바뀜(CUBRIDSUS-5136)

"cubrid createdb" 명령의 DB 볼륨 크기 및 로그 볼륨 크기를 지정할 때 페이지 단위를 사용하는 옵션들(-p, -l, -s)은 제거될 예정이므로, 2008 R4.0 Beta 이후 새로 추가된 옵션들(--db-volume-size, --log-volume-size, --db-page-size, --log-page-size)을 사용한다.

"cubrid addvoldb" 명령의 DB 볼륨 크기를 지정하는 경우에도 페이지 단위를 사용하지 않고 2008 R4.0 Beta 이후 새로 추가된 옵션(--db-volume-size)을 사용한다. 페이지 단위의 시스템 파라미터들은 추후 제거될 예정이므로 바이트 단위의 새로운 시스템 파라미터를 사용할 것을 권장한다. 관련 시스템 파라미터들에 대한 내용은 아래를 참고한다.

2008 R4.0 Beta 이전 사용자는 DB 볼륨 크기 설정 시 주의(CUBRIDSUS-4222)

2008 R4.0 Beta 버전부터 DB 생성 시 데이터 페이지 및 로그 페이지의 크기 기본값이 4KB에서 16KB로 변경되었으므로, DB 볼륨을 페이지 개수로 지정하여 생성하는 경우 볼륨의 바이트 크기가 기대와 다를 수 있음에 주의한다. 아무런 옵션도 주지 않을 경우 이전 버전에서는 4KB의 페이지 크기로 100MB의 DB 볼륨을 생성했으나, 2008 R4.0 버전부터는 16KB의 페이지 크기로 512MB의 DB 볼륨을 생성하게 된다.

그리고, DB 볼륨의 생성 가능한 최소 크기를 20MB로 제한했으므로 이보다 작은 크기의 DB 볼륨은 생성할 수 없다.

2008 R4.0 이전 버전의 일부 시스템 파라미터들의 기본값 변경(CUBRIDSUS-4095)

2008 R4.0부터 다음 시스템 파라미터들의 기본값이 변경되었다.

DB 서버가 허용하는 동시 연결 개수를 설정하는 max_clients의 기본값, 인덱스 페이지 생성 시 향후 업데이트를 대비하여 확보하는 여유 공간 비율을 설정하는 index_unfill_factor의 기본값이 변경되었으며, 바이트 단위 시스템 파라미터의 기본값이 기존 페이지 단위 시스템 파라미터의 기본값보다 커져서 별도의 설정을 하지 않는 경우 더 많은 메모리를 사용하게 되었다.

기존 시스템 파라미터 추가된 시스템 파라미터 기존 기본값 변경된 기본값 (단위: 바이트)
max_clients 없음 50 100
index_unfill_factor 없음 0.2 0.05
data_buffer_pages data_buffer_size 100M(페이지 크기=4K) 512M
log_buffer_pages log_buffer_size 200K(페이지 크기=4K) 4M
sort_buffer_pages sort_buffer_size 64K(페이지 크기=4K) 2M
index_scan_oid_buffer_pages index_scan_oid_buffer_size 16K(페이지 크기=4K) 64K

또한, "cubrid createdb"로 DB 생성 시 데이터 페이지 크기와 로그 페이지 크기의 최소값이 1K에서 4K로 변경되었다.

시스템 파라미터를 잘못 설정하면 DB 서비스, 유틸리티 및 응응 프로그램이 구동되지 않음(CUBRIDSUS-5375)

cubrid.conf 또는 cubrid_ha.conf에 정의되지 않은 시스템 파라미터를 설정하거나, 페이지 단위의 시스템 파라미터와 바이트 단위의 시스템 파라미터가 동시에 사용되거나, 시스템 파라미터 값이 허용 범위를 벗어나면 이와 관련된 DB 서비스, 유틸리티 및 응응 프로그램이 구동되지 않는다.

CUBRID 32bit 버전에서 data_buffer_size에 2G를 초과하는 값을 설정하면 DB 구동에 실패함(CUBRIDSUS-5349)

CUBRID 32bit 버전에서 data_buffer_size가 2G를 초과하는 값으로 설정되는 경우 DB 구동에 실패한다. 32bit 버전에서는 OS의 한계로 인해 설정값이 2G를 초과할 수 없음에 주의한다.

Windows Vista 이상 버전에서 cubrid 유틸리티를 사용한 서비스 제어 시 권장 사항(CUBRIDSUS-4186)

Windows Vista 이상 버전에서 cubrid 유틸리티를 사용하여 서비스를 제어하려면 명령 프롬프트 창을 관리자 권한으로 구동한 후 사용하는 것을 권장한다.

명령 프롬프트 창을 관리자 권한으로 구동하지 않고 cubrid 유틸리티를 사용하는 경우 UAC(User Account Control) 대화 상자를 통하여 관리자 권한으로 수행될 수 있으나 수행 결과 메시지를 확인할 수 없다.

Windows Vista 이상 버전에서 명령 프롬프트 창을 관리자 권한으로 구동하는 방법은 다음과 같다.

  • [시작> 모든 프로그램> 보조 프로그램> 명령 프롬프트]에서 마우스 오른쪽 버튼을 클릭한다.
  • [관리자 권한으로 실행(A)]을 선택하면 권한 상승을 확인하는 대화 상자가 활성화되고, "예"를 클릭하여 관리자 권한으로 구동한다.

CUBRID 소스 빌드 후 실행 시, 매니저 서버 프로세스 관련 오류 발생(CUBRIDSUS-3553)

사용자가 직접 빌드하여 설치하는 경우, CUBRID와 CUBRID 매니저를 각각 빌드하여 설치해야 한다. 만약, CUBRID 소스만 checkout하여 빌드 후 cubrid service start 또는 cubrid manager start를 실행하면, cubrid manager server is not installed라는 오류가 발생한다.

2008 R3.0 이하 버전에서 사용하던 GLO 클래스 지원 중단(CUBRIDSUS-3826)

CUBRID 2008 R3.0 이하 버전은 glo (Generalized Large Object) 클래스를 사용하여 Large Object를 처리했으나, CUBRID 2008 R3.1 이상 버전 glo 클래스를 제거하고 BLOB, CLOB 타입(이하 LOB)을 지원한다. LOB 데이터 타입에 대한 자세한 내용은 BLOB/CLOB 데이터 타입 절을 참고하면 된다.

기존의 glo 클래스 사용자는 다음과 같이 작업할 것을 권장한다.

  • GLO 데이터를 파일로 저장한 후 어플리케이션 및 DB 스키마에서 GLO를 사용하지 않도록 수정한다.
  • unloaddb, loaddb 유틸리티를 이용하여 DB 마이그레이션을 한다.
  • 변경한 어플리케이션에 맞게 파일을 LOB 데이터로 로딩하는 작업을 수행하도록 한다.
  • 수정한 어플리케이션이 정상 동작하는지 확인한다.

참고로, cubrid loaddb 유틸리티는 GLO 클래스를 상속받거나 GLO 클래스 타입을 가진 테이블을 로딩하려는 경우 " Error occurred during schema loading " 오류 메시지와 함께 데이터 로딩을 중지한다.

GLO 클래스의 지원 중단에 따라 각 인터페이스 별로 삭제한 함수는 다음과 같다.

인터페이스 삭제한 함수
CCI

cci_glo_append_data

cci_glo_compress_data

cci_glo_data_size

cci_glo_delete_data

cci_glo_destroy_data

cci_glo_insert_data

cci_glo_load

cci_glo_new

cci_glo_read_data

cci_glo_save

cci_glo_truncate_data

cci_glo_write_data

JDBC

CUBRIDConnection.getNewGLO

CUBRIDOID.loadGLO

CUBRIDOID.saveGLO

PHP

cubrid_new_glo

cubrid_save_to_glo

cubrid_load_from_glo

cubrid_send_glo

마스터 프로세스와 서버 프로세스 간 프로토콜 변경 및 두 개 버전을 동시에 운영하는 경우 포트 설정 필요(CUBRIDSUS-3564)

마스터 프로세스(cub_master)와 서버 프로세스(cub_server) 간 통신 프로토콜 변경으로 인해 CUBRID 2008 R3.0 이상 버전의 마스터 프로세스는 하위 버전의 서버 프로세스와 통신할 수 없고, 하위 버전의 마스터 프로세스도 2008 R3.0 이상 버전의 서버 프로세스와 통신할 수 없다. 따라서, 이미 하위 버전이 설치되어 있는 환경에서 새 버전을 추가 설치하여, 두 개 버전의 CUBRID를 동시에 운영하는 경우 각각 서로 다른 포트를 사용하도록 cubrid.conf의 cubrid_port_id 시스템 파라미터를 수정해야 한다.

JDBC에서 연결 정보를 URL 스트링으로 입력하는 경우 물음표를 반드시 명시(CUBRIDSUS-3217)

JDBC에서 URL 스트링으로 연결 정보를 입력하는 경우 이전 버전에서는 물음표(?)를 입력하지 않더라도 속성(PROPERTY) 정보가 적용되었으나, CUBRID 2008 R3.0부터는 문법에 따라 반드시 물음표를 명시해야 하고 이를 생략할 경우 에러를 출력한다. 또한, 연결 정보 중 USERNAME과 PASSWORD가 없더라도 반드시 콜론( : )을 명시해야 한다.

URL=jdbc:CUBRID:127.0.0.1:31000:db1:::altHosts=127.0.0.2:31000,127.0.0.3:31000 -에러 처리
URL=jdbc:CUBRID:127.0.0.1:31000:db1:::?altHosts=127.0.0.2:31000,127.0.0.3:31000 -정상 처리

DB 이름에 @를 포함할 수 없음(CUBRIDSUS-2828)

DB 이름에 @이 포함되는 경우 호스트 이름이 명시된 것으로 해석될 수 있으므로 이를 방지하기 위하여 "cubrid createdb", "cubrid renamedb", "cubrid copydb" 유틸리티 실행 시 DB 이름에 @를 포함할 수 없도록 수정했다.