pgloaderでMySQL→Postgresへの移行を行う

## はじめに

pgloaderでMySQLで作成したZabbixのDBをPostgresにインポートする手順を記載する。

## 環境


* CentOS 7.6
* Zabbix 4.2
* Postgres 11.5
* MySQL 8.0

## pgloaderのインストール

```
* gitのインストール
sudo yum install -y git


* インストールしたいディレクトリに移動
cd /usr/local/src

* インストール
git clone https://github.com/dimitri/pgloader.git
cd pgloader
chmod +x ./bootstrap-centos7.sh
sudo ./bootstrap-centos7.sh
make pgloader
```

下記のようなエラーが発生した場合は、``10``を入力し、
CONTINUEしたところ、正常にインストールされた。(インストールが正常に行われたかは不明)

```
...
[package pgloader.citus]..........................                                                                                                 [3537/4093]
[package pgloader.utils]                                                                                                                                      
debugger invoked on a NAME-CONFLICT in thread                                                                                                                 
#<THREAD "main thread" RUNNING {10005E85B3}>:                                                                                                                 
  EXPORT PGLOADER.CATALOG:FIELD-NAME causes name-conflicts in                                                                                                 
  #<PACKAGE "PGLOADER.PARSER"> between the following symbols:                                                                                                 
    PGLOADER.CATALOG:FIELD-NAME, PGLOADER.PARSER::FIELD-NAME                                                                                                  
See also:                                                                                                                                                     
  The ANSI Standard, Section 11.1.1.2.5                                                                                                                       
                                                                                                                                                              
Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.                                                                                              
                                                                                                                                                              
restarts (invokable by number or by possibly-abbreviated name):                                                                                               
  0: [KEEP-OLD                     ] Keep PGLOADER.PARSER::FIELD-NAME accessible in PGLOADER.PARSER (shadowing PGLOADER.CATALOG:FIELD-NAME).                  
  1: [TAKE-NEW                     ] Make PGLOADER.CATALOG:FIELD-NAME accessible in PGLOADER.PARSER (uninterning PGLOADER.PARSER::FIELD-NAME).                
  2: [RESOLVE-CONFLICT             ] Resolve conflict.                                                                                                        
  3: [RETRY                        ] Retry                                                                                                                    
                                     compiling #<CL-SOURCE-FILE "pgloader" "src" "package">.                                                                  
  4: [ACCEPT                       ] Continue, treating                                                                                                       
                                     compiling #<CL-SOURCE-FILE "pgloader" "src" "package">                                                                   
                                     as having been successful.                                                                                               
  5:                                 Retry ASDF operation.                                                                                                    
  6: [CLEAR-CONFIGURATION-AND-RETRY] Retry ASDF operation after resetting the                                                                                 
                                     configuration.                                                                                                           
  7:                                 Retry ASDF operation.                                                                                                    
  8:                                 Retry ASDF operation after resetting the                                                                                 
                                     configuration.                                                                                                           
  9: [ABORT                        ] Give up on "pgloader"                                                                                                    
 10: [CONTINUE                     ] Ignore runtime option --eval "(ql:quickload \"pgloader\")".                                                              
 11:                                 Skip rest of --eval and --load options.                                                                                  
 12:                                 Skip to toplevel READ/EVAL/PRINT loop.                                                                                   
 13: [EXIT                         ] Exit SBCL (calling #'EXIT, killing the process).                                                                         
                                                                                                                                                              
(NAME-CONFLICT #<PACKAGE "PGLOADER.PARSER"> EXPORT PGLOADER.CATALOG:FIELD-NAME PGLOADER.CATALOG:FIELD-NAME PGLOADER.PARSER::FIELD-NAME)                       
0]
```
https://github.com/dimitri/pgloader/issues/897


## zabbixを停止

```bash
systemctl stop zabbix-server.service
systemctl status zabbix-server.service
```

---

## mysqlを起動

mysqlが起動していない場合は、起動する。

```
systemctl start mysqld.service
systemctl status mysqld.service
```

---

## postgresを起動

postgresが起動していない場合は、起動する。

```bash
systemctl start postgresql-11.service
systemctl status postgresql-11.service
```

初期セットアップが完了していない場合、下記を実施。

```bash
sudo -u postgres /usr/pgsql-11/bin/initdb -D /var/lib/pgsql/data -X /var/lib/pgsql/data/pg_xlog --encoding=UTF8 --locale=ja_JP.UTF-8
```

---

## postgresにzabbixのDB作成

```bash
* ユーザの作成
createuser -U postgres zabbix --pwprompt -S -R -D

* DBの作成
createdb -U postgres zabbix -O zabbix


※ -Oでオーナーをつけるのを忘れた場合は、下記コマンドで後からつける。

psql -U postgres -c"ALTER DATABASE zabbix OWNER TO zabbix"

* zabbixのテーブルを作成
zcat /usr/share/doc/zabbix-server-pgsql-*/create.sql.gz | psql -U zabbix zabbix
```

---

## mysql→postgresへのマイグレーション

* スキーマをPostgresの"public"に設定するためのスクリプトファイルを作成

```bash

$ vim /tmp/commands.load

    load database
       from mysql://root:root@localhost/zabbix
       into pgsql://postgres:postgres@localhost/zabbix
       alter schema 'zabbix' rename to 'public';
```

* pgloaderでマイグレーション

```bash
* pgloaderでマイグレーション

build/bin/pgloader mysql://root:user_password@localhost/zabbix postgresql://postgres:user_password@localhost/zabbix

build/bin/pgloader /tmp/commands.load

* 結果確認
tail /tmp/pgloader/pgloader.log

* DBのエンコーディングを確認
mysql -u zabbix -pzabbix -e "SHOW CREATE DATABASE zabbix;"
psql -U postgres -l

* テーブル情報を確認
mysql -u root -ppassword -e "SHOW TABLES FROM zabbix;"
psql -U zabbix -d zabbix -c "\dt"

※ zabbixのDBのテーブル情報を確認し、OWNERがzabbixでなかった場合は、ALTERでOWNERを変更する
https://qiita.com/YusukeHigaki/items/ea81633bd1ccac078c7c

* ユーザ情報を表示
mysql -u root -ppassword -e "select host,user from mysql.user;"
psql -U zabbix -d zabbix -c "\du"
```

---

## Zabbixの設定ファイルを修正

下記のようにconfファイルを変更。

```
$ vi /etc/zabbix/zabbix_server.conf

#DBSocket=/var/lib/mysql/mysql.sock
DBPort=5432
```

```bash
$ vi /etc/zabbix/web/zabbix.conf.php

# SELECT IBM_DB2, MYSQL, ORACLE, POSTGRESQL.
#$DB['TYPE']     = 'MYSQL';
$DB['TYPE']     = 'POSTGRESQL';
$DB['SERVER']   = 'localhost';
$DB['PORT']     = '5432';
```

## Zabbixを再起動

```bash
systemctl start zabbix-server.service
systemctl status zabbix-server.service
```

---

## 参考

* https://www.zabbix.com/jp/download?zabbix=4.0&os_distribution=ubuntu&os_version=bionic&db=PostgreSQL
* https://www.sraoss.co.jp/technology/zabbix/introduction/01-firststep.php
* https://pig-log.com/centos7-zabbix4-postgresql11-php73/
* https://www.zabbix.com/forum/zabbix-help/375203-migration-from-mysql-to-postgres

* https://pgloader.readthedocs.io/en/latest/pgloader.html

* https://pgloader.readthedocs.io/en/latest/tutorial/tutorial.html