MySQLのバックアップのためにダンプを定期的にとる

MySQLのダンプを作成するバッチを作り、cronで動かす。

#!/bin/sh

# 他のユーザからバックアップを読み込めないようにする
umask 077
# バックアップファイルを何日分残しておくか
period=2
# バックアップファイルを保存するディレクトリ
dirpath='/root/mysql_dump'
# ファイル名を定義(※ファイル名で日付がわかるようにしておきます)
fileSuffix=`date +%y%m%d`
# 古いバックアップファイルを削除
oldfileSuffix=`date --date "$period days ago" +%y%m%d`

function dump()
{
  mysqldump --single-transaction -u {ユーザー} -h {ホスト} --password={パスワード} $1 | gzip > $dirpath/$1_$fileSuffix.dump.gz
}

function deleteOld()
{
  rm -f $dirpath/$1_$oldfileSuffix.dump.gz
}

function backup()
{
  dbName=$1
  echo "start $dbName " `date +'%Y/%m/%d %H:%M:%S'`
  dump $dbName
  deleteOld $dbName
  echo "end $dbName " `date +'%Y/%m/%d %H:%M:%S'`
}

echo "***** [$0] start " `date +'%Y/%m/%d %H:%M:%S'` " *****"
backup "{DB名1}"
backup "{DB名2}"
echo "***** [$0] end " `date +'%Y/%m/%d %H:%M:%S'` " *****"

を、保存してcronを設定する。

# mysqldump
0 16 * * * /root/tools/backupDB.sh >> /root/logs/backupDB.log

mysqldump で MySQL からデータダンプ

mysqldumpを使ってMySQLからDDL、DMLを出力する。

  • DDL
    データ定義
    CREATE, ALTER, DROP …

  • DML
    データ操作言語。
    SELECT, INSERT, UPDATE, DELETE …

  • DCL
    データ制御
    GRANT, REVOKE, COMMIT, ROLLBACK …

DDL + DATA

mysqldump -u {ユーザー} -p -h {ホスト} {DB名} {テーブル名} > dump.sql

DDLのみ(-d)

mysqldump -u {ユーザー} -p -d -h {ホスト} {DB名} {テーブル名} > dump.sql

DATAのみ(-t)

mysqldump -u {ユーザー} -p -t -h {ホスト} {DB名} {テーブル名} > dump.sql

複数テーブル

mysqldump -u {ユーザー} -p -t -h {ホスト} {DB名} {テーブル名} {テーブル名} > dump.sql

WHEREで抽出(-w ‘id <= 10’)

mysqldump -u {ユーザー} -p -t -w 'id <= 10' -h {ホスト} {DB名} {テーブル名} > dump.sql

ダンプ結果のSQLを1行ずつ(–skip-extended-insert)

mysqldump -u {ユーザー} -p -t --skip-extended-insert -h {ホスト} {DB名} {テーブル名} > dump.sql

カラム名出力(-c)

mysqldump -u {ユーザー} -p -t -c -h {ホスト} {DB名} {テーブル名} > dump.sql

GAS(Google Apps Script) で MySQL 接続

Google スプレッドシートとかで、GASでMySQLに接続する。

var con_str = 'jdbc:mysql://{ホスト名}:3306/{DB名}';
var user_id = '{ユーザー}';
var user_pass = '{パスワード}';

// DBに接続
var conn = Jdbc.getConnection(con_str, user_id, user_pass);
var stmt = conn.createStatement();

var sql = "SELECT * FROM test;";
var rs = stmt.executeQuery(sql);
while(rs.next()) {
  Logger.log(rs.getString("name"));
}
rs.close();

stmt.close();
conn.close();