java定时备份删除数据库

2 篇文章 0 订阅

java定时备份删除数据库

1、首先要设置数据库的环境变量
2、mysql数据库备份命令:mysqldump -h(IP) -P(端口号) -u(用户名) -p(密码) --default-character-set=utf8 数据库名 > 备份至本地磁盘的何处
3、数据库恢复命令:source 文件存放路径

 /**
     * @desc 备份sql文件,并且删除7天之前的备份sql文件
     */
    fun dbBack() {
        val fileName = dataName + System.currentTimeMillis() + ".sql"
        //调用备份数据库方法
        exportDatabaseTool(ip!!,port!!,username!!,password!!,dataName!!,backupPath!!,fileName)
        //删除数据库备份方法(删除一周前的备份)
        deleteDump("$backupPath/$fileName")
    }

    /**
     * Java代码实现MySQL数据库导出
     * @param ip MySQL数据库所在服务器地址IP
     * @param host 数据库端口号
     * @param userName 进入数据库所需要的用户名
     * @param password 进入数据库所需要的密码
     * @param databaseName 要导出的数据库名
     * @param savePath 数据库导出文件保存路径
     * @param fileName 数据库导出文件文件名
     * @return 返回true表示导出成功,否则返回false。
     * @throws IOException
     */
    @Throws(IOException::class)
    fun exportDatabaseTool(
        ip: String,
        host: String,
        userName: String,
        password: String,
        databaseName: String,
        savePath: String,
        fileName: String
    ) {
        var savePath = savePath
        val saveFile = File(savePath)
        if (!saveFile.exists()) { // 如果目录不存在
            saveFile.mkdirs() // 创建文件夹
        }
        if (!savePath.endsWith(File.separator)) {
            savePath = savePath + File.separator
        }
        var printWriter: PrintWriter? = null
        var bufferedReader: BufferedReader? = null
        try {
            printWriter = PrintWriter(OutputStreamWriter(FileOutputStream(savePath + fileName), "utf8"))
            val process = Runtime.getRuntime()
                .exec(" mysqldump -h$ip -P$host -u$userName -p$password --default-character-set=utf8 $databaseName")
            val inputStreamReader = InputStreamReader(process.inputStream, "utf8")
            bufferedReader = BufferedReader(inputStreamReader)
            var line: String?
            while (bufferedReader.readLine().also { line = it } != null) {
                printWriter.println(line)
            }
            printWriter.flush()
            /*if(process.waitFor() == 0){//0 表示线程正常终止。
				return true;
			}*/
        } finally {
            try {
                bufferedReader?.close()
                printWriter?.close()
            } catch (e: IOException) {
                e.printStackTrace()
            }
        }
        //return false;
    }


    /**
     * @desc 删除文件
     */
    fun deleteDump(fileName: String) {
        val file = File(backupPath)
        val sqlFileList = listFile(file, SqlFileFilter(), true)
        val sqlList = sqlFileList?.filter { it.path.endsWith(".sql") }
        if (sqlList != null) {
            if (sqlList.isNotEmpty()) {
                for (sqlFile in sqlList) {
                    val timeStamp = fileName.substringBefore(".sql").substringAfter("/$dataName").replace(".sql", "")
                    if (System.currentTimeMillis().minus(timeStamp.toLong()) > 7 * 24 * 60 * 60) {
                        if (sqlFile.exists()) {
                            sqlFile.delete()
                        }
                    }
                }
            }
        }
    }


    /**
     * @desc 获取路径下的指定后缀文件
     */
    fun listFile(
        dir: File, ff: FilenameFilter?,
        recursive: Boolean
    ): List<File>? {
        val list: MutableList<File> = ArrayList()
        val files = dir.listFiles(ff)
        if (files != null && files.isNotEmpty()) {
            for (f in files) {
                // 如果是文件,添加文件到list中
                if (f.isFile) {
                    list.add(f)
                } else if (recursive) {
                    list.addAll(listFile(f, ff, true)!!)
                }
            }
        }
        return list
    }


}
/**
 * @desc 继承文件过滤类,重写accept方法(获取以.sql的文件)
 */
class SqlFileFilter : FilenameFilter {
    override fun accept(dir: File, name: String): Boolean {
        if (dir.isDirectory) return true
        return name.lowercase(Locale.getDefault()).endsWith(".sql")
    }

参考文档:
Java备份mysql数据库

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值