黄莆课堂之java定时任务备份数据库

windows环境下定时任务备份数据库:

https://www.cnblogs.com/craffming/p/12097089.html
以上有在线文档支持,不做过多的描述;

Linux环境下定时任务备份数据库:

1、首先在Linux环境某路径下新建一个专门存放sh指令文件的路径,如:
/usr/local/backup

2、因为Linux环境如同window环境一样,都自带了定时任务指令,不同的是Linux环境下的指令是 crontab

3、我们使用crontab -e 对定时任务进行编写:如下图:


80e4154a-079f-4dc5-91ba-90a4e3558484.png

设置好对应的定时刷新的间隔时间

4、使用crontab -l 来查询定时任务:如图所示:


c07966a7-a749-4b54-8dc4-9e42319ec117.png
Liunx环境下数据库备份方法:

1、在/usr/local 下新建backup文件夹

2、编写sh脚本如下:
#!/bin/bash
find /usr/local/backup -name "backuppig_*" -type f -mmin +3  -exec rm -rf {} \;  
#删除3分钟之前生产的通配backuppig_*的sql脚本,-mmin +3  表示3分钟之前, -mtime +3则是表示三天之前的
mysqldump -u root -pgskj2024 nyj-livepig-pro > /usr/local/backup/backuppigsql_$(date +%Y%m%d_%H%M%s).sql

3、当在Linux里执行mysqldump时找不到时:

执行 ln -s  /usr/local/tool/mysql/bin/mysqldump  /usr/bin   软链接将mysqldump设置为全局

注:/usr/local/tool/mysql/bin 为MySQL的安装路径

4、Liunx服务器设置定时任务:
crontab -e   ---->  0  11/22 * * *   /usr/local/backup/xxx.sh      eg:每天11点、22点做数据库备份
Liunx服务器查看定时任务:
crontab -l
注意:sh脚本权限问题: /usr/local/backup 下面的sh脚本的权限要加读写权限   chmod 777 xxx.sh

5、然后我们编写sh执行脚本

#!/bin/bash
find /usr/local/backup -name "backuppigprosql_*" -type f -mtime +2 -exec rm -rf {} \;
mysqldump -u root -pgskj2024 nyj-livepig-pro > /usr/local/backup/backuppigprosql_$(date +%Y%m%d_%H%M%s).sql

对sh语言进行解析:
我们一般是使用mysqldump 来操作数据库备份的。所以先要确保Linux环境上mysqldump可以正常执行。

其次,因为备份数据库sql,如果不加删除机制,硬盘的内存会日益扩张,这肯定是不行的,所以我们在sh脚本前增加删除sql脚本的命令。
find /usr/local/backup -name "backuppigprosql_*" -type f -mtime +2 -exec rm -rf {} ;
这个命令的意思将所有带backuppigprosql_ 前缀的sql,凡是超过了3天的在/usr/local/backup/路径下的全部删除。只保留最近三天的数据库备份;

mysqldump -u root -pgskj2024 nyj-livepig-pro > /usr/local/backup/backuppigprosql_$(date +%Y%m%d_%H%M%s).sql
这个sh脚本意思就是将对应数据库的DB,全部转化为以backuppigprosql_开头的sql脚本。

这样sh脚本也就配置好了。注意在/usr/local/backup/backuppigpro.sh 一定需要和定时任务里的
0 11,22 * * * /usr/local/backup/backuppigpro.sh
一模一样。这样,我们到了定时任务刷新的时间点后,可以看到备份的sql

如图所示:


87006c98-1e69-4835-84a6-b91d388bcbbd.png

我们将其下载下来并打开,如图:

6197620a-0ab2-4d0e-bb01-75c9b47eed45.png

如图,这样我们在Linux环境下定时任务备份数据库就完成了。

另外,扩展一下,对于使用其他的定时任务,也可以采用代码去运行定时任务:
第一步,新建一个定时任务 rxxTask.mySqlDump() 触发执行mySqlDump方法:

public void mySqlDump(String host, String port, String username, String password, String databasename,String backupNumStr) throws Exception {
        String dir = GSConfig.getUploadPath() + "/dbBackUp";
        if (!FileUtil.exist(dir)) {
            FileUtil.mkdir(dir);
        }

        String sqlName = DateUtil.format(new Date(), DatePattern.PURE_DATETIME_MS_PATTERN)+ ".sql";
        String sqlPathName = dir + File.separator + sqlName;
        if (FileUtil.exist(sqlPathName)) {
            System.out.println(sqlName + "文件名已存在,请更换");
            return;
        }

        //拼接cmd命令  windows下 cmd   Linux下 /bin/sh
        Process exec;
        OsInfo osInfo = SystemUtil.getOsInfo();
        //如果不能取得系统属性os.name(因为Java安全限制),则总是返回false
        if(osInfo.isWindows()){
            exec = Runtime.getRuntime().exec("cmd /c mysqldump -h" + host + " -P" + port + " -u " + username + " -p" + password + " " + databasename + " > " + sqlPathName);
        } else {
            exec = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", "/usr/bin/mysqldump -h" + host + " -P" + port + " -u " + username + " -p" + password + " " + databasename + " > " + sqlPathName});
        }
        if (exec.waitFor() == 0) {
            System.out.println("数据库备份成功,备份路径为:" + sqlPathName);
        }

        //压缩
        String zipPathName = dir + File.separator + sqlName + ".zip";
        ZipUtil.zip(sqlPathName, zipPathName);
        //删除
        FileUtil.del(sqlPathName);

        //获取外部的备份保留份数
        int backupNum = 5;
        try {
            backupNum = NumberUtil.parseInt(backupNumStr);
        } catch (Exception e){
            System.out.println("backupNumStr非数字:"+backupNumStr);
        }

        //删除之前备份份数
        List<String> fileNames = FileUtil.listFileNames(dir);
        if(CollUtil.isNotEmpty(fileNames)){
            //从大到小排序
            fileNames = fileNames.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
            for (int i = 0; i < fileNames.size(); i++) {
                //超过的份数全删除
                if(i>=backupNum){
                    FileUtil.del(dir + File.separator + fileNames.get(i));
                }
            }
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容