MySQL道普請便り

第15回 mysqldumpを使ってバックアップする

この記事を読むのに必要な時間:およそ 4 分

そろそろ新年度を迎えて新しいPCやサーバを受け取る事もあるかと思いますが,そういった場合問題になるのがデータベースの移行です。とくに開発中に自分で作成したダミーのデータ等を手動で作成していた場合は,データに愛着があったり特殊なケースを検証するためのものを作成していたり等,そのまま移行したいこともあると思います。MySQLのデータファイルをそのまま新しいPCに移行して動く場合は良いのですが,万が一何か問題が起こった場合には復旧することは難しいでしょう。

そこで,今回はmysqlに標準でインストールされているmysqldumpを使ってテキストベースのバックアップを行ってみたいと思います。

デモンストレーション環境

今回使用するmysqldumpに関してはMac OS X(10.10.5)の上にHomebrewを用いて構築した5.7.11上での作業とします。使用するデータは第2回 MySQLにはじめてのデータを入れてみるで紹介されている郵便番号のデータベースを元にお話をさせていただきます。以下のようにzipcodeを作成した状態になってます。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| zipcode            |
+--------------------+
5 rows in set (0.00 sec)

mysqldumpを使ってみる

まずは一番シンプルにスキーマ全体をバックアップしてみましょう。以下のコマンドでローカルにあるMySQLからバックアップを取得します。またmysqlコマンドを使う時と同様に,host名やポートuser名等を指定することができます。今回はzipcodeデータベースの内容をバックアップしたいので,zipcodeデータベースを指定してます。

$ mysqldump -uroot -h127.0.0.1 -P3306 zipcode > backup.sql

出力されたbackup.sqlの中身を確認してみましょう。出力されたファイルは以下のような構成になってます。出力されるファイルが大きいため,変数宣言部分とテーブル宣言部分とデータ句に分割して説明をしていきます。

出力されたファイルの冒頭部分を見てみると,mysqldumpをどのバージョンのどういった設定のMySQLに対して行ったのかを確認することができます。またこれらの設定は読み込まれる際に自動で適用されます。そのためコメントだからと言って削除してしまうと挙動が変わってしまうことになるのでご注意ください。設定の内容が知りたい方は公式のドキュメントのコメントの構文をご覧になってください。

-- MySQL dump 10.13  Distrib 5.7.11, for osx10.10 (x86_64)
--
-- Host: localhost    Database: zipcode
-- ------------------------------------------------------
-- Server version       5.7.11

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

---省略---

続いてテーブルの宣言部分になります。ここでは最初にzipcodeテーブルが存在する場合にDROPを行ってからCREATEテーブルを行ってます。このことにより,バックアップから復旧した際にもし何らかの理由で同名のテーブルが存在していた場合でも問題なく復旧が行われます。

--
-- Table structure for table `zipcode`
--

DROP TABLE IF EXISTS `zipcode`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `zipcode` (
  `code` varchar(12) NOT NULL,
  `old_zipcode` varchar(5) NOT NULL,
  `zip_code` varchar(7) NOT NULL,
  `prefecture_kana` varchar(255) NOT NULL,
  `city_kana` varchar(255) NOT NULL,
  `town_kana` varchar(255) NOT NULL,
  `prefecture` varchar(128) NOT NULL,
  `city` varchar(128) NOT NULL,
  `town` varchar(128) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
/*!40101 SET character_set_client = @saved_cs_client */;

最後にデータをinsertしている部分を確認してみます。以下のようにバルクインサートが行われていきます。

--
-- Dumping data for table `zipcode`
--

LOCK TABLES `zipcode` WRITE;
/*!40000 ALTER TABLE `zipcode` DISABLE KEYS */;
INSERT INTO `zipcode` VALUES ('01610','056  ','0560001','ホッカイドウ','ヒダカグンシンヒダカチョウ','シズナイメナ(ソノタ)','北海道','日高郡新ひだか町','静>内目名(その他)'),('01610','056  ','0560024','ホッカイドウ','ヒダカグンシンヒダカチョウ','シズナイヤマテチョウ','北海道','日高郡新ひだか町','静内山手町'),('01610','056  ','0560018','ホッカイドウ','ヒダカグンシンヒダカチョウ','シズナイヨシノチョウ','北海道','日高郡新ひだか町','静内吉野町'),  ---省略---

このようにまずはSQLベースでバックアップを取ることができました。

著者プロフィール

木村浩一郎(きむらこういちろう)

GMOメディア株式会社 技術推進室所属のWebアプリケーションエンジニア。最近はミドルウェア・インフラ周りのことも少しずつ学習しています。趣味は将棋。好きな戦法は四間飛車。

Twitter:@kk2170

コメント

コメントの記入