From d48bcea8a6b8ddb347ef9693bd748cf3cdf7c9f6 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 19 May 2025 12:06:29 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20src07=E3=81=AEdump=E5=8F=96=E5=BE=97?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0=E3=80=82=E5=8F=96=E5=BE=97=E9=83=A8?= =?UTF-8?q?=E5=88=86=E3=82=92=E3=83=A1=E3=82=BD=E3=83=83=E3=83=89=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-dbdump/src/jobctrl_dbdump.py | 101 +++++++++++++++--------- 1 file changed, 62 insertions(+), 39 deletions(-) diff --git a/ecs/jskult-dbdump/src/jobctrl_dbdump.py b/ecs/jskult-dbdump/src/jobctrl_dbdump.py index 1cc5a89b..2ecdf0b4 100644 --- a/ecs/jskult-dbdump/src/jobctrl_dbdump.py +++ b/ecs/jskult-dbdump/src/jobctrl_dbdump.py @@ -60,46 +60,13 @@ def exec(): with open(my_cnf_path, 'w') as f: f.write(textwrap.dedent(my_cnf_file_content)[1:-1]) + # dump取得時刻を初期化 dt_now = datetime.datetime.now() - converted_value = dt_now.strftime('%Y%m%d%H%M%S') - dump_file_name = f'backup_rds_src05_{converted_value}.gz' - s3_file_path = f's3://{environment.JSKULT_BACKUP_BUCKET}/{environment.DUMP_BACKUP_FOLDER}/{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}/{dump_file_name}' - # mysqldumpコマンドを実行し、dumpを取得する - command = [ - 'mysqldump', - f'--defaults-file={my_cnf_path}', - '-P', - f"{environment.DB_PORT}", - '--no-tablespaces', - '--skip-column-statistics', - '--single-transaction', - '--set-gtid-purged=OFF', - environment.DB_SCHEMA - ] - - mysqldump_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - # gzipコマンドを実行してdump結果を圧縮する - gzip_process = subprocess.Popen(['gzip', '-c'], stdin=mysqldump_process.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - # aws s3 cpコマンドを実行してアップロードする - s3_cp_process = subprocess.Popen(['aws', 's3', 'cp', '-', s3_file_path], stdin=gzip_process.stdout, stderr=subprocess.PIPE) - # mysqldumpの標準出力をgzipに接続したため、標準出力をクローズする - mysqldump_process.stdout.close() - # gzipの標準出力をaws s3 cpに接続したため、標準出力をクローズする - gzip_process.stdout.close() - - # パイプラインを実行し、エラーハンドリング - _, error = mysqldump_process.communicate() - if mysqldump_process.returncode != 0: - raise BatchOperationException(f'`mysqldump`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') - - _, error = gzip_process.communicate() - if gzip_process.returncode != 0: - raise BatchOperationException(f'`gzip`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') - - _, error = s3_cp_process.communicate() - if s3_cp_process.returncode != 0: - raise BatchOperationException(f'`aws s3 cp`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + # src05のdumpを取得 + execute_dump(dt_now, my_cnf_path, 'src05') + # src07のdumpを取得 + execute_dump(dt_now, my_cnf_path, 'src07') # dump処理状態区分を正常終了に更新 try: @@ -108,7 +75,6 @@ def exec(): raise BatchOperationException(f'dump処理状態区分更新(処理中→正常終了) エラー(異常終了):{e}') logger.info('日次バッチ処理前DBダンプ取得:終了(正常終了)') - logger.info(f'出力ファイルパス: {s3_file_path}') return constants.BATCH_EXIT_CODE_SUCCESS except Exception as e: @@ -120,3 +86,60 @@ def exec(): return constants.BATCH_EXIT_CODE_SUCCESS logger.exception(f'日次バッチ処理前DBダンプ取得中に想定外のエラーが発生しました :{e}') return constants.BATCH_EXIT_CODE_SUCCESS + + +def execute_dump(dt_now: datetime.datetime, my_cnf_path: str, schema: str): + """指定されたスキーマのdumpを取得します + + Args: + dt_now (datetime.datetime): 現在時刻 + my_cnf_path (str): my.cnfファイルのローカルパス + schema (str): 取得対象のスキーマ + + Raises: + BatchOperationException: dump取得中のエラー + """ + yyyymmddhhmmss = dt_now.strftime('%Y%m%d%H%M%S') + dump_file_name = f'backup_rds_{schema}_{yyyymmddhhmmss}.gz' + s3_bucket_path = f's3://{environment.JSKULT_BACKUP_BUCKET}/{environment.DUMP_BACKUP_FOLDER}' + s3_file_path = f'{s3_bucket_path}/{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}/{dump_file_name}' + + # mysqldumpコマンドを実行し、dumpを取得する + command = [ + 'mysqldump', + f'--defaults-file={my_cnf_path}', + '-P', + f"{environment.DB_PORT}", + '--no-tablespaces', + '--skip-column-statistics', + '--single-transaction', + '--set-gtid-purged=OFF', + schema + ] + + mysqldump_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # gzipコマンドを実行してdump結果を圧縮する + gzip_process = subprocess.Popen(['gzip', '-c'], stdin=mysqldump_process.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # aws s3 cpコマンドを実行してアップロードする + s3_cp_process = subprocess.Popen(['aws', 's3', 'cp', '-', s3_file_path], stdin=gzip_process.stdout, stderr=subprocess.PIPE) + # mysqldumpの標準出力をgzipに接続したため、標準出力をクローズする + mysqldump_process.stdout.close() + # gzipの標準出力をaws s3 cpに接続したため、標準出力をクローズする + gzip_process.stdout.close() + + # パイプラインを実行し、エラーハンドリング + _, error = mysqldump_process.communicate() + if mysqldump_process.returncode != 0: + raise BatchOperationException(f'`mysqldump`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + + _, error = gzip_process.communicate() + if gzip_process.returncode != 0: + raise BatchOperationException(f'`gzip`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + + _, error = s3_cp_process.communicate() + if s3_cp_process.returncode != 0: + raise BatchOperationException(f'`aws s3 cp`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + + logger.info(f'出力ファイルパス: {s3_file_path}') + + return