MySQL移行メモ(2)

[MySQL移行メモ(1)](https://qiita.com/k-y-river/items/8f398b931df7c583d7d4)
からの続きです。

# 4. 移行先でのテーブル作成
方法はいくつかあります。以下のテーブルを例に説明します。

＜説明で使用するテーブル等＞

```
mysql> use test
Database changed

mysql> show tables;
+-----------------+
| Tables_in_test  |
+-----------------+
| national_census |
+-----------------+
1 row in set (0.00 sec)

mysql> desc national_census;
+-------------+--------------+------+-----+---------+-------+
| Field       | Type         | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| pref_id     | char(2)      | YES  |     | NULL    |       |
| muni_id     | char(5)      | NO   | PRI |         |       |
| division    | char(1)      | YES  |     | NULL    |       |
| pref_name   | varchar(8)   | YES  |     | NULL    |       |
| muni_name   | varchar(15)  | YES  |     | NULL    |       |
| population  | int(11)      | YES  |     | NULL    |       |
| area        | float(8,2)   | YES  |     | NULL    |       |
| pop_density | float(6,1)   | YES  |     | NULL    |       |
| average_age | double(10,8) | YES  |     | NULL    |       |
+-------------+--------------+------+-----+---------+-------+
9 rows in set (0.02 sec)
```

## 4.1 テーブルを作成時のDDL文を利用
移行元でテーブルを作成した時のDDL文を移行先で実行する。単純な話です。


```
mysql> use test
Database changed
mysql>
mysql> create table national_census (
    ->   pref_id      char(2),     -- 都道府県コード
    ->   muni_id      char(5),     -- 自治体コード
    ->   division     char(1),     -- 区分
    ->   pref_name    varchar(8),  -- 都道府県名
    ->   muni_name    varchar(15), -- 自治体名
    ->   population   integer,     -- 人口
    ->   area         float(8,2),  -- 自治体面積
    ->   pop_density  float(4,1),  -- 人口密度
    ->   average_age  double(10,8),-- 平均年齢
    ->
    ->   primary key( muni_id )
    -> );
Query OK, 0 rows affected (0.22 sec)
```

## 4.2 移行元でshow create table文によりDDL文を取得して利用
移行元でshow create table文を実行してDDL文を取得し、その結果を移行先で実行する。

例えば、移行元での初期構築後にカラム追加やインデックス追加等を繰り返した影響で、移行先でのテーブル作成のために利用できそうなDDL文がない、といったような場合には使える手段かと思います。

```
mysql> show create table national_census;
+-----------------+---------------------------------
| Table           | Create Table                                                                                                                                                                                                                                                                                                                                                           |
+-----------------+---------------------------------
| national_census | CREATE TABLE `national_census` (
  `pref_id` char(2) DEFAULT NULL,
  `muni_id` char(5) NOT NULL DEFAULT '',
  `division` char(1) DEFAULT NULL,
  `pref_name` varchar(8) DEFAULT NULL,
  `muni_name` varchar(15) DEFAULT NULL,
  `population` int(11) DEFAULT NULL,
  `area` float(8,2) DEFAULT NULL,
  `average_age` double(10,8) DEFAULT NULL,
  PRIMARY KEY (`muni_id`)
) ENGINE=InnoDB DEFAULT CHARSET=sjis |
+-----------------+---------------------------------+
1 row in set (0.00 sec)
```

Create Tableカラムに表示された内容を、移行先でそのまま実行すればOKです。


## 4.3 移行元でmysqldumpによりダンプした結果を利用
mysqldumpコマンドで移行元テーブルのダンプを取得し、移行先でmysqlコマンドでダンプ結果を実行する。

```
# 移行元で実行
mysqldump -u [user_name] -p[password] --databases test --tables national_census --no-data > national_census.sql
# 移行先で実行
mysql -u [user_name]-p[password] test < national_census.sql
```

4.1や4.2と同様の結果とする目的で--no-dataオプションをつけてます。
--no-dataオプションをつけなければ、データの移行も同時に実施できるダンプファイルを取得できます。
ただ、取得したダンプファイルにより実行されるのは「create table文＋全レコードに対応するinsert文」なので、大量データの移行には向いてないのでは？と思っています。