Unknown table 'SEQUENCES' in information_schema
INFO 22239 --- [ restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:mysql://localhost:3306/testdb?autoReconnect=true'
INFO 22239 --- [ restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]
INFO 22239 --- [ restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.6.14.Final
INFO 22239 --- [ restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
INFO 22239 --- [ restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
WARN 22239 --- [ restartedMain] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1109, SQLState: 42S02
ERROR 22239 --- [ restartedMain] o.h.engine.jdbc.spi.SqlExceptionHelper : Unknown table 'SEQUENCES' in information_schema
ERROR 22239 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean : Failed to initialize JPA EntityManagerFactory: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.SQLGrammarException: Unable to build DatabaseInformation
h2 Database를 사용하다가 MySQL로 변경하면서 발생한 에러로 원인과 해결 방법은 실행 로그를 살펴보면서 찾을 수 있었는데요.
로그에서 SQL Error: 1109, SQLStatus: 42S02 라는 에러 코드를 확인할 수 있으며, Unknown table 'SEQUENCES' in information_schema와 같이 information_schema에 있는 'SEQUENCES' 테이블을 찾을 수 없다는 메시지를 확인할 수 있습니다.
여기서 찾고 있는 information_schema의 'SEQUENCES' 테이블이 어디에 있는 것인지 찾아보면, 바로 h2 Database의 기본 구성 테이블에서 찾을 수 있었는데요.
Using dialect: org.hibernate.dialect.H2Dialect
다시 위 실행 로그를 살펴보면, 에러가 발생한 바로 윗 줄에서 실행에 적용되는 데이터베이스 Dialect(방언)으로 H2Dialect가 사용되고 있는 것을 확인할 수 있었습니다.
spring.jpa.database=h2
그리고 .properties 파일 설정을 확인해 보니, 다음과 같이 spring.jpa.database 옵션의 값이 h2로 설정되어 있었고, 때문에 스프링부트에서는 자동으로 h2 database에 맞는 dialect를 가져온 것입니다.
***
연결을 시도하는 DBMS는 MySQL인데 스프링 부트 실행 시 적용되는 dialect는 H2Dialect 였기 때문에 오류가 발생했던 것입니다.
해결 방법
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
해결 방법으로는 적용되는 dialect를 MySQL에 맞는 것으로 설정해주면 되는데요.
.properties (또는 .yml) 파일에 spring.jpa.database-platform 옵션의 값을 org.hibernate.dialect.MySQL5InnoDBDialect(또는 사용 중인 MySQL 버전에 맞는 dialect)로 설정해주고 동작하면 스프링부트가 정상적으로 동작하는 것을 확인할 수 있었습니다.
(Dialect에 대한 내용은 아래 참조자료를 통해 조금 더 살펴보실 수 있습니다.)
< 참고 자료 >
2022.12.07 - [Programming/Spring Boot] - JPA에서 Native SQL Function 사용하는 방법 (MetadataBuilder)