FileMakerServer19稼働のCentOSサーバにMySQLのODBCドライバを設定

# はじめに
## 前書き
* [FileMaker Advent Calendar 2020](https://qiita.com/advent-calendar/2020/filemaker) の 3 日目記事です

## 対象読者
* Claris FileMaker Server 19 ユーザ
* FileMaker から MySQL への接続を ODBC 経由でおこないたい

## 基礎知識
* CentOS は Red Hat Enterprise Linux 互換です

## 環境
* Linux CentOS 7.9
    * 7.8 でももちろん可
* MySQL ODBC Connector 8.0.22


# 本題
## MySQL ODBC ドライバのインストール
### インストール or 最新 ver. 更新
* 以下コマンドでインストール
    * あるいは既にインストールされている場合は最新の ver. へ更新

```sh
sudo rpm -Uvh http://repo.mysql.com/mysql80-community-release-el7.rpm
sudo yum install mysql-connector-odbc
```

* 実行すると以下のようなログが表示される
    * ここでは ver. 5.2.5 から 8.0.22 へ更新されている
    * 途中で進めるかどうか尋ねられるところでは `y` を入力して進めること

```sh
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ty1.mirror.newmediaexpress.com
 * epel: nrt.edge.kernel.org
 * extras: ty1.mirror.newmediaexpress.com
 * updates: ty1.mirror.newmediaexpress.com
Resolving Dependencies
--> Running transaction check
---> Package mysql-connector-odbc.x86_64 0:5.2.5-8.el7 will be updated
---> Package mysql-connector-odbc.x86_64 0:8.0.22-1.el7 will be an update
--> Processing Dependency: mysql-community-client-plugins = 8.0.22 for package: mysql-connector-odbc-8.0.22-1.el7.x86_64
--> Running transaction check
---> Package mysql-community-client-plugins.x86_64 0:8.0.22-1.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==============================================================================================
 Package                          Arch     Version         Repository                    Size
==============================================================================================
Updating:
 mysql-connector-odbc             x86_64   8.0.22-1.el7    mysql-connectors-community   4.1 M
Installing for dependencies:
 mysql-community-client-plugins   x86_64   8.0.22-1.el7    mysql80-community            235 k

Transaction Summary
==============================================================================================
Install             ( 1 Dependent package)
Upgrade  1 Package

Total download size: 4.3 M
Is this ok [y/d/N]: y
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
warning: /var/cache/yum/x86_64/7/mysql80-community/packages/mysql-community-client-plugins-8.0.22-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
Public key for mysql-community-client-plugins-8.0.22-1.el7.x86_64.rpm is not installed
(1/2): mysql-community-client-plugins-8.0.22-1.el7.x86_64.rpm          | 235 kB  00:00:00     
Public key for mysql-connector-odbc-8.0.22-1.el7.x86_64.rpm is not installed
(2/2): mysql-connector-odbc-8.0.22-1.el7.x86_64.rpm                    | 4.1 MB  00:00:00     
----------------------------------------------------------------------------------------------
Total                                                          24 MB/s | 4.3 MB  00:00:00     
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
Importing GPG key 0x5072E1F5:
 Userid     : "MySQL Release Engineering <mysql-build@oss.oracle.com>"
 Fingerprint: a4a9 4068 76fc bd3c 4567 70c8 8c71 8d3b 5072 e1f5
 Package    : mysql80-community-release-el7-3.noarch (installed)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
Is this ok [y/N]: y
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Warning: RPMDB altered outside of yum.
  Installing : mysql-community-client-plugins-8.0.22-1.el7.x86_64                         1/3 
  Updating   : mysql-connector-odbc-8.0.22-1.el7.x86_64                                   2/3 
Success: Usage count is 1
Success: Usage count is 1
  Cleanup    : mysql-connector-odbc-5.2.5-8.el7.x86_64                                    3/3 
  Verifying  : mysql-community-client-plugins-8.0.22-1.el7.x86_64                         1/3 
  Verifying  : mysql-connector-odbc-8.0.22-1.el7.x86_64                                   2/3 
  Verifying  : mysql-connector-odbc-5.2.5-8.el7.x86_64                                    3/3 

Dependency Installed:
  mysql-community-client-plugins.x86_64 0:8.0.22-1.el7                                        

Updated:
  mysql-connector-odbc.x86_64 0:8.0.22-1.el7                                                  

Complete!
```

* 再度 install を実行してみると、以下のように既にインストール済で最新 ver. になっているよと表示される

```sh
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ty1.mirror.newmediaexpress.com
 * epel: nrt.edge.kernel.org
 * extras: ty1.mirror.newmediaexpress.com
 * updates: ty1.mirror.newmediaexpress.com
Package mysql-connector-odbc-8.0.22-1.el7.x86_64 already installed and latest version
Nothing to do
```


## odbc.ini の設定
### 設定ファイルの設置
* 以下 path に `odbc.ini` ファイルを設置

```sh
sudo vi /etc/odbc.ini
```

### 設定ファイルの中身
* 中身は以下のように
    * `libmyodbc8w.so` の path が異なる場合は自身の環境に合わせて書き換えてください
    * 登録したいデータベースが複数ある場合、同じように記述を繰り返していくこと

```ini:/etc/odbc.ini
[ODBC Data Sources]
DataBase_1         = MyODBC 8.0 UNICODE Driver DSN
DataBase_2         = MyODBC 8.0 UNICODE Driver DSN

[DataBase_1]
Driver           = /usr/lib64/libmyodbc8w.so
SERVER           = xxx.xxx.xxx.xxx
PORT             = 3306
Database         = DataBase_1
OPTION           = 3
INTERACTIVE      = 1
BIG_PACKETS      = 1
NO_PROMPT        = 1
COMPRESSED_PROTO = 1
AUTO_RECONNECT   = 1
MULTI_STATEMENTS = 1

[DataBase_2]
Driver           = /usr/lib64/libmyodbc8w.so
SERVER           = xxx.xxx.xxx.xxx
PORT             = 3306
Database         = DataBase_2
OPTION           = 3
INTERACTIVE      = 1
BIG_PACKETS      = 1
NO_PROMPT        = 1
COMPRESSED_PROTO = 1
AUTO_RECONNECT   = 1
MULTI_STATEMENTS = 1
```

* なお、以下の項目についてはお好みで、必須ではありません
    * その他、文字コードを `utf8` や `utf8mb4` などに指定したい時は、 `charset = utf8` など追記してください
    * 各項目の詳細は以下リンクにて
        * [MySQL Connector/ODBC Developer Guide - 5.2 Connector/ODBC Connection Parameters
](https://dev.mysql.com/doc/connector-odbc/en/connector-odbc-configuration-connection-parameters.html)

```ini
OPTION           = 3
INTERACTIVE      = 1
BIG_PACKETS      = 1
NO_PROMPT        = 1
COMPRESSED_PROTO = 1
AUTO_RECONNECT   = 1
MULTI_STATEMENTS = 1
```


### FileMaker Server 再起動
* 設定した内容を反映させるため
    * なお、この再起動の必要性は MySQL Connector をインストールした際におこなわれるべきものであって、`odbc.ini` ファイルの中身を書き換えるだけであれば、わざわざサービス再起動をおこなわなくても設定が反映されるもよう
    * ……つまり `odbc.ini` ファイルを中途半端に不正な状態で保存してしまうと、最悪 FileMaker Server / Pro がクラッシュするリスクもあり？🤔

```sh
sudo service fmshelper restart
```


## 接続確認
* FileMaker Pro を起動して任意のファイルを開く
* `ファイル` > `管理` > `外部データソース` を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/cbdfc89e-ac19-6fa7-8279-5f805fee7efb.png)

* データソースの編集ウィンドウで `タイプ` を `ODBC` にして `DNS` の右端にある `指定` ボタンを押したときに以下のようなウィンドウが表示されて `odbc.ini` に記述したとおりのリストが見られればヨシ！
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/18f9bee9-dbef-6aa6-c5e7-e565ae62265e.png)

* `ファイル` > `管理` > `データベース` を選択して `リレーションシップ` タブでテーブルオカレンスを追加しようとする際に、以下のように ODBC データソースから選べるようになっているはずです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/c5482986-05d7-b9ff-a75a-8cfd25059d9f.png)

* なおデータベース接続の認証情報はグローバル変数を用いるか、都度入力させるかにしておくのがよいでしょう
    * グローバル変数の設定は、スクリプトトリガ `OnFirstWindowOpen` でファイルを開いたときに実行されるのが良いと思います
    * グローバル変数については以下の記事などご参照ください
        * [Qiita - FileMakerにおけるグローバル変数の管理：宣言編](https://qiita.com/Hi_Noguchi/items/250e19ddefff58ef6529)
        * [Qiita - FileMakerにおけるグローバル変数の管理：値セット編](https://qiita.com/Hi_Noguchi/items/29e2aba2837085d10660)
        * [Qiita - FileMakerのグローバルフィールド再入門
](https://qiita.com/Hi_Noguchi/items/9009cd5943b10d16b6ed)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/1e8e1031-e5ef-5f37-81e1-aee03fac16c2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/e3ea1c23-849b-5661-2653-97326e8699a1.png)


# おわりに
## 感想
* .ini ファイルをテキストで記述できるのは本当に楽で助かります
* しかし Linux での MySQL ODBC Connector 8 に関連する情報は散逸していて一つにまとまっているところが見つからず、思った以上にまとめるのが大変だった！

## 参考リンク
* [MySQL Documentation - A Quick Guide to Using the MySQL Yum Repository](https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/)
* [pkgs.org - mysql-connector-odbc-8.0.22-1.el7.x86_64.rpm](https://centos.pkgs.org/7/mysql-connectors-x86_64/mysql-connector-odbc-8.0.22-1.el7.x86_64.rpm.html)
* [Claris FileMaker Server 19 ヘルプ - 外部 ODBC データソースへのアクセス](https://help.claris.com/ja/server-help/content/xbdc-access.html)
* [Claris article - 外部 SQL データソースに対してサポートされている ODBC ドライバ](https://support.claris.com/s/article/%E5%A4%96%E9%83%A8-SQL-%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B-ODBC-%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90-1503692938179?language=ja)
* [MySQL Connector/ODBC Developer Guide - 5.5 Configuring a Connector/ODBC DSN on Unix
](https://dev.mysql.com/doc/connector-odbc/en/connector-odbc-configuration-dsn-unix.html)
* [MySQL Connector/ODBC Developer Guide - 5.2 Connector/ODBC Connection Parameters
](https://dev.mysql.com/doc/connector-odbc/en/connector-odbc-configuration-connection-parameters.html)
* [Stack Overflow - MySQL Connector ODBC odbc.ini 'Option' flag values](https://stackoverflow.com/questions/22333668/mysql-connector-odbc-odbc-ini-option-flag-values)