database - H2 数据库备份仅适用于 linux
问题描述
所以我们正在尝试使用以下脚本备份我们的数据库:
public void backup() throws SQLException {
try {
log.info("Trying to connect with DB");
String sqlFilePath = "./Backup_" + LocalDateTime.now() + ".sql";
Query q = em.createNativeQuery(String.format("SCRIPT TO '%s'", sqlFilePath));
log.info(q.getResultList().toString());
}
catch (Exception e){
e.printStackTrace();
throw new SQLException();
}
}
这在 linux 上完美运行,但是我们的软件也需要能够在 Windows 上运行,但是在 windows 中我不断收到以下 fileNotFoundException:
14:57:29,826 ERROR [stderr] (default task-21) Caused by: org.h2.jdbc.JdbcSQLException: IO Exception: "java.io.FileNotFoundException: .\Backup_2020-02-25T14:57:29.148621200.sql (The filename, directory name, or volume label syntax is incorrect)"; "./Backup_2020-02-25T14:57:29.148621200.sql"; SQL statement:
14:57:29,826 ERROR [stderr] (default task-21) BACKUP TO './Backup_2020-02-25T14:57:29.148621200.sql' [90031-193]
14:57:29,826 ERROR [stderr] (default task-21) at com.h2database.h2@1.4.193//org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
14:57:29,826 ERROR [stderr] (default task-21) at com.h2database.h2@1.4.193//org.h2.message.DbException.get(DbException.java:168)
14:57:29,827 ERROR [stderr] (default task-21) at com.h2database.h2@1.4.193//org.h2.message.DbException.convertIOException(DbException.java:330)
14:57:29,827 ERROR [stderr] (default task-21) at com.h2database.h2@1.4.193//org.h2.command.dml.BackupCommand.backupTo(BackupCommand.java:102)
14:57:29,827 ERROR [stderr] (default task-21) at com.h2database.h2@1.4.193//org.h2.command.dml.BackupCommand.update(BackupCommand.java:51)
14:57:29,827 ERROR [stderr] (default task-21) at com.h2database.h2@1.4.193//org.h2.command.CommandContainer.update(CommandContainer.java:98)
14:57:29,827 ERROR [stderr] (default task-21) at com.h2database.h2@1.4.193//org.h2.command.Command.executeUpdate(Command.java:258)
14:57:29,827 ERROR [stderr] (default task-21) at com.h2database.h2@1.4.193//org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:160)
14:57:29,828 ERROR [stderr] (default task-21) at com.h2database.h2@1.4.193//org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:146)
14:57:29,828 ERROR [stderr] (default task-21) at org.jboss.ironjacamar.jdbcadapters@1.4.17.Final//org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.executeUpdate(WrappedPreparedStatement.java:537)
14:57:29,828 ERROR [stderr] (default task-21) at org.hibernate@5.3.13.Final//org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:175)
14:57:29,828 ERROR [stderr] (default task-21) ... 107 more
14:57:29,828 ERROR [stderr] (default task-21) Caused by: java.io.FileNotFoundException: .\Backup_2020-02-25T14:57:29.148621200.sql (The filename, directory name, or volume label syntax is incorrect)
14:57:29,828 ERROR [stderr] (default task-21) at java.base/java.io.FileOutputStream.open0(Native Method)
14:57:29,828 ERROR [stderr] (default task-21) at java.base/java.io.FileOutputStream.open(FileOutputStream.java:292)
14:57:29,828 ERROR [stderr] (default task-21) at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:235)
14:57:29,829 ERROR [stderr] (default task-21) at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:124)
14:57:29,829 ERROR [stderr] (default task-21) at com.h2database.h2@1.4.193//org.h2.store.fs.FilePathDisk.newOutputStream(FilePathDisk.java:290)
14:57:29,829 ERROR [stderr] (default task-21) at com.h2database.h2@1.4.193//org.h2.store.fs.FileUtils.newOutputStream(FileUtils.java:233)
14:57:29,829 ERROR [stderr] (default task-21) at com.h2database.h2@1.4.193//org.h2.command.dml.BackupCommand.backupTo(BackupCommand.java:67)
14:57:29,829 ERROR [stderr] (default task-21) ... 114 more
任何帮助将非常感激!:)
解决方案
:
不能在 Windows 上用作文件名的一部分。您需要将其替换为一些允许的字符,例如使用LocalDateTime.now().toString().replace(':', '_')
或使用 custom DateTimeFormatter
。
推荐阅读
- perl - 将存储的字符串打印到单个单元格中的 xls
- java - 这两种代码风格的区别有名称吗?
- django - 如何解决 Django 中的相同 URL 模式冲突?
- c++ - 无法分配给返回值,因为函数 'operator->' 返回一个 const 值
- python - 断言 Scipy 单变量样条严格增加
- javascript - 拖放当前元素JS
- angular - 读取 URL 参数 - 以 # 开头
- html - 如何将两种不同字体大小的文本放在网页的中心?
- reactjs - 如何传入使用“this | that | other thing”语法定义的道具的值?
- linux - 跟踪用户写入目录