中国地方DB勉強会 in 岡山の登壇資料です。
そのうちここで登壇動画が公開されることでしょう。 肝心なチートシートは以下のとおり。
PostgreSQL
PostgreSQL 12に上げれるなら15まで基本的に上げれる。 自分もプロダクトで9.2から最近14まで上げましたが互換性、パフォーマンス共に問題なかった。
11,12から上げるところで大きな非互換はOIDの廃止だけど、基本的にそこに刺さる人はいないはず。
いたら returning
句を使う形に書き直しましょう。
または nextval()
先に値を取得する。
一般的なORMを使ってるような環境であれば一般的にそのへんは困らないはず。
公式ドキュメントは一通りみること
- https://lets.postgresql.jp/documents/technical/16
- https://lets.postgresql.jp/documents/technical/15
- https://lets.postgresql.jp/documents/technical/14
- https://lets.postgresql.jp/documents/technical/13
拡張、Extensionをインストールしている場合があるのでそこは要確認。
インストールしている拡張はSQL SELECT * FROM pg_extension;
で確認できるので事前に確認すること。
Extensionをインストールしている場合はExtensionのバージョンアップを調べること。
公式があるので確認すること。 非推奨や削除された機能などが書いてある。
- https://www.postgresql.jp/document/15/html/release-15.html
- https://www.postgresql.jp/document/14/html/release-14.html
- https://www.postgresql.jp/document/13/html/release-13.html
バージョンアップ直後、統計情報とかが壊れててパフォーマンスが落ちることがある。 これはAWSのドキュメントにも記載がある。
ANALYZE 操作を実行して pg_statistic テーブルを更新します。これは、すべての PostgreSQL DB インスタンスのすべてのデータベースに対して行う必要があります。Optimizer の統計情報はメジャーバージョンのアップグレード中には転送されないため、パフォーマンスの問題を回避するためにすべての統計情報を再生成する必要があります。次のようにパラメータを指定せずにコマンドを実行して、現在のデータベース内のすべての標準テーブルの統計情報を生成します
とりあえずアップデートしたらANALYZEしましょう。
あと、文字コードやロケール周りも要注意。
PostgreSQLはinitdbの際にロケールを指定しない場合、OS側に設定されているロケールを使用します。この場合の多くは、ja_JP.UTF-8が選ばれるでしょう。これに伴いDBが壊れることはありませんし、エラーなどもありません。ただし、ソート関連に影響し、OSに依存してしまうことから、意図しない挙動をすることがあります。
例えばこういうのもあるし、あとから変えるのは大変なので要注意。
あとMySQLも同様だけど、パラメータがリセットされて設定が変わることがあるのは要注意。 デッドロックやチェックポイント周りのチューニングやタイムゾーンなどは漏れやすい。
特にRDSはデフォルトのタイムゾーンはUTCだし、ロケールはなのでen_US.UTF-8なので注意。
Managing spatial data with the PostGIS extension
AWSの手順書がちゃんとしているので参考にすること。#
MySQL
メンテナンス時間をどれくらい取れるかで戦略が決まる。 基本的にはメンテナンス時間を十分に取れたほうが良い。 またリスクをどれだけ許容できるかもビジネスによるので要確認しておくべき。
基本的には一度切り替えてしまうとロールバックすることは簡単ではない。 覚悟を決めて突き進む必要がある
- MyISAMを使いたい
- 8でも動くけど諦めろ、もう未来はない
- InnoDBのほうがDisk サイズを消費する、countが遅い、などの課題はあるので簡単ではないが…
- InnoDB memcached Pluginとか使ってるんだよね
- 諦めろ、未来はない
- これを機にアーキテクチャを見直しましょう
- PKが無いtableがあるんだよね
- すべてのtableにまずPKを付けるんだ
- このあと、DMSを使ったりとかなにをするにしても死ぬ
- そもそもデータモデルとして死んでるのでPKはつけよう
- クエリキャッシュを使いたい
- 諦めましょう。そんなものは無い
- @mita2さんありがと!
- Oracle公式 : MySQL 5.7からMySQL 8.0へのバージョンアップ - MySQLを継続してお使いいただくために
- リリースノートを見ましょう
- 公式が必要なドキュメントは用意してくれています
- AWSの資料もオススメです
- MySQL DB エンジンのアップグレード
- 5.6 → 5.7 などの注意点もあって便利
- とみたさんがパラメータ差分わかるやつ作ってくれてる
- サイボウズの資料も良い
- MySQL 8.0 への移行が完了しました ~さようなら全ての MySQL 5.7~
- 特に具体的な事象に対する紹介があってよい
- 外部キー制約のALTERの話とか
- MySQL 8.0はマイナーバージョンで機能などに違いがあるので、利用するバージョンをよく確認する必要がある
- MySQL 8.0 の新機能
- MySQL 8.0 で追加された機能、MySQL 8.0 で非推奨となった機能、MySQL 8.0 で削除された機能はそれぞれ読みましょう
- 合わせて変更点も確認しましょう
- @taka_yuki_04さん、あざます! 上の資料をみれば概ね基本的な対応は書いてある。 あとはテストしましょう。
- MySQL 8.0 の新機能
- 一部の機能、エラーコードが削除
- 文字セットの違い
- 8はutf8mb4
- 照合順序とかも要注意
- 照合順序、ORDER BYしても気づかないことあるので注意
- MySQL 8.0 でも
utf8mb4_general_ci
を使い続けたい僕らは - MySQLはカラム単位で変えれるので
- パフォーマンスはKVSのような使い方をしていると特に下がる
- Aurora 2 → Aurora 3は20 ~ 30%程性能劣化することも珍しくない
- クソデカテーブルの
count(*)
も遅くなっているのも影響を受けやすい - パラメータの差異は見逃しがち
- 旧環境でチューニングしていた内容を反映することを忘れるなど
- 例えば
open_cache_table
とかrange_optimizer_max_mem_size
とか - どちらも5.7のときからあるパラメータだが、バージョンアップ時に新しいconfingを利用することで変更を忘れてパフォーマンスに影響を与えることがある
- 予約語とかSQLモードの違いとかによるエラーは開発環境で見つけれるはず
- テストを書きましょう
- GROUP BYや予約語は地道に直すしか無いです
時間があったら書く
チートシートだけじゃわからない!困ってる!
Have Fun Techがバージョンアップのサポートしますのでお気軽にご相談ください。
まとめ
やっぱ中国地方DB勉強会は最高だぜ!