Spring batch Mysql Backup

Yono·2023년 8월 22일
post-thumbnail

Spring Batch 적응기

현재 내가 하고있는 업무는 RDS 같은 클라우드 환경에 떠있는 RDBMS 의 dump를 생성해서 S3 같은 Object Storage에 전송하는 작업을 하는중이다.

필자는 현재 RDS는 아니고 NCP의 CloudDb for mysql 과 Object Storage 환경에 맞춰 개발을 진행했다.

앞서서 Ncp의 Object Storage는 AWS S3 의 SDK 를 지원한다.

네이버 클라우드 API Docs
https://api.ncloud-docs.com/docs/common-ncpapi

네이버 클라우드 Object Storage Docs
https://guide.ncloud-docs.com/docs/ko/storage-storage-6-1

내가 생각하는 플로우는 이렇다.
Batch Container 실행 -> MysqlDump -> ObjectStorage

@Scheduled 로 실행되는게 아니라 Crontab으로 실행될 예정

jar가 실행될떄 args에 daily weekly monthly 라는 인수를 전달해서 실행될 계획이다.

그래서 뭔가 Spring Batch라고 하기 좀 그렇다. 아무튼 배치임 아무튼 배치다

상기와 같이 dependencies 를 추가했다.

필자는 @Value를 자주쓰는게 귀찮아 @ConfigurationProperties 를 사용했다.

API Docs를 참고하여

이름을 Ncp로 하려했으나 공식문서에서도 상기와 같이나와있어 위와 같이 작성했다.

AWS Client

Mysql Dump 메서드를 만들고

public  class MysqlDumper {

    public int dump(String backupHost, String backupUser, String backupPassword, String backupDatabase, String backupFile) throws Exception {
        List<String> command = new ArrayList<>();
        command.add("mysqldump");
        command.add("-h");
        command.add(backupHost);
        command.add("-u");
        command.add(backupUser);
        command.add("--password=" + backupPassword); // Use the password directly
        command.add(backupDatabase); // Specify the database to backup

        System.out.println("Executing command: " + String.join(" ", command));

        ProcessBuilder processBuilder = new ProcessBuilder(command);
        processBuilder.redirectOutput(new File(backupFile)); // Output redirection

        Process process = processBuilder.start();

        // Error stream handling
        try (BufferedReader errorStream = new BufferedReader(new InputStreamReader(process.getErrorStream()))) {
            String line;
            while ((line = errorStream.readLine()) != null) {
                System.err.println(line); // This can be replaced with a logger
            }
        }

        return process.waitFor();
    }
}

현재 비밀번호가 yml에 기입되어있지만 추후에는 mysql.cnf파일을 이용할 예정이다.

오늘은 여기까지만 작성하고 추후 작성하겠다.

profile
Java,Spring,JavaScript

0개의 댓글