当前位置: 热点 > >正文

每日资讯:java实现定时备份/手动备份还原mysql数据库

来源:个人图书馆-hncdman    时间:2023-06-14 17:14:32
定时备件与还原

简介:配置一个时间监控器,通过util中的日期类和定时控制器解析相关的时间数据,在相关的时间调用备件数据库的方法。备份数据库的方法使用了mysql自带的mysqldump进行备份,得到数据库的sql文件,完成备份。 下面是实体的现实

首先,相关配置文件,放在文件类路径下(dbBackUpRecover.properties)

#smysql备份功能路径与数据库用户名和密码#//usr//bin为mysql服务bin目录的地址 -u后为用户名 -p后为密码 最后一个字符串为需要备份的数据库名称 sqlurl = //usr//bin//mysqldump -uroot -plyy504677 dk_qj_db#备份的sql保存路径 注意:必须手动在服务器相关应用文件夹下创建文件夹:LeaveDatabasepath = //usr//LeaveDatabase//dkxy_db-.sql#备份相关时间24 * 60 * 60 * 1000=86400000 此为一天时间distancetime = 1296000000 #15天份一次#备件的具体时间backuptime = 2:30:00 #制造两点半备份一次
复制

得到配置文件中相关数据的读取文件类(GetProperties.java)


【资料图】

导入java.io.IOException;导入java.io.InputStream;导入java.util.Properties;公共抽样类GetProperties {私有静态字符串sqlurl = "";私人静状态字串路径=“”;私人静态长途时间= 0;私人静状态字串备用时间=“”;停止的{/**通过这个方法只能读取类路径下的属性文件*/属性 properties = new Properties();// 使用ClassLoader加载属性配置文件生成对应的输入流InputStream in = GetProperties.class.getClassLoader().getResourceAsStream("dbBackUpRecover.properties");// 使用属性对图像加载输入流试试{属性.load(in);} 拖上(IOException e){e.printStackTrace();}//获取key对应的值sqlurl = properties.getProperty("sqlurl");path = properties.getProperty("路径");distancetime = Long.parseLong(properties.getProperty("distancetime"));备份时间 = properties.getProperty("备份时间");}公共静态字符串 getSqlurl() {返回 sql;}public static void setSqlurl(String sqlurl) {GetProperties.sqlurl = sqlurl;}公共静态字符串 getPath() {返回路径;}public static void setPath(字符串路径){GetProperties.path = 路径;}公共静态长 getDistancetime() {返回距离时间;}public static void setDistancetime(long distancetime) {GetProperties.distancetime = 距离时间;}公共静态字符串 getBackuptime() {返回备份时间;}public static void setBackuptime(字符串备份时间){GetProperties.backuptime = 备份时间;}}
复制

定时时间的详细设置,调用util包中的日历,启动定时控制器(TimerManager.java)

导入 java.io.IOException;导入 java.util.Calendar;导入 java.util.Date;导入 java.util.Timer;/*** 定时时间详细设置*/公共类 TimerManager {//时间间隔 1天时间private static final long PERIOD_DAY = GetProperties.getDistancetime();//构造函数进入公共 TimerManager() 抛出 IOException {//获取并处理配置文件中的时间/**备份的正确切换时间*/String backuptime=GetProperties.getBackuptime();String[] time=backuptime.split(":");int hours=Integer.parseInt(time[0]);int minute=Integer.parseInt(time[1]);int second=Integer.parseInt(time[2]);//调用util包中的日历,设置时间日历 calendar = Calendar.getInstance();calendar.set(Calendar.HOUR_OF_DAY,小时);calendar.set(Calendar.MINUTE, 分钟);calendar.set(Calendar.SECOND, second);日期 date=calendar.getTime(); //第一次执行任务的时间//如果第一次执行任务的时间 小于当时的时间//此时要在第一次执行指定时间任务的时间加一天,以方便此任务在下一个时间点执行。如果不加一天,任务会立即执行。如果(日期。之前(新日期())){date = this.addDay(date, 1);}//启动定时控制器定时器 timer = new Timer();OperationTimer task = new OperationTimer();//安排指定的任务在指定的时间开始进行重新恢复的固定延迟执行。timer.schedule(任务,日期,PERIOD_DAY);}// 增加或减少天数public Date addDay(Date date, int num) {日历 startDT = Calendar.getInstance();startDT.setTime(日期);startDT.add(Calendar.DAY_OF_MONTH, num);返回 startDT.getTime();}}
复制

时间监听器,用于启动定时部件数据库操作(OperationListener.java)

导入 javax.servlet.ServletContextEvent;导入 javax.servlet.ServletContextListener;导入 java.io.IOException;/*** 时间监听器,用于定时备份数据库*/public class OperationListener 实现 ServletContextListener {public void contextInitialized(ServletContextEvent servletContextEvent) {尝试 {新的定时器管理器();} 赶上(IOException e){e.printStackTrace();}}public void contextDestroyed(ServletContextEvent servletContextEvent) {}}
复制

设置执行内容类 (OperationTimer.java)

导入 java.io.IOException;导入 java.util.TimerTask;公共类 OperationTimer 扩展 TimerTask {/*** 此计时器任务要执行的操作。*///所要执行内容公共无效运行(){尝试 {新的数据库备份恢复时间();} 赶上(IOException e){e.printStackTrace();}}}
复制

定时备份数据库的实际操作类 (DatabaseBackUpRecoverTime)

import java.io.*;import java.text.SimpleDateFormat;import java.util.Date;import static com.qihang.util.TableConstants.sqlNum;/*** 定时备份数据库*/public class DatabaseBackUpRecoverTime {//读取配置文件中的信息//MySql的安装bin目录路径和dump等参数静态字符串 sqlurl=GetProperties.getSqlurl();//保存备份文件的路径及名称静态字符串路径=GetProperties.getPath();公共 DatabaseBackUpRecoverTime() 抛出 IOException {备份();// 备份数据库System.out.println("备份数据库成功!");}公共静态无效备份(){尝试 {//返回与当前的Java应用程序的运行时对比图运行时 rt =Runtime.getRuntime();// 调用调用mysql的安装目录的命令Process child = rt.exec(sqlurl);// 设置导出编码为utf-8。这里必须是utf-8// 把进程执行中的控制台输出信息写入.sql文件,即生成了备份文件。注:如果不对控制台信息进行读出,则会引导致进程堵塞无法运行InputStream in = child.getInputStream();//控制台的输入信息作输入流InputStreamReader xx = new InputStreamReader(in, "utf-8");// 设置输出流编码为utf-8。这里必须是utf-8,否则从流中读入的是乱码字符串 inStr;StringBuffer sb = new StringBuffer("");串出Str;// 组合控制台输出信息字串BufferedReader br = new BufferedReader(xx);while ((inStr = br.readLine()) != null) {sb.append(inStr + "\r\n");}outStr = sb.toString();// 要用来做导入的sql目标文件:日期 date = new Date();SimpleDateFormat f = new SimpleDateFormat("MM-dd");//注意:sqlNum为一个自定义工具类中的静态类型的日期变量,自己设置即可sqlNum = f.format(日期);path = path.split("-")[0]+"-"+sqlNum+".sql";FileOutputStream fout = new FileOutputStream(路径);OutputStreamWriter writer = new OutputStreamWriter(fout, "utf-8");writer.write(outStr);writer.flush();附寄();xx.close();br.close();writer.close();fout.close();System.out.println("");} 赶上(异常 e){e.printStackTrace();}}}
复制

在web.xml中配置监听器

<听众><监听类>com.qihang.controller.databaseBackUpRecover.OperationListener
复制

若想在本模块添加手动还原始数据库的方法,参考下一个模块即可

该代号已在项目中通过测试,有什么问题,评论应博客即可

手动备件与原始数据库

因为做的项目中使用的是定时的附件,所以手动的附件只是测试了下,并没有进行相关细节的完善,如果想使用本模板,对应定时备件的实际修改即可

实体现实类

导入 org.springframework.s tereotype.Controller;导入 org.springframework.web.bind.annotation.RequestMapping;导入 java.io.BufferedReader;导入 java.io.File;导入 java.io.FileInputStream;导入 java.io.FileOutputStream;导入 java .io.IOException;导入java.io.InputStream;导入java.io.InputStreamReader;导入java.io.OutputStream;导入java.io.OutputStreamWriter;/*** 备件与原始数据库*/@Controllerpublic class DatabaseBackUpRecover {// public static void main(String[] args) throws IOException{// backup("d:\\d.sql");// //recover("d:\\d. sql");// }@RequestMapping(value = "/backupDatabase")public void backupDatabase() 抛出 IOException {备份("d://d.sql");}公共静态无效备份(字符串路径)抛出 IOException{运行时 runtime = Runtime.getRuntime();//-u后面是用户名,-p是密码-p后面最好不要有空格,-family是数据库的名字Process process = runtime.exec("C://Program Files//MySQL//MySQL Server 5.5//bin//mysqldump -uroot -p12345 dk_qj_db");InputStream inputStream = process.getInputStream();//得到输入流,编写.sql文件InputStreamReader reader = new InputStreamReader(inputStream);BufferedReader br = new BufferedReader(阅读器);字串 s = null;StringBuffer sb = new StringBuffer();while((s = br.readLine()) != null){sb.append(s+"\r\n");}s = sb.toString();System.out.println(s);文件文件=新文件(路径);文件.getParentFile().mkdirs();FileOutputStream fileOutputStream = new FileOutputStream(文件);fileOutputStream.write(s.getBytes());文件输出流.close();br.close();读者.close();inputStream.close();}public static void recover(String path) 抛出 IOException{运行时 runtime = Runtime.getRuntime();//-u后面是用户名,-p是密码-p后面最好不要有空格,-family是数据库的名字,--default-character-set=utf8,这句话一定的加//我就是因为这句话没有添加引导程序运行成功,但是数据库里面的内容还是以前的内容,最好写上完成的sql放到cmd中运行才知道报错了//错误信息://mysql: Character set "utf-8" is not a compiled character set and is not specified in the "//C:\Program Files\MySQL\MySQL Server 5.5\share\charsets\Index.xml" 文件错误 2019 (HY000): 不能// 初始字符集utf-8(路径:C:\Program Files\MySQL\MySQL Server 5.5\share\charsets\),//又是讨人厌的编码问题,在恢复的时候设置一下默认的编码就可以了。Process process = runtime.exec("mysql -u root -pmysql --default-character-set=utf8 goldenwing");OutputStream outputStream = process.getOutputStream();BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(path)));字符串 str = null;StringBuffer sb = new StringBuffer();while((str = br.readLine()) != null){sb.append(str+"\r\n");}str = sb.toString();System.out.println(str);OutputStreamWriter writer = new OutputStreamWriter(outputStream,"utf-8");writer.write(str);writer.flush();outputStream.close();br.close();writer.close();}}

X 关闭

精心推荐

Copyright ©  2015-2022 北极建筑工程网版权所有  备案号:浙ICP备2022016517号-19   联系邮箱:514 676 113@qq.com