【问题标题】:How to back up the embedded H2 database engine while it is running?如何在运行时备份嵌入式 H2 数据库引擎?
【发布时间】:2011-01-03 09:56:45
【问题描述】:

我想用 H2 数据库引擎构建一个 Web 应用程序。但是,看完这篇教程,我还是不知道如何在数据库运行的时候备份数据:

http://www.h2database.com/html/tutorial.html#upgrade_backup_restore

H2 是否将其存储的文件输出到文件系统中的某个位置?我可以只备份输出的文件吗?

【问题讨论】:

标签: java database backup h2


【解决方案1】:

H2 存储在文件系统上,但最好使用您引用的备份工具,因为文件格式可以在 H2 版本之间更改。如果您升级 H2,它可能不再能够读取它在以前版本中创建的文件。另外,如果你复制它使用的文件,我建议先关闭数据库,否则复制的文件可能无法被 H2 读取。

文件的位置取决于你指定的 jdbc url。请参阅常见问题解答: http://www.h2database.com/html/faq.html

【讨论】:

    【解决方案2】:

    根据tutorial you linked,不建议在数据库运行时通过复制文件来备份数据库。这是在数据库运行时备份数据库的正确方法(Scala 代码,但可以轻松转换为 Java)(Source):

    val connection:java.sql.Connection = ??? // get a database connection 
    connection.prepareStatement("BACKUP TO 'myFile.zip'").executeUpdate 
    

    【讨论】:

      【解决方案3】:
       try{
           Class.forName("org.h2.Driver");
             Connection con = DriverManager.getConnection("jdbc:h2:"+"./Dbfolder/dbname", "username", "password" );
             Statement stmt = con.createStatement();
             con.prepareStatement("BACKUP TO 'backup.zip'").executeUpdate();
      
              }catch(Exception ex){
                  JOptionPane.showMessageDialog(null, ex.toString());
              }
      

      【讨论】:

      • 字符串语句中的什么原因 stmt = con.createStatement();?
      【解决方案4】:

      感谢 Jus12 的好答案。我将它改编为 Spring Data 中的 JPARepositories 并想在这里分享它,因为我在网上找不到类似的答案:

      @Modifying
      @Transactional
      @Query(value = "BACKUP TO ?1", nativeQuery = true)
      int backupDB(String path);
      

      【讨论】:

        猜你喜欢
        • 2016-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-12
        相关资源
        最近更新 更多