【MySQL】 データのエクスポート / バックアップを行うには... ~ mysqldump ~

■ はじめに

http://blogs.yahoo.co.jp/dk521123/36589352.html
で触れた mysqldump について、扱う。

■ 使いどころ

インポート/エクスポート
[1] データ移行
[2] バックアップ

etc...

■ エクスポート

 * mysqldumpを使用する

構文

全てのDBをエクスポートする(DB「information_schema」「mysql」「performance_schema」「sys」まで作成する)
mysqldump -u【User Name】 -p【Passsword】 -r 【Export File】 --single-transaction --all-databases
複数のDBをエクスポートする
mysqldump -u【User Name】 -p【Passsword】 -r 【Export File】 --single-transaction  --databases【DB Name1】 【DB Name2】 ...
特定のDBをエクスポートする
mysqldump -u【User Name】 -p【Passsword】 -r 【Export File】 --single-transaction 【DB Name】
テーブル定義部分とデータ部分を分けてエクスポート
https://www.saintsouth.net/blog/how-to-speedup-export-and-import-for-mysql/
# テーブル定義のみダンプ
mysqldump -u【User Name】 -p【Passsword】 -r 【Export File】 --no-data 【DB Name】

# データのみダンプ
mysqldump -u【User Name】 -p【Passsword】 -r 【Export File】 --no-create-info 【DB Name】

mysqldump -uroot -ppassword -r backup.sql --single-transaction sampledb

mysqldump -uroot -ppassword --single-transaction --routines --events --hex-blob sampledb > backup.sql
【出力結果】backup.sql (一部抜粋)
--
-- Table structure for table `sample_table`
--

DROP TABLE IF EXISTS `sample_table`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `sample_table` (
  `column_1` int(11) NOT NULL AUTO_INCREMENT,
  `column_2` varchar(255) DEFAULT NULL,
  `column_3` int(11) DEFAULT NULL,
  `column_4` varchar(255) DEFAULT NULL,
  `column_5` date DEFAULT NULL,
  `column_6` datetime NOT NULL,
  `column_7` datetime NOT NULL,
  PRIMARY KEY (`column_1`),
  KEY `index_sample_table_on_column_2_and_column_3` (`column_2`,`column_3`),
  KEY `index_sample_table_on_column_4` (`column_4`),
  KEY `index_sample_table_on_column_7` (`column_7`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `sample_table`
--

LOCK TABLES `sample_table` WRITE;
/*!40000 ALTER TABLE `sample_table` DISABLE KEYS */;
INSERT INTO `sample_table` VALUES (1,'MIKE',1,'SAM','2018-03-08','2018-03-08 22:05:45','2018-03-08 22:05:47'),(2,'Kevin',3,'Ken','2018-03-08','2018-03-08 22:06:19','2018-03-08 22:06:21');
/*!40000 ALTER TABLE `sample_table` ENABLE KEYS */;
UNLOCK TABLES;

使用上の注意

★重要★
 * 「ストアドプロシージャ」「ストアドファンクション」「イベント」は、
    デフォルトで出力しない場合があるので、ダンプしたい場合は、
    オプション「--routines」「--events」を明示的に付加する

# 新しいバージョンだと、デフォルトできるらしいが、、、
https://dev.mysql.com/doc/refman/5.6/ja/mysqldump-stored-programs.html

余談

出力されるファイルは、テキストエディタで参照することができる

mysqldumpの主なオプション

https://dev.mysql.com/doc/refman/5.6/ja/mysqldump.html
`#`オプション説明
01--databasesデータベース全体のバックアップ
02--single-transactionテーブルをロックしないでバックアップ
03--lock-all-tablesデータベースの全てのテーブルをロックしてバックアップ
04--routinesプロシージャや関数がある場合に付ける
05--hex-blob (※)バイナリ型のデータをエスケープ処理を行わずに実際に格納された値の16進表記でダンプ
06--disable-keys全レコードのインポートが完了するまでインデックスを作らないようにする
07--no-data(-d)CREATE TABLE 文のみを出力
08--no-create-info(-t)データのみ。--no-data とは逆で CREATE TABLE 文を出力せず
09--routines(-R)ストアドプロシージャおよびストアドファンクションを出力
10--eventsイベントスケジューラのイベントを出力
11--triggersテーブルのトリガを出力
12--skip-triggersテーブルのトリガを出力しない

※ 補足:--hex-blobの使いどころ
 * mysqldump は、バックアップとしてテキスト形式で出力しているが、
   テキストで扱えない値は、エスケープ処理をして出力する
    => 場合によっては、エスケープ処理に失敗する可能性があり
       バイナリデータが破壊されてしまう
    => --hex-blobで指定すると、16進表記でダンプするため、
       バイナリデータの破壊を防ぐことができる


■ インポート

構文

mysql -u【User Name】 -p【Passsword】【DB Name】 < 【Import File】

mysql -uroot -ppassword sampleNewDb < backup.txt

注意

 * ユーザは、 root もしくは、それに準ずるユーザで行うこと


関連記事

MySQL での データ移行 を考える

http://blogs.yahoo.co.jp/dk521123/36589352.html

Linux】【シェル】【MySQLMySQLの全DBをエクスポート/インポートするスクリプト

https://blogs.yahoo.co.jp/dk521123/37416957.html

Linux】【シェル】【MySQL】シェルで、複数の mysqldumpファイル を実行する

https://blogs.yahoo.co.jp/dk521123/36920590.html

【トラブル】【MySQL】HeidiSQL のエクスポート機能で、エクスポートしたBLOB型データが壊れる

http://blogs.yahoo.co.jp/dk521123/36708098.html