MYSQL java.io.StreamCorruptedException: invalid stream header: EFBFBDEF 오류

db, java
mysql
mysql

에러메세지

[localhost-startStop-1] [JDBCValueMappings] could not read serialized value [fieldName=VALUE1] : java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
Caused by: java.io.StreamCorruptedException: invalid stream header: EFBFBDEF

발생원인

백업 해놓은 mysql덤프 중 A와 B가 있다고 하고 설명하겠음.
A가 조금 더 과거버전이고 B가 최신버전인데 B를 임포트(복원)하고 어플리케이션 기동시 해당 오류가 발생했다.
A버전을 임포트 시에는 이상없이 어플리케이션이 기동됨.

A, B덤프의 차이는 거의 같은 버전의 mysql DB의 내용을 익스포트 했고 원본의 OS만 환경이 달랐다.
A는 windows에서 운영했던 mysql이었고 B는 linux(docker)에서 운영했던 mysql이었음.
단, B의 경우 use schema명을 추가하기 위해 vscode로 덤프를 한번 열었다가 저장을 했던 기억이 있음.

이 때 vscode에서 ‘이 문서에는 기본 ASCII 유니코드 문자가 아닌 문자가 많이 포함되어 있습니다. ASCII가 문자가 아닌 강조 사용 안 함’이라는 경고가 떴는데 이 때 파일을 잘못 컨트롤 했던 것으로 보인다. (원본 파일이 삭제되어서 해당 파일을 단순히 내용 추가만 하고 저장했는지, 인코딩하여 다시 열었는지 확실치는 않지만 파일이 손상되었다는 것은 확실하다)


데이터베이스를 복원하면서 바이너리 컬럼인 blob이나 clob 필드에 값이 잘못 들어간 것을 어플리케이션 단에서 읽어 복호화 할 때 발생하는 오류이다.

바이너리 필드의 값이 손상되었으니 복호화를 시도한 들 제대로 될리가 없다. 그러므로 StreamCorruptedException 발생한 것

해결방법

정상적으로 임포트 된 덤프로 DB를 복원하거나 오류가 발생하는 바이너리 컬럼에 정상적인 값을 넣어주어야 한다.
아놔.. 이게 뭐라고 불금에 10시 넘어 퇴근을…
그동안 DB덤프 파일은 문자셋(인코딩)만 맞춰서 텍스트 에디터로 편집해주면 별 문제 없을 줄 알았는데 당황스럽다.
테스트를 해 보니 에디트 플러스로 열어서 편집하는 경우 깨지지 않았으나 vscode에서 편집 후 저장할 경우 깨지는 것으로 보인다.

또한 mysqldump로 mysql 덤프를 뜰 때 –hex-blob 옵션을 줘서 HEX리터널로 출력하게 하면 깨지는 문자를 사용하지 않으므로 이번과 같은 문제를 피할 수 있을 것으로 보인다.

퇴근!

생계형 특급 개발자이자 아들 하나 있는 평범한 아빠. 취미는 요리, 캠핑, 뮤직 페스티발 다니기 등이지만 이 블로그에는 주로 개발관련된 내용만 올릴 예정입니다. 워드프레스를 시작한지 얼마 되지않아 사이트가 허전하지만 좋은 내용으로 채우도록 노력하겠습니다. 자주 놀러오세요 ^^
Posts created 54

Leave a Reply

Your email address will not be published. Required fields are marked *

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top