반응형

text 타입으로 되어 있는 컬럼에 데이터를 insert하려고 하자 다음과 같은 에러가 발생하였다.

Data truncation: Data too long for column

보통 텍스트형태의 데이터를 넣어봤자 500자 이내였기 때문에 이런 경우를 접해보지 못했는데 이번에 경험해보고 MYSQL의 text타입이 몇 글자 제한인지 알게 되었다.

TINYTEXT
- 범위 : 최대 255 글자

TEXT
- 범위 : 최대 65535 글자

MEDIUMTEXT
- 범위 : 최대 16777215 글자

LONGTEXT
- 범위 : 최대 4294967295 글자

65535글자면 왠만한 텍스트 데이터는 다 커버칠 것 같다.....LONGTEXT로 컬럼 type을 변경하여 처리하였다.

Solution => column type : TEXT -> LONGTEXT

반응형
반응형

MYSQL 두 개의 테이블을 join해서 데이터를 가져오는 도중 컬럼값이 BLOB로 보이는 현상 발생

join을 할 떄 한 테이블에서는 BIGINT타입의 컬럼과 또 다른테이블에서는 VARCHAR타입의 컬럼을 조인하는 과정에서 발생

select시 해당 컬럼에 CONVERT(컬럼명 USING utf8)로 TEXT로 변환하여 확인하였다.

 

BLOB란
binary large object의 약어로 
BLOB컬럼 타입을 이용하면 일반적인 int나 char와는 달리 이미지나 바이너리 파일을 테이블에 담을 수 있다.
BLOB 필드는 소팅이나 INDEX는 생성할 수 없다. 

MYSQL에서 지원하는 BLOB타입은 4가지

1. TINYBLOB (TINYTEXT)
- A BLOB or TEXT column with a maximum length of 255 (2^8 - 1) characters.

2. BLOB (TEXT)
- A BLOB or TEXT column with a maximum length of 65535 (2^16 - 1) characters.
 
3. MEDIUMBLOB (MEDIUMTEXT)
- A BLOB or TEXT column with a maximum length of 16777215 (2^24 - 1) characters.
 
4. LONGBLOB(LONGTEXT)
- A BLOB or TEXT column with a maximum length of 4294967295 (2^32 - 1) characters.

 

반응형
반응형

오늘은 파티셔닝에 대해서 포스팅 해보도록 하겠습니다. 실제로 파티셔닝으로 테이블을 설계해 보지 않아서 대략적인 의미만 알고 있었기에 한 번 정리할겸 책에서 학습한 내용을 정리해 봅니다. 해당 내용은 '관계형 데이터베이스 실전 입문'을 참고하였습니다. 


파티셔닝(Partitioning)이란?

파티셔닝에는 일반적으로 수평 파티셔닝(행으로 파티션을 나누는 방식) 수직 파티셔닝(컬럼별로 파티셔닝을 나누는 방법, 특정 컬럼만을 고속 스캔할 때 유용) 두 가지 방법이 있다. 보통 일반적으로 수평 파티셔닝(행으로 파티션을 나누는) 방식을 대부분 사용하고 해당 포스팅에서도 수평 파티셔닝에 대해서만 정리하도록 하겠습니다.


인덱스는 임의의 키 값에 따라서 행 데이터의 위치를 식별하는데 사용하는 기능인 반면 파티셔닝은 테이블을 여러 개의 파티션으로 분할하고 키의 값에 따라 어떤 파티션에 속하는 행인지 배분하는 역할을 합니다. 

파티션은 각각 같은 구조(schema)를 가진 테이블이며 인덱스도 파티션마다 존재합니다.

출처 : 관계형 데이터베이스 실전 입문


위의 그림에서는 세 개의 파티션이 정의되어 있고 날짜에 따라 저장될 파티션이 나뉘게 됩니다. 어떤 파티션에 속할 것인지 정하는 키(파티션 키)를 검색 조건으로 지정하면 해당 파티션만 검색하면 되므로 검색 효율이 향상됩니다. 

위의 그림에서 검색조건이 '2014-04-01'이므로 p3 파티션에 원하는 행이 있다는 사실을 알 수 있습니다. 이처럼 검색 대상 파티션을 좁혀가는 동작을 파티션 프루닝(Partition Pruning)이라고 합니다. -> Pruning은 가지치기란 뜻입니다.



파티셔닝이 적합한 경우

파티셔닝을 사용할지의 가장 큰 판단 기준은 파티션 프루닝을 할 수 있는 검색 조건을 포함한 쿼리의 실행빈도입니다. 파티션 프루닝이 유효한 쿼리가 대부분일 때는 파티셔닝에 의한 처리 전체의 효율화가 기대됩니다. (일반적으로 날짜를 기준으로 최신 데이터를 항상 참조할 경우)


그러나 파티셔닝이 적합하다고 판단될 때도 인덱스를 붙이는 것만으로 충분할 때가 대부분입니다. 파티셔닝을 사용하는 이유는 단일 INSERT나 혹은 단일 Select, 범위 Select의 아주 빠른 처리가 필요할 경우 혹은 이력 데이터의 효율적인 관리가 필요한 경우 입니다. (불필요해진 데이터를 백업 & 삭제하는 작업이 상당히 고부하 작업이기 때문)


추가로 새로운 데이터를 차례로 추가하는 응용프로그램이며 과거의 데이터에 그다지 접근하지 않을 때는 레인지 파티셔닝을 수행해 엑세스되는 대상의 데이터 국소성을 최대한 활용할 수 있다. 파티셔닝을 사용하면 파티셔닝별로 인덱스가 작성되기 때문이다.  최신 데이터가 항상 검색 대상이라면 p3(그림)만 엑세스 대상이 될 것이고 엑세스의 국소성이 있다면 캐시의 효율이 매우 향상된다. 따라서 대부분 검색이 메모리만으로 처리되고 디스크 I/O를 줄여서 성능 향상을 실현 할 수 있다. 


파티셔닝의 단점

데이터를 입력받았을 경우 어디에 넣어야 하는지에 대한 연산 오버헤드가 발생 할 수 있고 인덱스만으로도 해결되는 부분 파티셔닝을 무분별하게 파티셔닝을 적용했을 때는 오히려 성능이 나빠질 수 있음에 유의.



결론

파티셔닝을 적용할 때는 적용하지 않았을 때와 비교해 확실한 성능의 이점이 생기는지 꼭 확인해보자!!!!


반응형
반응형


자바 프로젝트 내부에서 jdbc드라이버를 연결하는 도중 다음과 같은 에러가 발생하였다.


detailMessage = "Could not create connection to database server. Attempted reconnect 3 times. Giving up."

cause = com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value 'KST' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.



[ 소스코드 ] 

DriverManger.getConnection하는 과정에서 발생

final private static String url = "jdbc:mysql://10.111.eee.xxx:5555/db?characterEncoding=utf8";
final private static String usr = "vuser";
final private static String pwd = "pwd11111";

Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, usr, pwd);
Statement stmt = conn.createStatement();


[ 문제해결 ] 

mysql-connector-java 버전 5.1.X 이후 버전부터 KST타임존을 인식하지 못하는 이슈가 있다고 한다.

따라서 url에 serverTimezone을 추가해준다!

"&serverTimezone=UTC"

String url = "jdbc:mysql://10.111.eee.xxx:5555/adflat?characterEncoding=utf8&serverTimezone=UTC";


이렇게 하면 손쉽게 해결할 수 있다~아니면 mysql-connector-java버전을 낮추거나~

반응형
반응형

Column count doesn't match value count at row 1 메세지가 발생한다면


DB에 insert하는 데이터의 개수와 컬럼의 개수가 일치하는지 확인해보시길~



; bad SQL grammar []; nested exception is java.sql.SQLException: Column count doesn't match value count at row 1

at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:99)

at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)

at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)

at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)

at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)

at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)



반응형

+ Recent posts