mysqldumpを使用してバックアップを行う方法を理解する
私見バックアップを行う方法を知っている場合、バックアップを行うことはより芸術的な形になっています
オプションがあります
オプション1:mysqldump mysqlインスタンス全体
これは最も簡単なものです、簡単です!
mysqldump -h... -u... -p... --hex-blob --routines --triggers --all-databases | gzip > MySQLData.sql.gz
テーブル構造、インデックス、トリガー、ストアドプロシージャ、ユーザー、暗号化されたパスワードなど、すべて1つのファイルに書き込まれます。他のmysqldumpオプションも、さまざまなスタイルのINSERTコマンド、バイナリログからのログファイルと位置座標、データベース作成オプション、部分データ(--whereオプション)などをエクスポートできます。
オプション2:mysqldumpはデータベースを個別のデータファイルに分離します
データベースのリストを作成することから始めます(これを行う2つの手法)
テクニック1
mysql -h... -u... -p... -A --skip-column-names -e"SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','mysql')" > ListOfDatabases.txt
テクニック2
mysql -h... -u... -p... -A --skip-column-names -e"SELECT DISTINCT table_schema FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql')" > ListOfDatabases.txt
テクニック1が最速の方法です。テクニック2は最も確実で安全です。テクニック2の方が優れている場合があります。ユーザーは、データベース関連ではない一般的な目的で/ var / lib / mysql(datadir)にフォルダーを作成することがあるためです。information_schemaは、information_schema.schemataテーブルにデータベースとしてフォルダーを登録します。手法2は、mysqlデータを含まないフォルダーをバイパスします。
データベースのリストをコンパイルしたら、リストをループしてmysqldumpに進み、必要に応じて並行して実行することもできます。
for DB in `cat ListOfDatabases.txt`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
done
wait
一度に起動するデータベースが多すぎる場合は、一度に10を並列ダンプします。
COMMIT_COUNT=0
COMMIT_LIMIT=10
for DB in `cat ListOfDatabases.txt`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
オプション3:mysqldumpテーブルを別々のデータファイルに分離
テーブルのリストを作成することから始めます
mysql -h... -u... -p... -A --skip-column-names -e"SELECT CONCAT(table_schema,'.',table_name) FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql')" > ListOfTables.txt
次に、10のグループですべてのテーブルをダンプします
COMMIT_COUNT=0
COMMIT_LIMIT=10
for DBTB in `cat ListOfTables.txt`
do
DB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $1}'`
TB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $2}'`
mysqldump -h... -u... -p... --hex-blob --triggers ${DB} ${TB} | gzip > ${DB}_${TB}.sql.gz &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
オプション4:想像力を使用する
前述のオプションのバリエーションに加えて、クリーンなスナップショットのテクニックを試してください
例
- 各テーブルのサイズの昇順または降順でテーブルのリストを並べます。
- 別のプロセスを使用して、mysqldumpsを起動する前に、「読み取りロック付きのフラッシュテーブル、SELECT SLEEP(86400)」を実行します。mysqldumpsが完了した後、このプロセスを強制終了します。これは、データベースにInnoDBとMyISAMの両方が含まれる場合に役立ちます
- 日付の付いたフォルダーにmysqldumpsを保存し、古いバックアップフォルダーをローテーションします。
- インスタンスmysqldumps全体をスタンドアロンサーバーにロードします。
警告
オプション1のみがすべてをもたらします。欠点は、この方法で作成されたmysqldumpは、mysqldumpが生成されたのと同じmajotリリースバージョンのmysqlにのみリロードできることです。つまり、MySQL 5.0データベースのmysqldumpは5.1または5.5にロードできません。理由 ?mysqlスキーマは、メジャーリリース間でまったく異なります。
オプション2と3には、ユーザー名とパスワードの保存は含まれません。
以下は、読み取り可能で移植性の高いユーザーのSQL Grantsをダンプする一般的な方法です。
mysql -h... -u... -p... --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql -h... -u... -p... --skip-column-names -A | sed 's/$/;/g' > MySQLGrants.sql
オプション3はストアドプロシージャを保存しないため、次のことができます。
mysqldump -h... -u... -p... --no-data --no-create-info --routines > MySQLStoredProcedures.sql &
注意すべきもう1つの点は、InnoDBに関するものです。大きいInnoDBバッファープールがある場合は、バックアップを実行する前にできる限りフラッシュすることをお勧めします。それ以外の場合、MySQLは残りのダーティページを持つテーブルをバッファプールからフラッシュするのに時間を費やします。ここに私が提案するものがあります:
このSQLコマンドを実行して、バックアップを実行する約1時間前
SET GLOBAL innodb_max_dirty_pages_pct = 0;
MySQL 5.5のデフォルトのinnodb_max_dirty_pages_pctは75です。MySQL5.1以降では、デフォルトのinnodb_max_dirty_pages_pctは90です。innodb_max_dirty_pages_pctを0に設定すると、ダーティページのディスクへのフラッシュが早まります。これにより、InnoDBテーブルに対してmysqldumpを実行する前に、InnoDBデータの不完全な2フェーズコミットをクリーンアップする影響を防ぐか、少なくとも軽減します。
mysqldumpの最終単語
ほとんどの人は他のツールを支持してmysqldumpを避け、これらのツールは本当に優れています。
そのようなツールには
- MAATKIT(並列ダンプ / 復元スクリプト、Perconaから[非推奨ですが素晴らしい])
- XtraBackup(PerconaのTopNotchスナップショットバックアップ)
- CDP R1Soft(ポイントインタイムスナップショットを取得するMySQL Module Option)
- MySQL Enterprise Backup(以前のInnoDB Hot Backups [商用])
真のMySQL DBAの精神をお持ちの場合は、mysqldumpを採用し、それを完全にマスターすることができます。すべてのバックアップが、MySQL DBAとしてのスキルを反映している場合があります。