zabbix用RDSの文字コードをデフォルトのままにしてたらひどい目にあった話

業務でzabbix serverを構築しているときにドはまりしたお話。
何の気なしにserver構築後に監視設定等々入れ込んでから気づいたのですが、時すでに遅し。。。

![スクリーンショット-2021-06-17-17.02.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1526421/b49131dc-c487-8579-0350-1a01e4665881.png)

めっちゃエラー吐いてる！

公式サイトを確認すると文字コードによるエラーとの事

https://www.zabbix.com/documentation/4.0/manual/web_interface/frontend_sections/reports/status_of_zabbix

```
Starting with Zabbix 4.0.18, System information will also display an error message if the database used does not have the required character set or collation (UTF-8).
```

zabbixさんは基本的に文字コードはutf8_binしか扱ってくれず、他の文字コードにしてしまった場合はsystem infoでエラーが出てしまいます。

RDSのデフォルトの文字コードはLatin1なので、パラメーターグループで先に設定してあげないといけません。
https://aws.amazon.com/jp/blogs/news/best-practices-for-configuring-parameters-for-amazon-rds-for-mysql-part-3-parameters-related-to-security-operational-manageability-and-connectivity-timeout/

普段はRDS構築もこちらでやるので脳死で設定していましたが、今回は先方が用意した既存のRDS（5.7互換）を使用したためドはまりした感じです。

ほんじゃあ文字コードをutf8にするパラメーターグループを作成してアタッチして解決だと思いきや、DBのstatusで見るとutf8なのにtableは変わっていない！

とりあえず既存のtableの文字コードを全部直していきましょうなのですが、すでにtable諸々の設定を入れ込んでしまったのでmysqldumpでexport/importでバックアップを取ってから検証しましょう。

dumpしたファイルのバックアップを取って文字コードをsedで置き換えていきます

```
$ sed s/Latin1/utf8/g dumpfile.dump.sql.bk > dumpfile.dump.sql
```

置き換えが終わったファイルをバックアップtableにimportしていきます。

```
$ mysql -h hoge -u huga -p バックアップ用table < dumpfile.dump.sql
Enter password: ERROR 1045 (28000): Access denied for user 'zabbix'@'xx.xx.xx.xx' (using password: YES)
```

まさかのpermission denied。。。
RDSのrootユーザーさんはAWS管理なのでrootになることなんて出来ません。

5.6だとすんなり入ってくれてたのに。。。

下記記事を参考にdumpファイルを編集し、無事にimportできました。
https://yoneyore.hatenablog.com/entry/2020/07/15/205611

さぁさぁ確認

```
mysql> SHOW TABLE STATUS FROM zabbix_bk;
+----------------------------+--------+---------+------------+---------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------+---------------------+------------+-----------------+----------+----------------+---------+
| Name                       | Engine | Version | Row_format | Rows    | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time         | Check_time | Collation       | Checksum | Create_options | Comment |
+----------------------------+--------+---------+------------+---------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------+---------------------+------------+-----------------+----------+----------------+---------+
| acknowledges               | InnoDB |      10 | Dynamic    |       8 |           2048 |       16384 |               0 |        49152 |         0 |           NULL | NULL        | 2021-06-17 16:57:55 | NULL       | utf8_general_ci |     NULL |                |         |
| actions                    | InnoDB |      10 | Dynamic    |       8 |           2048 |       16384 |               0 |        32768 |         0 |           NULL | NULL        | 2021-06-17 16:57:55 | NULL       | utf8_general_ci |     NULL |                |         |
| alerts                     | InnoDB |      10 | Dynamic    |     401 |            653 |      262144 |               0 |       131072 |         0 |           NULL | NULL        | 2021-06-17 16:57:55 | NULL       | utf8_general_ci |     NULL |                |         |
| application_discovery      | InnoDB |      10 | Dynamic    |       0 |              0 |       16384 |               0 |        32768 |         0 |           NULL | NULL        | NULL                | NULL       | utf8_general_ci |     NULL |                |         |
| application_prototype      | InnoDB |      10 | Dynamic    |       0 |              0 |       16384 |               0 |        32768 |         0 |           NULL | NULL        | 2021-06-17 16:57:55 | NULL       | utf8_general_ci |     NULL |                |         |
| application_template       | InnoDB |      10 | Dynamic    |     313 |             52 |       16384 |               0 |        32768 |         0 |           NULL | NULL        | 2021-06-17 16:57:55 | NULL       | utf8_general_ci |     NULL |                |         |
.............
```

??????
utf8_general_ci ????????
どうやらutf8に文字列置換してぶっこんだけでは **utf8_general_ci** になってしまうようです。

ちゃんとコマンドを流してtableの文字コード変えてあげないといけなさそうです。
tableの文字コードを変更するsql文はこんな感じですね、ちゃんと **COLLATE utf8_bin** を付けましょう


```
ALTER TABLE <table名> CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
```

下記記事を参考にsql実行文をSELECTしていき一行ずつポチポチ実行しました。
本当はforかなんかに突っ込んでぐるぐる回した方が効率的なのですが、、、

https://blog.komeho.info/2020/08/07/21002/#toc6

これで無事文字コードを **utf8_bin** に変更することが出来ました。
バックアップtableが無事に変更できたので本チャンにも同じコードを流して無事解決しました。

本当はRDSにデフォルトのパラメーターグループが当たっていたことには気づいていたのですが、まぁ問題が出たら都度対応しましょうという感じでスルーしてしまったのが今回の戦犯でした。

最後まで閲覧いただきありがとうございました。