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 件のコメント:
コメントを投稿