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数据库