如何在运行时备份嵌入式H2数据库引擎?

时间:2010-01-10 04:47:27

标签: java database backup h2

我想用H2数据库引擎构建一个Web应用程序。但是,在阅读本教程后,我仍然不知道如何在数据库运行时备份数据:

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

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

4 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:7)

根据tutorial you linked,建议不要在文件运行时复制备份数据库。以下是在数据库运行时备份数据库的正确方法(Scala代码,但可以很容易地转换为Java)(Source):

def content(request):
    if request.method == "POST":
            form = RestaurantForm(request.POST)
            if form.is_valid:
                form.save(commit=False)
                ip_address = get_client_ip(request)
                form.ip = ip_address
                form.save()
            else:
                error= "empty fields"
                return render(request, 'registration/content.html',{'error': error,'form':form})
    else:
            form = RestaurantForm()
            return render(request, 'registration/content.html',{'form': form})

def get_client_ip(request):
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    if x_forwarded_for:
        ip = x_forwarded_for.split(',')[0]
    else:
        ip = request.META.get('REMOTE_ADDR')
    return ip

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

 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());
        }