mysqldump クライアントは、論理バックアップ を実行するユーティリティーで、元のスキーマオブジェクト、テーブルデータ、または両方を再現するために実行できる SQL ステートメントのセットを生成します。バックアップまたは別の SQL サーバーへの転送のため、1 つまたは複数の MySQL データベースをダンプします。mysqldump コマンドは、CSV、その他の区切り文字で区切られたテキスト、または XML 形式でも出力を生成できます。
mysqldump では、ダンプされるテーブルに対する SELECT
権限、ダンプされるビューに対する SHOW VIEW
、ダンプされるトリガーに対する TRIGGER
、および --single-transaction
オプションが使用されない場合には LOCK TABLES
が少なくとも必要です。オプションの説明に示すように、一部のオプションではその他の権限が必要な場合があります。
ダンプファイルをリロードするには、CREATE
ステートメントを手動で発行してダンプされる各オブジェクトを作成するために必要な権限と同じものを持っていなければなりません。
mysqldump 出力には、データベースの照合順序を変更する ALTER DATABASE
ステートメントを含めることができます。これらは、ストアドプログラムをダンプする際に文字のエンコードを維持するために使用できます。このようなステートメントを含むダンプファイルをリロードするには、影響されるデータベースに対する ALTER
権限が必要です。
パフォーマンスおよびスケーラビリティーに関する考慮事項
mysqldump
の利点には、リストアする前に出力を表示して編集もできるという便利さと柔軟性があります。開発およびデータベース管理用にデータベースのクローンを作成したり、テスト用に既存のデータベースとわずかに異なるデータベースを作成したりできます。大量のデータのバックアップのための、高速でスケーラブルなソリューションを意図したものではありません。データサイズが大量の場合、バックアップのステップにかかる時間が妥当だとしても、SQL ステートメントの再現には、挿入やインデックスの作成などのディスク I/O が含まれるため、データのリストアに非常に長い時間がかかることがあります。
大規模なバックアップとリストアでは、データファイルを高速でリストアできる元の形式でコピーする、物理バックアップの方が適切です。
テーブルが主に
InnoDB
テーブルである場合、またはInnoDB
テーブルとMyISAM
テーブルが混在する場合は、MySQL Enterprise Backup 製品の mysqlbackup コマンドを使用することを検討してください。(Enterprise サブスクリプションの一部として含まれています。)これにより、最低限の中断でもっともパフォーマンスのよいInnoDB
のバックアップを実行できます。また、MyISAM
およびその他のストレージエンジンからのテーブルもバックアップでき、さまざまなバックアップシナリオに対応するための便利なオプションを多数提供します。セクション25.2「MySQL Enterprise Backup」を参照してください。テーブルが主に
MyISAM
テーブルである場合は、代わりに mysqlhotcopy を使用することを検討してください。mysqldump のバックアップおよびリストア操作よりも優れたパフォーマンスを提供します。セクション4.6.10「mysqlhotcopy — データベースバックアッププログラム」を参照してください。
mysqldump は、テーブルの内容を 1 行ずつ取得してダンプすることも、ダンプする前にテーブルからすべての内容を取得して、メモリーにバッファリングすることもできます。大きなテーブルをダンプしている場合、メモリーへのバッファリングが問題になる場合があります。テーブルを 1 行ずつダンプする場合、--quick
オプションを使用してください (または --opt
を指定すれば --quick
が有効になります)。--opt
オプションは (したがって --quick
も) デフォルトで有効なため、メモリーへのバッファリングを有効にするには、--skip-quick
を使用します。
最近のバージョンの mysqldump を使用して、非常に古い MySQL サーバーにリロードされるダンプを生成する場合は、--opt
オプションまたは --extended-insert
オプションの代わりに --skip-opt
オプションを使用します。
mysqldump の詳細は、セクション7.4「バックアップへの mysqldump の使用」を参照してください。
構文
次に示すように、一般に mysqldump を使用するには、1 つまたは複数のテーブルのセットのダンプ、1 つまたは複数の完全なデータベースのセット、または MySQL サーバー全体の 3 つの方法があります。
shell> mysqldump [options] db_name [tbl_name ...]
shell> mysqldump [options] --databases db_name ...
shell> mysqldump [options] --all-databases
データベース全体をダンプするには、db_name
に続けてテーブルを指名しないか、または --databases
オプションまたは --all-databases
オプションを使用します。
使用しているバージョンの mysqldump がサポートするオプションのリストを表示するには、コマンド mysqldump --help を発行します。
オプション構文 - アルファベット順のサマリー
mysqldump は次のオプションをサポートします。これらはコマンド行またはオプションファイルの [mysqldump]
グループおよび [client]
グループで指定できます。MySQL プログラムによって使用されるオプションファイルの詳細については、セクション4.2.6「オプションファイルの使用」を参照してください。
表 4.8 mysqldump のオプション
形式 | 説明 | 導入 |
---|---|---|
--add-drop-database | DROP DATABASE ステートメントを CREATE DATABASE ステートメントの前に追加 | |
--add-drop-table | DROP TABLE ステートメントを CREATE TABLE ステートメントの前に追加 | |
--add-drop-trigger | DROP TRIGGER ステートメントを CREATE TRIGGER ステートメントの前に追加 | |
--add-locks | LOCK TABLES と UNLOCK TABLES ステートメントで各テーブルダンプを囲む | |
--all-databases | すべてのデータベース内のすべてのテーブルをダンプ | |
--allow-keywords | キーワードであるカラム名の作成を許可 | |
--apply-slave-statements | CHANGE MASTER ステートメントの前に STOP SLAVE を含め、START SLAVE を出力の最後に含める | |
--bind-address | 指定されたネットワークインタフェースを使用して MySQL サーバーに接続 | 5.6.1 |
--comments | ダンプファイルにコメントを追加 | |
--compact | よりコンパクトな出力を生成 | |
--compatible | 古い MySQL サーバーやほかのデータベースシステムとの互換性がより高い出力を生成 | |
--complete-insert | カラム名を含む完全な INSERT ステートメントを使用 | |
--create-options | すべての MySQL に固有なテーブルオプションを CREATE TABLE ステートメントに含める | |
--databases | 複数のデータベースをダンプ | |
--debug | デバッグのログを書き込み | |
--debug-check | プログラムの終了時にデバッグ情報を出力 | |
--debug-info | プログラムの終了時に、デバッグ情報、メモリー、および CPU の統計を出力 | |
--default-auth | 使用する認証プラグイン | |
--default-character-set | デフォルト文字セットを指定 | |
--defaults-extra-file | 通常のオプションファイルに加えてオプションファイルを読み取る | |
--defaults-file | 指名されたオプションファイルのみを読み取る | |
--defaults-group-suffix | オプショングループのサフィクス値 | |
--delayed-insert | INSERT ステートメントではなく INSERT DELAYED ステートメントを書き出す | |
--delete-master-logs | マスターレプリケーションサーバーで、ダンプ操作の実行後にバイナリログを削除 | |
--disable-keys | 各テーブルについて、キーを無効にするステートメントおよび有効にするステートメントで INSERT ステートメントを囲む | |
--dump-date | --comments が指定された場合、ダンプ日を "Dump completed on" コメントとして含める | |
--dump-slave | スレーブのマスターのバイナリログ座標をリストする CHANGE MASTER ステートメントを含める | |
--events | ダンプされたデータベースからイベントをダンプ | |
--extended-insert | 複数の VALUES リストを含む、複数行 INSERT 構文を使用 | |
--fields-enclosed-by | このオプションは --tab オプションとともに使用され、LOAD DATA INFILE の対応する句と同じ意味を持つ | |
--fields-escaped-by | このオプションは --tab オプションとともに使用され、LOAD DATA INFILE の対応する句と同じ意味を持つ | |
--fields-optionally-enclosed-by | このオプションは --tab オプションとともに使用され、LOAD DATA INFILE の対応する句と同じ意味を持つ | |
--fields-terminated-by | このオプションは --tab オプションとともに使用され、LOAD DATA INFILE の対応する句と同じ意味を持つ | |
--flush-logs | ダンプを始める前に MySQL サーバーログファイルをフラッシュ | |
--flush-privileges | mysql データベースのダンプ後、FLUSH PRIVILEGES ステートメントを発行 | |
--help | ヘルプメッセージを表示して終了 | |
--hex-blob | バイナリカラムを 16 進変換表記法を使用してダンプ (たとえば、'abc' は 0x616263) | |
--host | 接続先のホスト (IP アドレスまたはホスト名) | |
--ignore-table | 指定されたテーブルをダンプしない | |
--include-master-host-port | --dump-slave ともに生成された CHANGE MASTER ステートメントに MASTER_HOST/MASTER_PORT オプションを含める | |
--insert-ignore | INSERT ステートメントではなく INSERT IGNORE ステートメントを書き出す | |
--lines-terminated-by | このオプションは --tab オプションとともに使用され、LOAD DATA INFILE の対応する句と同じ意味を持つ | |
--lock-all-tables | データベース内のテーブルをすべてロック | |
--lock-tables | テーブルをダンプする前にすべてロック | |
--log-error | 警告およびエラーを指名されたファイルに追加 | |
--login-path | ログインパスオプションを .mylogin.cnf から読み取り | 5.6.6 |
--master-data | バイナリログファイルの名前と場所を出力に書き込む | |
--max_allowed_packet | サーバーとの間で送受信するパケットの最大長 | |
--net_buffer_length | TCP/IP とソケット通信のバッファーサイズ | |
--no-autocommit | ダンプされたテーブルごとに、INSERT ステートメントを SET autocommit = 0 ステートメントと COMMIT ステートメントで囲む | |
--no-create-db | このオプションは CREATE DATABASE ステートメントを抑制 | |
--no-create-info | 各ダンプされたテーブルを再作成する CREATE TABLE ステートメントを書き出さない | |
--no-data | テーブルの内容をダンプしない | |
--no-defaults | オプションファイルを読み取らない | |
--no-set-names | --skip-set-charset と同じ | |
--no-tablespaces | CREATE LOGFILE GROUP ステートメントおよび CREATE TABLESPACE ステートメントを出力に書き出さない | |
--opt | --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset の短縮形。 | |
--order-by-primary | 各テーブルの行を、主キーまたは最初の一意のインデックスでソートしてダンプ | |
--password | サーバーに接続する際に使用するパスワード | |
--pipe | Windows で、名前付きパイプを使用してサーバーに接続 | |
--plugin-dir | プラグインがインストールされているディレクトリ | |
--port | 接続に使用する TCP/IP ポート番号 | |
--print-defaults | デフォルトを出力 | |
--protocol | 使用する接続プロトコル | |
--quick | サーバーからのテーブルについて、一度に 1 行ずつ取得 | |
--quote-names | 識別子を逆引用符文字で囲む | |
--replace | INSERT ステートメントではなく REPLACE ステートメントを書き出す | |
--result-file | 指定されたファイルに出力 | |
--routines | ダンプされたデータベースからストアドルーチン (プロシージャーおよび関数) をダンプ | |
--secure-auth | 古い (4.1.1 より前の) 形式でサーバーにパスワードを送信しない | 5.6.17 |
--set-charset | SET NAMES default_character_set を出力に追加 | |
--set-gtid-purged | SET @@GLOBAL.GTID_PURGED を出力に追加するかどうか | 5.6.9 |
--shared-memory-base-name | 共有メモリー接続に使用する共有メモリーの名前 | |
--single-transaction | このオプションは、サーバーからデータをダンプする前に BEGIN SQL ステートメントを発行 | |
--skip-add-drop-table | DROP TABLE ステートメントを CREATE TABLE ステートメントの前に追加しない | |
--skip-add-locks | ロックを追加しない | |
--skip-comments | ダンプファイルにコメントを追加しない | |
--skip-compact | よりコンパクトな出力を生成しない | |
--skip-disable-keys | キーを無効にしない | |
--skip-extended-insert | extended-insert をオフにする | |
--skip-opt | --opt で設定されたオプションをオフにする | |
--skip-quick | サーバーからのテーブルについて、一度に 1 行ずつ取得しない | |
--skip-quote-names | 識別子を引用符で囲まない | |
--skip-set-charset | SET NAMES ステートメントを抑制 | |
--skip-triggers | トリガーをダンプしない | |
--skip-tz-utc | tz-utc をオフにする | |
--socket | ローカルホストへの接続で、使用する Unix ソケットファイル | |
--ssl | 接続に SSL を有効化 | |
--ssl-ca | 信頼された SSL CA のリストを含むファイルのパス | |
--ssl-capath | 信頼された SSL CA の PEM 形式の証明書を含むディレクトリのパス | |
--ssl-cert | PEM 形式の X509 証明書を含むファイルのパス | |
--ssl-cipher | SSL の暗号化に使用される、許可された暗号のリスト | |
--ssl-crl | 証明書失効リストを含むファイルのパス | 5.6.3 |
--ssl-crlpath | 証明書失効リストファイルを含むディレクトリのパス | 5.6.3 |
--ssl-key | PEM 形式の X509 鍵を含むファイルのパス | |
--ssl-verify-server-cert | サーバーへの接続時に、サーバーの証明書内のコモンネーム値をホスト名に対して検証 | |
--tab | タブ区切りのデータファイルを生成 | |
--tables | --databases オプションまたは -B オプションをオーバーライド | |
--triggers | ダンプされた各テーブルについて、トリガーをダンプする | |
--tz-utc | SET TIME_ZONE='+00:00' をダンプファイルに追加 | |
--user | サーバーへの接続時に使用する MySQL ユーザー名 | |
--verbose | 冗長モード | |
--version | バージョン情報を表示して終了 | |
--where | 所定の WHERE 条件で選択された行のみダンプ | |
--xml | XML 出力を生成 |
接続オプション
mysqldump コマンドは MySQL サーバーにログインして情報を抽出します。次のオプションは、同じマシンまたはリモートシステム上の MySQL サーバーに接続する方法を指定します。
-
複数のネットワークインタフェースを持つコンピュータで、このオプションを使用して、MySQL サーバーへの接続に使用するインタフェースを選択します。
このオプションは MySQL 5.6.1 からサポートされています。
-
クライアントとサーバーの両方が圧縮をサポートしている場合、その間で送受信される情報をすべて圧縮します。
-
使用するクライアント側の認証プラグイン。セクション6.3.7「プラガブル認証」を参照してください。
-
--host=
,host_name
-h
host_name
与えられたホスト上の MySQL サーバーからデータをダンプします。デフォルトホストは
localhost
です。 -
指名されたログインパスから
.mylogin.cnf
ログインファイルのオプションを読み取ります。「ログインパス」は、host
、user
、およびpassword
という限定されたオプションのセットのみを許可するオプショングループです。ログインパスは、サーバーホストおよびそのサーバーで認証するための認証情報を示す値のセットであると考えてください。ログインパスファイルを作成するには、mysql_config_editor ユーティリティーを使用します。セクション4.6.6「mysql_config_editor — MySQL 構成ユーティリティー」を参照してください。このオプションは MySQL 5.6.6 で追加されました。 -
--password[=
,password
]-p[
password
]サーバーに接続する際に使用するパスワードです。短いオプション形式 (
-p
) を使用した場合は、オプションとパスワードの間にスペースを置くことはできません。コマンド行で、--password
オプションまたは-p
オプションに続けてpassword
の値を指定しなかった場合、mysqldump はそれを要求します。コマンド行でのパスワード指定は、セキュアでないと考えるべきです。セクション6.1.2.1「パスワードセキュリティーのためのエンドユーザーガイドライン」を参照してください。オプションファイルを使用すれば、コマンド行でパスワードを指定することを回避できます。
-
Windows で、名前付きパイプを使用してサーバーに接続します。このオプションは、サーバーが名前付きパイプ接続をサポートしている場合にのみ適用されます。
-
プラグインを検索するディレクトリ。
--default-auth
オプションを使用して認証プラグインを指定したが、mysqldump がそれを検出できない場合は、このオプションを指定しなければならない可能性があります。セクション6.3.7「プラガブル認証」を参照してください。 -
接続に使用する TCP/IP ポート番号。
-
--protocol={TCP|SOCKET|PIPE|MEMORY}
サーバーへの接続に使用する接続プロトコル。このオプションは、ほかの接続パラメータによって、必要なプロトコル以外のものが通常使用される場合に役立ちます。許可される値の詳細は、セクション4.2.2「MySQL サーバーへの接続」を参照してください。
-
古い (4.1 より前の) 形式でサーバーにパスワードを送信しません。これにより、新しいパスワード形式を使用するサーバー以外への接続を防ぎます。このオプションはデフォルトで有効です。無効にするには
--skip-secure-auth
を使用します。このオプションは MySQL 5.6.17 で追加されました。注記4.1 より前のハッシュ方式を使用するパスワードはネイティブのパスワードハッシュ方式を使用するパスワードよりもセキュアでないため、使用しないようにしてください。4.1 よりも前のパスワードは非推奨であり、これらのサポートは今後の MySQL リリースで削除される予定です。アカウントのアップグレード手順については、セクション6.3.8.3「4.1 よりも前のパスワードハッシュ方式と mysql_old_password プラグインからの移行」を参照してください。
-
localhost
への接続用に使用する、Unix ソケットファイル、または Windows では使用する名前付きパイプの名前。 -
--ssl
で始まるオプションは、SSL を使用してサーバーに接続することを許可するかどうかを指定し、SSL 鍵および証明書を検索する場所を指定します。セクション6.3.10.4「SSL コマンドのオプション」を参照してください。 -
--user=
,user_name
-u
user_name
サーバーへの接続時に使用する MySQL ユーザー名。
--
構文を使用すれば、次の変数も設定できます。
var_name
=value
-
クライアント/サーバー通信用のバッファーの最大サイズ。デフォルトは 24M バイト、最大は 1G バイトです。
-
クライアント/サーバー通信用のバッファーの初期サイズ。複数行の
INSERT
ステートメント (--extended-insert
オプションまたは--opt
オプションを使用する場合など) を作成する場合、mysqldump はnet_buffer_length
までの長さの行を作成します。この変数を増加させる場合は、MySQL サーバー内のnet_buffer_length
変数が少なくともこの大きさであることを確認してください。
オプションファイルオプション
これらのオプションは、どのオプションファイルを読み取るかを制御するために使用されます。
-
--defaults-extra-file=
file_name
このオプションファイルは、グローバルオプションファイルのあとに読み取りますが、(UNIX では) ユーザーオプションファイルの前に読み取るようにしてください。ファイルが存在しないかアクセスできない場合、エラーが発生します。
file_name
は、フルパス名でなく相対パス名として指定された場合、現行ディレクトリを基準にして解釈されます。 -
指定されたオプションファイルのみ使用します。ファイルが存在しないかアクセスできない場合、エラーが発生します。
file_name
は、フルパス名でなく相対パス名として指定された場合、現行ディレクトリを基準にして解釈されます。 -
通常のオプショングループだけでなく、通常の名前に
str
のサフィクスが付いたグループも読み取ります。たとえば、mysqldump は通常[client]
グループおよび[mysqldump]
グループを読み取ります。--defaults-group-suffix=_other
オプションを指定した場合、mysqldump は[client_other]
グループおよび[mysqldump_other]
グループも読み取ります。 -
オプションファイルを読み取りません。オプションファイルから不明のオプションを読み取ることが原因でプログラムの起動に失敗する場合、
--no-defaults
を使用して、オプションを読み取らないようにできます。例外として、
.mylogin.cnf
ファイルは、存在する場合はすべての場合に読み取られます。これにより、--no-defaults
が使用された場合にも、コマンド行よりも安全な方法でパスワードを指定できます。(.mylogin.cnf
は mysql_config_editor ユーティリティーによって作成されます。セクション4.6.6「mysql_config_editor — MySQL 構成ユーティリティー」を参照してください)。 -
プログラム名と、オプションファイルから受け取るすべてのオプションを出力します。
DDL オプション
mysqldump の使用シナリオには、新しい MySQL インスタンス全体 (データベーステーブルを含む) のセットアップ、および既存のインスタンス内部のデータを既存のデータベースおよびテーブルで置換することが含まれます。次のオプションを使用すると、ダンプファイル内にさまざまな DDL ステートメントをエンコードすることによって、ダンプをリストアする際に何を削除し何をセットアップするのかを指定できます。
-
DROP DATABASE
ステートメントを各CREATE DATABASE
ステートメントの前に追加します。通常このオプションは、--all-databases
オプションまたは--databases
オプションとともに使用されます。これらのオプションのいずれかを指定しないとCREATE DATABASE
ステートメントが書き込まれないからです。 -
DROP TABLE
ステートメントを各CREATE TABLE
ステートメントの前に追加します。 -
DROP TRIGGER
ステートメントを各CREATE TRIGGER
ステートメントの前に追加します。 -
NDB
テーブルが使用するテーブルスペースを作成するために必要なすべての SQL ステートメントをテーブルダンプに追加します。そうしないと、この情報は mysqldump の出力には含まれません。このオプションは、現在 MySQL Cluster テーブルに対してのみ有効です。 -
このオプションは、
--databases
オプションまたは--all-databases
オプションが指定されていた場合、出力に含まれるCREATE DATABASE
ステートメントを抑制します。 -
ダンプされた各テーブルを再作成する
CREATE TABLE
ステートメントを書き込みません。注記このオプションは、ログファイルグループまたはテーブルスペースを作成するステートメントを、mysqldump 出力から除外しません。ただし、このためには
--no-tablespaces
オプションを使用できます。 -
このオプションは、mysqldump の出力内のすべての
CREATE LOGFILE GROUP
ステートメントおよびCREATE TABLESPACE
ステートメントを抑制します。 -
INSERT
ステートメントではなくREPLACE
ステートメントを書き込みます。
デバッグオプション
次のオプションは、デバッグ情報を出力したり、ダンプファイルにデバッグ情報をエンコードしたり、または潜在的な問題にかかわらずダンプ操作を続行させたりします。
-
キーワードであるカラム名の作成を許可します。これは各カラム名にテーブル名のプリフィクスを用いることで機能します。
-
プログラムバージョン、サーバーバージョン、およびホストなどの追加情報をダンプファイルに書き込みます。このオプションはデフォルトで有効となっています。この追加情報を抑制するには、
--skip-comments
を使用してください。 -
--debug[=
,debug_options
]-# [
debug_options
]デバッグのログを書き込みます。一般的な
debug_options
文字列はd:t:o,
です。デフォルト値はfile_name
d:t:o,/tmp/mysqldump.trace
です。 -
プログラムの終了時に、デバッグ情報を出力します。
-
プログラムの終了時に、デバッグ情報とメモリーおよび CPU 使用率の統計を出力します。
-
--comments
オプションが指定された場合、mysqldump はダンプの最後に次の形式でコメントを生成します。-- Dump completed on DATE
ただし、別のときに取られたダンプファイルが、日付以外のデータがまったく同じでも日付のために異なって見えます。
--dump-date
および--skip-dump-date
は、コメントに日付を追加するかどうかを制御します。デフォルトは--dump-date
(日付をコメントに含める) です。--skip-dump-date
は日付の出力を抑制します。 -
テーブルダンプの最中に SQL エラーが発生しても続行します。
このオプションの使い方の 1 つとして、削除されたテーブルをビュー定義が参照するために無効になっているビューを検出したときにも、mysqldump が実行を続けるようにすることです。
--force
を指定しないと、mysqldump はエラーメッセージで終了します。--force
を使用すると、mysqldump はエラーメッセージを出力しますが、さらにビュー定義を含む SQL コメントをダンプ出力に書き込み、実行を継続します。 -
警告およびエラーを、指名されたファイルに追加することによってログに記録します。デフォルトでは、ロギングを行いません。
-
--comments
オプションの説明を参照してください。 -
冗長モード。プログラムの動作についてより多くの情報を出力します。
ヘルプオプション
次のオプションは、mysqldump コマンド自身に関する情報を表示します。
国際化オプション
次のオプションは、mysqldump コマンドが各国語の設定で文字データを表現する方法を変更します。
-
文字セットがインストールされているディレクトリ。セクション10.5「文字セットの構成」を参照してください。
-
--default-character-set=
charset_name
charset_name
をデフォルト文字セットとして使用します。セクション10.5「文字セットの構成」を参照してください。文字セットが指定されていない場合、mysqldump はutf8
を使用します。 -
--set-charset
設定をオフにします。--skip-set-charset
を指定するのと同様です。 -
出力に
SET NAMES
を追加します。このオプションはデフォルトで有効となっています。default_character_set
SET NAMES
ステートメントを抑制するには、--skip-set-charset
を使用してください。
レプリケーションオプション
mysqldump コマンドは、レプリケーションの構成において、空のインスタンスまたはデータを含むインスタンスをスレーブサーバーに作成するためによく使用されます。次のオプションは、レプリケーションマスターサーバーおよびスレーブサーバーでデータのダンプおよびリストアに適用されます。
-
--dump-slave
オプションで作成されたスレーブダンプで、STOP SLAVE
ステートメントをCHANGE MASTER TO
ステートメントの前に、START SLAVE
ステートメントを出力の最後に、それぞれ追加します。 -
マスターレプリケーションサーバーで、ダンプ操作の実行後にサーバーに
PURGE BINARY LOGS
ステートメントを送信することにより、バイナリログを削除します。このオプションは自動的に--master-data
を有効にします。 -
このオプションは、ダンプされたサーバーと同じマスターを持つスレーブとして別のサーバーをセットアップするために使用できるダンプファイルを生成するために、レプリケーションスレーブサーバーをダンプするために使用することを除き、
--master-data
と同様です。これにより、ダンプされたスレーブのマスターのバイナリログ座標 (ファイル名とファイル位置) を示すCHANGE MASTER TO
ステートメントがダンプ出力に追加されます。これらは、スレーブがレプリケーションを開始するマスターサーバーの座標です。--dump-slave
を使用すると、座標は--master-data
オプションのようにダンプされたサーバーのものではなく使用されるマスターのものになります。さらに、このオプションを指定すると--master-data
オプションが使用されている場合はオーバーライドされ、実質上無視されるようになります。オプション値は
--master-data
と同様に処理され (値を設定しないか、1 を設定するとCHANGE MASTER TO
ステートメントがダンプに書き込まれ、2 を設定するとステートメントは書き込まれますが SQL コメントで囲まれます)、ほかのオプションを有効または無効にする点およびロッキングの処理において、--master-data
と同様の効果があります。このオプションを使用すると、mysqldump はダンプ前にスレーブ SQL スレッドを終了し、ダンプ後に再起動します。
--dump-slave
とともに、--apply-slave-statements
オプションおよび--include-master-host-port
オプションも使用できます。 -
--dump-slave
を使用して生成されたスレーブダンプ内のCHANGE MASTER TO
ステートメントに、スレーブのマスターのホスト名および TCP/IP ポート番号のMASTER_HOST
オプションおよびMASTER_PORT
オプションを追加します。 -
マスターレプリケーションサーバーをダンプして、別のサーバーをマスターのスレーブとして設定するために使用できるダンプファイルを生成する場合に、このオプションを使用します。これにより、ダンプされたサーバーのバイナリログ座標 (ファイル名とファイル位置) を示す
CHANGE MASTER TO
ステートメントがダンプ出力に追加されます。これらは、ダンプファイルをスレーブにロードしたあとで、スレーブがレプリケーションを開始するマスターサーバーの座標です。オプションの値が 2 の場合、
CHANGE MASTER TO
ステートメントは SQL コメントとして書き込まれるため、情報提供の意味しかなく、ダンプファイルがリロードされるときには何の効果もありません。オプション値が 1 の場合、ステートメントはコメントとしては書き込まれず、ダンプファイルがリロードされるときに実行されます。オプション値が指定されていない場合は、デフォルト値は 1 です。このオプションには
RELOAD
権限が必要で、バイナリログが有効にされていなければいけません。--master-data
オプションは自動的に--lock-tables
をオフにします。また、--single-transaction
も指定されていない場合は、--lock-all-tables
をオンにします。その場合、ダンプの最初のわずかな時間のみグローバル読み取りロックが取得されます (--single-transaction
の説明を参照してください)。どの場合でも、ログに対するアクションはすべてダンプと同時に発生します。--dump-slave
オプションを使用してマスターの既存のスレーブをダンプすることによって、スレーブをセットアップすることも可能です。--master-data
は、これによってオーバーライドされ、両方のオプションが使用された場合には無視されます。MySQL 5.6.4 より前では、レプリケーションログテーブルのダンプにはこのオプションが必要でした (セクション17.2.2「レプリケーションリレーおよびステータスログ」を参照してください)。
-
このオプションを使用すると、
SET @@global.gtid_purged
ステートメントを出力に追加するかどうかを指定することによって、ダンプファイルに書き込まれるグローバルトランザクション ID (GTID) 情報を制御できます。次の表は、許可されるオプション値を示しています。デフォルト値は
AUTO
です。値 意味 OFF
出力に SET
ステートメントを追加しません。ON
出力に SET
ステートメントを追加します。サーバーで GTID が有効になっていない場合は、エラーが発生します。AUTO
サーバーで GTID が有効になっている場合に、出力に SET
ステートメントを追加します。このオプションは MySQL 5.6.9 で追加されました。
形式オプション
次のオプションは、ダンプファイル全体またはダンプファイル内のある種のデータの提示方法を指定します。また、ある種のオプションの情報をダンプファイルに書き込むかどうかも制御します。
-
よりコンパクトな出力を生成します。このオプションは、
--skip-add-drop-table
、--skip-add-locks
、--skip-comments
、--skip-disable-keys
、および--skip-set-charset
オプションを有効にします。 -
古い MySQL サーバーやほかのデータベースシステムとの互換性がより高い出力を生成します。
name
の値はansi
、mysql323
、mysql40
、postgresql
、oracle
、mssql
、db2
、maxdb
、no_key_options
、no_table_options
、またはno_field_options
となります。複数の値を使用する場合は、カンマで区切ります。これらの値は、サーバー SQL モード設定用の対応するオプションと同じ意味を持っています。セクション5.1.7「サーバー SQL モード」を参照してください。このオプションはほかのサーバーとの互換性を保証するものではありません。現在提供されている、ダンプ出力の互換性を向上させるための SQL モード値を有効にするだけです。たとえば、
--compatible=oracle
はデータ型を Oracle 型に対応付けたり、Oracle コメント構文を使用したりしません。このオプションには、バージョン 4.1.0 以降のサーバーが必要です。それよりも古いサーバーでは、何も行われません。
-
カラム名を含む、完全な
INSERT
ステートメントを使用します。 -
MySQL 固有のテーブルオプションを
CREATE TABLE
ステートメントに含めます。 -
--fields-terminated-by=...
,--fields-enclosed-by=...
,--fields-optionally-enclosed-by=...
,--fields-escaped-by=...
これらのオプションは
--tab
オプションとともに使用され、LOAD DATA INFILE
の対応するFIELDS
句と同じ意味を持ちます。セクション13.2.6「LOAD DATA INFILE 構文」を参照してください。 -
16 進表記を使用してバイナリカラムをダンプします (たとえば、
'abc'
は0x616263
となります)。影響を受けるデータ型は、BINARY
型、VARBINARY
型、BLOB
型およびBIT
です。 -
このオプションは
--tab
とともに使用され、LOAD DATA INFILE
の対応するLINES
句と同じ意味を持ちます。セクション13.2.6「LOAD DATA INFILE 構文」を参照してください。 -
識別子 (データベース、テーブル、およびカラム名など) を 「
`
」 文字で囲みます。ANSI_QUOTES
SQL モードが有効な場合、識別子は 「"
」 文字で囲まれます。このオプションはデフォルトで有効となっています。--skip-quote-names
で無効にできますが、このオプションは--compatible
のような--quote-names
を有効にする可能性のあるオプションのあとに指定するようにしてください。 -
--result-file=
,file_name
-r
file_name
指定されたファイルに出力します。このオプションは、Windows 上で改行文字 「
\n
」 が復帰/改行シーケンス 「\r\n
」 に変換されるのを防ぐために使用します。ダンプの生成中にエラーが発生しても、結果ファイルが作成され以前の内容は上書きされます。 -
タブ区切りのテキスト形式データファイルを生成します。mysqldump は、各ダンプテーブルに対して、テーブルを作成する
CREATE TABLE
ステートメントを含む
ファイルを作成し、サーバーはそのデータを含むtbl_name
.sql
ファイルに書き込みます。オプション値はファイルを書き込むディレクトリです。tbl_name
.txt注記このオプションは、mysqldump が mysqld サーバーと同じマシンで動作している場合にのみ使用するようにしてください。ユーザーは
FILE
権限を持っている必要があり、サーバーは指定したディレクトリ内にファイルを書き込む許可を持っていなければいけません。デフォルトでは、
.txt
データファイルはカラム値の間にタブ文字、各行の最後に改行を使用する形式になります。この形式は、--fields-
オプションおよびxxx
--lines-terminated-by
オプションを使用して明示的に指定できます。カラム値は、
--default-character-set
オプションで指定された文字セットに変換されます。 -
このオプションにより、異なるタイムゾーンのサーバー間で
TIMESTAMP
カラムをダンプしてリロードできるようになります。mysqldump はその接続タイムゾーンを UTC に設定し、SET TIME_ZONE='+00:00'
をダンプファイルに追加します。このオプションを使用しないと、TIMESTAMP
カラムはダンプ元およびリロード先のサーバーのローカルタイムゾーンでダンプおよびリロードが実行され、サーバーが異なるタイムゾーンにある場合、値が変更されます。--tz-utc
は、サマータイムによる変更からも保護します。--tz-utc
はデフォルトで有効です。無効にするには、--skip-tz-utc
を使用します。 -
ダンプ出力および整形式 XML を書き出します。
NULL
、'NULL'
、および空の値: このオプションで生成される出力では、column_name
という名前のカラムに関して、NULL
値、空の文字列、および文字列値'NULL'
は次のように互いに区別されます。値: XML 表現: NULL
(不明な値)<field name="
column_name
" xsi:nil="true" />''
(空の文字列)<field name="
column_name
"></field>'NULL'
(文字列値)<field name="
column_name
">NULL</field>mysql クライアントを
--xml
オプションを使用して実行した場合の出力も、前記のルールに従います。(セクション4.5.1.1「mysql のオプション」を参照してください。)mysqldump からの XML 出力には、次に示すように XML 名前空間が含まれます。
shell> mysqldump --xml -u root world City <?xml version="1.0"?> <mysqldump xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <database name="world"> <table_structure name="City"> <field Field="ID" Type="int(11)" Null="NO" Key="PRI" Extra="auto_increment" /> <field Field="Name" Type="char(35)" Null="NO" Key="" Default="" Extra="" /> <field Field="CountryCode" Type="char(3)" Null="NO" Key="" Default="" Extra="" /> <field Field="District" Type="char(20)" Null="NO" Key="" Default="" Extra="" /> <field Field="Population" Type="int(11)" Null="NO" Key="" Default="0" Extra="" /> <key Table="City" Non_unique="0" Key_name="PRIMARY" Seq_in_index="1" Column_name="ID" Collation="A" Cardinality="4079" Null="" Index_type="BTREE" Comment="" /> <options Name="City" Engine="MyISAM" Version="10" Row_format="Fixed" Rows="4079" Avg_row_length="67" Data_length="273293" Max_data_length="18858823439613951" Index_length="43008" Data_free="0" Auto_increment="4080" Create_time="2007-03-31 01:47:01" Update_time="2007-03-31 01:47:02" Collation="latin1_swedish_ci" Create_options="" Comment="" /> </table_structure> <table_data name="City"> <row> <field name="ID">1</field> <field name="Name">Kabul</field> <field name="CountryCode">AFG</field> <field name="District">Kabol</field> <field name="Population">1780000</field> </row> ... <row> <field name="ID">4079</field> <field name="Name">Rafah</field> <field name="CountryCode">PSE</field> <field name="District">Rafah</field> <field name="Population">92020</field> </row> </table_data> </database> </mysqldump>
MySQL 5.6.5 より前では、このオプションを使用すると
--routines
オプションが正しく機能しませんでした。つまり、ストアドルーチン、トリガー、およびイベントは XML 形式でダンプできませんでした。(Bug #11760384、Bug #52792)
フィルタリングオプション
次のオプションは、どのような種類のスキーマオブジェクトがダンプファイルに書き出されるかを、トリガーまたはイベントなどのカテゴリによって制御したり、たとえばダンプするデータベースおよびテーブルを選択して名前によって制御したり、または WHERE
句を使用してテーブルデータから行をフィルタリングして制御したりできます。
-
すべてのデータベース内のすべてのテーブルをダンプします。これは、コマンド行で
--databases
オプションを使用してすべてのデータベース名を指定するのと同じです。MySQL 5.6.4 より前では、このオプションでは
slave_master_info
テーブルおよびslave_relay_log_info
テーブル (セクション17.2.2「レプリケーションリレーおよびステータスログ」を参照してください) は含まれませんでした。 -
複数のデータベースをダンプします。通常、mysqldump は、コマンド行の最初の名前引数をデータベース名として、それに続く名前をテーブル名として処理します。このオプションを使用すると、名前引数をすべてデータベース名として処理します。出力には、各新しいデータベースの前に
CREATE DATABASE
ステートメントおよびUSE
ステートメントが含まれます。 -
ダンプされるデータベースのイベントスケジューライベントを出力に含めます。
-
--ignore-table=
db_name.tbl_name
指定されたテーブルをダンプしません。これはデータベース名とテーブル名を両方指定する必要があります。複数のテーブルを無視するには、このオプションを複数回使用してください。このオプションを使用してビューを無視することもできます。
-
テーブルの行情報を書き出しません (つまり、テーブルの内容をダンプしません)。これは、テーブルの
CREATE TABLE
ステートメントのみをダンプする場合に便利です (たとえば、ダンプファイルをロードしてテーブルの空のコピーを作成する場合など)。 -
ダンプされるデータベースのストアドルーチン (プロシージャーおよび関数) を出力に含めます。このオプションを使用するには、
mysql.proc
テーブルに対するSELECT
権限が必要です。--routines
を使用して生成された出力は、ルーチンの再作成のため、CREATE PROCEDURE
ステートメントおよびCREATE FUNCTION
ステートメントを含んでいます。ただし、これらのステートメントはルーチンの作成および変更のタイムスタンプなどの属性を含みません。つまり、ルーチンがリロードされたとき、リロード時間と等しいタイムスタンプで作成されます。ルーチンを元のタイムスタンプ属性で再作成しなければならない場合は、
--routines
を使用しないでください。代わりに、mysql
データベースの適切な権限を持っている MySQL アカウントを使用して、mysql.proc
テーブルの内容を直接ダンプしてリロードしてください。MySQL 5.6.5 より前では、このオプションは、
--xml
オプションとともに使用した場合には何の効果もありません。(Bug #11760384、Bug #52792) -
--databases
オプションまたは-B
オプションをオーバーライドします。mysqldump は、このオプションに続く名前の引数をすべてテーブル名とみなします。 -
ダンプされる各テーブルのトリガーを出力に含めます。このオプションはデフォルトで有効です。
--skip-triggers
を使用して無効にします。 -
--where='
,where_condition
'-w '
where_condition
'指定された
WHERE
条件で選択される行のみダンプします。条件が、スペースまたはユーザーのコマンドインタプリタにとって特別なその他の文字を含んでいる場合、条件を引用符で囲まなければなりません。例:
--where="user='jimf'" -w"userid>1" -w"userid<1"
パフォーマンスオプション
次のオプションは、特にリストア操作のパフォーマンスにもっとも重要です。大規模なデータセットでは、リストア操作 (ダンプファイル内の INSERT
ステートメントの処理) がもっとも時間のかかる部分です。データを迅速にリストアすることが緊急である場合、事前にステージを計画してパフォーマンスをテストします。時間単位で測定されるリストア時間に対して、InnoDB
のみ、または混在するデータベースでは MySQL Enterprise Backup、または MyISAM
のみのデータベースでは mysqlhotcopy など、代替のバックアップおよびリストアソリューションが望ましい場合もあります。
パフォーマンスは、主にダンプ操作に関して、トランザクションオプションにも影響されます。
-
INSERT DELAYED
構文をサポートする非トランザクションテーブルでは、通常のINSERT
ステートメントではなくそのステートメントを使用します。MySQL 5.6.6 では、
DELAYED
挿入は非推奨であるため、このオプションは将来のリリースで削除されます。 -
テーブルごとに、
INSERT
ステートメントを/*!40000 ALTER TABLE
ステートメントとtbl_name
DISABLE KEYS */;/*!40000 ALTER TABLE
ステートメントで囲みます。これにより、行がすべて挿入されたあとにインデックスが作成されるため、ダンプファイルのロードが高速になります。このオプションは、tbl_name
ENABLE KEYS */;MyISAM
テーブルの一意でないインデックスにのみ効果があります。 -
複数の
VALUES
リストを含む、複数行のINSERT
構文を使用します。これにより、ダンプファイルのサイズが小さくなり、ファイルがリロードされる際の挿入が高速化されます。 -
INSERT
ステートメントではなく、INSERT IGNORE
ステートメントを書き出します。 -
このオプションはデフォルトで有効で、
--add-drop-table
--add-locks
--create-options
--disable-keys
--extended-insert
--lock-tables
--quick
--set-charset
の組み合わせの短縮形です。高速ダンプ操作が可能になり、MySQL サーバーに迅速にリロードできるダンプファイルを生成します。--opt
オプションはデフォルトで有効であるため、いくつかのデフォルト設定をオフにする場合のみ、この逆の--skip-opt
を指定します。--opt
に影響されるオプションのサブセットを選択的に有効または無効にする方法は、mysqldump
オプショングループ の説明を参照してください。 -
このオプションは大規模なテーブルのダンプに便利です。これは mysqldump に対して、テーブルのすべての行のセットを取得して、書き出す前にメモリーにバッファリングするのではなく、サーバーから 1 行ずつ行を取得することを強制します。
-
--opt
オプションの説明を参照してください。
トランザクションオプション
次のオプションは、エクスポートされるデータの信頼性と一貫性のために、ダンプ操作のパフォーマンスを犠牲にします。
-
LOCK TABLES
ステートメントとUNLOCK TABLES
ステートメントで各テーブルダンプを囲みます。これにより、ダンプファイルをリロードする際の挿入の速度が向上します。セクション8.2.2.1「INSERT ステートメントの速度」を参照してください。 -
ダンプを始める前に MySQL サーバーログファイルをフラッシュします。このオプションには
RELOAD
権限が必要です。このオプションを--all-databases
オプションと組み合わせて使用すると、ログはダンプされるデータベースごとにフラッシュされます。例外は、--lock-all-tables
、--master-data
、または--single-transaction
を使用する場合です。この場合、ログはすべてのテーブルがロックされた瞬間に対応して一度のみフラッシュされます。ダンプとログのフラッシュを正確に同時に実行するには、--flush-logs
を--lock-all-tables
、--master-data
、または--single-transaction
とともに使用するようにしてください。 -
mysql
データベースのダンプ後に、ダンプ出力にFLUSH PRIVILEGES
ステートメントを追加します。ダンプにmysql
データベースおよびmysql
データベース内のデータに依存するその他のすべてのデータベースが含まれている場合には、正しいリストアのために必ずこのオプションを使用するようにしてください。 -
データベース内のテーブルをすべてロックします。これは全ダンプの期間、グローバル読み取りロックを取得することで達成されます。このオプションにより、
--single-transaction
および--lock-tables
は自動的にオフになります。 -
ダンプされる各データベースに対して、ダンプするすべてのテーブルをダンプ前にロックします。
MyISAM
テーブルの場合には、並列挿入を許可するため、テーブルはREAD LOCAL
でロックされます。InnoDB
などのトランザクションテーブルの場合は、--single-transaction
はテーブルをロックする必要がまったくないため、--lock-tables
よりはるかに適したオプションです。--lock-tables
は各データベースに対して個別にテーブルをロックするため、このオプションではダンプファイル内のテーブルがデータベース間で論理的に一貫していることは保証されません。異なるデータベース内のテーブルは完全に異なる状態でダンプされることがあります。--opt
など、一部のオプションは--lock-tables
を自動的に有効にします。これをオーバーライドするには、--skip-lock-tables
をオプションリストの最後に使用します。 -
ダンプされるテーブルごとに、
INSERT
ステートメントをSET autocommit = 0
ステートメントとCOMMIT
ステートメントで囲みます。 -
各テーブルの行を、主キーまたは最初の一意のインデックス (このようなインデックスが存在する場合) でソートしてダンプします。これは、
InnoDB
テーブルにロードされるMyISAM
テーブルをダンプする場合に便利ですが、ダンプ操作にかかる時間がかなり長くなります。 -
--shared-memory-base-name=
name
Windows で、共有メモリーを使用して作成されるローカルサーバーへの接続の共有メモリー名。デフォルト値は
MYSQL
です。共有メモリー名では大文字と小文字を区別します。共有メモリー接続を可能にするには、サーバーは
--shared-memory
オプションで起動する必要があります。 -
このオプションは、データのダンプ前に、トランザクション分離モードを
REPEATABLE READ
に設定し、START TRANSACTION
SQL ステートメントをサーバーに送信します。これは、InnoDB
などのトランザクションテーブルの場合にかぎって便利です。その場合、アプリケーションをブロックすることなく、START TRANSACTION
が発行された時点のデータベースの一貫した状態をダンプするからです。このオプションを使用する場合、一貫した状態でダンプされるのは
InnoDB
テーブルのみだということに留意してください。たとえば、このオプションの使用中にダンプされたMyISAM
テーブルまたはMEMORY
テーブルは状態が変化する可能性があります。--single-transaction
ダンプの処理中、ダンプファイルが正当である (テーブルの内容とバイナリログ座標が正しい) ことを保証するために、ほかの接続でALTER TABLE
、CREATE TABLE
、DROP TABLE
、RENAME TABLE
、TRUNCATE TABLE
ステートメントを使用しないようにしてください。一貫性読み取りはこれらのステートメントから分離されないため、ダンプされるテーブルでこれらを使用すると、mysqldump によって実行され、テーブルの内容を取得するSELECT
が、正しくない内容を取得したり失敗したりすることがあります。--single-transaction
オプションおよび--lock-tables
オプションは相互に排他的です。これは、保留中のトランザクションがLOCK TABLES
により暗黙的にコミットされるためです。大規模なテーブルをダンプするには、
--single-transaction
オプションを--quick
オプションと組み合わせてください。
オプショングループ
--opt
オプションは、高速なダンプ操作を実行するために協働するいくつかの設定をオンにします。--opt
はデフォルトでオンであるため、これらの設定はすべてデフォルトでオンです。したがって、--opt
を指定することは、あるとしてもまれです。代わりに、--skip-opt
を指定してこれらの設定をグループとしてオフにし、そのあと、コマンド行で関連するオプションを指定して特定の設定を再度有効にできます。--compact
オプションは、オプションのステートメントおよびコメントが出力に現れるかどうかを制御するいくつかの設定をオフにします。この場合も、このオプションに、特定の設定を再度有効にするその他のオプションを続けたり、--skip-compact
の形式を使用してすべての設定をオンにしたりできます。
グループオプションの一部を選択的に効果を有効または無効にする場合、オプションは前から後ろへの順で処理されるため、順序が重要です。たとえば、--disable-keys
--lock-tables
--skip-opt
では意図している効果を得られません。--skip-opt
だけの場合と同じになります。
例
データベース全体のバックアップを作成するには:
shell> mysqldump db_name > backup-file.sql
ダンプファイルをサーバーにロードするには:
shell> mysql db_name < backup-file.sql
ダンプファイルをリロードする別の方法:
shell> mysql -e "source /path-to-backup/backup-file.sql" db_name
mysqldump は、1 つの MySQL サーバーから別のサーバーにデータをコピーすることでデータベースを移入するのに非常に便利です。
shell> mysqldump --opt db_name | mysql --host=remote_host -C db_name
複数のデータベースを 1 つのコマンドでダンプできます。
shell> mysqldump --databases db_name1 [db_name2 ...] > my_databases.sql
すべてのデータベースをダンプするには、--all-databases
オプションを使用します。
shell> mysqldump --all-databases > all_databases.sql
InnoDB
テーブルに関して、mysqldump はオンラインバックアップの作成方法を提供します。
shell> mysqldump --all-databases --master-data --single-transaction > all_databases.sql
このバックアップでは、ダンプの最初で (FLUSH TABLES WITH READ LOCK
を使用して) すべてのテーブルに対するグローバル読み取りロックが取得されます。このロックが取得されるとすぐに、バイナリログの座標が読み取られ、ロックが解除されます。FLUSH
ステートメントが発行されたときに長い更新ステートメントが実行中の場合、MySQL サーバーはそれらのステートメントが終わるまで停止する可能性があります。そのあと、ダンプはロックがなくなり、テーブルの読み取りと書き込みを妨げることはなくなります。MySQL サーバーが受信する更新ステートメントが (実行時間の点で) 短い場合、更新の数が多くても最初のロック時間はさほど気にならないはずです。
ポイントインタイムリカバリ (または 「ロールフォワード」、これは古いバックアップをリストアし、そのバックアップ後に発生した変更を再現する必要がある場合) は、バイナリログを交替させる (セクション5.2.4「バイナリログ」を参照してください) か、または少なくともダンプが対応しているバイナリログ座標を知っていると便利な場合があります。
shell> mysqldump --all-databases --master-data=2 > all_databases.sql
または:
shell> mysqldump --all-databases --flush-logs --master-data=2
> all_databases.sql
--master-data
オプションおよび --single-transaction
オプションは同時に使用できます。これは、テーブルが InnoDB
ストレージエンジンを使用して保存されている場合に、ポイントインタイムリカバリの前に使用するのに適したオンラインバックアップを作成する便利な方法を提供します。
バックアップ作成の詳細は、セクション7.2「データベースバックアップ方法」とセクション7.3「バックアップおよびリカバリ戦略の例」を参照してください。
いくつかの機能を除いて
--opt
の効果を選択するには、除く各機能に対して--skip
オプションを選択します。拡張挿入およびメモリーバッファリングを無効にするには、--opt
--skip-extended-insert
--skip-quick
を使用します。(--opt
はデフォルトでオンであるため、実際には--skip-extended-insert
--skip-quick
で十分です。)インデックスの無効化とテーブルのロックを除くすべての機能に関して
--opt
を反転するには、--skip-opt
--disable-keys
--lock-tables
を使用します。
制約
mysqldump は、デフォルトでは INFORMATION_SCHEMA
データベースおよび performance_schema
データベースをダンプしません。これらのいずれかをダンプするには、コマンド行で明示的に指定し、--skip-lock-tables
オプションも使用します。--databases
オプションでも指定できます。
mysqldump は、MySQL Cluster ndbinfo
情報データベースをダンプしません。
MySQL 5.6.6 より前では、mysqldump は mysql
データベースのダンプとして general_log
テーブルも slow_query_log
テーブルもダンプしません。5.6.6 以降では、ダンプにはそれらのテーブルを再作成するためのステートメントが含まれているため、ダンプファイルを再ロードしたあとにそれらのテーブルが失われません。ログテーブルの内容はダンプされません。
権限が不十分なためビューのバックアップに問題が生じる場合は、セクションD.5「ビューの制約」の回避策を参照してください。
1. mysqldump --opt --user=username --password database > filetosaveto.sql
2. open the dump file put this statement at the beginning of the sql dump text file:
SET FOREIGN_KEY_CHECKS=0;
3. mysql --user=username --password database < dumpfile.sql
Very fast.
Simply put something like this into /etc/logrotate.conf:
/var/backups/mysql/dump.sql {
daily
rotate 14
missingok
compress
postrotate
/usr/bin/mysqldump --defaults-extra-file=/.../backup-credentials.cnf --opt --flush-logs --all-databases > /var/backups/mysql/dump.sql
endscript
}
1. mysqldump --opt --user=username --password database > dumbfile.sql
2. Edit the dump file and put these lines at the beginning:
SET AUTOCOMMIT = 0;
SET FOREIGN_KEY_CHECKS=0;
3. Put these lines at the end:
SET FOREIGN_KEY_CHECKS = 1;
COMMIT;
SET AUTOCOMMIT = 1;
4. mysql --user=username --password database < dumpfile.sql
First off, you will need a command line file compressor (or your should use one, anyway). I like GNU gzip. You can get it for windows here http://gnuwin32.sourceforge.net/packages/gzip.htm
Secondly, you will need to use windowsw FTP via command line. It took me all day to find documentation on this guy, so I hope this saves some time for somebody.
Anyway, you need two files -- the batch file and a script for your ftp client. The Batch file should look like this guy (it uses random numbers in the file name so that multiple backups are not overwritten):
@ECHO OFF
@REM Set dir variables. Use ~1 format in win2k
SET basedir=C:\BACKUP~1
SET workdir=c:\TEMP
SET mysqldir=c:\mysql\bin
SET gzipdir=c:\PROGRA~1\GnuWin32\bin
SET mysqlpassword=mygoodpassword
SET mysqluser=myrootuser
@REM Change to mysqldir
CD %mysqldir%
@REM dump database. This is all one line
mysqldump -u %mysqluser% -p%mysqlpassword% --all-databases >%workdir%\backup.sql
@REM Change to workdir
CD %workdir%
@REM Zip up database
%gzipdir%\gzip.exe backup.sql
@REM Move to random file name
MOVE backup.sql.gz backup.%random%.gz
@REM FTP file to repository
FTP -n -s:%basedir%\ftp-commands.txt
@REM Remove old backup files
del backup.sql
del backup.*.gz
@REM Change back to base dir
CD %basedir%
And your ftp script should look like this guy (and be named ftp-commands.txt so the above script can find it)
open
ftp.mybackuplocation.com
user
myusername
mypassword
bin
put backup.*.gz
quit
Make sure both of the above files are in whatever directory you set up as %basedir% and test it out and make sure everything works for you. Then schedule it to run every day to protect your data!
You could easily add all the other bells and whistles of ZIP, FTP, and scheduling should you need it. Note that I didn't use a password or many of the other args for mysqldump, you can add those if ya need 'em.
@ECHO OFF
for /f "tokens=1-4 delims=/ " %%a in ('date/t') do (
set dw=%%a
set mm=%%b
set dd=%%c
set yy=%%d
)
SET bkupdir=C:\path\to\where\you\want\backups
SET mysqldir=D:\path\to\mysql
SET dbname=this_is_the_name_of_my_database
SET dbuser=this_is_my_user_name
@ECHO Beginning backup of %dbname%...
%mysqldir%\bin\mysqldump -B %dbname% -u %dbuser% > %bkupdir%\dbBkup_%dbname%_%yy%%mm%%dd%.sql
@ECHO Done! New File: dbBkup_%dbname%_%yy%%mm%%dd%.sql
pause
Use these options:
--single-transaction
--flush-logs
--master-data=1
--delete-master-logs
If you have several databases that are binary-logged and you want to keep a consistent binary log you may have to include all the databases instead of just some (is that really so?):
--all-databases
Now, these are the actions performed by the master server:
1) Acquire global read lock using FLUSH TABLES WITH READ LOCK. This also flushes the query cache and the query result cache. Caused by option --single-transaction.
2) All running and outstanding transactions terminate. MySQL server stalls for further updates.
3) Read lock on all tables acquired.
4) All the logs are flushed, in particular the binary log is closed and a new generation binary log is opened. Caused by option --flush-logs
5) Binary lock coordinates are read and written out so that the slave can position correctly in the binary log. Caused by --master-data=1
6) Read lock is released, MySQL server can proceed with updates. These updates will also go to the binary log and can thus be replayed by the slave. Meanwhile, the InnoDB tables are dumped in a consistent state, which is the state they were in in step 5. (Not guaranteed for MyISAM tables)
7) Dump terminates after a possibly long time.
8) Any old binary log files are deleted. Caused by --delete-master-logs.
Additionally, there are performance-influencing options:
--extended-insert: use multiple-row insert statements
--quick: do not do buffering of row data, good if tables are large
And there are format-influencing options:
--hex-blob: dump binary columns in hex
--complete-insert: use complete insert statements that include column names works nicely with --extended-insert
--add-drop-table: add a DROP TABLE statement before each CREATE TABLE statement.
You can pipe it to gzip to compress in windows. I didn't think it would work on windows, but apparently it does.
@ECHO Beginning backup of %dbname%...
%mysqldir%\bin\mysqldump -B %dbname% -u %dbuser% | gzip> %bkupdir%\dbBkup_%dbname%_%yy%%mm%%dd%.sql.gz
Of course,you need gng gzip in your path or directory.
So, Inspired by Lon B and Corey Tisdale (above) I created a batch file that will create a mysqldump GZiped file for each database and put them into seperate folders. It also creates a log file. You will have to set the vars at the top to match your system.
You will also need GZip to do the compression...
It could still use some work (like no error trapping etc...) but it's in production for me now.
I used a utility "commail.exe" to send the log file to me after the backup is complete.
//--- Begin Batch File ---//
@echo off
:: Set some variables
set bkupdir=E:\MySQL\backup
set mysqldir=E:\MySQL
set datadir=E:\MySQL\data
set logdir=E:\MySQL\logs
set dbuser=username
set dbpass=password
set zip=C:\GZip\bin\gzip.exe
set endtime=0
:GETTIME
:: get the date and then parse it into variables
for /F "tokens=2-4 delims=/ " %%i in ('date /t') do (
set mm=%%i
set dd=%%j
set yy=%%k
)
:: get the time and then parse it into variables
for /F "tokens=5-8 delims=:. " %%i in ('echo.^| time ^| find "current" ') do (
set hh=%%i
set ii=%%j
set ss=%%k
)
:: If this is the second time through then go to the end of the file
if "%endtime%"=="1" goto END
:: Create the filename suffix
set fn=_%yy%%mm%%dd%_%hh%%mm%%ss%
:: Switch to the data directory to enumerate the folders
pushd %datadir%
:: Write to the log file
echo Beginning MySQLDump Process > %logdir%\LOG%fn%.txt
echo Start Time = %yy%-%mm%-%dd% %hh%:%ii%:%ss% >> %logdir%\LOG%fn%.txt
echo --------------------------- >> %logdir%\LOG%fn%.txt
echo. >> %logdir%\LOG%fn%.txt
:: Loop through the data structure in the data dir to get the database names
for /d %%f in (*) do (
:: Create the backup sub-directory is it does not exist
if not exist %bkupdir%\%%f\ (
echo Making Directory %%f
echo Making Directory %%f >> %logdir%\LOG%fn%.txt
mkdir %bkupdir%\%%f
) else (
echo Directory %%f Exists
echo Directory %%f Exists >> %logdir%\LOG%fn%.txt
)
:: Run mysqldump on each database and compress the data by piping through gZip
echo Backing up database %%f%fn%.sql.gz
echo Backing up database %%f%fn%.sql.gz >> %logdir%\LOG%fn%.txt
%mysqldir%\bin\mysqldump --user=%dbuser% --password=%dbpass% --databases %%f --opt --quote-names --allow-keywords --complete-insert | %zip% > %bkupdir%\%%f\%%f%fn%.sql.gz
echo Done...
echo Done... >> %logdir%\LOG%fn%.txt
)
:: Go back and get the end time for the script
set endtime=1
goto :GETTIME
:END
:: Write to the log file
echo. >> %logdir%\LOG%fn%.txt
echo --------------------------- >> %logdir%\LOG%fn%.txt
echo MySQLDump Process Finished >> %logdir%\LOG%fn%.txt
echo End Time = %yy%-%mm%-%dd% %hh%:%ii%:%ss% >> %logdir%\LOG%fn%.txt
echo. >> %logdir%\LOG%fn%.txt
:: Return to the scripts dir
popd
:: Send the log file in an e-mail
c:\commail\commail -host=smtp.yourcompany.com -from="server <server@yourcompany.com>" -to=serveradmins@yourcompany.com -subject="MySQL Backup" -msg=%logdir%\LOG%fn%.txt
//--- End Batch File ---//
It creates a folder for each day, a folder for each db & single bzip2'd files for each table. There are provisions for exclusions. See below where it skips the entire tmp & test db's and in all db's, tables tbl_session & tbl_parameter. It also cleans up files older than 5 days (by that time they've gone to tape).
Be sure to update <user> & <pwd>. Ideally these would be in constants but I couldn't get the bash escaping to work.
# setup
suffix=`date +%Y%m%d`
dest=/mirror/mysqldumps
cmd='/usr/bin/mysqldump'
databases=(`echo 'show databases;' | mysql -u <user> --password='<pwd>' | grep -v ^Database$`)
for d in "${databases[@]}"; do
if [[ $d != 'tmp' && $d != 'test' ]]
then
echo "DATABASE ${d}"
s="use ${d}; show tables;"
tables=(`echo ${s} | mysql -u <user> --password='<pwd>' | grep -v '^Tables_in_'`)
for t in "${tables[@]}"; do
if [[ $t != 'tbl_parameter' && $t != 'tbl_session' ]]
then
echo " TABLE ${t}"
path="${dest}/${suffix}/${d}"
mkdir -p ${path}
${cmd} --user=<user> --password='<pwd>' --quick --add-drop-table --all ${d} ${t} | bzip2 -c > ${path}/${t}.sql.bz2
fi
done
fi
done
# delete old dumps (retain 5 days)
find ${dest} -mtime +5 -exec rm {} \;
You can use these 2 scripts.
First Step:
-Install the mutt client that will transfer emails on the command-line : "apt-get install mutt" or "yum install mutt"
-Create the backup directory : "mkdir /home/backups"
Second Step:
- Copy these 2 scripts on your root directory or your user directory :
#!/bin/sh
# Script name : auto_mysql_dump.sh
# Backup the dbname database
dir=`date +%Y-%m-%d`
dbname=`mybase`
if [ -d /home/backups ]; then
mkdir /home/backups/$dir
mysqldump -B --user=user_of_my_base --password=pwd_of_my_base --host=host_of_my_base $dbname > /home/backups/$dir/$dbname.sql
if [ $?=0 ]; then
#Bzip2 the dump.sql
bzip2 -z9v /home/backups/$dir/$dbname.sql
#Remove the dump.sql from disk
rm -f /home/backups/$dir/$dbname.sql
fi
fi
# End of script auto_mysql_dump.sh
#!/bin/sh
# Script Name : auto_mail_dump.sh
# Sends an email with the dump realized before
dir=`date +%Y-%m-%d`
dbname=`mybase`
mutt -s "Today backup" -a /home/backups/$dir/$dbname.sql.bz2 user@tosend.com < /dev/null
# End of script auto_mail_dump.sh
-Don't forget to change the access to make them executable:
"chmod 700 auto_mysql_dump.sh"
"chmod 700 auto_mail_dump.sh"
Third step:
-Edit the CronTab to schedule the execution of the two scripts.
"crontab -e" (you will use the vi editor)
We consider that the 2 scripts are in the /root directory
-I want the dump to be executed at 8.30 everyday
-I want the mail to be sent at 9.00 everyday
Thus I add these 2 rows after the existing lines :
Hit the "i" to insert new characters...
30 8 * * * /root/auto_mysql_dump.sh > /dev/null
00 9 * * * /root/auto_mail_dump.sh > /dev/null
Save the crontab by hitting : "Esc" + ":wq" (means Write and Quit)
What you should do now :
Once you've written the scripts, test-them !
Enjoy the automatic backup from now on :-)
This way of importing the data avoids problems with language specific characters being turned into garble.
The script is also available at http://www.jijenik.com/projects/mysqlbackup/
Many thanks to Wade Hedgren whose script formed the basis for this version.
//--- Begin Batch File ---//
::
:: Creates a backup of all databases in MySQL.
:: Zip, encrypts and emails the backup file.
::
:: Each database is saved to a seperate file in a new folder.
:: The folder is zipped and then deleted.
:: the zipped backup is encrypted and then emailed, unless the file exceeds the maximum filesize
:: In all cases the logfile is emailed.
:: The encrypted backup is deleted, leaving the unencrypted zipfile on your local machine.
::
:: Version 1.1
::
:: Changes in version 1.1 (released June 29th, 2006)
:: - backups are now sent to the address specified by the mailto variable
::
:: The initial version 1.0 was released on May 27th, 2006
::
::
:: This version of the script was written by Mathieu van Loon (mathieu-public@jijenik.com)
:: It is based heavily on the script by Wade Hedgren (see comments at http://dev.mysql.com/doc/refman/5.0/en/mysqldump.html)
::
:: This script requires several freeware libraries:
:: - zipgenius (a compression tool), www.zipgenius.it
:: - blat (an emailer tool), www.blat.net
:: - doff (extracts datetime, ignores regional formatting), www.jfitz.com/dos/index.html
::
:: Some areas where this script could be improved:
:: - include error trapping and handling
:: - make steps such as encryption and email optional
:: - allow the user to specify a single database on the command line
::
@echo off
::
:: Configuration options
::
:: The threshold for emailing the backup file. If the backup is larger
:: it will not be emailed (the logfile is always sent).
set maxmailsize=10000000
:: The passphrase used to encrypt the zipfile. Longer is more secure.
set passphrase=secret
:: Name of the database user
set dbuser=root
:: Password for the database user
set dbpass=password
:: Recipients of database backup, comma seperated, enclosed in quotes
set mailto="backups@example.com,backups2@example.com"
:: From address for email
set mailfrom="MySQL Backup Service <noreply@example.com>"
:: Email server
set mailsmtp=localhost
:: Email subject
set mailsubject="MySQL Backup"
:: directory where logfiles are stored
set logdir=C:\DatabaseBackups\logs
:: directory where backup files are stored
set bkupdir=C:\DatabaseBackups
:: Install folder of MySQL
set mysqldir=C:\Program Files (x86)\MySQL\MySQL Server 4.1
:: Data directory of MySQL (only used to enumerate databases, we use mysqldump for backup)
set datadir=C:\Program Files (x86)\MySQL\MySQL Server 4.1\data
:: Path of zipgenius compression tool
set zip=C:\Program Files (x86)\ZipGenius 6\zg.exe
:: Path of blat mail tool
set mail=C:\DatabaseBackups\Backupscript\libraries\Blat250\full\blat.exe
:: Path of doff date tool (specify only the folder not the exe)
set doff=C:\DatabaseBackups\Backupscript\libraries\doff10
::
::
:: NO NEED TO CHANGE ANYTHING BELOW
::
::
:: get the date and then parse it into variables
pushd %doff%
for /f %%i in ('doff.exe yyyymmdd_hhmiss') do set fn=%%i
for /f %%i in ('doff.exe dd-mm-yyyy hh:mi:ss') do set nicedate=%%i
popd
set logfile="%logdir%\%fn%_Backuplog.txt"
:: Switch to the data directory to enumerate the folders
pushd "%datadir%"
:: Write to the log file
echo Beginning MySQLDump Process > %logfile%
echo Start Time = %nicedate% >> %logfile%
echo --------------------------- >> %logfile%
echo. >> %logfile%
:: Create the backup folder
if not exist "%bkupdir%\%fn%\" (
echo Making Directory %fn%
echo Making Directory %fn% >> %logfile%
mkdir "%bkupdir%\%fn%"
)
:: Loop through the data structure in the data dir to get the database names
for /d %%f in (*) do (
:: Run mysqldump on each database and compress the data by piping through gZip
echo Backing up database %fn%_%%f.sql
echo Backing up database %fn%_%%f.sql >> %logfile%
"%mysqldir%\bin\mysqldump" --user=%dbuser% --password=%dbpass% --databases %%f --opt --quote-names --allow-keywords --complete-insert > "%bkupdir%\%fn%\%fn%_%%f.sql"
echo Done... >> %logfile%
)
:: return from data dir
popd
pushd %bkupdir%
echo Zipping databases
echo Zipping databases >> %logfile%
REM C9 : maximum compression
REM AM : Delete source files
REM F1 : Store relative path
REM R1 : include subfolders
REM K0 : Do not display progress
"%zip%" -add "%fn%_MySQLBackup.zip" C9 AM F1 R1 K0 +"%bkupdir%\%fn%"
echo Crypting zipfile
echo Crypting zipfile >> %logfile%
REM C : Create non-executable zip
REM S : Do not delete after x tries
REM 3 : Use AES encryption
"%zip%" -encrypt "%fn%_MySQLBackup.zip" C S 3 "%passphrase%" %mailfrom%
echo Deleting directory %fn%
echo Deleting directory %fn% >> %logfile%
rmdir /s /q "%bkupdir%\%fn%"
:: Go back and get the end time for the script
set endtime=1
:: return from backup dir
popd
:: update the nicedate for the log
pushd %doff%
for /f %%i in ('doff.exe dd-mm-yyyy hh:mi:ss') do set nicedate=%%i
popd
:: Write to the log file
echo. >> %logfile%
echo --------------------------- >> %logfile%
echo MySQLDump Process Finished >> %logfile%
echo End Time = %nicedate% >> %logfile%
echo. >> %logfile%
:: Send the log file in an e-mail, include the backup file if it is not too large
:: We use the CALL Trick to enable determination of the filesize (type CALL /? at prompt for info)
:: note that you _must_ specify the full filename as the argument
pushd %bkupdir%
Call :MAILFILE "%bkupdir%\%fn%_MySQLBackup.czip"
echo Backup completed
goto :EOF
:MAILFILE
if /i %~z1 LSS %maxmailsize% (
echo Emailing backup file
"%mail%" %logfile% -q -attach %1 -serverSMTP %mailsmtp% -f %mailfrom% -to %mailto% -subject %mailsubject%
) ELSE (
echo Size of backup file %~z1 B exceeds configured email size %maxmailsize% B.
echo Emailing logfile only
echo Size of backup file %~z1 B exceeds configured email size %maxmailsize% B. only emailing logfile. >> %logfile%
"%mail%" %logfile% -q -serverSMTP %mailsmtp% -f %mailfrom% -to %mailto% -subject %mailsubject%
)
echo Deleting encrypted backup file
del %1
popd
//--- End Batch File ---//
Excellent, I had this installed and configured in about 10 minutes. I do have one minor fix however.
You aren't getting the time portion of the DOFF command captured into your variable. It appears that the output formatting string MUST NOT CONTAIN ANY BLANKS so I changed mine to:
for /f %%i in ('doff.exe dd-mm-yyyy_at_hh:mi:ss') do set nicedate=%%i
This is terrific, wish I found it 10 hrs ago (darn mySQL Administrator Backup - such a waste!!!
***
Now the problem is that my backups won't restore.... I am backing up multiple instances of MediaWiki, Mantis, and Joomla. I'm playing around with the
--max_allowed_packet= nnn and that should fix it based on manual backups working. Now is that nnn bytes or an abbreviation? Hmmm.
Please note:
1) this was a quick hack, so please test thoroughly before using in production. Still, I hope it will be a useful basis for your own script.
2) the --single-transaction switch is used as I am backing up InnoDB tables.
3) mysqldump is run with the root user. It would be A Good Thing to make this more secure - eg. create a backup user with read-only permissions to the tables.
4) <tab> is the tab character. Indentation is significant in Python.
import glob
import os
import time
# configuration
baseBackupFileName = "backupName"
maxBackups = 3
mySqlDumpCommand = "d:\\programs\\mysql\\bin\\mysqldump --user=root --password=rootpass --single-transaction DBName Table1Name Table2Name Table3Name"
winRarPath = "\"c:\\Program Files\\WinRAR\\WinRAR.exe\"" # path is quoted as it contains spaces
print "--- START ---"
# create new backup
newBackupFileName = baseBackupFileName + time.strftime("_%Y%m%d_%H%M%S", time.localtime())
os.system(mySqlDumpCommand+" > "+newBackupFileName+".sql")
# compress new backup
os.system(winRarPath+" a "+newBackupFileName+" "+newBackupFileName+".sql")
os.remove(newBackupFileName+".sql")
print "Created new backup \""+newBackupFileName+".rar\""
# delete old backups
oldBackupFileNames = glob.glob(baseBackupFileName+"_*_*.rar")
oldBackupFileNames.sort()
if len(oldBackupFileNames) > maxBackups:
<tab>for fileName in oldBackupFileNames[0:len(oldBackupFileNames)-maxBackups]:
<tab><tab>os.remove(fileName)
<tab><tab>print "Deleted old backup \""+fileName+"\""
print "--- END ---"
I am just using default character sets - normally latin1. However, the dump produced by mysqldump is, perhaps surprisingly, in utf8. This seems fine, but leads to trouble with the --skip-opt option to mysqldump, which turns off --set-charset but leaves the dump in utf8.
This seems to lead to a dump that will be silently incorrectly reloaded if strings in the database contain non-ascii latin1 characters.
(Is this a documentation flaw, a design flaw or a bug??)
Perhaps the fact that mysqldump uses utf8 by default, and the importance of the --set-charset option should be more prominently documented (see the documentation for the --default-character-set attribute for the current mention of the use of utf8)
#!/bin/sh
TIME_1=`date +%s`
cd /backup/mysql
DBS="$(mysql --user=youruser --password=yourpass -Bse 'show databases')"
for db in ${DBS[@]}
do
echo ${db}-$(date +%m-%d-%y).sql.bz2 is being saved in /backup/mysql
# remember to add the options you need with your backups here.
mysqldump --user=youruser --password=yourpass $db --single-transaction -R | bzip2 -c > ${db}-$(date +%m-%d-%y).sql.bz2
done
TIME_2=`date +%s`
elapsed_time=$(( ( $TIME_2 - $TIME_1 ) / 60 ))
## just a sanity check to make sure i am not running a dump for 4 hours
echo "This mysql dump ran for a total of $elapsed_time minutes." > mysql_dump_runtime.txt
# delete old databases. I have it setup on a daily cron so
# anything older than 60 minutes is fine
for del in $(find /backup/mysql -name '*.sql.bz2' -mmin +60)
do
echo This directory is more than one day old and it is being removed: $del
rm $del
done
# SEE : http://dev.mysql.com/doc/refman/5.0/en/mysqldump.html
# SEE : http://safari.oreilly.com/0596526784/date_and_time_string_formatting_with_strftime
#
# Improved by Bill Hernandez (Plano, Texas) on Tuesday, August 21, 2007 (12:55 AM)
# ( 1 ) Backs up all info to time stamped individual directories, which makes it easier to track
# ( 2 ) Now maintains a single log that contains additional information
# ( 3 ) Includes a file comment header inside each compressed file
# ( 4 ) Used more variables instead of hard-code to make routine easier to use for something else
# ( 5 ) Where I have mysql5, you may have to replace it with mysql
#
# Posted by Ryan Haynes on July 11 2007 6:29pm
# DO NOT DELETE AUTOMATICALLY FOR NOW, MAYBE LATER
DELETE_EXPIRED_AUTOMATICALLY="TRUE"
# DELETE EXPIRED BACKUPS THAT ARE MORE THAN
# expire_minutes=$(( 1 * 30 )) # 30 minutes old
# expire_minutes=$(( 60 * 24 )) # 1 day old
# expire_minutes=$(( 60 * 24 * 7 )) # 7 days old
# expire_minutes=$(( 60 * 24 * 30 )) # 30 days old
expire_minutes=$(( 60 * 24 * 7 )) # 7 days old
if [ $expire_minutes -gt 1440 ]; then
expire_days=$(( $expire_minutes /1440 ))
else
expire_days=0
fi
function pause(){
read -p "$*"
}
# pause "HIT RETURN, and then enter your sudo password..."
echo "Please enter your sudo password..."
sudo echo
mysql_username="your_mysql_username"
mysql_password="your_mysql_password"
current_dir=`pwd`
echo -n "Current working directory is : "
echo $current_dir
echo "------------------------------------------------------------------------"
TIME_1=`date +%s`
TS=$(date +%Y.%m.%d\-%I.%M.%p)
BASE_DIR=/backups/mysql
BACKUP_DIR=${BASE_DIR}/$TS
BACKUP_LOG_NAME=mysql_dump_runtime.log
BACKUP_LOG=${BASE_DIR}/${BACKUP_LOG_NAME}
sudo mkdir -p $BACKUP_DIR
sudo chown mysql:admin $BACKUP_DIR
sudo chmod 775 $BASE_DIR
sudo chmod -R 777 $BACKUP_DIR
cd $BACKUP_DIR
echo -n "Changed working directory to : "
pwd
echo "Saving the following backups..."
echo "------------------------------------------------------------------------"
DBS="$(mysql5 --user=${mysql_username} --password=${mysql_password} -Bse 'show databases')"
for db in ${DBS[@]}
do
normal_output_filename=${db}.sql
compressed_output_filename=${normal_output_filename}.bz2
echo $compressed_output_filename
# remember to add the options you need with your backups here.
echo "-- $compressed_output_filename - $TS" > $normal_output_filename
echo "-- Logname : `logname`" >> $normal_output_filename
# mysqldump5 --user=${mysql_username} --password=${mysql_password} $db --single-transaction -R | bzip2 -c > $compressed_output_filename
mysqldump5 --user=${mysql_username} --password=${mysql_password} $db --single-transaction -R >> $normal_output_filename
bzip2 -c $normal_output_filename > $compressed_output_filename
rm $normal_output_filename
done
echo "------------------------------------------------------------------------"
TIME_2=`date +%s`
elapsed_seconds=$(( ( $TIME_2 - $TIME_1 ) ))
elapsed_minutes=$(( ( $TIME_2 - $TIME_1 ) / 60 ))
# just a sanity check to make sure i am not running a dump for 4 hours
cd $BASE_DIR
echo -n "Changed working directory to : "
pwd
echo "Making log entries..."
if [ ! -f $BACKUP_LOG ]; then
echo "------------------------------------------------------------------------" > ${BACKUP_LOG_NAME}
echo "THIS IS A LOG OF THE MYSQL DUMPS..." >> ${BACKUP_LOG_NAME}
echo "DATE STARTED : [${TS}]" >> ${BACKUP_LOG_NAME}
echo "------------------------------------------------------------------------" >> ${BACKUP_LOG_NAME}
echo "[BACKUP DIRECTORY ] [ELAPSED TIME]" >> ${BACKUP_LOG_NAME}
echo "------------------------------------------------------------------------" >> ${BACKUP_LOG_NAME}
fi
echo "[${TS}] This mysql dump ran for a total of $elapsed_seconds seconds." >> ${BACKUP_LOG_NAME}
echo "------------------------------------------------------------------------" >> ${BACKUP_LOG_NAME}
# delete old databases. I have it setup on a daily cron so anything older than 60 minutes is fine
if [ $DELETE_EXPIRED_AUTOMATICALLY == "TRUE" ]; then
counter=0
for del in $(find $BASE_DIR -name '*-[0-9][0-9].[0-9][0-9].[AP]M' -mmin +${expire_minutes})
do
counter=$(( counter + 1 ))
echo "[${TS}] [Expired Backup - Deleted] $del" >> ${BACKUP_LOG_NAME}
done
echo "------------------------------------------------------------------------"
if [ $counter -lt 1 ]; then
if [ $expire_days -gt 0 ]; then
echo There were no backup directories that were more than ${expire_days} days old:
else
echo There were no backup directories that were more than ${expire_minutes} minutes old:
fi
else
echo "------------------------------------------------------------------------" >> ${BACKUP_LOG_NAME}
if [ $expire_days -gt 0 ]; then
echo These directories are more than ${expire_days} days old and they are being removed:
else
echo These directories are more than ${expire_minutes} minutes old and they are being removed:
fi
echo "------------------------------------------------------------------------"
echo "\${expire_minutes} = ${expire_minutes} minutes"
counter=0
for del in $(find $BASE_DIR -name '*-[0-9][0-9].[0-9][0-9].[AP]M' -mmin +${expire_minutes})
do
counter=$(( counter + 1 ))
echo $del
rm -R $del
done
fi
fi
echo "------------------------------------------------------------------------"
cd `echo $current_dir`
echo -n "Restored working directory to : "
pwd
mysqldump --all-databases | gzip -c > dumpfile.sql.gz
if [ $? -eq 0 ]
...
fi
since the "|gzip" will always return 0.
instead you should use a pipe:
### create a pipe named "pipe"
mkfifo pipe
### compress the pipe in background
gzip < pipe > dumpfile.sql.gz &
### write directly to the pipe
mysqldump --all-databases > pipe
### get the real return code of mysqldump
result=$?
### wait until the gzip completes
wait
### now it is safe to remove the pipe
rm pipe
kind regards....
--
Ludovico
And thanks for the great script examples - I've taken a bit of the batch files and made a perl script for backing up mysql databases - it's pretty crude, but it's what I'm using right now to back up the servers nightly.
It's done on a win2003 server box that has perl and gzip (http://gnuwin32.sourceforge.net/packages.html)installed.
I chose perl 'cause if I need to port the script to 'nix it's trivial. (well, so's the script, really) And it's easy to bang out small scripts in!
Hope this helps someone!
=============
#!/usr/bin/perl
## DB info struct
##{ host, db, username, password}
@DBsToBackup =(
##host 1
['192.168.0.1', 'database1', 'username', 'password'],
['192.168.0.1', 'database2', 'username', 'password'],
['192.168.0.1', 'database3', 'username', 'password'],
['192.168.0.1', 'database4', 'username', 'password'],
##host 2
['192.168.0.2', 'database5', 'username', 'password']
);
$backupdir = 'D:\\Database\\DBdumps';
print "Starting dump of databases...\n\n";
foreach $dbinfo (@DBsToBackup){
($Second, $Minute, $Hour, $Day, $Month, $Year, $WeekDay, $DayOfYear, $IsDST) = localtime(time) ;
$Year += 1900 ; $Month += 1;
$outputFilename = sprintf("%04d%02d%02d[%02d%02d%02d]", $Year, $Month, $Day, $Hour, $Minute, $Second ) . "_$$dbinfo[1]_.sql.gz";
print "dumping: $$dbinfo[0] / $$dbinfo[1]...\n";
$ex = "\"C:\\Program Files\\MySQL\\MySQL\ Server\ 5.0\\bin\\mysqldump\" --user=$$dbinfo[2] --password=$$dbinfo[3] --host=$$dbinfo[0] --add-drop-database --add-drop-table $$dbinfo[1] | gzip > ${backupdir}\\$outputFilename";
print $ex ."\n\n";
print `$ex`;
}
print "DONE dumping\n";
print "deleting dumps older than 14 days...\n";
print `forfiles /P $backupdir /D -14 /C "cmd /c del @path\@file" /S`;
print "script finished\n";
==============
You can find this script and more at http://www.lancetek.com
Thanks,
Lance
Then you will most probably not be able to create or retrieve a MySQL dump.
For a solution try this:
http://www.dwalker.co.uk/phpmysqlautobackup/
it will export your database and email to you. Its GPL open source.
1. mysqldump --opt --user=username --password database > dumbfile.sql
2. Create file to execute prior to the dump file:
echo 'SET AUTOCOMMIT = 0;
SET FOREIGN_KEY_CHECKS=0;
' > pre.sql
3. Create a file to execute after the dump file is imported:
echo 'SET FOREIGN_KEY_CHECKS = 1;
COMMIT;
SET AUTOCOMMIT = 1;
' > post.sql
4. cat pre.sql dumpfile.sql post.sql | mysql --user=username --password database
/backup_dir/db_name/day/table.sql.gz
Useful if you want to restore to a particular days data.
It checks new backups are different to last before overwriting files. This helps if you are rsyncing your filesystems as normally mysql writes a date into the dump so the files always appear to differ even if the data is the same.
Also saves a directory with just your schema in, checks and repairs tables where necessary and defrags tables on a Sunday.
#!/bin/sh
# Incremental backup script using rdiff
# Author: Driantsov Alexander
# Requirements:
# * rdiff-backup - http://www.nongnu.org/rdiff-backup/
# * rsync
# * ssh ;)
####
BACKUP_ADMIN_EMAIL="yourmail@yourserver.com"
BACKUP_MAIL_SUBJECT="`hostname`: SQL Backup Synchronization Result"
BACKUP_LOG="/var/log/backup-sql"
BACKUP_PRIO="20" # Priority for the MySQL dump and rdiff-backup Min: 20 Max: -20
BACKUP_TMP_DIR="/var/backup/mysql_tmp" # New dumps will be stored here
BACKUP_DIFF_DIR="/var/backup/hosting/mysql" # Diffs of dumps will be stored there
SYNC_SRV="BAC.KUP.SER.VER" # Remote server for backup storage
SYNC_USER="backup_user" # User at remote storage
SYNC_SPEED="200" # Limit Synchronization Bandwidth to this number of KB/s
SYNC_DIR="/backup/hosting/mysql" #Directory on Remote server to synchronize backups in
MYSQL_USER="admin" # MySQL user
MYSQL_PASSWD=`cat /etc/psa/.psa.shadow` # Password for MySQL. You may obtain password from /etc/psa/.psa.shadow if you are using Plesk on your server.
#Implementaition
RSCONSTR="$SYNC_USER@$SYNC_SRV"
# Dump
echo "Backup Started at `date`" > $BACKUP_LOG
load_average=`uptime|awk '{print $10" "$11" "$12}'`
echo "Load overage at start: $load_average" >> $BACKUP_LOG
echo "\nBackingUP MySQL:" >> $BACKUP_LOG
for i in `mysql -u$MYSQL_USER -p$MYSQL_PASSWD -Bse "show databases"`; do echo "Backing up database $i..." >> $BACKUP_LOG ; nice -n $BACKUP_PRIO mysqldump --single-transaction --quick --skip-extended-insert -u$MYSQL_USER -p$MYSQL_PASSWD $i > $BACKUP_TMP_DIR/$i.dump; done
echo "MySQL dump completed at `date`" >> $BACKUP_LOG
load_average=`uptime|awk '{print $10" "$11" "$12}'`
echo "\nLoad overage after MySQL dumps: $load_average\n" >> $BACKUP_LOG
# Diff
echo "Looking for difference in database" >> $BACKUP_LOG
nice -n $BACKUP_PRIO rdiff-backup $BACKUP_TMP_DIR $BACKUP_DIFF_DIR/$HOSTNAME 2>&1 >> $BACKUP_LOG
echo "Done" >> $BACKUP_LOG
echo "Rdiff-backup completed at `date`" >> $BACKUP_LOG
load_average=`uptime|awk '{print $10" "$11" "$12}'`
echo "\nLoad overage after rdiff-backup: $load_average\n" >> $BACKUP_LOG
# Synchronize
sql_result=`rsync -avz --bwlimit $SYNC_SPEED $BACKUP_DIFF_DIR $RSCONSTR:$SYNC_DIR|tail -n 2`
free_space_info=`ssh $RSCONSTR df -h --sync -t ext3`
echo -en " MySQL backup synchronization:\n $sql_result \nSynchronization completed at `date` \n\nInformation on free space on remote backup server: \n $free_space_info \n\n Backup Log: \n\n`cat $BACKUP_LOG`"| mail -s "$BACKUP_MAIL_SUBJECT" $BACKUP_ADMIN_EMAIL
I started with what Lon B posted and many editions/revisions later this was produced. I hope you find it as useful as we have.
~~~ BEGIN FILE ~~~
@ECHO OFF
SET VERSIONMAJOR=10
SET VERSIONMINOR=6
FOR /f "tokens=1-4 delims=/ " %%a IN ('date/t') DO (
SET dw=%%a
SET mm=%%b
SET dd=%%c
SET yy=%%d
)
REM *** VERIFY AND UPDATE THESE SETTINGS BEFORE INITIAL RUN ***
REM *** mysqldir must point to the \bin directory! ***
SET bkupdir=C:\MySQL-Backups
SET mysqldir=C:\wamp\bin\mysql\mysql5.0.51b\bin
SET dbhost=localhost
SET dbuser=
SET dbpass=
REM *** END USER CONFIGURABLE SETTINGS ***
IF /i "%1" == "--INSTALL" GOTO INSTALLER
IF /i "%1" == "--CREATEDIRS" GOTO CREATEDIRS
IF /i "%1" == "--ADDSCHEDULEDTASK" GOTO TASKSCHED
IF ""%1"" == """" GOTO ALLDB
IF /i "%1" == "--ALL" GOTO ALLDB
IF /i "%1:~0,2%" == "--" GOTO PARAMERROR
SET ALLDBS=0
SET dbnames=%1
SET dbnamesf=%1
SHIFT
:setArgs
IF ""%1""=="""" GOTO BKUP
SET dbnames=%dbnames% %1
SET dbnamesf=%dbnamesf%_%1
SHIFT
GOTO setArgs
:ALLDB
SET ALLDBS=1
SET dbnames=ALL DATABASES
SET dbnamesf=ALL_DATABASES
:BKUP
@ECHO MySQLdump script for Windows v%VERSIONMAJOR%.%VERSIONMINOR% > %bkupdir%\dbBkup_%dbnamesf%_%yy%%mm%%dd%.log
@ECHO. >> %bkupdir%\dbBkup_%dbnamesf%_%yy%%mm%%dd%.log
@ECHO MySQLdump script for Windows v%VERSIONMAJOR%.%VERSIONMINOR%
@ECHO.
IF NOT EXIST %bkupdir%\INSTALLED.OK (
@ECHO DIRECTORY STRUCTURE NOT IN PLACE. >> %bkupdir%\dbBkup_%dbnamesf%_%yy%%mm%%dd%.log
@ECHO PLEASE RUN %0 --INSTALL OR %0 --CREATEDIRS >> %bkupdir%\dbBkup_%dbnamesf%_%yy%%mm%%dd%.log
@ECHO FAILED TO BACKUP DATABASES. >> %bkupdir%\dbBkup_%dbnamesf%_%yy%%mm%%dd%.log
@ECHO DIRECTORY STRUCTURE NOT IN PLACE.
@ECHO PLEASE RUN %0 --INSTALL OR %0 --CREATEDIRS
@ECHO FAILED TO BACKUP DATABASES.
GOTO BOTTOM
)
@ECHO Beginning backup of %dbnames%... >> %bkupdir%\dbBkup_%dbnamesf%_%yy%%mm%%dd%.log
@ECHO Beginning backup of %dbnames%...
IF %ALLDBS% == 1 (
SET dumpparams=--host=%dbhost% -u %dbuser% -p%dbpass% -A -f -x -q --create-options --flush-privileges -r %bkupdir%\dbBkup_%dbnamesf%_%yy%%mm%%dd%.sql
) ELSE (
SET dumpparams=--host=%dbhost% -u %dbuser% -p%dbpass% -f -x -q --create-options --flush-privileges -r %bkupdir%\dbBkup_%dbnamesf%_%yy%%mm%%dd%.sql --databases %dbnames%
)
%mysqldir%\mysqldump %dumpparams% >> %bkupdir%\dbBkup_%dbnamesf%_%yy%%mm%%dd%.log
@ECHO Done! New File: dbBkup_%dbnamesf%_%yy%%mm%%dd%.sql >> %bkupdir%\dbBkup_%dbnamesf%_%yy%%mm%%dd%.log
@ECHO Done! New File: dbBkup_%dbnamesf%_%yy%%mm%%dd%.sql
COPY /Y %bkupdir%\dbBkup_%dbnamesf%_%yy%%mm%%dd%.sql /A %bkupdir%\Daily\dbBkup_%dbnamesf%_%dw%.sql /A > NUL
@ECHO Created Daily Backup: Daily\dbBkup_%dbnamesf%_%dw%.sql >> %bkupdir%\dbBkup_%dbnamesf%_%yy%%mm%%dd%.log
@ECHO Created Daily Backup: Daily\dbBkup_%dbnamesf%_%dw%.sql
REM Check to see if it's time for the Weekend backup
IF /i "%dw%" NEQ "Sat" GOTO SKIPWKBK
IF EXIST %bkupdir%\Weekly\safety_%dbnamesf%_%yy%%mm%%dd%.txt GOTO WKCUR
IF NOT EXIST %bkupdir%\Weekly\dbBkup_%dbnamesf%_Current.sql GOTO WKCUR
IF NOT EXIST %bkupdir%\Weekly\dbBkup_%dbnamesf%_Previous.sql GOTO WKPRE
IF NOT EXIST %bkupdir%\Weekly\dbBkup_%dbnamesf%_Previous_2.sql GOTO WKPR2
MOVE /Y %bkupdir%\Weekly\dbBkup_%dbnamesf%_Previous_2.sql %bkupdir%\Weekly\dbBkup_%dbnamesf%_Previous_3.sql > NUL
:WKPR2
MOVE /Y %bkupdir%\Weekly\dbBkup_%dbnamesf%_Previous.sql %bkupdir%\Weekly\dbBkup_%dbnamesf%_Previous_2.sql > NUL
:WKPRE
MOVE /Y %bkupdir%\Weekly\dbBkup_%dbnamesf%_Current.sql %bkupdir%\Weekly\dbBkup_%dbnamesf%_Previous.sql > NUL
:WKCUR
COPY /Y %bkupdir%\dbBkup_%dbnamesf%_%yy%%mm%%dd%.sql /A %bkupdir%\Weekly\dbBkup_%dbnamesf%_Current.sql /A > NUL
@ECHO. > %bkupdir%\Weekly\safety_%dbnamesf%_%yy%%mm%%dd%.txt
@ECHO Created Weekly Backup: Weekly\dbBkup_%dbnamesf%_Current.sql >> %bkupdir%\dbBkup_%dbnamesf%_%yy%%mm%%dd%.log
@ECHO Created Weekly Backup: Weekly\dbBkup_%dbnamesf%_Current.sql
:SKIPWKBK
REM if (day >= 28) write EoM backup
IF %dd% GEQ 28 (
COPY /Y %bkupdir%\dbBkup_%dbnamesf%_%yy%%mm%%dd%.sql /A %bkupdir%\Monthly\dbBkup_%dbnamesf%_%mm%.sql /A > NUL
@ECHO Created End of Month Backup: Monthly\dbBkup_%dbnamesf%_%mm%.sql >> %bkupdir%\dbBkup_%dbnamesf%_%yy%%mm%%dd%.log
@ECHO Created End of Month Backup: Monthly\dbBkup_%dbnamesf%_%mm%.sql
)
DEL /q /f %bkupdir%\dbBkup_%dbnamesf%_%yy%%mm%%dd%.sql
@ECHO Backup stored in rotating archives. >> %bkupdir%\dbBkup_%dbnamesf%_%yy%%mm%%dd%.log
@ECHO. >> %bkupdir%\dbBkup_%dbnamesf%_%yy%%mm%%dd%.log
@ECHO End MySQLdump Script >> %bkupdir%\dbBkup_%dbnamesf%_%yy%%mm%%dd%.log
@ECHO Backup stored in rotating archives.
@ECHO.
@ECHO End MySQLdump Script
GOTO BOTTOM
:INSTALLER
@ECHO VERIFY: Path to mysqldump: %mysqldir%
@ECHO VERIFY: Path to backups: %bkupdir%
@ECHO VERIFY: MySQL User: %dbuser%
@ECHO VERIFY: MySQL Pass: %dbpass%
@ECHO VERIFY: MySQL Host: %dbhost%
IF NOT EXIST %bkupdir%\INSTALLED.OK (
@ECHO ALERT: Backup directory does not exist. Create base directory and subdirectories?
SET /p domkdir=[Y/N]:
IF /i "%domkdir%" == "N" (
@ECHO ALERT: CANNOT CONTINUE WITHOUT DIRECTORIES IN PLACE.
GOTO BOTTOM
)
)
:CREATEDIRS
IF NOT EXIST %bkupdir%\INSTALLED.OK (
MD "%bkupdir%" > NUL
MD "%bkupdir%\Daily" > NUL
MD "%bkupdir%\Weekly" > NUL
MD "%bkupdir%\Monthly" > NUL
@ECHO INSTALLED CORRECTLY > %bkupdir%\INSTALLED.OK
)
GOTO BOTTOM
:TASKSCHED
@ECHO Preparing add Scheduled Task...
:STUPIDUSER1
SET /p taskuser=Domain\User to run task:
IF /i ""%taskuser%"" == """" GOTO STUPIDUSER1
:STUPIDUSER2
SET /p taskpwd1=Password:
SET /p taskpwd2=Confirm Password:
IF %taskpwd1% NEQ %taskpwd2% GOTO STUPIDUSER2
:STUPIDUSER3
SET /p taskname=Task name:
IF /i ""%taskname%"" == """" GOTO STUPIDUSER3
SET /p taskparam=Parameters to pass to batch file:
SCHTASKS /Create /SC DAILY /ST 04:00:00 /TN "%taskname%" /TR "%~f0 %taskparam%" /RU "%taskuser%" /RP %taskpwd1%
GOTO BOTTOM
:PARAMERROR
@ECHO ERROR: Unknown Parameter Passed.
@ECHO Current supported parameters:
@ECHO --ALL - Backup all databases, same as passing nothing to batch file
@ECHO --ADDSCHEDULEDTASK - Adds a scheduled task for this process
@ECHO --CREATEDIRS - Creates Directory Structure
@ECHO --INSTALL - Creates directory structure and outputs configuration settings that need verification
:BOTTOM
mysqldump -u [username] -p [dbname] {--opt} --where="true limit 100" > dump.sql
This adds the clause "where true limit 100" when creating the SELECT statement. (Adding "true" is a workaround: I ignore whether there is a way to add "limit 100" without adding the WHERE keyword).
Original post: http://www.geeknewz.com/board/index.php?automodule=blog&blogid=76&showentry=434
http://kc5vzm.com/cms/wiki/view/MySQL+-+Simple+Backup+Script
MYSQL="mysql -h HOST -u USERNAME -pPASSWORD -D DB_NAME"
$MYSQL -BNe "show tables" | awk '{print "set foreign_key_checks=0; drop table `" $1 "`;"}' | $MYSQL
unset MYSQL
This can be useful if you need to empty a database in order to restore a backup made by mysqldump, but you couldn't use --add-drop-database because you don't have CREATE DATABASE privileges on the command line (e.g. you're on shared hosting). mysqldump adds DROP TABLE by default, but if tables may have been added or renamed since the time of your backup (e.g. by some sort of update process that you're trying to revert from), failing to drop those tables will likely cause serious headaches later on.
Of course this raises the question of why MySQL doesn't support "DROP TABLE *;" (in which case mysqldump could just insert that)?
select concat('drop table ',TABLE_SCHEMA,'.',TABLE_NAME,';')
from information_schema.tables
where <TABLE_SCHEMA = db or what ever you want!)
http://www.edmondscommerce.co.uk/blog/mysql/updated-mysql-dump-splitter-and-cleaner/
This shell script will be grabbing the tables you want and pass it to tablename.sql.
It’s capable to understand regular expressions as I’ve added sed -r option.
Also MyDumpSplitter can split the dump in to individual table dumps.
http://kedar.nitty-witty.com/blog/mydumpsplitter-extract-tables-from-mysql-dump-shell-script/
mysqldump --skip-opt exp --tables foo --where "foo_parent_id = 72 limit 100" > ~/foo.dmp
(note the injection of the limit clause in the where)
I now have 100 insert statements. Foo itself has several million rows, so this is quite handy.
showing a way to dump mysql databases directly into gzip and then into ssh connection, thus creating a gzipped dump archive that never resided on the server hard drive. This can be a handy way to ensure that backup does not fill up the server hard drive.
To get it to work, amend the following line
SCHTASKS /Create /SC DAILY /ST 04:00:00 /TN "%taskname%" /TR "%~f0 %taskparam%" /RU "%taskuser%" /RP %taskpwd1%
as follows:
SCHTASKS /Create /SC DAILY /ST 04:00:00 /TN "%taskname%" /TR "\"%~f0\" %taskparam%" /RU "%taskuser%" /RP %taskpwd1%
The escaped quote characters around the script filename (%~f0) will now allow this to work.
This Perl script will extract a single table definition and it's data from a large mysqldump file. Very nice tool for quick restorations from backups.
#!/usr/bin/perl -w
use strict;
# Usage: perl extract_table_from_mysqldump.pl {table name} < {full mysqldump} > {single table dump}
my $regex='^\-\- Table structure for table `'.$ARGV[0].'`';
my $output=0;
while (<STDIN>) {
if ($output && m/^\-\- Table structure/) { exit; }
if (!$output && m/$regex/) { $output=1; }
if ($output) { print; }
}
--Dave Bennett (dbennett at bensoft com)
With MKS Toolkit (http://www.mkssoftware.com/products/tk/)
-----------------------------------------------------------
set DateTime=%date:~7,2%-%date:~4,2%-%date:~-4%
set WorkingDirectory=D:\Backup Directory\
set MySQLDirectory=D:\mysqldump.exe Directory\
"%MySQLDirectory%mysqldump" --host="127.0.0.1" --user="root" --password="" --routines --triggers --events dbname > "%WorkingDirectory%DBName %DateTime%.sql"
zip -m "%WorkingDirectory%DBName %DateTime%" "DBName %DateTime%.sql"
With 7-zip (http://www.7-zip.org/download.html)
-----------------------------------------------
set DateTime=%date:~7,2%-%date:~4,2%-%date:~-4%
set WorkingDirectory=D:\Backup Directory\
set MySQLDirectory=D:\mysqldump.exe Directory\
"%MySQLDirectory%mysqldump" --host="127.0.0.1" --user="root" --password="" --routines --triggers --events dbname > "%WorkingDirectory%DBName %DateTime%.sql"
7z a -tzip "%WorkingDirectory%DBName %DateTime%" "DBName %DateTime%.sql"
if ERRORLEVEL 1 goto :EOF
del "%WorkingDirectory%SnD %DateTime%.sql"
:EOF
schtasks /create /sc daily /st 04:30 /ru SYSTEM /tn MySQL_backup /tr "\"C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqldump.exe\" -B <DB_NAME> -u <USER_NAME> -p<PASSWORD> -r C:\MySQL_backup\<DB_NAME>_%date:~0,2%.sql
This creates a daily task to run at 04:30, creating a seperate backupfile each day (<DB_NAME>_ma.sql, <DB_NAME>_di.sql, <DB_NAME>_wo.sql etc.)
To overcome the replication delay, caused by restoring the dump table on the master, there is a need to widespread the massive inserts. This can be done by the MySQL SLEEP command.
See http://www.mysqldiary.com/as-restoring-a-dump-table-into-the-mysql-master-you-better-get-some-sleep/
http://www.codesphp.com/mysql-category/bdd-mysql-category/dump-mysql-database.html
I had this problem before and searching for backup tools I found MySqlBackupFTP (http://mysqlbackupftp.com).It is easy to use and it has a free version that allows you to connect to a remote phpMyAdmin instance.
I hope it helps others with the same problem.
http://www.geeksww.com/tutorials/database_management_systems/mysql/tips_and_tricks/fast_parallel_restore_from_sql_dumps_mysqldump_for_mysql.php
mysqldump $MYSQL_OPTS $database $tables |gzip -1 >$path
if [ ${PIPESTATUS[0]} != 0 ]; then
echo " ## Backup of $db tables $tables FAILED! ##"
else
echo "Backup of $db $tables successful!"
fi