【发布时间】:2017-10-20 01:57:56
【问题描述】:
我有一个需要备份数据库的用例。与 H2 一样,数据库可以存储在文件中,这似乎很容易将文件复制掉。但是,这应该在应用程序运行时发生。
因此,我必须事先停止 H2 数据库,然后再重新启动。
我有一个基于这个 Maven 配置的简单 Spring Boot 应用程序:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<properties>
<java.version>1.8</java.version>
<spring.boot.version>1.5.3.RELEASE</spring.boot.version>
</properties>
<artifactId>RestartH2</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
这是应用程序:
package ch.sahits.game.h2;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class H2Application implements CommandLineRunner {
public static void main(String[] args) throws Exception {
SpringApplication.run(H2Application.class, args);
}
//access command line arguments
@Override
public void run(String... args) throws Exception {
// How to stop the H2 database
// backup the database file
// Restart the database
}
}
application.properties:
spring.datasource.url=jdbc:h2:file:~/test;DB_CLOSE_ON_EXIT=FALSE
如果这不是基于文件的,我可以通过org.h2.tools.Server,我可以通过它启动和停止服务器,但解决方案是基于文件的。
为了停止数据库,我在AbstractEmbeddedDatabaseConfigurer中找到了一些代码:
public void shutdown(DataSource dataSource, String databaseName) {
Connection con = null;
try {
con = dataSource.getConnection();
con.createStatement().execute("SHUTDOWN");
} catch (SQLException var13) {
this.logger.warn("Could not shut down embedded database", var13);
} finally {
if(con != null) {
try {
con.close();
} catch (Throwable var12) {
this.logger.debug("Could not close JDBC Connection on shutdown", var12);
}
}
}
}
但是,对于重新启动数据库,我不知道该怎么做。有可能吗?如果有,怎么做?如果基于文件的方法无法做到这一点,在这种情况下我将如何实现数据库的备份?
更新:检查H2 documentation 有一个命令行工具可以进行备份,但数据库可能没有运行。还有一个在线解决方案,但不清楚如何恢复这样的备份。
【问题讨论】:
-
不确定我是否在这里遗漏了什么。但是由于数据库已备份到一个文件,并且您知道该文件的位置。您不能将其复制到应用程序中的其他位置吗?您不需要重新启动您的应用程序,不是吗?
-
据我了解,在数据库运行时复制该文件会导致数据损坏。
-
而且即使这样可行,但恢复的问题仍然存在:在数据库运行的同时切换数据库文件肯定行不通。
标签: java spring spring-boot spring-data-jpa h2