- 1. 概要
- 2. バックアップ
- 3. リストア
- 4. 参考サイト
1. 概要
本ページは、「MySQL」のデータベースバックアップについて記述します。
2. バックアップ
バックアップをとるときの対象によって以下を使い分けた方がいいようです。
バックアップ対象の「MySQL サーバーで「GTID(グローバルトランザクションID)」というレプリケーション用の機能をどうするかによって使い分けます。
もっとも一般的で、運用の影響が少ない方法。
主に「InnoDB」テーブルを使っている場合、データベースをロック(停止)することなく、トランザクションの仕組みを利用して「ある一時点の正しいデータ」を安全にダンプしたいとき。
「--single-transaction」というオプションをつけて。
mysqldump -u root -p --all-databases --routines --triggers --events --single-transaction > filename
もし「MyISAM」テーブルが含まれている場合や、バックアップ中のデータ更新を完全にブロックしても問題ない環境(開発環境やメンテナンス中など)であれば、すべてのテーブルをロックしてダンプ。
「--lock-all-tables」というオプションをつけて。
mysqldump -u root -p --all-databases --routines --triggers --events --lock-all-tables > filename
ダンプファイルを「別のテスト環境(GTIDを使っていない環境)」などにリストアする目的で、「GTID」の情報をダンプに含める必要がそもそもない場合。
「--set-gtid-purged=OFF」というオプションをつけて。
mysqldump -u root -p --all-databases --routines --triggers --events --set-gtid-purged=OFF > filename
いずれもパスワード入力待ちになりますので、入力して Enter で出力されます。
Enter password:
圧縮オプションをつけていないで、テキストファイルに出力しますので、比較的小さめのデータベースが対象になります。
わたしは、自分の環境がバックアップ中、ロックしても問題ないので下記のコマンドを使っています。
mysqldump -u root -p --all-databases --routines --triggers --events --lock-all-tables > filename
3. リストア
リストアは以下のコマンドで行います。
最もシンプルなパターン。
mysql -u root -p < filename
「--single-transaction」または「--lock-all-tables」で取得した(GTIDの情報がダンプファイルに含まれている)場合。
リストア先が「空のサーバー(新規構築など)」の場合は、上記のままで問題ありません。
バックアップ元の「GTID」情報がそのままリストア先にも引き継がれます。
リストア先に「すでに別のデータや履歴がある」場合は。
そのまま復元しようとすると以下のエラーで失敗します。
ERROR 1840 (HY000) at line XX: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.
リストア先で一度「GTID」の履歴をリセットする必要があります。
「MySQL」にログインし、以下のコマンドを実行してからリストアを行います。
RESET MASTER;
RESET BINARY LOGS AND REPLICAS;
こうすれば、履歴をまっさらにした状態になりますので、本項最初の基本のリストアコマンドを実行します。
「--set-gtid-purged=OFF」で取得した場合。
「GTID」の情報を完全に除外して、純粋なデータだけをバックアップした状態なので。
リストア先の「GTID」の状態を気にする必要がありません。
競合が起きないため、もっともスムーズにリストアできます。
テスト環境や開発環境にデータをコピーしたい場合はこのパターンが一番楽です。
本項の最初のコマンドを実行します。
全ダンプ「--all-databases」をリストアするときの共通の注意点として。
丸ごとバックアップしているため。
リストアすると「MySQL」データベース(ユーザー権限や設定が入っているシステムデータベース)も上書きされます。
そのため、リストアが完了したら。
「MySQL」に設定を再読み込みさせるために以下のコマンドを実行(権限情報のキャッシュを更新するコマンド)するか。
mysqladmin -u root -p flush-privileges
「MySQL」サーバー自体を再起動することをおすすめします。
4. 参考サイト
本ページは、「Gemini」伍長を参考にさせていただきました。
|
|