1、达梦数据库
数据库安装在linux系统上,我们如何通过程序去手动处理备份呢。
我们可以通过脚本的方式处理。
time2=$(date "+%Y%m%d%H%M%S")
cd /usr/local/tzb/file/backupdb
mkdir "$time2"
cd /dm/bin
/dm/bin/dexp USERID=TZB/123456789@192.168.10.166:5236 FILE=db_str.dmp OWNER=TZB DIRECTORY=/usr/local/tzb/file/backupdb/$time2
chmod 777 /usr/local/tzb/file/backupdb/$time2/db_str.dmp
大致流程就是先在你的目的文件夹创建一个时间戳的文件夹,然后去到达梦数据库的bin目录下执行这个命令,最后再把生成的SQL文件授权一下,否则还原的时候会无权限。
脚本大概就这样了,那么如何驱动运行呢。重点的就是:Runtime.getRuntime().exec();
@Override
@Async
public void backupDb() {
String shPath = RuoYiConfig.getProfile();// /usr/local/tzb/file/
String backupDir = RuoYiConfig.getProfile()+"backupdb";//数据备份总路径,该路径下是时间戳组成的文件夹,时间戳文件夹下面是数据库备份的数据
String shName = "backupDm.sh";
File file = new File(backupDir);
if (!file.exists()) {
file.mkdirs();
}
try {
Runtime.getRuntime().exec(shPath+shName);
} catch (IOException e) {
e.printStackTrace();
}
}
最后看一下实战效果,这是服务器上存的SQL文件
我的页面上面显示的列表
数据库还原的命令脚本
cd /dm/bin
/dm/bin/dimp USERID=TZB/123456789@192.168.10.166:5236 FILE=db_str.dmp DIRECTORY=/usr/local/tzb/file/backupdb/20210715081505 owner=TZB table_exists_action=TRUNCATE NOLOGFILE=Y
2、MySQL数据库
前几天遇见了一个bug,系统里面的备份数据库不能使用了,刚好抽空把这块弄了一下,网上有很多帖子,说实话没有几个真正能使用的,然后我结合自己的实际情况,把这个给整出来了
public static void main(String[] args) throws Exception {
/*String realPath = ResourceUtils.getURL("classpath:").getPath() + "static";
System.out.println(realPath);*/
DataBaseUtils.exportDatabaseTool("127.0.0.1", "root", "root", "ljw","3306");
DataBaseUtils.restore("127.0.0.1","root","root","3306","ljw");
}
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class DataBaseUtils {
//参考文章:https://blog.csdn.net/duli3554197/article/details/89468758
/**
*
* @param hostIP ip地址
* @param userName 用户名
* @param password 密码
* @param savePath 备份文件保存路径
* @param fileName 文件名称
* @param databaseName 数据库名称
* @param port 数据库端口号
* @return
* @throws InterruptedException
* @throws IOException
*/
public static boolean exportDatabaseTool(String hostIP, String userName, String password, String databaseName,String port) throws InterruptedException, IOException {
System.out.println("数据库备份开始*************");
String saveFile="C:/backupDatabase/2021-04-13.sql";
File f = new File(saveFile);
if(!f.exists()) {
f.createNewFile();
}else {
f.delete();
f.createNewFile();
}
PrintWriter pw = null;
BufferedReader bufferedReader = null;
try {
pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(saveFile), "utf8"));
Process process = Runtime.getRuntime().exec("cmd /c \"F:/tools/workspace/project/target/classes/static/mysqldump.exe\" -h" + hostIP + " -u" + userName + " -p" + password +" -P"+port+ " --set-charset=UTF8 " + databaseName);
InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream(), "utf8");
bufferedReader = new BufferedReader(inputStreamReader);
String line;
while((line = bufferedReader.readLine())!= null){
pw.println(line);
}
pw.flush();
if(process.waitFor() == 0){//0 表示线程正常终止。
System.out.println("数据库备份成功*************");
return true;
}
}catch (IOException e) {
e.printStackTrace();
System.out.println("数据库备份失败*************");
} finally {
try {
if (bufferedReader != null) {
bufferedReader.close();
}
if (pw != null) {
pw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return false;
}
//参考文章:https://www.cnblogs.com/jiduoduo/p/5807743.html
/**
*
* @param hostIp ip地址
* @param username 用户名
* @param pwd 用户密码
* @param port 端口号
* @param dataBaseName 数据库名称
* @throws Exception
*/
public static void restore (String hostIp,String username,String pwd,String port,String dataBaseName) throws Exception {
System.err.println("开始还原");
OutputStream outputStream=null;
BufferedReader bufferedReader = null;
try {
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("cmd /c \"F:/tools/workspace/project/target/classes/static/mysql.exe\" -h"+hostIp+" -u"+username+" -p"+pwd+" -P"+port+" --default-character-set=utf8 "+ dataBaseName);
outputStream = process.getOutputStream();
bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("C:/backupDatabase/2021-04-13.sql"), "utf-8"));
String str = null;
StringBuffer sb = new StringBuffer();
while ((str = bufferedReader.readLine()) != null) {
sb.append(str + "\r\n");
}
str = sb.toString();
OutputStreamWriter writer = new OutputStreamWriter(outputStream,"utf-8");
writer.write(str);
writer.flush();
outputStream.close();
bufferedReader.close();
writer.close();
System.out.println("还原成功");
} catch (Exception e) {
System.out.println("还原失败");
e.printStackTrace();
} finally {
try {
if (bufferedReader != null) {
bufferedReader.close();
}
if (outputStream != null) {
outputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
注意事项:备份数据为空或者还原数据为空现象这个位置要找正确
如果一般安装MySQL默认在C盘的话,这两个东西都会在这里面
但是如果,你直接使用这个路径的话,会存在文件夹有空格问题,也不会成功
所以就像我一样,把这俩东西放在自己项目里面最保险。
我这为了方便演示,直接在代码中写死的位置,实际部署起来用这段代码获取ResourceUtils.getURL("classpath:").getPath() + "static";