에러메세지
[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리터널로 출력하게 하면 깨지는 문자를 사용하지 않으므로 이번과 같은 문제를 피할 수 있을 것으로 보인다.
퇴근!