Share
Embed
互換性のある(らしい)DBへの移行など考えるにあたってたいへんざっくり
「データベースを異なる環境や互換性のあるマネージドサービスなどに移行する際、どういうことを考えてるか、幅広い層に向けて話してください」みたいなことをいわれたのでかきました
Takanori Sejima
March 31, 2026
Transcript
89 slides
-
アジェンダのようなもの - まず最初に - 次に、データの保護やバックアップについて - 振る舞いについて - トランザクション関連 -
設計思想に起因する性能特性 - 性能 - メンテナンスやバージョンアップ - まとめのようなもの 8 -
「◯◯と互換性 100%」 - 独自実装であれば、そもそも互換性100%とは 普通ならない。 - 互換性100%と言ってる場合は、同じクライアントライブ ラリが使える == プロトコル的に互換性がある程度で、
実際の機能や挙動、性能特性までは互換性がない。 - MySQLからforkしたものであっても、独自実装 の部分で振る舞いが変わったりする。 14 -
互換性のある DBに移行する際の心構え - (実際にそこまで大変なケースは限られている だろうが)メジャーバージョンアップと大差ないつ もりで臨んだ方が無難 - 「〇〇をベースに」とか「〇〇互換」と言われて も、そのまま動作するとは限らない -
例えば、Aurora DSQLはPostgreSQL非互換の部分も ある 16 -
独自実装であるがゆえのデメリット - 本家との差分が大きいということは、本家で新し いメジャーバージョンが出たとき、追随するのに 時間がかかる - 例えばMySQLは8.0のときに Coding Guideline などが
一気に変わってソースコードがかなり書き直された。 MySQLをforkしている各社のマネージドサービスで差分 が大きいと、こういうとき追随するのが大変になる。 18 -
- 例えば、RDS for MySQL 8.0の標準サポート終 了は2026年7月31日、CloudSQL for MySQL 8.0の拡張サポート開始日は2027年1月1日と なっている。
- 自分たちが利用しているMySQL互換のマネージドサー ビスが他にもあって、それが8.4対応できていなければ、 8.0と8.4の環境両方をメンテナンスし続けることになる。 20 -
データ保護の観点 - (いまどき当たり前だろうけど)暗号化機能があ るかどうか - 例:EBSの volume snapshotなどは、暗号化されていな い場合、設定ミスの結果、他のAWSアカウントにclone できて漏洩してしまうリスクが想定される。
- volumeやsnapshotが、アカウント内に閉じた鍵で暗 号化されていれば、鍵がなければ別のアカウントで cloneして中身を見ることはできない。 23 -
移行する前に整理すること - これから移行するシステムは、どの程度の規模 の障害を想定し、どの程度の時間で復旧できる 必要があるのか - AZ障害だけでなくリージョン障害も想定するのか - 何時間以内に復旧する必要があるのか -
移行前の構成で想定されていたRecovery Time Objectiveは維持できるのか、あるいは改 善するのか 28 -
振る舞いの観点 - データベース側だけでは決まらない - プログラミング言語ごとにDBのクライアントライブラリの 実装が異なるケースがある。プログラミング言語ごとに、 クライアントライブラリの振る舞いが異なるケースがあ る。クライアントライブラリの実装とDB側の実装の組み 合わせが重要。 -
参考: - https://labs.gree.jp/blog/2024/03/23110/ - https://labs.gree.jp/blog/2023/07/22581/ 30 -
文字コード - アプリケーションで使っている文字コードを、 RDBMSでサポートできていればよいというもの ではない。(いまどきUTF-8使ってないところは 珍しいだろうけど) - 例えばMySQL は character
set について client <-> server 間で handshake する - (MySQL8.0まではそのhandshakeをスキップするオプ ションが有る) 31 -
EUC-JP <-> Unicodeの不可逆変換 - MySQLで具体的な例を挙げると - EUC-JP 0xA1C0 -> U+005C
REVERSE SOLIDUS - https://gist.github.com/sejima/40174345ff2714e7 53d2fd448696a618#file-gistfile1-txt - EUC-JP 0x8FA2B7 -> U+007E TILDE - https://gist.github.com/sejima/40174345ff2714e7 53d2fd448696a618#file-gistfile2-txt - EUC-JPに戻すとき、0xA1C0 や 0x8FA2B7 で はなく 0x5C や 0x7E になる。 34 -
Unicodeの仕様が修正されることも - Unicode 7.0以前の仕様書ではU+301C, WAVE DASH を使うべきところでU+FF5E, FULLWIDTH TILDEが使われてしまっていた が、Unicode
8.0以降で修正されたことがあっ た。 - Wikipedia | 波ダッシュ 35 -
絵文字や合字の扱い - MySQLのサポートしているUnicodeのバージョ ンは9.0と古いので、最近の絵文字や合字の扱 いに一部制限がある。 - 例えば、2019年に追加された令和の合字を”令和”と同 じものだと識別できない。”㍻”と”平成”はわかる。 - 例:
- https://gist.github.com/sejima/40174345ff2714e7 53d2fd448696a618#file-gistfile3-txt 38 -
ソート順や一意性制約への影響 - collation含めて互換性が担保できないと、文字 列のソートの順番が変わってしまう。また、文字 列のUNIQUE KEYがあったときに挙動が変 わってしまう。 - MySQLは8.0でdefaultのcollationが変わってし まったので、5.7以前から稼働しているDBを8.0
に移行する場合、5.7以前のdefaultのcollation に設定可能かというのも重要。 39 -
MySQL 5.7と8.0のcollationの例 - utf8mb4_0900_ai_ci, utf8mb4_general_ci, utf8mb4_bin, utf8mb4_ja_0900_as_cs, utf8mb4_ja_0900_as_cs_ks でのソート順の 違いや振る舞いの違いなどの実例
- https://gist.github.com/sejima/40174345ff2714e753d 2fd448696a618#file-gistfile4-txt 40 -
MySQL 8.0でdefaultのcollation設定 - (いくつか方法はあるのだが)MySQL互換のマ ネージドサービスであれば、SUPER権限も CONNECTION_ADMIN権限もないアカウント でアクセスするなら init_connect パラメータで collation
周りの設定を毎回上書きするようにす れば、わりと上手く行く。 - 参考:https://labs.gree.jp/blog/2024/03/23110/ 41 -
- MySQL互換のマネージドサービスへ移行を検 討する場合であったとしても、次のような点は移 行しやすさを実現するうえで重要 - アプリケーション側で使うMySQLアカウントに、必要以 上に強い権限を持たせない。 - アプリケーション側で使うMySQLアカウントやパスワー ドを、変更しやすい仕組みにしておく。(移行時に
init_connectなど使うなら、新規作成したアカウントに切 り替えやすい設計になっているか) 42 -
認証プロトコル - MySQL 9.0でmysql_native_password が削除 された。 - MySQL 9.x 以降では
caching_sha2_passwordが必須になったが、 この振る舞いもプログラミング言語ごとに異な る。このことを想定した事前調査などはやった方 が良い。 44 -
トランザクション分離レベル - MySQL互換を謳っていたとしても、defaultのト ランザクション分離レベルはMySQLと同じなの か?挙動もMySQLと同じなのか? - 例えば、TiDBのドキュメントには Difference between TiDB
and MySQL Repeatable Read やDifference between TiDB and MySQL Read Committed といった 項目がある - Aurora MySQL でREAD COMMITTEDを使う場合、 readerの挙動はMySQLと完全には一致しない。 48 -
- ANSI/ISO SQL標準で SERIALIZABLE、 REPETABLE READ、READ COMMITTED、 READ UNCOMMITTEDといった4種類のトラ ンザクション分離レベルが定義されている。た
だ、それぞれの振る舞いは、MySQL互換云々 以前に、そもそもRDBMSごとに微妙に異なった りする。 49 -
主要RDBMS製品の比較について - 近年、渡部さんが db tech showcase で登壇し てお話されてるテーマなので、公開された資料 を読んだら参考になると思います。 -
https://x.com/wrcsus4/status/1943499418541629626 - https://x.com/wrcsus4/status/1811305297413059067 50 -
例:Aurora MySQL - Aurora MySQL は undo log を writer
と reader で共有するアーキテクチャなので、 autocommit=1で運用することや、長いトランザ クションを避けることを推奨するホワイトペー パーが公開されている。 - https://d1.awsstatic.com/whitepapers/ja_JP/RDS/am azon-aurora-connection-management-handbook.pdf 52 -
例:TiDB - Transaction too largeでエラーになるケース や、REPEATABLE READでLost Updateが発 生してしまうケースなど、Cygamesさんの丁寧 な解説資料が存在します。
- 【TiDB GAME DAY 2024】TiDBにおけるテーブル設計 と最適化の事例 - 【TiDB GAME DAY 2025】Shadowverse: Worlds Beyond にみる TiDB 活用術 53 -
ロックの範囲やデッドロックなど - Upsert のロックの範囲やデッドロックは、アプリ ケーションで使うトランザクション分離レベルを 変更することで緩和できるケースもある。 - ただ、TiDBやAurora MySQLの例を見るよう に、同じREPETABLE
READ、同じREAD COMMITTEDでも、完全な互換性があるわけ ではない。 56 -
性能特性の観点 - レイテンシ - 設計上、MySQLなどと比べて分散DBはレイテンシが増 加する傾向にあると考えられる。分散DBに移行したい 場合、アプリケーション側でN+1のループがあったときに 耐えられるか - 分散DBでなかったとしても、マルチAZを前提としたアー
キテクチャだった場合、AZ間のレイテンシはアプリケー ションから許容できる範疇に収まっているのか 58 -
設計思想に基づく違い - MySQLなど分散データベースでないRDBMS は、primary key がシーケンシャルな値だと空 間効率が良いケースがある。 - MySQLのInnoDBはprimary keyをランダムな値でラン
ダムにINSERTすると、テーブルがフラグメントする。 59 -
- 一方、Spannerはprimary keyがシーケンシャ ルな値だと hot spot ができやすい問題がある。 - Spannerに限らず、分散DBにおいてMySQLの auto_incrementのようなものはボトルネックになりがち。
- SpannerもSEQUENCEをサポートするようになったが、 bit_reversed_positive が必須など、他のRDBMSとは 異なる特性がある。 60 -
性能の観点 - アーキテクチャやそれに伴うハードウェア構成 はどのようなものか - 最初からマルチAZ前提の設計になっていれば、更新時 にCOMMITのレイテンシへの影響が発生する可能性が ある。 - 後づけでマルチAZ構成でデータをレプリケーションする
場合、レプリケーションの遅延を考慮して更新性能を評 価する必要がある。 63 -
例:Amazon Aurora の場合 - 最初からマルチAZ構成を前提とした設計で、 COMMIT時には(内部的に)他のAZにもredo logを書き込んでいる。その結果、 CommitLatencyはAZ間通信のRTTの影響をあ る程度受けると考えられる。 -
その一方で、COMMITに対する様々な最適化は独自実 装されている。 64 -
ベンチマークを取るうえで - ベンチマークを流した際、見かけ上は高い性能 を出しているように見えたとしても、レプリケー ションなども考慮しつつ、実際に許容できるのは どの程度の更新性能になるのかを見極めるの が重要。 - 更新頻度が高いと CommitLatency
が悪化するならば、 許容できる範囲の CommitLatency に収まる更新頻度 はどの程度か、といったことなど考える。 66 -
failover時の再接続処理 - Amazon Aurora では、フェイルオーバーを高速 化して数秒程度の切り替えできる Advanced JDBC Wrapper Driver
が公開されている - SLAによってはサービス停止なしでswitch over など検討できる可能性も出てくるので、クライア ントライブラリ込で評価するのはとても大切。 79 -
周辺のサービス - Amazon Auroraを使う際にAdvanced JDBC Wrapper Driverが使えなかったとしても、 Amazon RDS Proxy
を使うことでfailoverの時 間を短縮できたりもする。 - 周辺のサービスも込みで評価することは大切。 80 -
References - ArkEdge Space Blog | できれば知らずに済ませたかった Aurora DSQL非互換集 -
MySQL Blog Archive | MySQL 8.0 Source Code Improvements - 組織をランサムウェアの脅威から守るためのベスト プラク ティス - MySQL Blog Archive | MySQL 8.0: ひらがなカタカナを判 別する日本語用Collation 86 -
References - tmtms のメモ | MySQL と PostgreSQL のコレーション -
【TiDB GAME DAY 2024】TiDBにおけるテーブル設計と最 適化の事例 - 【TiDB GAME DAY 2025】Shadowverse: Worlds Beyond にみる TiDB 活用術 - トランザクションを「本気で使いこなす」ための必須知識。 PostgreSQLコミッターが教える活用術 87 -
References - Cloud Spanner の自動生成主キーを使ってみる - Amazon Aurora 向け Advanced
JDBC Wrapper Driver のご紹介 - Amazon RDS Proxy を使用したアプリケーションの可用性 の向上 88