MicrosoftAccess2003のデータをPostgreSQL12に移行してみた

#はじめに
MicrosoftAccess2003のデータ(*.mdb) をPostgreSQL12に移行してみたのでその備忘録として残しておきます。
データ移行は、「MDB Tools」でCSVファイルに変化後、データのインポートを行った。
※MDB Toolsは、mdbファイルからCSVファイルやSQLファイルに変換できるツールです(その他にも色んな機能があります)。

#前提条件

・OS環境は、Virtualboxで稼働中のCentOS8.1です。以下、OS詳細情報となります。

```php
# cat /etc/centos-release
CentOS Linux release 8.1.1911 (Core)
```

・Virtualboxのネットワーク設定は、「NAT」「ホストオンリーアダプター」で構成。


・OSの初期設定が完了していること。


・MDB Toolsのインストールは、Linuxbrew経由でおこなう。
ソースからのインストールは、以下をご参照ください。
https://github.com/brianb/mdbtools

#手順概要
手順は、以下の順におこなっていきます。

(1)Linuxbrewをインストール
(2)MDB-Toolsをインストール
(3)PostgreSQL12をインストール
(4)PostgreSQL12にデータをインポート


#(1)Linuxbrewをインストール

####(1.1)Linuxbrewのインストールユーザの設定

▼「qiita」ユーザを作成

```
# useradd qiita
```

▼「qiita」ユーザのパスワードを設定

```
# passwd qiita
```


▼「qiita」ユーザにsudo権限を付与(末尾に追記)

```php:visudo
qiita        ALL=(ALL)       NOPASSWD: ALL
```


▼「qiita」ユーザに切り替える

```
# su - qiita
```

※「Linuxbrew」のインストールは、一般ユーザでないと失敗する。


####(1.2)Linuxbrewをインストール
▼Linuxbrewの必須パッケージをインストール

```
$ sudo dnf -y groupinstall 'Development Tools' && sudo dnf -y install curl file git
```

▼Linuxbrewをインストール

```
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
```

※「Warning:/home/linuxbrew/.linuxbrew/bin is not in your PATH」が表示されるが無視してよい。


▼Linuxbrew関連の設定を定義(末尾に追記)

```$HOME/.bash_profile
export PATH=/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:$PATH
export MANPATH=/home/linuxbrew/.linuxbrew/share/man:$MANPATH
export INFOPATH=/home/linuxbrew/.linuxbrew/share/info:$INFOPATH
```

▼設定ファイルの再読み込みを実施

```
$ source $HOME/.bash_profile
```

▼Linuxbrewバージョン確認

```
$ brew -v
```

※ここでバージョンが表示されればOK



#(2)MDB Toolsをインストール

####(2.1)MDB Tools　インストール

▼MDB-Toolsをインストール

```
$ brew install mdbtools
```

▼「root」ユーザに切り替える

```
$ exit
```

▼MDB-Toolsのパスを設定

```php:/etc/profile
export PATH=/home/linuxbrew/.linuxbrew/Cellar/mdbtools/0.7.1_3/bin/:$PATH
```

▼設定ファイルの再読み込みを実施

```
# source /etc/profile
```

※MDB-Toolsをインストールしたことで、以下のコマンドが使えるようになる。

```
# ls /home/linuxbrew/.linuxbrew/Cellar/mdbtools/0.7.1_3/bin/
mdb-array   mdb-header   mdb-parsecsv  mdb-schema  mdb-tables
mdb-export  mdb-hexdump  mdb-prop      mdb-sql     mdb-ver
```

####(2.2)MDBファイルのバージョン確認

▼作業ディレクトリ「/tmp/mdb」を作成

```
# mkdir /tmp/mdb
```

▼FTPツールでMDBファイル「会員情報.mdb」を「/tmp/mdb」以下にコピー
※本環境では、「会員情報.mdb」をPostgreSQL12に移行する想定で、記述します。

▼MDBファイルのバージョンを確認

```
# mdb-ver /tmp/mdb/会員情報.mdb
```

※MDBファイルのバージョンが出力される。

#(3)PostgreSQL12をインストール

▼既存環境のPostgreSQLが入っていないことを確認

```
# rpm -qa | grep postgres
```

▼PostgreSQL12のリポジトリをインストール

```
# dnf -y install https://download.postgresql.org/pub/repos/yum/12/redhat/rhel-8-x86_64/pgdg-redhat-repo-42.0-6.noarch.rpm
```

▼リポジトリ情報を確認

```
# dnf info pgdg-redhat-repo
```

▼既存のPostgreSQLモジュールを削除

```
# dnf -y module disable postgresql
```


▼PostgreSQL12をインストール

```
# dnf -y install postgresql12-server
```

▼ログイン時の読み込みファイルにPostgreSQL12の設定を追記(末尾に追記)

```php:/etc/profile
export PATH=/usr/pgsql-12/bin/:$PATH
```

▼設定ファイルの再読み込みを実施

```
# source /etc/profile
```

▼バージョン確認

```
# postgres --version
```

※PostgreSQLのバージョンが12であること

▼データベースの初期化

```
# postgresql-12-setup initdb
```

▼PostgreSQL12の起動・自動起動

```
# systemctl start postgresql-12 && systemctl enable postgresql-12
```

▼PostgreSQLのログイン確認

```
# sudo -u postgres psql -U postgres
```

※ログインができればOK！！

▼PostgreSQLから抜ける

```
postgres=# \q
```


#(4)PostgreSQL12にデータをインポート

####(4.1)mdbファイルからCSVファイルを生成

▼エクスポートする前にテーブル構造を確認

```
# mdb-schema /tmp/mdb/会員情報.mdb
↓以下、出力結果
-- ----------------------------------------------------------
-- MDB Tools - A library for reading MS Access database files
-- Copyright (C) 2000-2011 Brian Bruns and others.
-- Files in libmdb are licensed under LGPL and the utilities under
-- the GPL, see COPYING.LIB and COPYING files respectively.
-- Check out http://mdbtools.sourceforge.net
-- ----------------------------------------------------------

-- That file uses encoding UTF-8

CREATE TABLE [会員テーブル]
 (
        [会員NO]                        Text (8),
        [名前]                  Text (60),
        [フリガナ]                      Text (60),
        [〒]                    Text (16),
        [住所1]                 Text (100),
        [住所2]                 Text (100),
        [TEL]                   Text (24),
        [生年月日]                      DateTime,
        [退会]                  Boolean NOT NULL,
        [DM]                    Boolean NOT NULL
);
```

※「mdb-schema」コマンドを用いることでテーブル構造の確認ができます。


▼「会員情報.mdb」内にある「会員テーブル」のデータをCSVファイルにエクスポート

```
# mdb-export -D '%Y-%m-%d %H:%M:%S' -H /tmp/mdb/会員情報.mdb "会員テーブル" > /tmp/mdb/MemberTable.csv
```

※mdb-exportコマンドで、mdbファイルからCSVファイルを生成している。(SQLファイルで生成することも可能)
※上記コマンドで使用したオプションは、以下のとおり。

|オプション|意味|
|:---|:---|
|-D|日付書式を指定|
|-H|出力時にカラム名を除去して出力|

####(4.2)データベース作成/環境確認

▼postgresユーザに切り替え

```
# su - postgres
```

▼データベースに接続

```
$ psql
```

▼データベース「qiita」を作成

```
CREATE DATABASE qiita;
```

▼データベース「qiita」に切り替える

```
\c qiita
```

▼現在のデータベースの文字エンコーディングを確認

```
\encoding
↓出力結果
UTF8
```

※本環境では、「UTF8」であればOKとする！！

▼クライアント側の文字エンコーディングを確認

```
show client_encoding;
↓以下出力結果
 client_encoding
-----------------
 UTF8
(1 行)
```

※本環境では、「UTF8」であればOKとする！！

####(4.3)テーブル作成/データのインポート

▼手順4.1で確認したテーブル構造をもとにテーブルを作成

```
CREATE TABLE "会員テーブル"
 (
        "会員NO" varchar(510),
        "名前" varchar(510),
        "フリガナ" varchar(510),
        "〒" varchar(510),
        "住所1" varchar(510),
        "住所2" varchar(510),
        "TEL" varchar(510),
        "生年月日" timestamp,
        "退会" Boolean NOT NULL,
        "DM" Boolean NOT NULL
);
```

▼作成したテーブルのテーブル構造を確認

```
\d "会員テーブル"
```

▼CSVファイルのインポートを実施

```
copy "会員テーブル" from '/tmp/mdb/MemberTable.csv' with csv;
```

▼データインポート後の確認

```
SELECT * FROM "会員テーブル";
```

※ここでデータが表示されていれば完了！！

#最後に
MySQL8への移行はこちらを参考に
[MicrosoftAccess2003のデータをMySQL8に移行してみた](https://qiita.com/yes_dog/items/7dbf7a2e3b45bf218aff)


#参考文献
[MS Access の データを mdbtools で見る](https://qiita.com/ekzemplaro/items/f2e59076c94d460c7fa6)