热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

jfinalmysql配置文件_JFinal定时备份mysql数据库(mysqldump实现)

1.配置文件#windows和linux不同#database_backup_mysqldumpmysqldumpdatabase_backup_mysqldumpC:\\Prog

1. 配置文件# windows 和  linux 不同

# database_backup_mysqldump = mysqldump

database_backup_mysqldump = C:\\Program Files\\MySQL\\MySQL Server 5.7\\bin\\mysqldump.exe

# 数据库配置(路径不以/结尾) 注意:该目录只存放备份SQL,否则会误删其他文件

database_backup_dir = D:/home/backup

# 清除30天前的备份文件

database_backup_clear_before_days = 30

# 数据库执行备份的定时任务

cron4j=mysqlBackup

mysqlBackup.cron=0 1 * * *

mysqlBackup.class=com.sohnny.jfinal.task.BackupMySqlTask

mysqlBackup.enable=true

2.定时备份MySQL任务类import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.nio.file.Files;

import java.nio.file.Path;

import java.nio.file.Paths;

import java.nio.file.StandardOpenOption;

import java.time.LocalDateTime;

import java.time.format.DateTimeFormatter;

import java.util.Date;

import com.jfinal.plugin.activerecord.Db;

import com.jfinal.plugin.activerecord.Record;

import com.jfinal.plugin.cron4j.ITask;

import com.sohnny.MainConfig;

import com.sohnny.jfinal.common.kit.ClearFileKit;

public class BackupMySqlTask implements ITask {

String url = MainConfig.jdbcProp.get("jdbcUrl");

Path dir = Paths.get(MainConfig.sysProp.get("database_backup_dir"));

String mysqldump = MainConfig.sysProp.get("database_backup_mysqldump");

int beforeDays = MainConfig.sysProp.getInt("database_backup_clear_before_days");

@Override

public void run() {

//获取IP和PORT

String[] arrays = url.split("/");

String host = arrays[2];

String ip, port;

if (host.contains(":")) {

ip   = host.split(":")[0];

port = host.split(":")[1];

} else {

ip = host;

port = "3306";

}

//获取数据库名称

System.out.println(arrays[3]);

System.out.println(arrays[3].substring(0, arrays[3].indexOf("?")));

String dataBaseName = arrays[3].substring(0, arrays[3].indexOf("?"));

//创建备份目录

if (!Files.exists(dir)) {

try {

Files.createDirectories(dir);

} catch (IOException e) {

e.printStackTrace();

}

}

//生成备份文件名

String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH-mm-ss"));

Path path = Paths.get(dir.toString(), dataBaseName+"-"+date+".sql");

Process process = null;

try {

String cmd = mysqldump+" -h "+ip+" -P "+port+" -u "+MainConfig.jdbcProp.get("user")+" -p"+MainConfig.jdbcProp.get("password").trim()+" --databases "+dataBaseName+" ";

System.out.println(cmd);

process = Runtime.getRuntime().exec(cmd);

try (

BufferedReader stdoutReader = new BufferedReader(new InputStreamReader(process.getInputStream()));

BufferedReader stderrReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));

) {

backup(stdoutReader, path);

errOut(stderrReader, path);

} catch (IOException e) {

e.printStackTrace();

}

int exitVal = process.waitFor();

if (exitVal == 0) {

System.out.println("数据库备份完成");

}

} catch (InterruptedException e) {

e.printStackTrace();

} catch (IOException e1) {

e1.printStackTrace();

}

//清除过期文件

ClearFileKit.clearFileByMonth(dir, beforeDays);

// 每次调度启动时,向 task_run_log 写日志,用于检查调度的时间是否与预期的一致,避免出现 bug 却不知道

Record taskRunLog = new Record().set("taskName", "backupMySql").set("createAt", new Date());

Db.save("task_run_log", taskRunLog);

}

@Override

public void stop() {

// TODO Auto-generated method stub

}

private void backup (BufferedReader stdReader, Path path) throws IOException {

Path backupPath = null;

if (Files.notExists(path)) backupPath = Files.createFile(path);

String line;

try (BufferedWriter bw = Files.newBufferedWriter(backupPath, StandardOpenOption.WRITE)) {

while ((line = stdReader.readLine()) != null) {

bw.write(line+"\n");

}

} catch (IOException e) {

e.printStackTrace();

}

}

private void errOut (BufferedReader stdReader, Path path) throws IOException {

String line;

try {

while ((line = stdReader.readLine()) != null) {

System.err.println(line);

}

} catch (IOException e) {

e.printStackTrace();

}

}

public static void main(String[] args) {

new Thread(new BackupMySqlTask()).start();

}

}

3. 清除过期文件类import static java.nio.file.FileVisitResult.CONTINUE;

import java.io.IOException;

import java.nio.file.DirectoryNotEmptyException;

import java.nio.file.FileVisitResult;

import java.nio.file.Files;

import java.nio.file.NoSuchFileException;

import java.nio.file.Path;

import java.nio.file.SimpleFileVisitor;

import java.nio.file.attribute.BasicFileAttributes;

import java.time.LocalDateTime;

import java.time.ZoneId;

public class ClearFileKit {

/**

* 清除某个目录下某几天前的文件

* @param dir

* @param days

*/

public static void clearFileByMonth(Path dir, int days) {

class DeleteFiles extends SimpleFileVisitor {

LocalDateTime beforeDateTime = LocalDateTime.now().minusDays(days);

boolean isDeleteDir = false;

public DeleteFiles(boolean isDeleteDir) {

this.isDeleteDir = isDeleteDir;

}

@Override

public FileVisitResult visitFile(Path file, BasicFileAttributes attr) {

if (attr.isSymbolicLink()) {

System.out.format("Symbolic link: %s%n ", file);

} else if (attr.isRegularFile()) {

try {

boolean isHarfYearBefore = attr.creationTime().toInstant().isBefore(beforeDateTime.atZone(ZoneId.systemDefault()).toInstant());

if (isHarfYearBefore) {

Files.delete(file);

System.out.format("Delete Regular file: %s%n ", file);

}

} catch (IOException e) {

e.printStackTrace();

}

} else {

System.out.format("Other: %s%n ", file);

}

//System.out.println("(" + attr.size() + "bytes)");

return CONTINUE;

}

// Print each directory visited.

@Override

public FileVisitResult postVisitDirectory(Path dir, IOException exc) {

if (isDeleteDir) {

try {

Files.delete(dir);

System.out.format("Delete Directory: %s%n ", dir);

} catch (NoSuchFileException x) {

System.err.format("%s: no such" + " directory%n", dir);

} catch (DirectoryNotEmptyException x) {

//System.err.format("%s not empty%n", dir);

} catch (IOException x) {

// File permission problems are caught here.

System.err.println(x);

}

}

return CONTINUE;

}

// If there is some error accessing

// the file, let the user know.

// If you don't override this method

// and an error occurs, an IOException

// is thrown.

@Override

public FileVisitResult visitFileFailed(Path file, IOException exc) {

System.err.println(exc);

return CONTINUE;

}

}

long startTime = System.currentTimeMillis();

System.out.println("开始删除过期文件...");

Path startingDir = dir;

DeleteFiles pf = new DeleteFiles(false);

try {

Files.walkFileTree(startingDir, pf);

} catch (IOException e) {

e.printStackTrace();

}

long endTime = System.currentTimeMillis();

long time = endTime-startTime;

System.out.println("删除过期文件完成, 耗时: " +time/1000+"  秒");

}

}



推荐阅读
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 基于iSCSI的SQL Server 2012群集测试(一)SQL群集安装
    一、测试需求介绍与准备公司计划服务器迁移过程计划同时上线SQLServer2012,引入SQLServer2012群集提高高可用性,需要对SQLServ ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
  • 本文详细介绍了在MySQL中如何高效利用EXPLAIN命令进行查询优化。通过实例解析和步骤说明,文章旨在帮助读者深入理解EXPLAIN命令的工作原理及其在性能调优中的应用,内容通俗易懂且结构清晰,适合各水平的数据库管理员和技术人员参考学习。 ... [详细]
author-avatar
快乐饼干W_848
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有