当前位置:   article > 正文

springboot+kotlin 实现对mysql数据库的备份与恢复_springboot 通过sql文件恢复mysql数据库

springboot 通过sql文件恢复mysql数据库

背景:新来的开发误操作数据库,导致数据丢失,但是没有数据备份,所以就写一个程序,定时备份数据库,体量也不是很大。

yml 配置

  1. server:
  2. port: 8080
  3. # 备份的目录
  4. backup:
  5. sql:
  6. path: usr/local/mysql/bak_data/
  7. # 需要备份的数据库
  8. mysql:
  9. ip: 127.0.0.1
  10. port: 3306
  11. username: root
  12. password: root
  13. # mysqldump 目录
  14. mysqldump:
  15. path: /usr/bin/mysqldump

kotlin 使用 @Value获取配置文件的值时要多一个 \

  1. private var logger = LoggerFactory.getLogger(BackupSqlService::class.java)
  2. @Value("\${backup.sql.path}")
  3. private lateinit var backPath: String
  4. @Value("\${mysql.ip}")
  5. private lateinit var ip: String
  6. @Value("\${mysql.port}")
  7. private lateinit var port: String
  8. @Value("\${mysql.username}")
  9. private lateinit var username: String
  10. @Value("\${mysql.password}")
  11. private lateinit var password: String
  12. @Value("\${mysql.mysqldump.path}")
  13. private lateinit var mysqldumpPath: String

备份数据库

  1. fun backupSQL() {
  2. var df = DateTimeFormatter.ofPattern("yyyyMMddHHmmss")
  3. var time = df.format(LocalDateTime.now())
  4. var fileName = "backup_$time.sql"
  5. var cmd = "$mysqldumpPath -h$ip -P$port -u$username -p$password bank_actity > ${backPath}$fileName"
  6. var cmdLinux = arrayOf("/bin/sh", "-c", cmd) // linux 命令
  7. // var cmdWindows = arrayOf("cmd", "/c", cmd) // windows
  8. Runtime.getRuntime().exec(cmdLinux )
  9. logger.info("备份数据库成功")
  10. }

获取所有备份的文件列表,后续根据文件名称进行恢复数据

  1. fun backFiles(): ArrayList<String> {
  2. var rs = arrayListOf<String>()
  3. var file = File(backPath)
  4. if (file.exists()) {
  5. var files = file.listFiles()
  6. files?.let {
  7. for (f in files) {
  8. println(f.name)
  9. rs.add(f.name)
  10. }
  11. }
  12. }
  13. return rs
  14. }

恢复数据

  1. fun rollback(fileName: String) {
  2. var file = File("${backPath}$fileName")
  3. if (!file.exists()) {
  4. throw NullPointerException("文件不存在")
  5. }
  6. var cmd = "mysql -h$ip -P$port -u$username -p$password --default-character-set=utf8 bank_actity"
  7. // var cmdLinux = arrayOf("/bin/sh", "-c", cmd) // linux 命令
  8. var cmdWindows = arrayOf("cmd", "/c", cmd) // windows
  9. var os = Runtime.getRuntime().exec(cmdWindows).outputStream
  10. var ins = FileInputStream(file)
  11. var str = ins.bufferedReader().use(BufferedReader::readText)
  12. var writer = OutputStreamWriter(os, "utf-8")
  13. writer.write(str)
  14. writer.flush()
  15. writer.close()
  16. ins.close()
  17. logger.info("还原数据库成功")
  18. }

这里说一下,一开始我是使用 BufferedReader().readLine() 实现的,但是出现内存不够的情况

正常java 写,但是在kotlin会报错了

  1. String str = null;
  2. StringBuffer sb = new StringBuffer()
  3. while((str = br.readLine()) != null) {
  4. sb.append(str + "\r\n")
  5. }

所以kotlin 新的写法就是如下,虽然这样是可以了,但是append()方法会出现性能问题,

java.lang.OutOfMemoryError: Java heap space

  1. var str: String? = null
  2. var sb = StringBuffer()
  3. while (({str = br.readLine();str}) != null) {
  4. sb.append(str + "\r\n")
  5. }

 解决办法就是

var str = inputStream.bufferedReader().use(BufferedReader::readText)

定时程序,备份数据

  1. @Component
  2. class Scheduled {
  3. @Autowired
  4. private lateinit var service: BackupSqlService
  5. // 每天23:30 备份数据,根据业务来
  6. @Scheduled(cron = "0 30 23 * * ?")
  7. fun cron() {
  8. service.backupSQL()
  9. }
  10. }

又是学习的一天啊!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/1009349
推荐阅读
相关标签
  

闽ICP备14008679号