osechiman’s blog

開発備忘録

PostgreSQL⇒MySQLへのデータ移行

PostgreSQLMySQLへのデータ移行

やりたかったこと

PostgreSQLのテーブルの一部のデータを、

MySQLで作成した新しいテーブルに移植したい、というような事がありまして。

今回はその時にやった手順の備忘録。

postgres=# \d+ p_name
                                  Table "public.p_name"
   Column    |         Type          | Modifiers | Storage  | Stats target | Description
-------------+-----------------------+-----------+----------+--------------+-------------
 id          | integer               |           | plain    |              |
 first_name  | character varying(40) |           | extended |              |
 family_name | character varying(40) |           | extended |              |

postgres=# \l sandbox
                          List of databases
  Name   |  Owner   | Encoding | Collate | Ctype | Access privileges
---------+----------+----------+---------+-------+-------------------
 sandbox | postgres | EUC_JP   | C       | C     |
(1 row)
  • テストデータ
postgres=# SELECT * FROM p_name;
 id | first_name | family_name
----+------------+-------------
  1 | 太郎       | 田中
  2 | 次郎       | 佐藤
  3 | 三郎       | 鈴木
(3 rows)
mysql> SHOW COLUMNS FROM name;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id         | int(11)     | NO   | PRI | NULL    |       |
| first_name | varchar(40) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> SHOW CREATE table name\G
*************************** 1. row ***************************
       Table: name
Create Table: CREATE TABLE `name` (
  `id` int(11) NOT NULL,
  `first_name` varchar(40) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

できたこと

単純にPostgreSQLからCSVでデータを出力して

postgres@f78d7d394494:/$ psql -c 'SELECT id, first_name FROM p_name' -A -F, -t > /tmp/p_name.csv

nkfかけて

[root@f78d7d394494 /]$ nkf -w --overwrite /tmp/p_name.csv

MySQLに突っ込む

mysql> use sandbox
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> LOAD DATA LOCAL INFILE '/tmp/p_name.csv' INTO TABLE name FIELDS TERMINATED BY ',' ENCLOSED BY '"';      Query OK, 3 rows affected (0.01 sec)
Records: 3  Deleted: 0  Skipped: 0  Warnings: 0

mysql> ^DBye
[root@f78d7d394494 /]$ mysql -p sandbox -e 'SELECT * FROM name'
Enter password:
+----+------------+
| id | first_name |
+----+------------+
|  1 | 太郎     |
|  2 | 次郎     |
|  3 | 三郎     |
+----+------------+
[root@f78d7d394494 /]$

で目的は達成できました。