springboot+kotlin 实现对mysql数据库的备份与恢复

8 篇文章 0 订阅
3 篇文章 0 订阅

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

yml 配置

server:
  port: 8080

# 备份的目录
backup:
  sql:
    path: usr/local/mysql/bak_data/

# 需要备份的数据库
mysql:
  ip: 127.0.0.1
  port: 3306
  username: root
  password: root
# mysqldump 目录
  mysqldump:
    path: /usr/bin/mysqldump

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

    private var logger = LoggerFactory.getLogger(BackupSqlService::class.java)

    @Value("\${backup.sql.path}")
    private lateinit var backPath: String

    @Value("\${mysql.ip}")
    private lateinit var ip: String

    @Value("\${mysql.port}")
    private lateinit var port: String

    @Value("\${mysql.username}")
    private lateinit var username: String

    @Value("\${mysql.password}")
    private lateinit var password: String

    @Value("\${mysql.mysqldump.path}")
    private lateinit var mysqldumpPath: String

备份数据库

   fun backupSQL() {
        var df = DateTimeFormatter.ofPattern("yyyyMMddHHmmss")
        var time = df.format(LocalDateTime.now())
        var fileName = "backup_$time.sql"
        var cmd = "$mysqldumpPath -h$ip -P$port -u$username -p$password bank_actity > ${backPath}$fileName"
        var cmdLinux = arrayOf("/bin/sh", "-c", cmd)     // linux 命令
     //   var cmdWindows = arrayOf("cmd", "/c", cmd)      // windows
        Runtime.getRuntime().exec(cmdLinux )

        logger.info("备份数据库成功")
    }

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

 fun backFiles(): ArrayList<String> {
        var rs = arrayListOf<String>()
        var file = File(backPath)
        if (file.exists()) {
            var files = file.listFiles()
            files?.let {
                for (f in files) {
                    println(f.name)
                    rs.add(f.name)
                }
            }
        }
        return rs
    }

恢复数据

 fun rollback(fileName: String) {
        var file = File("${backPath}$fileName")
        if (!file.exists()) {
            throw NullPointerException("文件不存在")
        }
        var cmd = "mysql -h$ip -P$port -u$username -p$password --default-character-set=utf8 bank_actity"
       // var cmdLinux = arrayOf("/bin/sh", "-c", cmd)     // linux 命令
        var cmdWindows = arrayOf("cmd", "/c", cmd)      // windows
        var os = Runtime.getRuntime().exec(cmdWindows).outputStream
        var ins = FileInputStream(file)

        var str = ins.bufferedReader().use(BufferedReader::readText)
        var writer = OutputStreamWriter(os, "utf-8")
        writer.write(str)
        writer.flush()

        writer.close()
        ins.close()

        logger.info("还原数据库成功")
    }

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

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

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

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

java.lang.OutOfMemoryError: Java heap space

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

 解决办法就是

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

定时程序,备份数据

@Component
class Scheduled {

    @Autowired
    private lateinit var service: BackupSqlService

    // 每天23:30 备份数据,根据业务来 
    @Scheduled(cron = "0 30 23 * * ?")
    fun cron() {
        service.backupSQL()
    }
}

又是学习的一天啊!

以下是使用 Spring BootKotlin 更新 API 的详细示例: 1. 创建一个新的 Spring Boot 项目并添加必要的依赖项,如下所示: ```gradle dependencies { implementation("org.springframework.boot:spring-boot-starter-web") implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") implementation("org.jetbrains.kotlin:kotlin-reflect") } ``` 2. 创建一个名为 `User` 的数据类,用于表示要更新的用户: ```kotlin data class User( val id: Long, val name: String, val email: String ) ``` 3. 创建一个名为 `UserController` 的控制器类,用于处理用户更新请求: ```kotlin @RestController @RequestMapping("/api/users") class UserController(private val userRepository: UserRepository) { @PutMapping("/{id}") fun updateUser(@PathVariable id: Long, @RequestBody user: User): User { val existingUser = userRepository.findById(id) .orElseThrow { EntityNotFoundException("User with id $id not found") } existingUser.name = user.name existingUser.email = user.email return userRepository.save(existingUser) } } ``` 4. 创建一个名为 `UserRepository` 的存储库接口,用于访问用户数据: ```kotlin @Repository interface UserRepository : JpaRepository<UserEntity, Long> ``` 5. 创建一个名为 `UserEntity` 的实体类,用于映射到数据库中的用户表: ```kotlin @Entity @Table(name = "users") data class UserEntity( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long = 0, @Column(nullable = false) var name: String, @Column(nullable = false, unique = true) var email: String ) ``` 6. 运行应用程序并使用 cURL 或其他 HTTP 客户端发出更新用户的请求: ```bash curl -X PUT -H "Content-Type: application/json" -d '{"name": "John Doe", "email": "john.doe@example.com"}' http://localhost:8080/api/users/1 ``` 这将更新 ID 为 1 的用户的名称和电子邮件,并返回更新后的用户对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值