ユーザ用ツール

サイト用ツール


serverapps:db:postgresql

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
serverapps:db:postgresql [2026/04/27 15:33] – [PostgreSQL起動設定 (/usr/local/etc/rc.conf.d/postgresql)] hayashiserverapps:db:postgresql [2026/04/27 15:59] (現在) – [password変更] hayashi
行 105: 行 105:
   * OSアップデートによる「インデックス破損」   * OSアップデートによる「インデックス破損」
     * FreeBSDやLinuxのマイナーアップデートで、OS側のロケール定義(glibcやlibcのソート順)がわずかに変更されることがあります。このとき、DB側のインデックスとOS側のルールに不整合が起き、**「検索にヒットしないデータが出る」「重複エラーで書き込めない」**といった、復旧が困難な破損を招くリスクがあります。     * FreeBSDやLinuxのマイナーアップデートで、OS側のロケール定義(glibcやlibcのソート順)がわずかに変更されることがあります。このとき、DB側のインデックスとOS側のルールに不整合が起き、**「検索にヒットしないデータが出る」「重複エラーで書き込めない」**といった、復旧が困難な破損を招くリスクがあります。
 +    * PostgreSQL 17.1 のリリースノートでは、LC_CTYPE が C で LC_COLLATE が他のロケールという稀な構成で、問い合わせ結果が誤り、文字列インデックスが破損する可能性があったため、影響を受けるインデックスの再作成が必要と明記されています。
 +    * SRA OSS の技術情報でも同じ趣旨が説明されており、その組み合わせでは文字列インデックスが破損しうるとされています
   * パフォーマンスの劣化:   * パフォーマンスの劣化:
     * ja_JP ロケールは文字列比較のたびに複雑な言語ルールを計算するため、C ロケールに比べてソート性能が数倍〜十数倍遅くなることがあります。     * ja_JP ロケールは文字列比較のたびに複雑な言語ルールを計算するため、C ロケールに比べてソート性能が数倍〜十数倍遅くなることがあります。
 +
 +**代替案**
 +  * 読み仮名カラムを持つ
 +    * name_kana カラムを作り、そこに平仮名を入れて、そのカラムでソート
 +    * C ロケールでも、平仮名やカタカナの数値順は五十音順とほぼ一致するため、実用上の問題はないはず
 +
 +  * クエリ時にロケールを指定する (ICU規格)
 +    * PostgreSQL 15以降では、DB全体を C ロケールにしても、特定のクエリや特定のカラムにだけ、**不変のロケール定義(ICUプロバイダ)**を適用可能
 +
 +<code SQL>
 +-- 必要なときだけ日本語ソートを適用(※事前にICUサポートが必要)
 +SELECT name FROM users ORDER BY name COLLATE "ja-JP-x-icu";
 +</code>
 +
 +これなら、基本は高速、必要な時だけ日本語順という「いいとこ取り」が可能((2026-04-28: FreeBSD pkgでは'--without-icu'でビルドされているので注意))
 +
 +運用指針は以下の通りとした
 +
 +^ 項目 ^ 方針 ^ 理由 ^
 +| OS更新時の運用 | 特になし (メンテナンスフリー) | C ロケール採用によりOS依存を排除したため |
 +| インデックス管理 | 定期的な ANALYZE のみ | 破損リスクがないため REINDEX 運用は不要 |
 +| ソート順の担保 | アプリケーション/設計で解決 | DBの整合性を最優先とするため |
 +
 ==== データベースの初期化と起動 ==== ==== データベースの初期化と起動 ====
  
行 166: 行 191:
   listen_addresses = '*'   listen_addresses = '*'
      
 +
 +==== 管理者 password変更 ====
 +root(postgres)ユーザのパスワードを変更します。((パスワードは別紙参照))
 +  alter role postgres with password 'xxxxxxxxxxxxxxxxxxxx';
 +  
 +
  
 ----- -----
行 210: 行 241:
  
 ==== password変更 ==== ==== password変更 ====
-rootユーザのパスワードを変更します。((パスワードは別紙参照)) +root(postgres)ユーザのパスワードを変更します。((パスワードは別紙参照)) 
-  alter role postgres with password 'xxxxxxxxxxxxxxxxxxxx';+  # sudo -u postgres psql 
 +  postgres=# alter role postgres with password 'xxxxxxxxxxxxxxxxxxxx';
      
 ==== Role(ユーザ)の追加 ==== ==== Role(ユーザ)の追加 ====
serverapps/db/postgresql.1777303998.txt.gz · 最終更新: by hayashi