MySQLやMariaDBのテーブルバックアップをPythonで実行してみたので、その方法をまとめておく。
環境
MySQLの設定
.my.cnfの中身は次のようにユーザー名とパスワードを記載しておく。
[mysqldump]user=mysqluser
password=password
最後にパーミッションを設定しておく。
Pythonでmysqldumpを実行する
Pythonでmysqldumpを実行するためにsubprocessモジュール(Pythonのsubprocessでコマンドを実行する)を使う。
以下のコードでは、mydbデータベースのmytableテーブルをダンプしてgzip圧縮する。MySQLではオプション--skip-column-statisticsが必要。
import os
import io
import subprocess
from pathlib import Path
def dump_table(dbhost, dbname, tblname, mariadb=True):
    dump_path = tblname+'.sql.gz'
    if mariadb:
        com_dump = 'mysqldump --defaults-file=~/.my.cnf -h {} {} {}'.format(dbhost, dbname, tblname)
    else:
        # --skip-column-statistics
        # MySQLではこのオプションがないと "Unknown table 'COLUMN_STATISTICS' in information_schema (1109)" が発生する
        com_dump = 'mysqldump --defaults-file=~/.my.cnf --skip-column-statistics -h {} {} {}'.format(dbhost, dbname, tblname)
    ps1 = subprocess.Popen(com_dump.split(' '), stdout=subprocess.PIPE)
    with open(dump_path, 'wb') as f:
        ps2 = subprocess.Popen(['gzip'], stdin=ps1.stdout, stdout=f)
        ps1.stdout.close()
    
    # プロセス終了まで待つ
    outs, errs = ps2.communicate()
    # ダンプしたファイルの確認
    p = Path(dump_path)
    if p.is_file():
        dump_size = os.path.getsize(dump_path)
        print('dump_path=', dump_path)
        print('dump_size=', dump_size)
    else:
        raise Exception('Failed to dump: [dbname={}] [tblname={}]'.format(dbname, tblname))
def main():
    # データベースのホスト
    dbhost = 'localhost'
    # データベース名
    dbname = 'mydb'
    # ダンプするテーブル
    tblname = 'mytable'
    dump_table(dbhost, dbname, tblname)
if __name__ == '__main__':
    main()
このコードを実行するとzip圧縮されたダンプファイルがmytable.sql.gzとして作成される。
0 件のコメント:
コメントを投稿