配置R2DBC与Liquibase的Spring Boot测试应用H2数据库报错求助
解决方案
原因分析
错误提示显示程序尝试在系统根目录创建.testdb.trace.db文件,但系统根目录属于只读文件系统,当前用户没有写入权限。问题根源在于H2数据库的URL写法错误,导致文件路径被解析到了系统根目录。
具体修复方法
方法1:修正数据库文件路径(推荐)
修改Liquibase和R2DBC的H2 URL,使用当前应用运行目录的相对路径,避免写入系统根目录:
修改后的配置:
spring: liquibase: change-log: classpath:liquibase/db.changelog.xml contexts: production url: jdbc:h2:file:./.testdb;MODE=MySQL r2dbc: url: r2dbc:h2:file:./.testdb h2: console: enabled: false
关键修改点:
- Liquibase的JDBC URL:将
file:///./.testdb改为file:./.testdb(H2 JDBC的file路径格式为jdbc:h2:file:<相对/绝对路径>,多余的//会导致路径解析到系统根目录) - R2DBC的URL:将
file:///./.testdb改为file:./.testdb(R2DBC H2的file路径格式为r2dbc:h2:file:<相对/绝对路径>)
修改后,H2会在当前应用启动的目录下创建.testdb相关文件,当前用户默认拥有该目录的写入权限。
方法2:禁用H2的trace日志
如果不想修改路径,也可以通过禁用H2的trace日志来避免生成.testdb.trace.db文件:
修改后的配置:
spring: liquibase: change-log: classpath:liquibase/db.changelog.xml contexts: production url: jdbc:h2:file:///./.testdb;MODE=MySQL;TRACE_LEVEL_FILE=0 r2dbc: url: r2dbc:h2:file:///./.testdb?traceLevel=0 h2: console: enabled: false
关键修改点:
- Liquibase的JDBC URL添加
TRACE_LEVEL_FILE=0参数,关闭文件日志生成 - R2DBC的URL添加
traceLevel=0参数,关闭trace日志输出
方法3:指定有权限的绝对路径
如果需要将数据库文件放在特定目录,直接写入当前用户有权限的绝对路径即可,例如:
spring: liquibase: url: jdbc:h2:file:/home/yourusername/.testdb;MODE=MySQL r2dbc: url: r2dbc:h2:file:/home/yourusername/.testdb
替换/home/yourusername/为实际的用户目录或其他有权限的目录。
内容的提问来源于stack exchange,提问作者eeqk
相关产品推荐
相关产品推荐

