2021.02.13  

【Python】MySQLサーバーのDBバックアップ及び、ローカル端末への保存を自動化する

macからMySQLサーバーにアクセスし、バックアップ(dump)ファイルを出力、さらにそのdumpファイルをmacに保存するスクリプトを作成した。

macのcronを使えば、一連の流れを自動化できる。

pythonスクリプトの内容

実行サーバーはAWSのCentOS7を想定している。
前提として、クライアント(mac) 側にparamikoとscpをインストールしておく必要がある。

macターミナルでparamikoとscpをインストール
pip install paramiko
pip install scp
DBRemoteBackup.py
#!/usr/bin/python
# coding:utf-8
import sys
import paramiko
from scp import SCPClient

# 環境により書き換える------------------------------------------
# サーバーへの接続情報を設定
IP_ADDRESS = '12.22.230.123'
USER_NAME = 'centos'
KEY_FILENAME = '/Users/macuser/.ssh/mysqldb.pem'

# サーバー上で実行するコマンドを設定。今回はMySQL DBのdumpファイルを出力する
CMD = 'mysqldump -uroot -p[ rootのパスワード ] [ DB名 ] > dump.sql'

# サーバー上で取得するファイル名とその格納先を設定
GET_FILE_NAME = 'dump.sql'
GET_FILE_PATH = '/home/centos/'

# サーバーで取得したファイルの保存先(ローカル)を指定。cronの使用を想定し絶対パスで書く。
LOCAL_FILE_DOWNLOAD_PATH = '/Users/macuser/backup'
# ----------------------------------------------------------

# ssh接続
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.WarningPolicy())
client.connect(IP_ADDRESS, username=USER_NAME, key_filename=KEY_FILENAME, timeout=5.0)

# DBバックアップコマンドの実行
stdin, stdout, stderr = client.exec_command(CMD, get_pty=True)
for line in stdout:
    print(line.strip())

# spcでリモートファイルをローカルにコピー
with SCPClient(client.get_transport()) as scp:
    scp.get(GET_FILE_PATH + GET_FILE_NAME, LOCAL_FILE_DOWNLOAD_PATH)

# ssh接続断
client.close()
del client, stdin, stdout, stderr

sys.exit(0)

これを試しにmacで動かす。

python ./DBRemoteBackup.py

そうすると「LOCAL_FILE_DOWNLOAD_PATH」に指定したパス「/Users/macuser/backup」にdump.sqlが作成される。
サンプル12.22.230.123サーバーのMySQLからDBのバックアップと取得はこれだけでできてしまう。
ちなみに、既にローカルディレクトリにdump.sqlが出力されている場合は上書き保存される。

処理の自動化

次にこのスクリプトを自動化してみよう。
macにはある日時になると自動的にコマンドやスクリプトを実行してくれるcronという機能がある。
※ macが起動している時のみ実行される。

cron を使用する前には下準備が必要だ。
まずはスクリプトに実行権限を付与する。コマンドはスクリプトの置いてあるディレクトリで実行する。

chmod u+x DBRemoteBackup.py

今度は次のコマンドを実行する。

echo $PATH
/Users/macuser/opt/anaconda3/bin:/Users/macuser/opt/anaconda3/condabin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:

echo $PATH の下に出てきた文字列をメモ帳に貼り付けておく。
貼り付けたらcronコマンドを実行する。

crontab -e

そうすると以下のようにvi画面になる。

vi画面でiキー押してから次のように設定する。
「PATH=」の「=」から先の部分は先ほどメモした文字列をコピペする。
cronはデフォルトだとコマンドへのPATHが殆ど通っていないため、この設定をしないとpythonコマンドが実行できない。

PATH=/Users/macuser/opt/anaconda3/bin:/Users/macuser/opt/anaconda3/condabin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
59 23 * * * python /[スクリプトまでのフルパス]/DBRemoteBackup.py

これで毎日23時59分になると、スクリプトが自動で動くようになる。
まあ、毎週土曜日の4時9分に起動したければ以下の設定になる。

9 4 * * 6 python /[スクリプトまでのフルパス]/DBRemoteBackup.py

フォーマット:

(分)(時)(日)(月)(曜日) 実行するコマンド

曜日については日曜日の0から土曜日の6を数字で設定する。

設定が完了したらescキーを押したあと「:wq!」と入力し、enterキーを押す。

あと、cronの注意点としては、スクリプト内の「LOCAL_FILE_DOWNLOAD_PATH」はフルパスで設定しないと想定したところにファイルが出力されないので気をつけよう。
相対パスで指定すると、そのパスはスクリプトからの相対ではなく、ユーザーホーム(/Users/macuser)からの相対となるため、思った通りにファイルが出力されなくなる。

以上で設定は完了です。
お疲れ様でした!

コメント
現在コメントはありません。
コメントする
コメント入力

名前 (※ 必須)

メールアドレス (※ 必須 画面には表示されません)

送信