热门标签 | 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+"  秒");

}

}



推荐阅读
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
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社区 版权所有