Contents

9.2 패치 릴리스 노트

릴리스 노트 정보

본 문서는 CUBRID 9.2 Patch 1(빌드번호 9.2.1.0020)부터 9.2 Patch 19(빌드번호 9.2.19.0003)까지의 정보를 포함한다.

CUBRID 9.2의 각 패치 버전은 이전 패치 버전에서 발견된 오류 수정 및 기능 개선을 포함한다.

CUBRID 9.2는 CUBRID 9.1에서 발견된 오류 수정 및 기능 개선과 이전 버전들에 반영된 모든 오류 수정 및 기능 개선을 포함한다.

9.0 Beta, 9.1, 9.2에 대한 정보는 9.0 릴리스 노트, 9.1 릴리스 노트, 9.2 릴리스 노트에서 확인할 수 있다.

CUBRID 2008 R4.4에 대한 정보는 http://www.cubrid.org/manual/844/ko/release_note/에서 확인할 수 있다.

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

동작 변경

9.2 Patch 11

동적 변경이 불가했던 브로커 파라미터 일부를 가능하게 수정 (CUBRIDSUS-13994)

다음 파라미터들의 동적 변경(broker_changer 명령을 통한 값의 변경)이 가능하도록 수정했다.

  • PREFERRED_HOSTS
  • MAX_PREPARED_STMT_COUNT
  • SESSION_TIMEOUT
  • ERROR_LOG_DIR
  • LOG_DIR
  • SLOW_LOG_DIR

9.2 Patch 9

call stack dump 및 error log 관련 파라미터에 대해 동적 변경이 가능하도록 수정 (CUBRIDSUS-14120)

call_stack_dump_activation_list, call_stack_dump_deactivation_list, call_stack_dump_on_error, error_log_level, error_log_size, error_log_warning 파라미터에 대해 동적으로 변경해도 DB 서버(cub_server)에는 변경된 값이 반영되지 않았으나, 반영되도록 수정했다. 예를 들어, 수정 이전 버전에서 error_log_level을 ERROR에서 WARNING으로 변경하면 변경을 요청한 응용 프로그램에만 이 값이 변경되고 DB 서버에는 변경되지 않아 DB 서버에서 발생하는 WARINING 메시지가 에러 로그에 기록되지 않지만, 수정 이후에는 DB 서버에도 이 값이 변경되면서 DB 서버의 WARINING 메시지가 에러 로그에 기록된다.

복제 동기화 잠금을 획득하지 못하는 경우의 에러 로그 레벨을 NOTIFICATION 에서 ERROR로 변경 (CUBRIDSUS-14156)

복제 동기화 잠금을 영구히 획득할 수 없어서 복제 반영이 멈춘 경우에도, 에러 로그 레벨에 따라서 에러 로그가 기록되지 않는 문제가 있다. 이 상황을 사용자가 감시할 수 있도록 해당 메시지에 대한 에러 로그 수준을 NOTIFICATION에서 ERROR로 변경했다. 해당 에러 메시지는 applylogdb의 에러 로그 파일($CUBRID/log/<db-name>@<local-node-name>_applylogdb_<db-name>_<remote-node-name>.err )에 출력된다.

Unable to mount disk volume "/home/cubrid/CUBRID/var/APPLYLOGDB/testdb". The database "testdb", to which the disk volume belongs, is in use by user - on process 13223 of host - since -.

복제 동기화 잠금을 영구히 획득할 수 없는 경우는 아래와 같다.

  • 기존 HA 그룹으로 구성되어 복제 반영 중이던 노드가 제거된 경우
  • 기존 HA 그룹으로 구성되어 복제 반영 중이던 노드의 이름이 변경된 경우

9.2 Patch 3

JDBCCCI CCI의 loginTimeout과 JDBC의 connectTimeout의 적용 범위 및 기본값 변경 (CUBRIDSUS-12537)

수정 이전에는 URL에 설정한 CCI의 loginTimeout(JDBC는 ConnectTimeout)이 최초 접속시에만 적용되며 loginTimeout(JDBC는 connectTimeout)을 지정하지 않으면 무한 대기했다. 수정 이후 로그인 타임아웃이 최초 접속 이후 내부 재접속에도 적용되며, loginTimeout(JDBC는 connectTimeout)을 지정하지 않은 경우 기본 값이 30초로 설정된다.

CCI datasource에서 연결 개수의 제한을 동적으로 변경할 수 있도록 수정 (CUBRIDSUS-12616)

datasource에서 연결 개수를 제한하는 pool_size 속성을 변경 가능하도록 하고, datasource 생성 시 연결 풀에 유지되는 최대 연결 개수를 지정하는 max_pool_size 속성을 추가했다. 수정 이후 pool_size 속성은 cci_datasource_change_property 함수를 통해 최대 max_pool_size 값까지 변경할 수 있다.

9.2 Patch 2

CCI prepare 또는 execute 함수에서 내부적인 재접속 시 login_timeout 속성이 적용되도록 수정 (CUBRIDSUS-12530)

수정 이전 버전에서는 prepare 또는 execute 함수에서 내부적인 재접속 시 로그인 타임아웃이 적용되지 않았으나 login_timeout이 설정되어 있을 경우 반영되도록 수정했다.

9.2 Patch 1

슬레이브 노드 또는 레플리카 노드에서 CSQL에 --sysadm 옵션만 사용하는 경우 DDL, INSERT 질의가 성공하지 못하도록 수정 (CUBRIDSUS-12187)

수정 이후 슬레이브 노드 또는 레플리카 노드에서 DDL, INSERT를 포함한 쓰기 질의가 성공하려면 --sysadm과 함께 --write-on-standby 옵션을 사용해야 한다.

브로커 접속 로그(ACCESS_LOG) 파일의 출력 정보 및 관련 파라미터 수정 (CUBRIDSUS-9617)

ACCESS LOG 파일의 로깅 형식과 로그 파일 백업 정책이 변경되었다. 상세한 수정 내용은 다음과 같다.

  1. cubrid_broker.conf의 ACCESS_LOG 기본값을 OFF로 변경했다.

  2. ACCESS_LOG 파일에 접속 정보만 기록하도록 수정했다.

  3. 접속 거부된 기록은 broker_name.access.denied에 기록된다. ACCESS_LOG 파일과 동일한 규칙으로 백업된다.

    다음은 수정 이후 접속 정보이다.

    1 127.0.0.1 2013/07/19 16:25:46 tdb dba NEW 49463
    

    위의 접속 정보에서 뒤의 2개 필드는 다음을 의미한다.

    • connection_type: NEW ,OLD, REJ 중 하나의 값을 가지며 각각 다음을 의미한다.

      • NEW: 새로운 접속
      • OLD: change client 또는 CAS 재시작으로 인한 기존 연결의 재접속
      • REJ: 접속 거부(access.denied 파일에만 기록됨)
    • session-id: 서버에서 할당한 세션 번호

      change client 등으로 인해 CAS번호가 변경되었을 때, 최초 연결이 어떤 CAS에 다시 접속되었는지 추적할 수 있도록 한다.

  4. 브로커 동작 중 동적으로 변경 가능한 ACCESS_LOG_MAX_SIZE 파라미터를 추가했다. ACCESS_LOG 파일의 최대 크기를 지정하며, ACCESS_LOG 파일이 지정한 크기보다 커지면 broker_name.access.YYYYMMDDHHMISS 형식의 이름으로 백업된 후 새 파일(broker_name.access)에 로그가 기록된다. 기본값은 10M 이며 최대 2G 까지 설정이 가능하다.

  5. ACCESS_LOG_DIR 파라미터를 추가했다. ACCESS_LOG 파일이 생성되는 디렉터리를 지정한다. 기본값은 log/broker 이다.

  6. 수정 이전 버전에서는 브로커 정지 시 ACCESS_LOG가 지워지거나 백업되었으나, 수정 이후 브로커 정지 시 ACCESS_LOG와 관련하여 아무것도 하지 않는다. 이와 함께, LOG_BACKUP 파라미터는 더 이상 사용되지 않는다.

"cubrid unloaddb" 명령에 DB 계정과 암호를 지정하는 옵션 추가 (CUBRIDSUS-12070)

수정 이전 버전에서는 DB 계정과 암호의 지정이 없이 "cubrid unloaddb"를 수행할 수 있어 전체 데이터를 덤프할 수 있는 보안 문제가 존재했으나, "cubrid unloaddb"에 DB 계정과 암호를 지정해야만 수행 가능하도록 수정했다.

수정 이후 버전에서 DB 계정과 암호가 지정되지 않을 경우 DB 계정은 "DBA", 암호는 빈 문자열("")이 된다.

기능 추가

9.2 Patch 7

디스크 장애를 감지하는 기능 추가 (CUBRIDSUS-13796)

디스크 장애를 감지하기 위해 cubrid.conf의 ha_monitor_disk_failure_interval 파라미터가 추가되었다. 이 파라미터 값에 설정한 시간마다 디스크 장애 여부를 판단한다.

9.2 Patch 6

copylogdb의 지연으로 인해 로그 플러시도 지연되는 상태를 감지하여 데이터베이스 서버 로그 파일에 로깅하는 기능 추가 (CUBRIDSUS-13232)

cubrid.conf의 log_trace_flush_time 파라미터에 설정한 시간보다 로그 플러싱 시간이 오래 걸리는 상태를 감지하여 로깅하는 기능을 추가했다.

질의 수행 시간 및 질의 계획을 재확인하기 위해 SQL 로그를 재생하는 cubrid_replay 유틸리티 추가 (CUBRIDSUS-13170)

이 유틸리티를 통해 다음 정보를 확인할 수 있다.

  • SQL 로그에 기록된 질의 수행 시간과 이 유틸리티에 의해 재생된 질의 수행 시간의 차이가 큰 것부터 확인할 수 있다. 즉, 어떤 장비에 기록된 SQL 로그를 다른 장비에서 재생하여 어떤 SQL에서 성능 차이가 발생하는지를 확인할 수 있다.
  • SELECT 문 뿐 아니라 UPDATE, DELETE 문도 SELECT 문으로 변환하여 질의 계획을 확인할 수 있다.

9.2 Patch 5

문자열 중간에 '\0'가 있는 경우에도 바인딩할 수 있는 cci_bind_param_ex 함수를 추가 (CUBRIDSUS-13503)

cci_bind_param 함수는 중간에 '\0'이 포함된 문자열을 바인딩할 수 없으므로, 이 동작이 가능한 cci_bind_param_ex 함수를 추가했다.

cci_bind_param_ex(statement, 1, CCI_A_TYPE_STR, "aaa\0bbb", 7, CCI_U_TYPE_STRING, 0);

위에서 다섯번째 인자인 7이 문자열의 바이트 길이에 해당된다.

9.2 Patch 4

JDBC 연결 객체 생성 시 브로커 연결 없이 대기하게 하는 기능 추가 (CUBRIDSUS-13376)

JDBC 연결 URL의 속성에 'useLazyConnection=(true|false)'를 추가했다. 기본값은 false이며, 이 값이 true이면 사용자의 연결 요청 시 브로커 연결 없이 성공을 반환하며, prepare나 execute 등의 함수를 호출할 때 브로커에 연결된다. 이 값을 true로 설정하면 많은 클라이언트 응용이 동시에 재시작되면서 CONNECTION POOL을 생성할 때 접속이 지연되거나 실패하는 현상을 피할 수 있다.

인덱스 스킵 스캔 힌트 추가 (CUBRIDSUS-13348)

인덱스 스킵 스캔의 적용 여부를 통계 정보에 의해 결정하는 경우 사용자의 의도에 맞지 않게 순차 스캔(sequential scan)이 적용될 수 있으므로, 인덱스 스킵 스캔 힌트(INDEX_SS)를 추가하여 해당 힌트를 입력하는 경우에만 인덱스 스킵 스캔이 적용될 수 있도록 수정했다.

어떤 칼럼의 제약 조건이 NULL일 때 데이터 검사 없이 제약 조건을 NOT NULL로 변경하는 것을 허용하는 힌트 추가 (CUBRIDSUS-13221)

NULL을 NOT NULL로 제약 조건을 변경하는 경우 기존 버전에서는 hard default로 값을 업데이트하는 과정으로 인해 많은 시간이 소요되며, 이 문제를 해소하기 위해 수정된 버전에서는 SKIP_UPDATE_NULL를 제공한다. 이 힌트 사용 이후 사용자는 NOT NULL 제약 조건과 불일치되는 NULL 값이 존재할 수 있음을 인지해야 한다.

ALTER /*+ SKIP_UPDATE_NULL */ TABLE foo MODIFY col INT NOT NULL;

9.2 Patch 2

CCI 로그인 타임아웃 값 변경 함수 추가 및 datasource 속성 변경 함수 추가 (CUBRIDSUS-12530)

다음 함수들이 추가되었다.

  • cci_set_login_timeout: 로그인 타임아웃을 밀리초 단위로 설정한다.
  • cci_get_login_timeout: 로그인 타임아웃 값을 반환한다.
  • cci_datasource_change_property: CCI의 DATASOURCE에 대해 key에 명시한 속성(property)의 값을 val에 설정한다. 이 함수를 사용하여 변경한 속성 값은 datasource 내 모든 연결에 적용된다.

databases.txt의 db-host에 명시된 호스트들 중 접속을 시도할 복제 지연 호스트들의 개수를 명시하는 파라미터 추가 (CUBRIDSUS-12495)

새로 추가된 MAX_NUM_DELAYED_HOSTS_LOOKUP 파라미터는 databases.txt의 db-host에 명시된 호스트들에 접속을 시도할 때, 접속을 시도하는 복제 지연 호스트 개수를 제한한다. 단, PREFERRED_HOSTS에는 적용되지 않는다. 이 파라미터에서 지정한 개수까지 복제 지연이 발생하면 나머지 호스트들도 복제 지연일 것이라고 가정하기 때문에, 브로커는 더 이상 복제 지연이 아닌 호스트 찾기를 포기하고 가장 마지막에 찾은 복제 지연 서버와 연결한다.

9.2 Patch 1

슬레이브 노드 또는 레플리카 노드에서 통계 정보 갱신이 가능해짐 (CUBRIDSUS-12198)

--sysadm과 함께 --write-on-standby 옵션 사용 시 슬레이브 노드 또는 레플리카 노드에서 UPDATE STATISTICS 문의 수행이 가능해졌다.

브로커가 레플리카에만 접속하도록 설정하는 파라미터 추가 (CUBRIDSUS-12232)

cubrid_broker.conf에 REPLICA_ONLY 파라미터를 추가하여, 이 값이 ON이면 레플리카에만 접속되도록 수정했다. ACCESS_MODE의 값이 RW이고 REPLICA_ONLY의 값이 ON이면 레플리카에 쓰기가 가능해진다.

슬레이브 DB 또는 레플리카 DB에 쓰기가 가능한 옵션을 CSQL에 추가 (CUBRIDSUS-12232)

CSQL에 --write-on-standby 옵션을 추가하여, 이 옵션으로 CSQL을 실행한 dba는 슬레이브 DB 또는 레플리카 DB에 쓰기가 가능하게 되었다. 이 옵션은 시스템 관리자 모드 옵션(--sysadm)과 함께 사용해야 한다.

$ csql --sysadm --write-on-standby -u dba testdb

CAS가 특정 상황에서 일정 시간 경과 시 서버에 재연결을 시도하도록 수정 (CUBRIDSUS-12140)

CAS가 다음의 상황에서 일정 시간 경과 시 서버에 재연결을 시도하도록 수정했다.

  • PREFERRED_HOSTS가 아닌 다른 호스트에 연결한 경우
  • RO 브로커인데 active 서버에 연결한 경우

일정 시간은 RECONNECT_TIME(기본값: 600s) 브로커 파라미터로 명시하며, 이 값이 0이면 재연결을 시도하지 않는다.

CAS와 DB 서버 간 복제 지연 시 다른 노드로 재접속을 시도하게 하는 기능 추가 (CUBRIDSUS-11707)

cubrid_ha.conf에 ha_delay_limit와 ha_delay_limit_delta를 추가하여 standby 서버에 ha_delay_limit 이상의 복제 지연 발생 시 CAS는 해당 DB와 연결을 끊고 다른 DB로 접속을 시도하는 기능을 추가했다. ha_delay_limit 이상의 복제 지연 발생 시 서버는 스스로 복제 지연 상태라 판단하고 복제 지연 시간이 ha_delay_limit에서 ha_delay_limit_delta를 뺀 시간 보다 낮아질 경우 복제 지연이 해소되었다고 판단한다.

복제 지연으로 인해 우선 순위가 낮은 DB에서 연결된 CAS는 cubrid_broker.conf의 RECONNECT_TIME으로 명시한 시간이 경과하면 복제 지연이 해소되었을 것으로 기대하여, 우선 순위가 높은 standby DB 서버에 재접속을 시도한다.

JDBC Datasource을 이용한 접속 시 연결 URL 문자열을 사용할 수 있도록 수정 (CUBRIDSUS-12429)

CUBRIDDataSource 클래스에 setURL 메서드를 추가하여, 연결 URL 문자열을 사용할 수 있도록 수정했다. 연결 URL 문자열에는 IP, 포트, DB 이름 뿐만 아니라 charset, logSlowQueries 등과 같이 CUBRID에서 정의한 속성(property)들을 포함할 수 있다.

import cubrid.jdbc.driver.CUBRIDDataSource;
...

ds = new CUBRIDDataSource();
ds.setUrl("jdbc:cubrid:10.113.153.144:55300:demodb:::?charset=utf8&logSlowQueries=true&slowQueryThresholdMillis=1000&logTraceApi=true&logTraceNetwork=true");

마스터 노드와 슬레이브 노드 간 방화벽이 설정되어 있는 경우 장시간 동안 트랜잭션 로그가 복사되지 않으면 DB 서버 쪽 연결이 종료되는 현상 (CUBRIDSUS-12194)

TCP 네트워크 프로토콜에 SO_KEEPALIVE 옵션을 적용하여, 위 제목의 현상으로 인해 마스터 DB에서 장애 발생 시 failover가 정상 동작하지 않을 수 있는 문제를 수정했다.

또한, cubrid.conf에 tcp_keepalive 파라미터(기본값: yes)를 추가하여 TCP 네트워크 프로토콜에 SO_KEEPALIVE 옵션을 적용할지 여부를 지정할 수 있도록 수정했다.

"cubrid statdump" 명령 수행 시 출력되는 결과에 복제 지연 시간을 추가 (CUBRIDSUS-12152)

"cubrid statdump" 명령 수행 시 출력되는 복제 지연 시간의 항목 이름은 "Time_ha_replication_delay"이다. (단위: 초)

개선 및 오류 수정

9.2 Patch 17

UPPER/LOWER 함수가 UTF-8 문자열을 입력받으면 오동작함 (CUBRIDSUS-16019)

CREATE TABLE tbl(id INT, s VARCHAR(100));
INSERT INTO tbl values (1, 'ABC' || CHR(0) || 'XYZ');
SELECT * FROM tbl WHERE LOWER(s) LIKE '%'|| 'xyz' ||'%';

수정 이전 버전에서 UTF-8 문자셋을 명시하여 데이터베이스를 생성한 후, 위의 질의를 수행하면 0건을 출력한다.

SELECT 리스트에 ORDERBY_NUM()이 포함되고, ORDER BY 절에 LIMIT 또는 FOR ORDERBY_NUM() 구문이 포함되어 있는 질의문 수행 시 질의 결과의 크기가 정렬 버퍼의 크기보다 커지면 오류가 발생함 (CUBRIDSUS-16005)

정렬 버퍼의 크기는 cubrid.conf의 sort_buffer_size 파라미터로 설정할 수 있다.

SELECT ORDERBY_NUM(), a, b, c FROM tbl WHERE a > 0 ORDER BY a DESC LIMIT 5, 20;
ERROR: Object buffer underflow while reading.

9.2 Patch 15

HA 종료 이후 15초 이내에 재구동하면 디스크 장애 감지 기능이 오작동할 수 있음 (CUBRIDSUS-15793)

HA 재구동 이후 재시작된 노드가 마스터가 된 경우 디스크 장애 감지 기능 오작동으로 인해 슬레이브로 역할이 변경될 수 있는 현상을 수정했다.

9.2 Patch 14

다중 칼럼으로 구성된 키의 칼럼 중 하나 이상이 내림차순일 때, 해당 테이블에 INSERT ... ON DUPLICATE KEY UPDATE 문을 수행하면 실패하는 현상 (CUBRIDSUS-15375)

CREATE TABLE foo ( a INT, b INT ) ;
ALTER TABLE foo ADD PRIMARY KEY ( a ASC, b DESC );
INSERT INTO foo VALUES (1, 1);
INSERT INTO foo VALUES (1, 1) ON DUPLICATE KEY UPDATE b = b + 1;

위의 질의를 수행하면 수정 이전 버전에서는 아래의 에러 메시지가 출력된다.

ERROR: No error message available.

UNION 문이나 부질의에 LIMIT 0이 포함되면 서버 프로세스가 비정상 종료함 (CUBRIDSUS-15369)

CREATE TABLE t1(c1 int, c2 int);
CREATE TABLE t2(c1 int, c2 int);

PREPARE stmt1 FROM '( SELECT fv.c1, fv.c2 as prec2, ? as targetc2
                     FROM t1 fv JOIN t2 gu
                     ON fv.c1=gu.c1
                     LIMIT ? )
                     UNION ALL
                   ( SELECT c1, c2 as prec2, ? as targetc2
                     FROM t1
                     LIMIT ?
                    )
                    LIMIT ?';

EXECUTE stmt1 USING 2,2,2,2,0;

2008 R4.4 이상 버전의 JDBC 드라이버로 2008 R4.1 이하 버전의 CUBRID 엔진에 접속하면 CAS 변경 시 질의 타임아웃 에러가 발생함 (CUBRIDSUS-15656)

동시 접속이 많은 환경에서 CAS 변경이 일어날 때, 질의 타임아웃 시간(연결 URL 문자열에서 queryTimeout으로 설정)을 너무 짧게 잡으면 CAS가 변경된 이후에 이미 질의 타임아웃을 초과하는 상황이 자주 발생할 수 있다.

수정 이전에는 2008 R4.4 이상의 JDBC 드라이버에서 2008 R4.1 데이터베이스 엔진에 접속하고 있을 때 JDBC 드라이버에서 초로 설정한 값이 1/1000로 나뉘어져서, 데이터베이스 엔진에 전달되기 전에 질의 타임아웃이 발생한 것으로 잘못 판단된다.

자동 커밋 OFF일 때 DDL 수행 직후 요청된 DML 이 실패하면 이미 성공한 DDL이 복제되지 않는 문제 (CUBRIDSUS-14969)

CREATE TABLE tbl (id INT PRIMARY KEY, col2 INT);
COMMIT;
INSERT INTO tbl VALUES (1, 1);
ALTER TABLE tbl ADD COLUMN col1 VARCHAR(10); -- 복제 안 됨
INSERT INTO tbl VALUES (1, 1, 'a'); -- 고유 키 위반으로 실패
COMMIT;

9.2 Patch 13

한 응용 프로세스 내에서 사용 가능한 연결 개수의 제한을 1024개에서 2048개로 늘림 (CUBRIDSUS-15340)

수정 이전 버전에서는 한 응용 프로세스 내에서 사용 가능한 연결 개수는 1024개로 제한되어 있는데, 예를 들어 연결 풀의 연결 개수를 1024개를 초과하여 설정할 수 없다.

수정 이후 한 응용 프로세스 내에서 연결 개수를 2048개까지 설정 가능하다.

group_commit_interval_in_msecs 파라미터의 값을 1000보다 작게 설정하면 설정 시간보다 짧은 시간마다 로그를 플러시하는 현상 (CUBRIDSUS-15300)

예를 들어, 수정 이전 버전에서 이 값을 200ms로 설정하면 이보다 짧은 시간마다 로그를 플러시한다.

9.2 Patch 12

REPLACE 또는 INSERT ... ON DUPLICATE 문을 수행할 때, 해당 테이블이 다중 컬럼 고유 키를 가지며 키 컬럼 중 일부가 NULL 값이면 데이터베이스 서버 프로세스가 비정상 종료하거나 응용 프로그램이 무한히 대기하는 등의 이상 현상이 발생함 (CUBRIDSUS-15130)

CREATE TABLE foo (
    id integer,
    name character varying(300) ,
    cell_phone character varying(11)
);
CREATE UNIQUE INDEX i_foo on foo (name, cell_phone, id);
REPLACE INTO foo (id, name, cell_phone) VALUES (2,NULL,NULL );

JDBC/CCI 응용프로그램에서 데이터베이스 서버 프로세스에 격리 수준 또는 잠금 타임 아웃 정보를 불필요하게 설정하거나 요청하는 경우 제거 (CUBRIDSUS-15093)

수정 이전 버전에서는 사용자가 격리 수준 값이나 잠금 타임 아웃 값을 이전 값과 동일하게 설정하면, 브로커의 SQL 로그에서 set_db_parameter 함수가 매번 호출되는것을 확인할 수 있다. 또한 이들 값의 변경이 없는데도 설정값 확인을 위해 매번 get_db_parameter 함수가 호출되는 것을 브로커의 SQL 로그에서 확인할 수 있다.

수정 이후에는 격리수준 값이나 잠금 타임 아웃값의 변경이 없으면 드라이버가 브로커로 설정 요청을 보내지 않는다. 마찬가지로, 격리수준 값이나 잠금 타임 아웃값의 변경이 없으면 그 값을 확인하기 위한 요청도 보내지 않는다.

데이터베이스 연결 과정에서 할당된 CAS가 다른 응용 프로그램에 의해 사용된 이후 cci_get_db_parameter 함수가 호출되면 함수 수행 이후에도 트랜잭션이 진행 중인 상태로 남아있는 현상 (CUBRIDSUS-15091)

응용 프로그램 A에 할당된 CAS가 다른 응용 프로그램 B에 의해 사용된 이후에, 원래 응용 프로그램 A에서 요청한 cci_get_db_paramter() 를 처리하는 CAS의 상태가 요청을 처리한 이후에도 트랜잭션 진행중(CLIENT_WAIT)인 상태로 남는 문제를 수정했다. CAS의 상태는 "cubrid broker status" 명령으로 확인할 수 있다.

"cubrid restore" 명령에 --up-to-date 옵션을 사용하는 경우 옵션 지정 시간 이후에 첫번째로 커밋한 트랜잭션까지 복원되는 현상 (CUBRIDSUS-14984)

이 현상은 9.2 Patch 11, 9.3 Patch 1 버전에서만 발생한다.

$ cubrid restoredb --up-to-date=14-10-2014:14:10:00 testdb

DISTINCT와 같은 질의문에서 정렬 연산 수행 도중, 실행 중인 사용자의 인터럽트 또는 설정에 의해 질의가 중단되면 서버 프로세스가 비정상 종료함 (CUBRIDSUS-14982)

DISTINCT와 같은 질의문에서 정렬 연산 수행 도중, 다음에 의해 실행이 중단되면 서버 프로세스가 비정상 종료하는 현상을 수정했다.

  • 응용 프로그램 또는 브로커에서 질의 타임아웃을 설정하여 타임아웃이 발생하는 경우
  • 응용 프로그램에서 질의 수행 중 Statement.cancel()을 호출하여 질의를 강제로 종료하는 경우
  • CSQL에서 질의 수행 중 사용자가 Ctrl-C를 누른 경우

JDBC 응용 프로그램에서 Statement.getGeneratedKeys() 메서드가 항상 NULL을 반환하는 현상 (CUBRIDSUS-14970)

이 현상과 함께 CAS 프로세스가 비정상 종료하는 문제를 수정했다.

느린 질의 발생 시 CAS 프로세스에서 메모리가 누수되는 현상 (CUBRIDSUS-14793)

cubrid.conf의 sql_trace_slow 파라미터를 설정한 후, 이 값을 초과하여 실행하는 질의(slow query)가 발생하면 CAS 프로세스에서 메모리가 누수되는 현상을 수정했다.

인라인 뷰에 분석 함수와 문장 집합 연산자를 포함하고 인라인 뷰 외부에 WHERE 조건이 있을 때 오류가 발생함 (CUBRIDSUS-14114)

문장 집합 연산자는 UNION, INTERSECTION, DIFFERENCE를 의미한다. 인라인 뷰 외부의 WHERE 조건은 질의 최적화에 의해 내부의 조건으로 변환될 수 있는데, 이때 변환이 잘못되면서 오류가 발생하는 현상을 수정했다.

다음은 해당 이슈가 발생하는 예이다.

SELECT /*+ RECOMPILE */ host_year, nation_code, gold, silver, rank
FROM
(
SELECT host_year, nation_code, gold , silver, rank() OVER (PARTITION BY host_year ORDER BY gold DESC) AS rank
FROM participant
UNION ALL
SELECT host_year, nation_code, gold, silver, rank() OVER (PARTITION BY host_year ORDER BY silver DESC) AS rank
FROM participant
)
WHERE rank=1;

9.2 Patch 11

명시한 시간을 초과 실행하는 슬로우 쿼리(slow query)를 이벤트 로그에 출력할 때 서버 프로세스가 비정상 종료하는 현상 (CUBRIDSUS-14781)

"Invalid XASL" 에러가 발생한 이후 슬로우 쿼리(slow query)를 이벤트 로그에 출력하려는 경우 서버 프로세스가 비정상 종료하는 현상을 수정했다. 슬로우 쿼리란 cubrid.conf의 sql_trace_slow 파라미터 값에 설정된 시간을 초과하여 수행하는 질의를 지칭한다.

해당 상황은 sql_trace_slow의 값을 1밀리 초 이하의 매우 작은 값으로 설정했기 때문에 발생한 것이다. sql_trace_slow의 기본 단위는 밀리 초이므로, 이 값을 적절히 큰 값(보통 1초 이상)으로 설정하기를 권장한다.

"Invalid XASL" 에러는 어떤 질의에 대해 PREPARE 연산 이후 해당 질의가 캐시에 없는 상태에서 EXECUTE 연산을 수행할 때 발생하는 에러로, 매우 짧은 시간 이내에 실행되므로 sql_trace_slow의 값을 1밀리 초 이하로 설정하는 경우가 아니면 수정 이전 버전에서도 해당 현상은 발생하지 않는다.

서버 프로세스가 비정상 종료된 이후, 재시작하여 복구하는 과정에서 데이터베이스 볼륨에 이상이 발생할 수 있음 (CUBRIDSUS-14534)

서버 프로세스가 비정상 종료된 이후 재시작되어 복구하는 과정에서, 마지막 체크포인트때 수집된 트랜잭션의 상태에 따라 이미 종료된 트랜잭션의 언두 로그가 잘못 적용되는 문제를 해결하였다.

톰캣 종료 시 CUBRID JDBC에서 예외 처리가 발생하는 현상 (CUBRIDSUS-14710)

CUBRID JDBC를 사용하는 환경에서 톰캣 종료 시 아래와 같은 예외(exception) 처리 로그가 발생하는 현상을 수정했다.

org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: A web application appears to have started a thread named Thread-13 but has failed to stop it. This is very likely to create a memory leak.

FROM_UNIXTIME()의 입력 인자로 호스트 변수를 사용하면 NULL을 반환하는 문제 (CUBRIDSUS-14282)

CREATE TABLE foo (c1 INT, c2 TIMESTAMP, PRIMARY KEY(c1));
PREPARE stmt1 FROM 'INSERT INTO foo VALUES (?, FROM_UNIXTIME(?))';
EXECUTE stmt1 using 2,2;

브로커의 CONNECT_ORDER 파라미터 값을 RANDOM으로 설정했는데도 특정 DB에만 접속 빈도가 낮음 (CUBRIDSUS-14272)

해당 설정 환경에서 브로커가 여러 DB 호스트에 골고루 분산되지 않는 현상을 수정했다. 예를 들어 ACCESS_MODE의 값이 RO이고 CONNECT_ORDER의 값이 RANDOM인 설정 환경에서 다수의 standby 서버가 존재하는 경우, 수정 이전 버전에서는 특정 standby 서버에만 접속 빈도가 낮은 현상이 발생한다.

잠금을 해제하지 않아야 할 상황에서 잠금을 해제하는 현상 (CUBRIDSUS-14216)

한 예로 수정 이전 버전에서 같은 트랜잭션에서 고유 인덱스에 같은 키를 두 번 INSERT하는 경우, 두 번째 INSERT 문이 실패하면서 첫 번째 INSERT 문 수행 시 획득했던 키의 NS_LOCK을 해제하는 현상이 발생한다.

파일의 내부 정보를 잘못 기록하여 "cubrid checkdb" 수행 시 오류를 출력하는 현상 (CUBRIDSUS-14136)

특정 테이블에 대해 insert 또는 update가 동시에 수행되는 환경에서 query cancel등으로 인해 질의가 실패하는 경우, 상황에 따라 파일의 내부정보가 잘못 기록될 수 있는 문제를 수정했다. 수정 이전 버전에서 해당 문제가 발생해도 데이터베이스 볼륨에 이상이 발생하는 것은 아니다.

파일의 내부 정보가 잘못 기록되면 checkdb 수행 시 -604번 오류가 발생하게 된다.

Time: 05/19/14 11:39:33.771 - ERROR *** file ../../src/storage/file_manager.c, line 10244 ERROR CODE = -604 Tran = 1, EID = 1
Internal Error: An allocation set for file VFID 267|0(Volume "/home/tester/ap/repro/testdb") seems inconsistent in 0 deleted or marked deleted pages and 1 page holes in table

OR 절이 매우 많이 사용된 질의 수행 시 서버 프로세스가 비정상 종료하는 현상 (CUBRIDSUS-14100)

수정 이후 OR 절이 400개 이상 사용된 질의를 수행하면 다음의 에러 메시지를 출력하여 서버 프로세스의 비정상 종료를 방지한다.

SELECT *
FROM tbl
WHERE id = ?
AND ((email = ? AND uname = ?)
OR(email = ? AND uname = ?)
...
OR(email = ? AND uname = ?)
);
The query has been rejected due to attempt to exceed the maximum allowed nesting level(400).

"cubrid checkdb" 명령 수행 도중 몇 가지 오류 상황에서 나머지 검사들을 수행하지 않고 종료되는 문제 (CUBRIDSUS-13987)

"cubrid checkdb"는 데이터베이스에 대한 여러가지 항목에 대한 오류 검사를 수행하는데, 몇 가지 상황에서 특정 항목에 대한 오류를 발견한 이후 나머지 항목에 대한 검사를 이어서 수행하지 않고 종료되는 문제를 수정했다.

9.2 Patch 10

백업 수행 시 --sleep-msecs 옵션을 지정하면 수행 시간이 매우 오래 걸리는 현상 (CUBRIDSUS-14383)

"cubrid backupdb" 명령으로 백업 수행 시, 1MB의 파일을 내려받을 때마다 --sleep-msecs 옵션으로 지정한 시간만큼 쉬게 하는 동작을 수행하는데, 이 값의 기본 단위는 밀리초이나 초단위로 잘못 인식되어 백업 수행 시간이 훨씬 오래 걸리는(옵션에 의해 쉬는 시간이 입력 값의 1000배) 현상을 수정했다.

9.2 Patch 9

다수의 호스트 접속 환경에서 CCI 응용 프로그램이 특정 호스트에만 접속 빈도가 낮음 (CUBRIDSUS-14247)

HA 환경에서 연결 URL의 altHosts에 다수의 호스트를 설정하고 loadBalance 속성을 true로 설정했음에도 불구하고 CCI 응용 프로그램들이 여러 브로커에 고루 분산되어 접속되지 않는 현상을 수정했다.

CCI 응용 프로그램에서 pool statement 사용 시 cci_schema_info 함수로 생성된 요청을 닫으면 응용 프로그램에 비정상 종료함 (CUBRIDSUS-14333)

cci_property_set (ps, "pool_prepared_statement", "true");
ds = cci_datasource_create (ps, &err);
...
req = cci_schema_info(con, CCI_SCH_PRIMARY_KEY, "foo", NULL, CCI_CLASS_NAME_PATTERN_MATCH, &err);
...
cci_close_req_handle (req);

비활성화한 트리거를 재활성화하면 오류가 발생함 (CUBRIDSUS-14103)

트리거의 상태를 비활성화했다가 재활성화하면 오류가 발생하는 현상을 수정했다.

ALTER TRIGGER trig_tb_a_insert STATUS INACTIVE;
ALTER TRIGGER trig_tb_a_insert STATUS ACTIVE;
ERROR: Attribute "new" was not found.

한 트랜잭션 내에서 오버플로우 OID 페이지가 발생한 이후 DROP INDEX 혹은 DROP TABLE을 수행하면 DB 볼륨에 이상이 생김 (CUBRIDSUS-13992)

키의 중복이 심한 환경에서는 하나의 키에 여러 개의 OID를 저장해야 하는데, OID 저장을 위한 공간이 한 페이지(기본 크기: 16KB)의 1/4이 넘으면 오버플로우 OID 페이지가 발생한다.

수정 이전 버전에서 해당 현상이 발생하는 시나리오는 다음과 같다.

NO AUTO COMMIT
DELETE로 레코드 삭제 (이때 오버플로우 OID 페이지가 해제(dealloc)되어야 함)
DROP INDEX (또는 DROP TABLE)
COMMIT

9.2 Patch 8

copylogdb 프로세스가 이미 삭제된 오래된 보관 로그를 요청할 때 DB 서버 프로세스가 비정상 종료되는 문제 (CUBRIDSUS-14179)

시스템 파라미터 force_remove_archives의 값이 yes로 설정된 경우, copylogdb가 복사하지 않은 트랜잭션 로그를 DB 서버 프로세스가 지우는 것은 정상 동작이다. 그러나, 이후 copylogdb가 이 트랜잭션 로그를 요청할 때 서버 프로세스가 비정상 종료되는 문제를 수정하였다. 수정 이전과 이후의 버전에서 copylogdb가 복사하지 않은 트랜잭션 로그를 DB 서버 프로세스가 지우는 경우 copylogdb 로그 파일에는 다음과 같은 에러 메시지가 기록된다.

Unable to mount disk volume "/home1/user1/CUBRID/log/message02_lgar39100".... No such file or directory
...
Internal error: unable to find log page 2327082503 in log archives.

9.2 Patch 7

페이지 크기에 근접한 크기의 레코드에 대해 INSERT/DELETE 작업이 반복되는 경우 공간이 재활용되지 않는 현상 (CUBRIDSUS-13454)

페이지 크기(기본 크기: 16K)에 근접한 크기의 레코드에 대해 INSERT/DELETE 작업이 반복되면 기존 여유 공간을 재활용하지 않고 새로운 페이지를 할당하는 오류를 수정했다.

상관 부질의(correlated subquery) 조건이 존재하는 계층 질의 수행 시 잘못된 결과를 출력하는 현상 (CUBRIDSUS-13597)

SELECT foo.* FROM foo
WHERE EXISTS (SELECT 1 from goo WHERE foo.id = goo.id)
START WITH foo.parent=-1
CONNECT BY PRIOR foo.id = foo.parent;

마스터 노드의 DB 서버 프로세스가 1분 이내에 재시작에 실패하는 경우 슬레이브로 역할을 변경하도록 수정 (CUBRIDSUS-13849)

수정 이전 버전에서는 같은 조건 하에서 마스터 노드가 동작을 정지하고 failover가 발생한다.

REUSE_OID 테이블에 대해 INSERT ... ON DUPLICATE KEY UPDATE 문 또는 UPDATE 문을 수행하면 다른 키가 가리키는 값을 갱신하는 현상 (CUBRIDSUS-14101)

이러한 현상을 회피하기 위한 우회안으로, 9.2 Patch 6 이하 버전에서는 테이블 생성 시 REUSE_OID를 사용하지 않도록 한다.

INSERT ... ON DUPLICATE KEY UPDATE ... 문 수행 시 DB 서버가 비정상 종료할 수 있는 현상 (CUBRIDSUS-14062)

CREATE TABLE tb1 (a INT UNIQUE);
INSERT INTO tb1 VALUES (1);
PREPARE S FROM 'INSERT INTO tb1 SET a = 1 ON DUPLICATE KEY UPDATE a = ?; ';
EXECUTE S USING '1';

"cubrid broker status" 명령에 "-b" 또는 "-f" 옵션 사용 시 출력되는 값들이 잘리는 현상 (CUBRIDSUS-13588)

수정 이전에는 브로커 이름이 영문 최대 20자를 넘으면 넘는 부분을 생략하여 출력했으나 수정 이후에는 생략없이 전체 이름을 출력한다. 또한, "LONG-T "등 고정폭을 넘어 출력되는 값은 잘려서 출력되었으나 값이 잘리지 않도록 수정했다.

이 수정으로 인해 출력되는 값의 문자열 길이에 따라 출력폭이 가변적일 수 있음에 유의한다.

여러 클라이언트를 통해 동시에 INSERT가 수행되는 환경에서 query timeout이 자주 발생하면, DB볼륨에 이상이 발생할 수 있음 (CUBRIDSUS-14026)

여러 클라이언트가 동시에 INSERT를 수행하고 query cancel이나 query timeout이 자주 발생하면, 데이터 페이지의 연결 체인이 잘못될 수 있는 문제를 해결하였다. 이 경우 해당 테이블에 대한 인덱스 스캔결과는 이상이 없으나, 순차스캔의 결과가 잘못될 수 있다. 해당 문제가 발생하면 checkdb를 통해 검출이 되는데, 아래와 같은 오류들이 보고된다.

  • 에러 번호 : -597, -546, -698, -699
Time: 05/14/14 10:04:58.246 - ERROR *** file ../../src/storage/heap_file.c, line 15908 ERROR CODE = -597 Tran = 1, EID = 4
Number of pages for heap file 0|261|630 is inconsistent.
200508 and 200534 were found according to heap chain and file table, respectively.

Time: 05/14/14 10:09:07.070 - ERROR *** file ../../src/transaction/locator_sr.c, line 8252 ERROR CODE = -698 Tran = 1, EID = 9
Internal error: INDEX pk_XXX_id ON CLASS XXX (CLASS_OID: 0|605|4). the number of OIDs in the unique hierarchy: 786125 does not equal the number of OIDs: 786126 found in the unique B+tree plus the number of NULLs: 0 found in the unique hierarchy for B+tree: 0|264|660.

Time: 05/14/14 10:09:07.070 - ERROR *** file ../../src/transaction/locator_sr.c, line 8277 ERROR CODE = -699 Tran = 1, EID = 10
Internal error: INDEX pk_XXX_id ON CLASS XXX (CLASS_OID: 0|605|4). the number of OIDs in the unique hierarchy: 786125 does not equal the number of OIDs: 786126 found in the unique B+tree root statistics for B+tree: 0|264|660.

Time: 05/14/14 10:09:19.281 - ERROR *** file ../../src/transaction/locator_sr.c, line 7827 ERROR CODE = -546 Tran = 1, EID = 11
Internal error: INDEX i_XXX_c_b ON CLASS XXX (CLASS_OID: 0|605|4). Expecting 786125 OID entry values, but 786126 were found on B+tree: 0|299|850.

cci_schema_info를 통해 기본 키(primary key) 정보를 구할 때 동일한 정보가 중복되어 출력됨 (CUBRIDSUS-14019)

수정 이전 버전에서 각각 다른 테이블에 같은 이름을 가진 기본 키를 생성하는 경우 해당 현상이 발생한다.

CREATE TABLE test1 (id INT, a INT);
CREATE TABLE test2 (id INT, a INT);

ALTER TABLE test1 ADD CONSTRAINT pk_id PRIMARY KEY(id);
ALTER TABLE test2 ADD CONSTRAINT pk_id PRIMARY KEY(id);
cci_schema_info(src_conn_hid, CCI_SCH_PRIMARY_KEY, test1, NULL, CCI_CLASS_NAME_PATTERN_MATCH, &cci_err);

자동 확장되는 GENERIC 볼륨을 checkdb 유틸리티가 오류가 있는 볼륨으로 잘못 판단하는 문제 (CUBRIDSUS-14018)

자동 확장되는 GENERIC 볼륨이 최대 볼륨 크기만큼 확장되지 않은 상태에서 "cubrid checkdb" 명령을 수행하면 해당 볼륨을 오류가 있는 것으로 잘못 보고하는 문제를 수정했다. 이 오류는 공간 부족시 GENERIC 볼륨이 조금씩 확장되는 기능이 추가된 9.2, 9.3 버전에서만 발생한다.

applylogdb 프로세스가 DB에 반영하는 SQL 문을 로깅할 때 출력되는 float /double 값의 유효 자리수가 6자리로 고정되는 현상 (CUBRIDSUS-13968)

ha_enable_sql_logging 파라미터 값을 yes로 설정하여 applylogdb의 SQL 문을 로깅할 때, 출력되는 float/double 값의 유효 자리수가 6자리로 고정되는 현상을 수정했다.

오버플로우(overflow)되는 레코드, 즉 DB 볼륨 한 페이지의 크기(기본 크기: 16K)보다 큰 레코드에 LOB 타입 칼럼이 포함되어 있는 경우 LOB 타입이 아닌 다른 칼럼을 UPDATE한 이후 LOB 타입 칼럼을 SELECT하면 오류가 발생함 (CUBRIDSUS-13561)

CREATE TABLE foo (a STRING, b BLOB); INSERT INTO FOO VALUES (REPEAT('0123456789', 2000), BIT_TO_BLOB(X'abcdef1234567890987654321fedcba')); SELECT BLOB_TO_BIT(b) FROM foo; UPDATE foo SET a = REPEAT('abcdeabcde', 2000); SELECT BLOB_TO_BIT(b) FROM foo;

ERROR: External file "/home/user1/CUBRID/databases/testdb/lob/ces_524/foo.00001396576111615326_9340" was not found.

9.2 Patch 6

CCI cci_bind_param 함수에서 STRING 타입을 DATETIME 타입으로 변환할 때 입력값과 달라지는 현상 (CUBRIDSUS-13581)

snprintf (sql, 4096, "insert into foo values(?,?)");
req1 = cci_prepare (con, sql, 0, &err);
res = cci_bind_param(req1, 2, CCI_A_TYPE_STR, "2012/01/01 01:03:05.0", CCI_U_TYPE_DATETIME, 0);

수정 이전 버전에서는 변환된 데이터의 초가 입력 데이터와 다르게 변환된다.

2012/1/1 1:3:3.000

CCI cci_datasource_release 함수의 실행이 성공할 때 0을 반환하는 오류 (CUBRIDSUS-13576)

이 함수의 실행이 성공하면 1을 반환하도록 수정했다.

copylogdb 스레드가 복제 타임아웃으로 인해 동작을 멈추면서(sleep) 이를 기다리는 연결 관리 스레드도 계속 대기하게 되는 현상 (CUBRIDSUS-13562)

이 이슈는 2008 R4.4 Patch 4, 9.2 Patch 3에서만 발생한다. ha_copy_log_timeout 파라미터의 값이 매우 작은 경우 발생 가능성이 높아진다.

9.2 Patch 4

DB 서버와 응용 프로그램의 연결을 중계하는 CAS가 다른 CAS로 변경된 이후 사용자의 요청을 처리하지 못하는 현상 (CUBRIDSUS-13390)

수정 이전 버전에서는 CAS가 변경된 이후 PREPARE와 EXECUTE를 제외한 나머지 요청들을 처리하지 못한다. 이 현상의 예로 JDBC 응용 프로그램에서 CUBRIDDatabaseMetaData.getTables()을 호출하면 통신 에러(communication error)가 발생한다.

TRUNC 함수의 입력 인자 칼럼이 SELECT 리스트에 별도로 포함되는 경우 TRUNC 함수의 결과와 같은 값을 출력하는 현상 (CUBRIDSUS-13241)

CREATE TABLE tbl(a DATETIME);
INSERT INTO tbl VALUES('2012-05-05 10:10:10 AM');

SELECT a, TRUNC(a, 'day') FROM tbl;
a trunc(a,'day')
===============================================
10:10:10.000 AM 04/29/2012 04/29/2012

INNER JOIN과 LEFT OUTER JOIN이 같이 있는 질의를 수행하면 CAS가 비정상 종료하는 현상 (CUBRIDSUS-13207)

SELECT tbl3.code, tbl3.temp
FROM tbl1
INNER JOIN tbl2 ON tbl2.id = tbl1.id
LEFT JOIN tbl3 ON tbl3.code = tbl1.code and tbl3.name = 'AAA';

동일한 조인 칼럼에 검색 조건이 2 개 이상인 병합 조인(merge join) 수행 시 잘못된 결과를 출력하는 현상 (CUBRIDSUS-13199)

CREATE TABLE foo (i INT, j INT);
INSERT INTO foo VALUES (1, 1);
INSERT INTO foo VALUES (2, 1);

CREATE TABLE bar (v VARCHAR(10), i INT);
INSERT INTO bar VALUES ('one', 1);
INSERT INTO bar VALUES ('two', 2);

SELECT /*+ RECOMPILE USE_MERGE */
f.*, b.*
FROM foo f JOIN bar b ON f.i=b.i AND f.j=b.i;

위 질의를 수행하면 1건을 출력해야 하나 수정 이전에는 2건을 출력한다.

동시에 같은 테이블에 많은 FULL SCAN 작업이 수행되는 경우에 대해 성능을 일부 개선 (CUBRIDSUS-13188)

테이블 FULL SCAN 질의가 수행되면 INSERT에서 사용될 BEST PAGE를 질의 처리와 병행하여 선별하게 되는데, 이때 다른 트랜잭션이 DELETE후 COMMIT하지 않아 비어있지만 사용할 수 없는 공간을 확인하는 과정을 수행한다. 그런데 이 과정에서 CRITICAL SECTION을 사용하므로 동시에 많은 FULL SCAN 질의는 성능 저하를 유발한다. 실제 INSERT 과정에서 이 공간을 다시 확인하게 되므로, 이 수정에서는 DELETE후 COMMIT하지 않은 공간을 확인하는 절차를 생략하여 CRITICAL SECTION으로 인한 병목 현상을 줄이도록 했다.

커버링 인덱스의 칼럼에 NULL 값이 존재할 때 커버링 인덱스 스캔으로 GROUP BY 절을 포함하는 질의를 수행하면 부정확한 결과를 출력하는 현상 (CUBRIDSUS-13100)

CREATE TABLE foo (id VARCHAR(60), stat VARCHAR(15));
INSERT INTO foo VALUES ('line', '1');
INSERT INTO foo VALUES ('line', '1');
INSERT INTO foo VALUES ('line', '1');
INSERT INTO foo VALUES ('line', null);
INSERT INTO foo VALUES ('line', null);

CREATE INDEX idx1 ON foo (id, stat);

SELECT /*+ RECOMPILE */ COUNT(*) cnt, id, stat
FROM foo
WHERE id > ''
GROUP BY id, stat
ORDER BY cnt desc;
  cnt id stat
======================================
    3 'line' '1'
    1 'line' NULL
    1 'line' NULL

수정 이전에는 위의 질의 수행 결과로 3건을 출력하나, 수정 이후 2건을 정상적으로 출력한다.

  cnt id stat
======================================
    3 'line' '1'
    2 'line' NULL

ORDERBY_NUM() 조건에 부질의(subquery) 사용 시 CAS 프로세스가 비정상 종료하는 현상 (CUBRIDSUS-13036)

SELECT /*+ recompile */ *
FROM t1 a
WHERE a.b BETWEEN 1900 AND 2000
ORDER BY a.id
FOR ORDERBY_NUM() BETWEEN 1 AND (SELECT COUNT(*) FROM t1);

레플리카 존재 시 split-brain 방지 기능이 동작하지 않는 현상 (CUBRIDSUS-12986)

마스터 노드에서 슬레이브로 역할 변경(demote)이 필요한 경우 마스터 노드의 고립 여부에 따라 역할 변경 수행 여부를 결정하나, 수정 이전 버전에서는 레플리카가 존재하는 경우 마스터 노드는 고립이 아니라고 판단하여 역할 변경이 되지 않거나 혹은 불필요한 역할 변경이 발생한다.

브로커 다중화에서 모든 브로커 호스트가 장애로 판단되는 경우 재접속하는 방법 개선 (CUBRIDSUS-12977)

수정 이전 버전에서는 모든 호스트가 장애로 판단(unreachable)되면 2차 연결 이후에도 모든 호스트를 장애 노드로 판단했으나 수정 이후 버전에서는 2차 연결 시 성공한 노드는 장애 노드 리스트에서 제외한다.

9.2 Patch 3

GROUP_CONCAT의 구분자 리터럴, STR_TO_DATE의 날짜 형식 리터럴, LIKE ... ESCAPE 뒤의 이스케이프 리터럴을 포함하는 질의문으로 생성한 뷰를 가지고 질의를 수행하면 오류가 발생하는 현상 (CUBRIDSUS-13062)

CREATE TABLE tbl (a VARCHAR(10));
INSERT INTO tbl VALUES ('a'),('b'),('c');

CREATE VIEW vw AS
    SELECT GROUP_CONCAT(a ORDER BY a SEPARATOR ':') col
    FROM tbl;
ERROR: In line 1, column 45 before ' iso88591_bin) from tbl tbl'
Syntax error: unexpected 'collate', expecting ')'

수정 이전에는 위와 같은 질의문으로 뷰를 생성하면 리터럴 뒤에 "COLLATE iso88591_bin"과 같이 COLLATE 수정자가 자동으로 추가되며, CUBRID는 이 구문을 허용하지 않기 때문에 오류가 발생한다.

허용하지 않는 예는 아래와 같이 GROUP_CONCAT의 구분자 리터럴, STR_TO_DATE의 날짜 형식 리터럴, LIKE ... ESCAPE 뒤의 이스케이프 리터럴에 COLLATE가 명시되는 경우이다.

SELECT GROUP_CONCAT(a ORDER BY a SEPARATOR ':' COLLATE iso88591) from tbl;
SELECT STR_TO_DATE('01,5,2013','%d,%m,%Y' COLLATE iso88591);
SELECT * FROM tbl WHERE a LIKE 'a%' ESCAPE '@' COLLATE iso88591;

수정 이후에는 뷰를 생성할 때 위와 같은 리터럴 뒤에 COLLATE 수정자를 자동으로 추가하지 않는다.

Windowws 환경에서 응용프로그램을 통해 질의를 수행하는 경우 Linux 환경에 비해 상대적으로 느린 현상 (CUBRIDSUS-12980)

수정 이전 버전에서는 Windows 환경에서 응용 프로그램의 드라이버와 CAS 사이의 데이터 전송 지연 문제로 인해 Linux 환경에 비해 질의 수행이 상대적으로 느리다.

copylogdb 프로세스의 응답이 늦어지면 상대방 노드의 DB 서버 프로세스가 비정상 종료할 수 있는 현상 (CUBRIDSUS-12884)

HA copylogdb 프로세스가 존재하는 장비에 작업 부하가 커지면서 copylogdb 프로세스의 응답이 늦어지면 상대방 노드의 DB 서버 프로세스가 비정상 종료할 수 있는 현상을 수정했다.

GROUP BY와 ORDER BY가 함께 존재하고 두 절의 컬럼이 다를때, 질의에 따라 잘못된 인덱스 스캔이 선택되어 질의 결과가 잘못 나오는 문제 (CUBRIDSUS-12883)

CREATE TABLE foo (a INT, b INT, c INT);
CREATE INDEX idx_a ON foo (a);
INSERT INTO foo values (null, 1, 1);

SELECT b, c
FROM foo
WHERE a IS NULL GROUP BY b, c ORDER BY c, b;

수정 이전에는 위의 질의 수행시 잘못된 인덱스 스캔이 선택되어 잘못된 결과를 출력하지만, 수정 이후에는 순차스캔으로 동작하여 정상 결과를 출력하게 된다. 하지만 순차 스캔으로 인해 성능이 저하될 수 있으므로, 해당 질의 계획을 확인하여 질의를 최적화하는 방안을 다시 고려해야 한다.

오버플로우 키를 가진 고정 길이 CHAR 타입 칼럼에 데이터를 INSERT하지 못하는 현상 (CUBRIDSUS-12762)

키의 크기가 DB 볼륨의 1/4 페이지(페이지 크기 기본값 16KB)를 초과하여 오버플로우 키로 설정된 CHAR 타입 칼럼에 데이터를 INSERT할 때, 페이지 분할 중 B-tree의 구분자(separator)가 크게 생성되면 INSERT가 실패할 수 있는 현상을 수정했다.

응용 프로그램에서 PREPARE->EXECUTE->테이블 재성성 이후 다시 EXECUTE를 수행하면서 바인딩되는 칼럼의 타입이 기존 테이블과 다르면 오류가 발생함 (CUBRIDSUS-12745)

CREATE TABLE tbl (i INT);

INSERT INTO tbl VALUES(?); -- prepare & execute
DROP TABLE IF EXISTS tbl;
CREATE TABLE tbl (i STRING); -- the type of a column is changed
INSERT INTO tbl VALUES(?); -- execute with previous prepare statement
CREATE TABLE tbl (i int);
Semantic: Cannot coerce host var to type integer.

잠금 타임아웃 이벤트 로그에 blocker의 SQL이 잘못 출력되는 현상 (CUBRIDSUS-12713)

client 1
    csql> INSERT INTO x VALUES (4);

client 2
    csql> UPDATE x SET a = 10 WHERE a = 4;

위의 질의를 각 클라이언트에서 수행할 때 아래와 같이 blocker의 SQL이 실제 blocker SQL이 아닌 다른 SQL로 잘못 출력되는 현상을 수정했다.

12/19/13 18:37:57.304 - LOCK_TIMEOUT
waiter:
  client: PUBLIC@testhost|csql(10458)
  lock: U_LOCK (oid=0|560|4, table=x)
  sql: update x x set x.a= ?:1 where x.a= ?:0
  bind: 4
  bind: 10

blocker:
  client: PUBLIC@testhost|csql(10459)
  lock: X_LOCK (oid=0|560|4, table=x)
  sql: update x x set x.a= ?:1 where x.a= ?:0

SQL 트레이스 출력 결과에서 인덱스 스캔의 힙 "lookup time" 시간이 실제보다 작은 값으로 출력되는 오류 (CUBRIDSUS-12678)

csql> ;trace on
csql> SELECT a, b FROM x WHERE a < 10 and b = 'g';
...
Trace Statistics:
  SELECT (time: 925, fetch: 73745, ioread: 64532)
    SCAN (index: x.idx), (btree time: 921, fetch: 73742, ioread: 64532, readkeys: 9, filteredkeys: 9, rows: 9216) (lookup time: 85, rows: 1024)

AUTO_INCREMENT 칼럼에 정의된 SERIAL의 CACHE 크기가 0보다 크면 서버 프로세스에서 메모리 누수 발생 (CUBRIDSUS-12628)

CREATE TABLE foo (a INT AUTO_INCREMENT, b DATETIME);
ALTER SERIAL foo_ai_a INCREMENT BY 1 CACHE 5000;

"cubrid broker status -f" 명령 수행 결과에 이전에 접속한 호스트 이름이 출력되는 현상 (CUBRIDSUS-12573)

databases.txt의 db-hosts에 다수의 호스트가 설정된 상태에서 절체 등으로 인해 CAS가 다른 호스트에 재연결되는 경우 "cubrid broker status -f" 명령을 수행하면 재연결된 호스트 정보가 아닌 이전의 호스트 정보가 출력되는 문제를 수정했다.

JDBC getObject()를 통해 Timestamp 타입 또는 Date 타입으로 저장된 데이터를 가져올 때 "NULL pointer exception" 에러 발생 (CUBRIDSUS-12686)

한 예로, 수정 이전 버전에서 iBatis를 사용하여 Timestamp 또는 Date 타입 값을 가져올 때 에러가 발생한다.

JDBC ResultSetMetaData.isAutoIncrement()를 호출하면 NullPointerException 발생 (CUBRIDSUS-12612)

DatabaseMetaData를 통해 생성된 ResultSet에서 (예, DatabaseMetaData.getTables()) ResultSetMetaData를 사용할 때 isAutoIncrement()를 호출하면 NullPointerException이 발생하는 오류를 수정했다.

DatabaseMetaData m = c.getMetaData();
ResultSet r = m.getTables(null, null, "foo", null);
ResultSetMetaData rm = r.getMetaData();

for (int i = 0; i < rm.getColumnCount(); i++) {
    System.out.println(String.format("%s%s", rm.getColumnName(i + 1), rm.isAutoIncrement(i + 1) ? "true" : "false"));
}

Windows 64 비트용 CUBRID 소스 코드 빌드 시 gencat.exe가 없다는 에러 메시지와 함께 실패하는 현상 (CUBRIDSUS-12370)

'"D:\code\win\x64\Debug"\..\..\gencat\gencat.exe' is not recognized as an internal or external command

9.2 Patch 2

기본 키 또는 고유 키를 포함하는 조건이 있으면 다른 키가 아닌 해당 키를 선택하여 스캔 범위를 좁히도록 수정 (CUBRIDSUS-12615)

기본 키 또는 고유 키의 모든 컬럼에 대해 동등(equal)조건이 주어지는 경우, 해당 키를 사용하는 스캔 계획이 생성되도록 수정했다.

CREATE TABLE foo (a INT, b INT, c STRING);
CREATE UNIQUE INDEX u_foo ON foo(a);
CREATE INDEX i_foo ON foo(b, c);

SELECT /*+ RECOMPILE */ b, c
FROM foo
WHERE a = 100 AND b = 100 AND c = 'aaaaa';

MERGE문의 INSERT구문을 통해 DEFAULT 값이 입력되는 경우 DB서버 프로세스가 비정상 종료하는 현상 (CUBRIDSUS-12608)

CREATE TABLE foo(
    a INT PRIMARY KEY,
    b INT,
    c TIMESTAMP DEFAULT SYS_TIMESTAMP
);

MERGE INTO foo A
USING db_root ON (A.a = 1)
WHEN MATCHED THEN UPDATE SET A.b = A.b + 1
WHEN NOT MATCHED THEN INSERT (A.a, A.b) VALUES(1, 1);

브로커가 새로운 CAS를 생성하는데 계속 실패하면서 드라이버의 연결이 안 됨 (CUBRIDSUS-12567)

브로커가 새로운 CAS를 생성하는데 계속 실패하면서 드라이버의 연결이 안 되는 현상을 수정했다. 수정 이전 버전에서 드라이버에 login_timeout 속성이 명시되어 있으면 login timeout으로 실패하고 login_timeout 속성이 명시되지 않으면 무한 대기하는 상황이 발생한다.

cubrid_broker.conf의 MIN_NUM_APPL_SERVER, MAX_NUM_APPL_SERVER 값이 서로 다른 경우 "cubrid broker status -b" 수행 결과 일부가 잘못 출력되는 현상 (CUBRIDSUS-12562)

cubrid_broker.conf의 MIN_NUM_APPL_SERVER, MAX_NUM_APPL_SERVER 값이 서로 다른 경우 "cubrid broker status -b" 명령으로 출력되는 TPS, QPS, SELECT, INSERT, UPDATE, DELETE, OTHERS, #CONNECT 값들이 잘못되는 현상을 수정했다.

9.2 Patch 1

UNION ALL이 많은 질의 또는 표현식의 중첩이 많은 질의 수행 시 DB 서버가 비정상 종료하는 현상 (CUBRIDSUS-12208)

UNION ALL이 많은 질의 또는 표현식의 중첩이 많은 질의 수행 시 DB 서버가 비정상 종료했으나, 오류 처리하도록 수정했다.

CONNECT BY 절을 사용하는 상관 부질의에서 발생하는 오류 (CUBRIDSUS-12485)

SELECT a.w_id wId , a.c_id cId ,
(
    SELECT SUBSTR(SYS_CONNECT_BY_PATH(name, ' > '), 4) fullname
    FROM innertbl
    WHERE cId = a.c_id /* workClsId */
    START WITH lvl = 1 CONNECT BY PRIOR WORK_CLS_ID = UPR_ID
) AS cname
FROM outertbl a
WHERE 1 = 1
AND ROWNUM < 10
ERROR: An I/O error occurred while reading page 1094004801 of volume "(null)".... Bad file description

GROUP BY 최적화(skip group by)가 되는 SELECT 질의문의 SELECT 리스트 중 오버플로우(overflow)된 칼럼이 존재하면 DB 서버가 비정상 종료하는 현상 (CUBRIDSUS-12464)

칼럼 값의 크기가 DB 볼륨 1 페이지(기본값 16KB)를 초과하는 오버플로우가 발생하면 DB 서버가 비정상 종료하는 현상을 수정했다.

CREATE TABLE FOO (id INT PRIMARY KEY, name STRING);
INSERT INTO foo SELECT ROWNUM, LPAD('A', 3*16*1024, 'A') FROM DB_CLASS;
UPDATE foo SET name='A' WHERE id % 2 = 1;
SELECT name, id FROM tbl GROUP BY id;

두 개의 REPLACE문이 PRIMARY KEY와 UNIQUE가 동시에 존재하는 테이블에 대해 동시에 수행될 때 잘못된 오류가 발생하는 문제 (CUBRIDSUS-12447)

특정 컬럼에 PRIMARY KEY와 UNIQUE가 함께 존재하는 상황에서 REPLACE문이 동시에 수행될 때 교착 상태가 발생할 수 있는데, 교착 상태 에러가 아닌 잘못된 오류("Object found in workspace without class")를 반환하는 문제를 수정했다.

SHARD 힌트로 인해 broker_log_top 수행 결과에서 동일한 질의가 구분되어 집계되는 현상 (CUBRIDSUS-12410)

broker_log_top 수행 시 질의 힌트를 제거한 이후에 질의 개수를 집계하도록 수정했다.

테이블에 대해 다량의 DELETE가 수행되어 데이터 페이지에 빈 공간이 많아진 이후, INSERT 수행 시간이 오래 소요되는 현상 (CUBRIDSUS-12405)

하나의 테이블에 대해 많은 양의 DELETE가 발생해서 데이터페이지에 대한 빈 공간이 많이진 이후, 여러 클라이언트들이 해당 테이블에 대해 동시에 INSERT를 수행할 때 비정상적으로 많은 시간이 소요되는 현상을 수정했다.

브로커와 DB 서버를 연결할 때 1차 연결에서 cubrid_broker.conf의 PREFERRED_HOSTS에 명시된 모든 호스트와 databases.txt의 db-host에 명시된 모든 호스트에 접속이 불가능하면 2차 연결 시 PREFERRED_HOSTS부터 다시 시도하도록 수정 (CUBRIDSUS-12353)

1차 연결 시에는 DB의 상태(active 또는 standby)와 복제 지연 여부를 확인하여, 이 두 가지 조건이 만족하는 경우에만 연결 여부를 결정한다. 2차 연결 시에는 이 두 가지 조건을 무시하고 네트워크 접속이 가능하면 연결을 성공시킨다. 단, "ACCESS_MODE=SO"인 경우에는 DB의 상태가 반드시 standby여야 한다.

수정 이전 버전에서는 1차 연결에서 PREFERRED_HOSTS와 db-host에 최초에 접속이 안 되면 2차 연결 시에는 PREFERRED_HOSTS의 호스트 접속을 시도하지 않고 db-host에 명시된 호스트에만 접속을 시도한다.

백업 수행 시 -B 혹은 -D 옵션으로 주어진 경로에 접근 권한이 없거나 디스크 여유 공간이 없으면 멈춰있는(hang) 현상 (CUBRIDSUS-12286)

수정 이전 버전에서 위의 현상이 발생하면 체크포인트가 실행되지 않아서 보관 로그 파일이 삭제되지 않을 수 있다.

broker와 DB 사이에 발생하는 에러 세분화 (CUBRIDSUS-12261)

broker와 DB 사이에 발생하는 핸드쉐이크(handshake) 에러 및 연결 에러를 세분화했다.

HA 환경에서 copylogdb가 요청한 로그 페이지가 없는 경우 copylogdb 에러 로그에 에러 메시지를 기록하도록 수정 (CUBRIDSUS-12249)

HA 환경에서 copylogdb가 요청한 로그 페이지가 없는 경우 copylogdb와 서버의 에러 로그에 다음 메시지를 기록하도록 수정했다.

log writer: failed to get log page(s) starting from page id 108.

슬레이브 노드의 DB 볼륨이 마스터 노드의 DB 볼륨보다 커지는 현상 (CUBRIDSUS-12209)

슬레이브 노드의 DB 볼륨이 마스터 노드의 DB 볼륨보다 커지는 현상을 줄이기 위해, 슬레이브 노드의 복제 반영 주기(커밋 주기)가 자동으로 조절되도록 수정했다.

복제 로그를 슬레이브 노드의 DB에 반영하는 applylogdb 프로세스는 일정 시간 단위로 복제 로그에 대한 커밋을 수행하는데, 주기가 짧을수록 볼륨 재사용률이 높아져서 볼륨 크기가 불필요하게 증가하지 않게 된다. 반면, 주기가 짧아지면 복제 반영 속도가 늦어져서 복제 지연의 가능성이 높아진다.

수정 이전 버전에서는 복제 반영 주기가 고정되었으나, 수정 이후 버전에서는 복제 지연 정도를 계산하여 복제 반영 주기를 자동으로 조정한다.

cub_master 프로세스가 비정상 종료하는 현상 (CUBRIDSUS-12196)

cub_master 프로세스의 에러 로깅으로 인해 cub_master 프로세스가 비정상 종료하는 현상을 수정했다.

access_ip_control_file에서 ip 주소에 0 이 포함되어 있으면 DB 서버 구동에 실패 (CUBRIDSUS-12188)

  • cubrid.conf

    access_ip_control=yes access_ip_control_file=db.access

수정 이전 버전에서 아래 db.access 파일의 IP 주소에 0이 포함되면 DB 서버 구동에 실패한다.

  • db.access

    @TESTDB 10.100.0.1

한 테이블 내에서 총 20억건이 입력된 후, 새로운 입력 요청이 다량의 IO Read를 유발하는 문제 (CUBRIDSUS-12170)

해당 문제는 데이터의 입력과 삭제가 함께 수행되는 환경에서 발현되며, 삭제된 건수와 상관없이 DB생성 이후 총 입력된 건수가 20억건을 넘어서면 문제가 발생할 수 있다.

"broker reset"이 동작하지 않는 오류 (CUBRIDSUS-12106)

다수의 standby HA 서버 구성 (host1:host2)에서 host1의 서버 이상으로 RO/SO 브로커가 host2에 연결된 경우 host1이 서버 복구 후 "cubrid broker reset" 명령을 수행해도 host1에 재연결되지 않고 host2에 연결이 유지되는 현상을 수정했다.

SHARD 환경에서 한 응용 프로그램이 동일한 SQL 문에 대해 동시에 여러 개를 PREPARE한 후 실행하면 질의 결과가 잘못되는 현상 (CUBRIDSUS-11977)

PreparedStatement pstmt1 = con.prepareStatement(sql);
PreparedStatement pstmt2 = con.prepareStatement(sql);

pstmt1.setInt(1, 2);
ResultSet rs1 = pstmt1.executeQuery();
pstmt2.setInt(1, 4);
ResultSet rs2 = pstmt2.executeQuery();

// 수정 이전 버전에서 아래를 실행하면 rs2의 결과가 섞여서 출력되는 오류가 존재한다.
while (rs1.next()) {
  System.out.println(rs1.getInt(1) + " : " + rs1.getInt(2));
}

JDBC, CCI 2008 R4.x 드라이버로 9.x 이상 버전에 접속할 때 DATASOURCE를 사용하면 DB 서버가 비정상 종료하는 현상 (CUBRIDSUS-12450)

2008 R4.x 드라이버로 9.x 이상 버전에 접속할 때 CCI의 DATASOURCE 또는 JDBC의 XADataSource를 사용하면 DB 서버가 비정상 종료하는 현상을 수정했다.

JDBCCCI CAS의 keepalive 패킷 전송 주기가 OS 설정을 따라가도록 수정하고, 드라이버의 소켓에 keepalive 시간을 사용하도록 수정 (CUBRIDSUS-12354)

CAS에서 사용하는 소켓의 keepalive 패킷전송 주기가 OS 설정을 따라가도록 수정했고, JDBC와 CCI드라이버의 소켓도 CAS 소켓과 동일하게 keepalive 시간을 사용하도록 수정했다. 이 수정으로 인해 드라이버와 CAS 간 방화벽에 의해 연결이 끊기는 현상이 줄어들게 되었다.

MIN_NUM_APPL_SERVER와 MAX_NUM_APPL_SERVER가 다른 경우 일부 CAS에 "cubrid broker reset" 명령이 적용되지 않는 문제 (CUBRIDSUS-12516)

cubrid_broker.conf의 MIN_NUM_APPL_SERVER 값과 MAX_NUM_APPL_SERVER 값이 서로 다른 경우 일부 CAS에 "cubrid broker reset" 명령이 적용되지 않는 문제를 수정했다.