<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule" >
  <channel>
  <title>IT小作人の日記</title>
  <link>https://aieyzumcrgpdbggt.blog.shinobi.jp/</link>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="https://aieyzumcrgpdbggt.blog.shinobi.jp/RSS/" />
  <description>IT関係の小作人労働の日々の日記です。
最近データベースが好きです。
インフラ構築、DB構築、アプリケーション開発・・・何でも屋です。
何でもできそうで、何にもできない。</description>
  <lastBuildDate>Sun, 23 Aug 2026 02:12:52 GMT</lastBuildDate>
  <language>ja</language>
  <copyright>© Ninja Tools Inc.</copyright>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" />

    <item>
    <title>【データベース内部構造】SQLはどう処理される？クエリ実行の内部プロセスと最適化の流れ</title>
    <description>
    <![CDATA[<p>SQL文を発行した際、データベース（RDBMS）内部ではどのような処理が行われているのだろうか。<br />
SQLは「どのようなデータを取得・更新したいか」という宣言的な記述を行う言語であり、「具体的にどのようにデータを取得するか」という手順はRDBMS内部の処理エンジンが自動的に判断している。</p>
<p>今回は、SQLが投入されてから結果が返されるまでの内部ステップと、効率的な実行処理を行うための<b>「クエリ最適化（Query Optimization）」</b>の流れを整理した。</p>
<hr style="border: 0; height: 2px; background: linear-gradient(to right, #0078d4, #00bcf2, #0078d4);" />
<h3><span style="border-left: 5px solid #0078d4; padding-left: 10px; color: #107c41;">1. SQL処理の5つのステップ</span></h3>
<p>一般的なRDBMSにおいて、SQL文は主に以下の5つの段階を経て実行される。</p>
<ul style="list-style: none; padding-left: 0;">
<li style="background-color: #f0f6ff; border-left: 4px solid #0078d4; padding: 12px 15px; margin-bottom: 12px; border-radius: 0 4px 4px 0;"><b style="color: #0078d4; font-size: 1.05em;">① Parsing（構文解析）</b><br />
送られてきたSQLの文法的な正しさ（シンタックスチェック）を解釈・検証する。<br />
SQL実行後の最初のプロセスとして、Parser（構文解析器）が<b>SQLのロジカルな構造を関係演算を表す「Query Tree（クエリツリー）」へ変換</b>する。</li>
<li style="background-color: #eef9f2; border-left: 4px solid #107c41; padding: 12px 15px; margin-bottom: 12px; border-radius: 0 4px 4px 0;"><b style="color: #107c41; font-size: 1.05em;">② Query Validation（クエリ検証・意味解析）</b><br />
SQL内に指定されたテーブルや列（カラム）がデータベース上に実際に存在するか、アクセス権限があるかなどの「意味的妥当性」を検証する。</li>
<li style="background-color: #fff4ce; border-left: 4px solid #ff8c00; padding: 12px 15px; margin-bottom: 12px; border-radius: 0 4px 4px 0;"><b style="color: #d76d00; font-size: 1.05em;">③ Optimization（最適化 / クエリ最適化）</b><br />
関係演算を表す Query Tree を、<b>実際のアクセス手順である「物理的な実行プラン（Execution Plan）」へ変換</b>する。<br />
通常、データ取得の手順には複数のバリエーション（多くのプラン）が存在するため、その中で最も効率が良い（低コストな）実行プランを選択する。</li>
<li style="background-color: #fdf4f6; border-left: 4px solid #d13438; padding: 12px 15px; margin-bottom: 12px; border-radius: 0 4px 4px 0;"><b style="color: #d13438; font-size: 1.05em;">④ Plan Compile（プランコンパイル）</b><br />
クエリオプティマイザ（Query Optimizer）によって選択された最適な計画を、実行エンジンが直接処理できるマシンコードや内部コマンド形式へコンパイル・変換する。</li>
<li style="background-color: #f0f6ff; border-left: 4px solid #0078d4; padding: 12px 15px; margin-bottom: 12px; border-radius: 0 4px 4px 0;"><b style="color: #0078d4; font-size: 1.05em;">⑤ Execution（実行）</b><br />
Query 実行エンジン（Execution Engine）が物理プランに従ってストレージやキャッシュメモリからデータを読み書きし、最終的な結果をクライアントへ返す。</li>
</ul>
<hr style="border: 0; height: 2px; background: linear-gradient(to right, #0078d4, #00bcf2, #0078d4);" />
<h3><span style="border-left: 5px solid #0078d4; padding-left: 10px; color: #107c41;">2. クエリ最適化（Query Optimization）の役割</span></h3>
<p>SQLの処理工程の中で、パフォーマンスを決定づける最も重要なコンポーネントが<b>「クエリオプティマイザ（Query Optimizer）」</b>である。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; font-size: 0.95em; margin: 15px 0; line-height: 1.6; border-radius: 4px;"><b>【クエリ最適化の仕組みとポイント】</b><br />
<br />
<span style="color: #0078d4;">■ 物理プランの大量生成</span><br />
1つのSQLに対して、「フルスキャンをするか / インデックスを使うか」「テーブル結合の順序をどうするか」「ハッシュ結合かループ結合か」など、多数の物理プラン候補が生成される。<br />
<br />
<span style="color: #107c41;">■ コスト評価（Cost-Based Optimization）</span><br />
オプティマイザは統計情報（データ件数、インデックスのカーディナリティ、データ配置など）を参照し、推定実行時間やI/Oコストなどの「いろいろな値」から最適なプランを算出・算出決定する。<br />
<br />
<span style="color: #d76d00;">■ 実行エンジンへの受け渡し</span><br />
最小コストと判定された計画（最適プラン）のみが選択され、Query 実行エンジンに渡されて高速な処理が実現される。</div>
<hr style="border: 0; height: 2px; background: linear-gradient(to right, #0078d4, #00bcf2, #0078d4);" />
<h3><span style="border-left: 5px solid #0078d4; padding-left: 10px; color: #107c41;">3. まとめ</span></h3>
<p>SQLは「データ取得の結果」を指示するだけで、裏側では<b>Parser（構文解析器）</b>による Query Tree の生成と、<b>Query Optimizer（最適化エンジン）</b>による物理実行プランの決定という高度な処理が自動的に行われている。</p>
<p>SQLパフォーマンスチューニングにおいては、オプティマイザが意図通りの最適な実行プランを選択できるよう、<b style="background-color: #fff4ce; padding: 2px 4px;">「最新の統計情報（Statistics）の維持」</b>や<b style="background-color: #fff4ce; padding: 2px 4px;">「適切なインデックス設計」</b>を行うことが重要となる。</p>
<div style="font-family: monospace; border: 1px solid #0078d4; border-radius: 6px; padding: 15px; background-color: #f0f6ff; font-size: 0.95em; margin: 15px 0; line-height: 1.6;"><b style="color: #0078d4; font-size: 1.05em;">【SQL実行プロセスから見るチューニングのポイント】</b><br />
<span style="color: #107c41;">✔</span> プレースホルダ（バインド変数）を使い、Parsing・Plan Compileの再利用（ハードパース削減）を狙えているか？<br />
<span style="color: #107c41;">✔</span> テーブル統計情報は最新に更新されているか？（古い統計情報だとオプティマイザが間違ったプランを選ぶ）<br />
<span style="color: #107c41;">✔</span> <code>EXPLAIN</code> / <code>AUTOTRACE</code> 等で最適化された物理実行プランを分析しているか？</div>]]>
    </description>
    <category>【データベースの知識】</category>
    <link>https://aieyzumcrgpdbggt.blog.shinobi.jp/Entry/924/</link>
    <pubDate>Sun, 23 Aug 2026 02:03:51 GMT</pubDate>
    <guid isPermaLink="false">aieyzumcrgpdbggt.blog.shinobi.jp://entry/924</guid>
  </item>
    <item>
    <title>【データベース】&lt;/span&gt;分散システムの限界を示す！CAP定理（CAP Theorem）とは</title>
    <description>
    <![CDATA[<p>分散データベースやNoSQLの選定・設計において、避けて通れない非常に重要な理論が<b>「CAP定理（CAP Theorem）」</b>である。<br />
（※一般に「CPA」ではなく「CAP」と呼ばれることが多い概念だ）</p>
<p>CAP定理とは、<b>「分散システムにおいて『一貫性』『可用性』『分断耐性』の3つの性質を、同時にすべて（3つとも）満たすことはできない」</b>というトレードオフの定理を指す。</p>
<hr style="border: 0; height: 2px; background: linear-gradient(to right, #0078d4, #00bcf2, #0078d4);" />
<h3><span style="border-left: 5px solid #0078d4; padding-left: 10px; color: #107c41;">1. CAP定理の3つの構成要素</span></h3>
<p>分散システムが備えるべき3つの評価軸の定義は以下の通りである。</p>
<ul style="list-style: none; padding-left: 0;">
<li style="background-color: #f0f6ff; border-left: 4px solid #0078d4; padding: 12px 15px; margin-bottom: 12px; border-radius: 0 4px 4px 0;"><b style="color: #0078d4; font-size: 1.05em;">C：Consistency（一貫性）</b><br />
システムにあるオペレーションを行った後、どのノード（サーバー）にアクセスしても常に最新で同じデータ（一貫性）が保たれている性質。<br />
分散システムで一貫性を担保するためには、<b>あるノードでデータ更新（Update）が発生した場合、他のすべてのノードにもその結果を即座に同期・反映</b>しなければならない。</li>
<li style="background-color: #eef9f2; border-left: 4px solid #107c41; padding: 12px 15px; margin-bottom: 12px; border-radius: 0 4px 4px 0;"><b style="color: #107c41; font-size: 1.05em;">A：Availability（可用性）</b><br />
システムを構成する<b>ノードの一部が故障（ダウン）しても、システム全体としてはレスポンスを返し続け、正常に稼働し続けなければならない</b>性質。<br />
エラーを返さず、常にすべての正常なノードが読み書きの要求に応答できることが求められる。</li>
<li style="background-color: #fff4ce; border-left: 4px solid #ff8c00; padding: 12px 15px; margin-bottom: 12px; border-radius: 0 4px 4px 0;"><b style="color: #d76d00; font-size: 1.05em;">P：Partition Tolerance（分断耐性）</b><br />
ノード間を結ぶ<b>ネットワークが障害等で分断され、通信が一時的に不通・切断されても、システムとしては停止せずに稼働し続けなければならない</b>性質。</li>
</ul>
<hr style="border: 0; height: 2px; background: linear-gradient(to right, #0078d4, #00bcf2, #0078d4);" />
<h3><span style="border-left: 5px solid #0078d4; padding-left: 10px; color: #107c41;">2. なぜ3つ同時に満たせないのか？</span></h3>
<p>ネットワーク分断（<b>P</b>）が発生した状況を想像してみよう。ノードAとノードBの間で通信ができない状態である。</p>
<p>このとき、ノードAに書き込みリクエストが届いた場合、選択肢は2つしかない。</p>
<ul style="list-style: none; padding-left: 0;">
<li style="background-color: #fdf4f6; border-left: 4px solid #d13438; padding: 10px 15px; margin-bottom: 8px; border-radius: 0 4px 4px 0;"><b>選択肢①：一貫性（C）を優先する</b> ➔ ノードBへデータ更新を同期できないため、エラーを返して書き込みを拒否する。（<b>可用性 A が犠牲になる</b>）</li>
<li style="background-color: #fdf4f6; border-left: 4px solid #d13438; padding: 10px 15px; margin-bottom: 8px; border-radius: 0 4px 4px 0;"><b>選択肢②：可用性（A）を優先する</b> ➔ ノードAだけで書き込みを完了させ、応答を返す。しかしノードBのデータは古いままになる。（<b>一貫性 C が犠牲になる</b>）</li>
</ul>
<p>このように、現実の分散環境において「分断（P）」の発生を完全に回避することは不可能なため、実質的に分散システムは<b>「CP型」か「AP型」のどちらかを選択（トレードオフ）せざるを得ない</b>のである。</p>
<hr style="border: 0; height: 2px; background: linear-gradient(to right, #0078d4, #00bcf2, #0078d4);" />
<h3><span style="border-left: 5px solid #0078d4; padding-left: 10px; color: #107c41;">3. NoSQLにおけるCAPによる分類</span></h3>
<p>近代のNoSQLデータベースは、この3つのうち「どれを重視し、どれを妥協するか」という設計思想（トレードオフ）によって、大きく3つのタイプに分類することができる。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; font-size: 0.95em; margin: 15px 0; line-height: 1.6; border-radius: 4px;"><b>【CAP特性によるデータベース分類】</b><br />
<br />
<span style="color: #0078d4;">■ CP型（一貫性 ＋ 分断耐性）</span><br />
・特徴：ネットワーク分断時はエラーを返してでもデータ不整合を防ぐ。<br />
・代表例：<b>HBase, MongoDB, Redis, Accumulo</b><br />
・用途：金融決済や在庫管理など、絶対的なデータ整合性が求められるシステム。<br />
<br />
<span style="color: #107c41;">■ AP型（可用性 ＋ 分断耐性）</span><br />
・特徴：データ整合性が一時的に崩れても、止まらずに読み書きに応答する（※結果的一貫性を重視）。<br />
・代表例：<b>Apache Cassandra, Amazon DynamoDB, CouchDB</b><br />
・用途：SNSのタイムラインやアクセスログの収集など、止まらないことが最優先のシステム。<br />
<br />
<span style="color: #d76d00;">■ CA型（一貫性 ＋ 可用性）</span><br />
・特徴：ネットワーク分断が発生しない単一ノード（非分散環境）を前提とするモデル。<br />
・代表例：<b>従来の単一構成RDBMS（PostgreSQL, MySQL, Oracle DB など）</b><br />
・注意：分散環境においてはネットワーク障害（P）の回避が困難なため、実質の選択肢としては「CP」か「AP」の2択となる。</div>
<hr style="border: 0; height: 2px; background: linear-gradient(to right, #0078d4, #00bcf2, #0078d4);" />
<h3><span style="border-left: 5px solid #0078d4; padding-left: 10px; color: #107c41;">4. まとめ</span></h3>
<p>「すべての面で完璧なデータベース」は存在しない。システム要件に応じて、<b>「一貫性（C）」を絶対に譲れないのか</b>、あるいは<b>「高可用性（A）」を取って一時的な不整合（Eventual Consistency：結果的一貫性）を許容するのか</b>を見極めることが、適切なDB選定の第一歩となる。</p>
<div style="font-family: monospace; border: 1px solid #0078d4; border-radius: 6px; padding: 15px; background-color: #f0f6ff; font-size: 0.95em; margin: 15px 0; line-height: 1.6;"><b style="color: #0078d4; font-size: 1.05em;">【CAP定理から考えるデータベース選定の要点】</b><br />
<span style="color: #107c41;">✔</span> 金融・決済・アカウント管理など、1円・1件のズレも許されない ➔ <b>CP型（または伝統的RDBMS）</b><br />
<span style="color: #107c41;">✔</span> ログ収集・SNS・カートの一時保持など、止まらないことが最優先 ➔ <b>AP型</b><br />
<span style="color: #107c41;">✔</span> AP型を採用する場合は「結果的一貫性（最終的にデータが合えばOK）」の思想を許容できるか確認する</div>]]>
    </description>
    <category>【データベース:Oracle】</category>
    <link>https://aieyzumcrgpdbggt.blog.shinobi.jp/Entry/923/</link>
    <pubDate>Sun, 16 Aug 2026 04:43:00 GMT</pubDate>
    <guid isPermaLink="false">aieyzumcrgpdbggt.blog.shinobi.jp://entry/923</guid>
  </item>
    <item>
    <title>【Struts1.1再入門】Java 21 + Macで「Welcome!」を表示させる環境構築の手順</title>
    <description>
    <![CDATA[<p>Java 21 が標準となった現代の開発現場において、あえて <b>「Struts 1.1」</b> の学習に立ち返る。<br />
かつてのWeb開発を支えたこのフレームワークを、最新の <b>Mac OS 15.7.7</b> 上で動かし、当時の構造を解き明かすことは、レガシーシステムの移行や移植サービスを検討する上で非常に価値のある検証となる。</p>
<p>今回は、Tomcat のセットアップから Struts 1.1 サンプルアプリケーション（struts-blank）の稼働確認までを整理した。</p>
<hr style="border: 0; height: 2px; background: linear-gradient(to right, #0078d4, #00bcf2, #0078d4);" />
<h3><span style="border-left: 5px solid #0078d4; padding-left: 10px; color: #107c41;">1. 現代環境（Mac OS 15.7.7 + Java 21）における Tomcat の準備</span></h3>
<p>Struts 1.1 は 2003 年頃の製品であり、当時の Servlet API 仕様（2.3）に深く依存している。最新の Tomcat 11 などでは動作しない可能性が高いため、今回は安定して動作確認が可能な <b>Apache Tomcat 9.0系</b> を採用する。</p>
<ul style="list-style: none; padding-left: 0;">
<li style="background-color: #f0f6ff; border-left: 4px solid #0078d4; padding: 12px 15px; margin-bottom: 12px; border-radius: 0 4px 4px 0;"><b style="color: #0078d4; font-size: 1.05em;">Step 1: Tomcat のダウンロードと展開</b><br />
公式サイトより <code>apache-tomcat-9.0.120.zip</code> を取得し、ターミナルから <code>unzip</code> で展開・配置する。</li>
<li style="background-color: #eef9f2; border-left: 4px solid #107c41; padding: 12px 15px; margin-bottom: 12px; border-radius: 0 4px 4px 0;"><b style="color: #107c41; font-size: 1.05em;">Step 2: JAVA_HOME の確認</b><br />
Temurin-21 のパスが正しく通っていることを確認してサーバーを起動する。</li>
</ul>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; font-size: 0.95em; margin: 15px 0; line-height: 1.6; border-radius: 4px;"><b>【JAVA_HOME 確認】</b><br />
<code>% echo $JAVA_HOME</code><br />
<code>/Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home</code></div>
<hr style="border: 0; height: 2px; background: linear-gradient(to right, #0078d4, #00bcf2, #0078d4);" />
<h3><span style="border-left: 5px solid #0078d4; padding-left: 10px; color: #107c41;">2. ターミナル操作によるサンプルアプリのデプロイ</span></h3>
<p>今回は、最小構成である <code>struts-blank.war</code> を Tomcat にデプロイし、動作確認を行う。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; font-size: 0.95em; margin: 15px 0; line-height: 1.6; border-radius: 4px;"><b>【デプロイと稼働確認手順】</b><br />
1. <b>Tomcat 起動:</b><br />
&nbsp;&nbsp;&nbsp;&nbsp;<code>~/opt/tomcat/bin/startup.sh</code><br />
2. <b>Tomcat 稼働確認:</b><br />
&nbsp;&nbsp;&nbsp;&nbsp;ブラウザで <code>http://localhost:8080/</code> にアクセスし、Tomcat の初期画面が表示されることを確認。<br />
<br />
3. <b>サンプル（struts-blank）の配備:</b><br />
&nbsp;&nbsp;&nbsp;&nbsp;<code>cp ~/Downloads/jakarta-struts-1.1/webapps/struts-blank.war ~/opt/tomcat/webapps/</code><br />
<br />
4. <b>動作確認:</b><br />
&nbsp;&nbsp;&nbsp;&nbsp;ブラウザで <code>http://localhost:8080/struts-blank/</code> にアクセスし、<b>「Welcome!」</b> 画面が表示されることを確認。</div>
<hr style="border: 0; height: 2px; background: linear-gradient(to right, #0078d4, #00bcf2, #0078d4);" />
<h3><span style="border-left: 5px solid #0078d4; padding-left: 10px; color: #107c41;">3. まとめ</span></h3>
<p>最新の Mac OS および Java 21 環境において、Struts 1.1 の土台が完成した。<br />
「Welcome!」画面が表示されたことで、開発環境のベースラインが確保されたことになる。今回の検証で「動く環境」を手に入れたため、次回からはより踏み込んだ内部構造の解析へステップを進めていく。</p>
<div style="font-family: monospace; border: 1px solid #0078d4; border-radius: 6px; padding: 15px; background-color: #f0f6ff; font-size: 0.95em; margin: 15px 0; line-height: 1.6;"><b style="color: #0078d4; font-size: 1.05em;">【次回の検証ポイント】</b><br />
<span style="color: #107c41;">✔</span> <b>struts-config.xml の解析:</b> 設定ファイルと Action クラスの紐付けを確認する。<br />
<span style="color: #107c41;">✔</span> <b>ビルドの自動化:</b> IDEに頼らず、Ant や Maven を使った CLI ビルド環境への昇華。<br />
<span style="color: #107c41;">✔</span> <b>移植性の検証:</b> レガシーな構成を読み解き、将来の移植サービスへの知見とする。</div>
<br />
]]>
    </description>
    <category>【Java+Struts】</category>
    <link>https://aieyzumcrgpdbggt.blog.shinobi.jp/Entry/922/</link>
    <pubDate>Sun, 16 Aug 2026 04:38:59 GMT</pubDate>
    <guid isPermaLink="false">aieyzumcrgpdbggt.blog.shinobi.jp://entry/922</guid>
  </item>
    <item>
    <title>【データベース】&lt;/span&gt;データの信頼性を守る命綱！トランザクションの「ACID特性」とは</title>
    <description>
    <![CDATA[<p>データベース（RDBMS）を扱う上で、絶対に避けて通れない最重要概念が<b>「トランザクション（Transaction）」</b>である。<br />
銀行の口座振込やECサイトの注文処理など、複数のデータ更新を「1つの不可分な処理単位」として扱う仕組みを指す。</p>
<p>そして、このトランザクション処理が安全かつ正確に行われるために、RDBMSが保証すべき4つの性質の頭文字をとったものが<b>「ACID（アシッド）特性」</b>だ。<br />
今回は、システム開発やデータベース設計の基本となるACID特性をわかりやすく整理した。</p>
<hr style="border: 0; height: 2px; background: linear-gradient(to right, #0078d4, #00bcf2, #0078d4);" />
<h3><span style="border-left: 5px solid #0078d4; padding-left: 10px; color: #107c41;">1. ACID特性の4つの要素</span></h3>
<p>データベースのデータ破壊を防ぎ、整合性を完璧に保つためにRDBMSが備えるべき4つの原則は以下の通りである。</p>
<ul style="list-style: none; padding-left: 0;">
<li style="background-color: #f0f6ff; border-left: 4px solid #0078d4; padding: 12px 15px; margin-bottom: 12px; border-radius: 0 4px 4px 0;"><b style="color: #0078d4; font-size: 1.05em;">A：Atomicity（原子性 / All or Nothing）</b><br />
トランザクションに含まれる一連のデータ操作は、<b>「すべて完全に実行される（Commit）」か「まったく実行されなかった状態に戻る（Rollback）」かのどちらか一方</b>にしかならない性質。<br />
途中でエラーやシステム障害が発生した場合、中途半端に一部だけが更新された状態が残ることは絶対にない。</li>
<li style="background-color: #eef9f2; border-left: 4px solid #107c41; padding: 12px 15px; margin-bottom: 12px; border-radius: 0 4px 4px 0;"><b style="color: #107c41; font-size: 1.05em;">C：Consistency（一貫性 / 整合性）</b><br />
トランザクションの開始前と終了後で、<b>データベースの整合性制約（主キー制約、外部キー制約、NOT NULL制約など）が常に満たされている</b>性質。<br />
ルールに違反するような不正なデータ変更が行われそうになった場合、トランザクション全体が自動的に取り消される。</li>
<li style="background-color: #fff4ce; border-left: 4px solid #ff8c00; padding: 12px 15px; margin-bottom: 12px; border-radius: 0 4px 4px 0;"><b style="color: #d76d00; font-size: 1.05em;">I：Isolation（独立性 / 隔離性）</b><br />
複数のトランザクションが同時に並行実行されていても、<b>互いの処理過程が干渉・影響し合わない</b>性質。<br />
他のトランザクションからは「まだ確定していない途中の状態」が見えず、あたかも1つずつ順番に実行（直列化）されたかのような結果が保証される。</li>
<li style="background-color: #fdf4f6; border-left: 4px solid #d13438; padding: 12px 15px; margin-bottom: 12px; border-radius: 0 4px 4px 0;"><b style="color: #d13438; font-size: 1.05em;">D：Durability（永続性 / 堅牢性）</b><br />
トランザクションが一度確定（Commit）または取消（Rollback）した時点で、<b>その結果は永続的に記憶され、絶対に失われない</b>性質。<br />
確定直後にサーバーの電源が落ちたりシステム障害が発生したりしても、REDOログ等の仕組みによってデータは確実に復元される。</li>
</ul>
<hr style="border: 0; height: 2px; background: linear-gradient(to right, #0078d4, #00bcf2, #0078d4);" />
<h3><span style="border-left: 5px solid #0078d4; padding-left: 10px; color: #107c41;">2. 具体例：銀行の口座振込で考えるACID</span></h3>
<p>「Aさんの口座からBさんの口座へ1万円を振り込む」というトランザクション（①A口座から1万円引く ➔ ②B口座に1万円足す）を例に挙げると、ACID特性の重要性がより明確になる。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; font-size: 0.95em; margin: 15px 0; line-height: 1.6; border-radius: 4px;"><b>【振込処理におけるACIDの役割】</b><br />
・<b>原子性：</b> ①のあと回線が切れても、B口座に足されずにA口座の1万円だけ消える（消滅する）事故を防ぐ（ロールバックされる）。<br />
・<b>一貫性：</b> 残高がマイナス不可の制約がある場合、残高不足なら振込処理自体をエラーにして弾く。<br />
・<b>独立性：</b> Aさんが振込処理を行っている最中に、CさんがAさんの残高を参照しても「振込途中の確定していない残高」は見えない。<br />
・<b>永続性：</b> 「振込完了」の画面が出た直後に銀行のDBサーバーが停電しても、1万円の移動記録は消えずに残る。</div>
<hr style="border: 0; height: 2px; background: linear-gradient(to right, #0078d4, #00bcf2, #0078d4);" />
<h3><span style="border-left: 5px solid #0078d4; padding-left: 10px; color: #107c41;">3. まとめ</span></h3>
<p>Webアプリケーションや基幹システムにおいて、データの辻褄が合わなくなるバグを防いでいるのは、RDBMSが提供するこの<b>ACID特性</b>のおかげである。</p>
<p>システム設計時には、特に<b style="background-color: #fff4ce; padding: 2px 4px;">「隔離性（Isolation）レベルの設定（Dirty ReadやPhantom Readの防犯）」</b>や<b style="background-color: #fff4ce; padding: 2px 4px;">「デッドロックの防止」</b>など、ACID特性を意識したトランザクション設計を行うことが求められる。</p>
<div style="font-family: monospace; border: 1px solid #0078d4; border-radius: 6px; padding: 15px; background-color: #f0f6ff; font-size: 0.95em; margin: 15px 0; line-height: 1.6;"><b style="color: #0078d4; font-size: 1.05em;">【トランザクション設計のチェック項目】</b><br />
<span style="color: #107c41;">✔</span> 複数の更新クエリが「1つのトランザクション」としてコミット/ロールバック制御されているか？（原子性）<br />
<span style="color: #107c41;">✔</span> アプリ側の処理異常時に確実に <code>ROLLBACK</code> が発行される構造になっているか？（一貫性）<br />
<span style="color: #107c41;">✔</span> 同時実行時のロック範囲や分離レベル（Read Committed等）が適切に設計されているか？（独立性）</div>]]>
    </description>
    <category>【データベースの知識】</category>
    <link>https://aieyzumcrgpdbggt.blog.shinobi.jp/Entry/921/</link>
    <pubDate>Sun, 09 Aug 2026 10:25:54 GMT</pubDate>
    <guid isPermaLink="false">aieyzumcrgpdbggt.blog.shinobi.jp://entry/921</guid>
  </item>
    <item>
    <title>【データベースの知識】現代のRDBの原点！コッドの12のルール（Codd's 12 Rules）とは</title>
    <description>
    <![CDATA[<p>リレーショナルデータベース（RDB）の基礎理論を考案した Edgar F. Codd（エドガー・F・コッド）博士が1985年に提唱した<b>「コッドの12のルール（Codd's 12 Rules）」</b>。<br />
「真のリレーショナルデータベース管理システム（RDBMS）とはどうあるべきか」を定義した指針であり、データベースの運用や基本設計、情報処理試験の理論問題においても極めて重要な概念となっている。</p>
<p>今回は、データベースを正しく管理・運用するためにRDBMSが備えるべき12の原則をわかりやすく整理した。</p>
<hr style="border: 0; height: 2px; background: linear-gradient(to right, #0078d4, #00bcf2, #0078d4);" />
<h3><span style="border-left: 5px solid #0078d4; padding-left: 10px; color: #107c41;">1. コッドの12のルール（RDBMSの要件定義）</span></h3>
<p>コッド博士は、システムが独自の拡張や物理的な制約に頼らず、純粋に「リレーショナルモデル」としてデータの一貫性・独立性を保つために以下の12原則（および原則0である「完全なリレーショナル機能による管理」）を定めた。</p>
<ul style="list-style: none; padding-left: 0;">
<li style="background-color: #f0f6ff; border-left: 4px solid #0078d4; padding: 12px 15px; margin-bottom: 10px; border-radius: 0 4px 4px 0;"><b style="color: #0078d4;">① 情報の表現原則（Information Rule）</b><br />
テーブル名や列名、制約といったメタデータを含め、データベース内のすべての情報は「表（リレーション）のセルに格納された値」として一元的に記録されなければならない。</li>
<li style="background-color: #f0f6ff; border-left: 4px solid #0078d4; padding: 12px 15px; margin-bottom: 10px; border-radius: 0 4px 4px 0;"><b style="color: #0078d4;">② アクセスの保証（Guaranteed Access Rule）</b><br />
すべてのデータ要素は、「テーブル名」「主キー（Primary Key）の値」「列（ドメイン）名」の組み合わせによって論理的に一意指定してアクセス可能でなければならない（物理アドレスやポインタの指定は不可）。</li>
<li style="background-color: #f0f6ff; border-left: 4px solid #0078d4; padding: 12px 15px; margin-bottom: 10px; border-radius: 0 4px 4px 0;"><b style="color: #0078d4;">③ NULLの統一的扱い（Systematic Treatment of Null Values）</b><br />
「値が存在しない（未知）」「適用不能」を表す <code style="background-color: #e1dfdd; padding: 2px 5px; border-radius: 3px; color: #d13438;">NULL</code> は、データ型に関わらず、システム全体で統一かつ体系的な方法で処理されなければならない。</li>
<li style="background-color: #eef9f2; border-left: 4px solid #107c41; padding: 12px 15px; margin-bottom: 10px; border-radius: 0 4px 4px 0;"><b style="color: #107c41;">④ オンライン・アクティブ・カタログ（Dynamic Online Catalog）</b><br />
データベース構造を保持するカタログ（データディクショナリ）自体も通常のデータと同じ表形式で表現され、通常のSQL等のデータアクセス言語を使ってオンラインで照会できなければならない。</li>
<li style="background-color: #eef9f2; border-left: 4px solid #107c41; padding: 12px 15px; margin-bottom: 10px; border-radius: 0 4px 4px 0;"><b style="color: #107c41;">⑤ 包括的なデータ言語の原則（Comprehensive Data Sublanguage Rule）</b><br />
データの定義（DDL）、ビューの定義、データの操作（DML）、整合性制約、トランザクション制御（COMMIT/ROLLBACK）などが、単一の明確に定義された言語（SQLなど）で完結して実現できなければならない。</li>
<li style="background-color: #eef9f2; border-left: 4px solid #107c41; padding: 12px 15px; margin-bottom: 10px; border-radius: 0 4px 4px 0;"><b style="color: #107c41;">⑥ ビューの更新原則（View Updating Rule）</b><br />
理論的に更新可能なビューに対して更新（<code style="background-color: #e1dfdd; padding: 2px 5px; border-radius: 3px; color: #107c41;">INSERT</code> / <code style="background-color: #e1dfdd; padding: 2px 5px; border-radius: 3px; color: #107c41;">UPDATE</code> / <code style="background-color: #e1dfdd; padding: 2px 5px; border-radius: 3px; color: #107c41;">DELETE</code>）が発行された場合、RDBMSがそれを検知し、裏側にある実表（基底テーブル）に対して正しく更新処理を反映しなければならない。</li>
<li style="background-color: #fff4ce; border-left: 4px solid #ff8c00; padding: 12px 15px; margin-bottom: 10px; border-radius: 0 4px 4px 0;"><b style="color: #d76d00;">⑦ 高水準の挿入・更新・削除（High-Level Insert, Update, and Delete）</b><br />
データ操作言語は、一度の命令（クエリ）で1行ずつ処理するのではなく、複数の行（タプル／集合）をひと括りで集合処理できなければならない。</li>
<li style="background-color: #fff4ce; border-left: 4px solid #ff8c00; padding: 12px 15px; margin-bottom: 10px; border-radius: 0 4px 4px 0;"><b style="color: #d76d00;">⑧ 物理的データ独立性（Physical Data Independence）</b><br />
データの記憶形式やアクセスパス（インデックス構造やファイルの配置場所など）といった物理的な変更を行っても、アプリケーションプログラムのコードに影響を与えてはならない。</li>
<li style="background-color: #fff4ce; border-left: 4px solid #ff8c00; padding: 12px 15px; margin-bottom: 10px; border-radius: 0 4px 4px 0;"><b style="color: #d76d00;">⑨ 論理的データ独立性（Logical Data Independence）</b><br />
テーブルの分割・結合など、データベースの論理構造を変更した場合でも、既存のアプリケーションプログラムへの影響を最小限に抑えられなければならない（ビュー等の活用）。</li>
<li style="background-color: #fdf4f6; border-left: 4px solid #d13438; padding: 12px 15px; margin-bottom: 10px; border-radius: 0 4px 4px 0;"><b style="color: #d13438;">⑩ 整合性制約の独立性（Integrity Independence）</b><br />
主キー制約や外部キー制約などのデータ整合性制約は、アプリ側のプログラム内に記述するのではなく、RDBMS内のカタログに直接定義・保持されなければならない。制約が変更されてもアプリ側に影響を与えない。</li>
<li style="background-color: #fdf4f6; border-left: 4px solid #d13438; padding: 12px 15px; margin-bottom: 10px; border-radius: 0 4px 4px 0;"><b style="color: #d13438;">⑪ 分散の独立性（Distribution Independence）</b><br />
データベースが複数のサーバやネットワーク上に分散配置されたとしても、アプリケーション側からはあたかも単一のローカルデータベースを操作しているように見えなければならない（位置の透過性）。</li>
<li style="background-color: #fdf4f6; border-left: 4px solid #d13438; padding: 12px 15px; margin-bottom: 10px; border-radius: 0 4px 4px 0;"><b style="color: #d13438;">⑫ 規約無効化の否定（Non-Subversion Rule）</b><br />
RDBMSに低水準（レコード単位など）のインターフェースが存在する場合でも、その経路を使ってRDBMSに定義された整合性制約やセキュリティ規約を回避・破壊できてはならない。</li>
</ul>
<hr style="border: 0; height: 2px; background: linear-gradient(to right, #0078d4, #00bcf2, #0078d4);" />
<h3><span style="border-left: 5px solid #0078d4; padding-left: 10px; color: #107c41;">2. まとめ：現代RDBMSにおける位置づけ</span></h3>
<p>コッドの12のルールは、SQLデータベースの理想型を示した厳格な基準である。現実の主要なRDBMS（Oracle、PostgreSQL、MySQL、SQL Serverなど）であっても、これら12のルールを完全（100%）に満たしている製品は少ない。</p>
<p>しかし、<b style="background-color: #fff4ce; padding: 2px 4px;">「物理データからの独立」「集合操作」「整合性制約のRDBMS側での一元管理」</b>といった根幹のコンセプトは、現代のデータベース設計やアプリケーション開発においても変わらない基礎知識として息づいている。</p>
<div style="font-family: monospace; border: 1px solid #0078d4; border-radius: 6px; padding: 15px; background-color: #f0f6ff; font-size: 0.95em; margin: 15px 0; line-height: 1.6;"><b style="color: #0078d4; font-size: 1.05em;">【データベース設計・運用のチェック項目】</b><br />
<span style="color: #107c41;">✔</span> アプリケーション側に整合性チェックのロジックを抱え込みすぎていないか？（ルール10）<br />
<span style="color: #107c41;">✔</span> 物理的なインデックス追加・変更がアプリ側に波及しない構造になっているか？（ルール8）<br />
<span style="color: #107c41;">✔</span> NULLの判定ロジックがシステム全体で統一されているか？（ルール3）</div>]]>
    </description>
    <category>【データベースの知識】</category>
    <link>https://aieyzumcrgpdbggt.blog.shinobi.jp/Entry/920/</link>
    <pubDate>Thu, 06 Aug 2026 11:13:36 GMT</pubDate>
    <guid isPermaLink="false">aieyzumcrgpdbggt.blog.shinobi.jp://entry/920</guid>
  </item>
    <item>
    <title>【データベース】実行計画の要！「オプティマイザー」の役割と2つのアプローチ</title>
    <description>
    <![CDATA[<p>リレーショナルデータベース（RDB）に対してSQL文を発行する際、私たちは「どのようなデータを満たすか（WHAT）」だけを指定し、「どのようにデータを取得するか（HOW）」の手順は記述しない。<br />
この「どのようにデータを取得するか」という具体的なアクセス経路（実行計画）を裏で自動的に導き出しているのが、DBMSの心臓部である<b>「オプティマイザー（最適化エンジン）」</b>である。</p>
<hr />
<h3>1. オプティマイザーとは</h3>
<p>データベースアクセスを最適化する仕組み、およびそのシステムをオプティマイザーと呼ぶ。</p>
<p>オプティマイザーは、ユーザーから送られてきたSQL文を構文解析（パース）し、テーブルの構造やインデックスの有無を分析する。その後、内部で複数の実行計画（プラン）を組み立て、その中から最も効率が良いと判断したアクセス経路を検出して実行に移す役割を担っている。</p>
<hr />
<h3>2. オプティマイザーの2つの種類</h3>
<p>SQL文の実行計画を選択・決定する手法には、歴史的な経緯やアプローチの違いにより、大きく分けて次の2種類が存在する。</p>
<h4>（1）ルールベース・オプティマイザー（RBO）</h4>
<p>ルールベースのオプティマイザーは、データの量や状態に関わらず、<b>あらかじめシステムに組み込まれた固定の優先順位（ルール）</b>に則って、機械的に実行計画を決定する。</p>
<p>一般的には、以下のようなアクセス・パス（経路）の優先順位が定義されており、より上位の条件にマッチするインデックス等があれば、それを優先的に選択する。</p>
<ul>
<li><b>（ア）ユニーク・キーまたは主キーによる単一行アクセス</b>（最優先）</li>
<li><b>（イ）インデックス付きのクラスター・キー</b></li>
<li><b>（ウ）複合インデックス（複数カラムを組み合わせたインデックス）</b></li>
<li><b>（エ）単一カラム・インデックス</b></li>
<li><b>（オ）ソート／マージ結合</b></li>
<li><b>（カ）インデックス付きカラムの <code>MAX</code> または <code>MIN</code> 関数</b></li>
<li><b>（キ）インデックス付きカラムの <code>ORDER BY</code></b></li>
<li><b>（ク）テーブル全体のスキャン（フルスキャン）</b>（最も優先順位が低い）</li>
</ul>
<h4>（2）コストベース・オプティマイザー（CBO）</h4>
<p>現在の主要なDBMS（Oracle、PostgreSQL、MySQL、SQL Serverなど）で主流となっているのが、このコストベースである。<br />
あらかじめデータベース内に収集・蓄積されている、テーブルのレコード数、カラムの平均長、インデックスの深さ、データの分布度といった<b>「統計情報」</b>を基にする。</p>
<p>オプティマイザーは内部で複数の実行計画をシミュレーションし、それぞれのパターンで発生する「コスト」を計算して、最もコストが低いプランを採用する。</p>
<p>※ここでいう<b>「コスト」</b>とは、SQL文を実行するために必要と予測される、CPU処理時間やディスクI/O（読み書き）の経過時間に比例する見積値のことである。データ量が少なければフルスキャンを選び、データ量が多ければインデックスを選ぶ、といった柔軟な判断が可能となる。</p>
<hr />
<h3>3. まとめ</h3>
<p>ルールベースは「構造」だけで判断するためデータ量の変化に弱く、現代の複雑なシステムでは不都合が生じやすい。そのため、現在のRDB運用においては、定期的に <code>ANALYZE</code> などのコマンドを実行して最新の<b>「統計情報」</b>を維持し、コストベース・オプティマイザーに正しい判断をさせることが、パフォーマンス管理における最大の鉄則となっている。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; font-size: 0.95em; margin: 15px 0; line-height: 1.6;"><b>【オプティマイザー運用のチェック項目】</b><br />
□ 意図しないフルスキャン（テーブル全体スキャン）が発生していないか？<br />
□ 大規模なデータ更新（バッチ処理等）のあとに統計情報を更新しているか？<br />
□ 期待通りのインデックスアクセスが選択されるよう、実行計画（EXPLAIN）を確認したか？</div>]]>
    </description>
    <category>【データベースの知識】</category>
    <link>https://aieyzumcrgpdbggt.blog.shinobi.jp/Entry/919/</link>
    <pubDate>Sat, 11 Jul 2026 21:44:13 GMT</pubDate>
    <guid isPermaLink="false">aieyzumcrgpdbggt.blog.shinobi.jp://entry/919</guid>
  </item>
    <item>
    <title>【データベースの知識】データベース運用で知っておくべき「更新可能なView」の8つの必須条件</title>
    <description>
    <![CDATA[<p>SQLにおいて、複雑なクエリをカプセル化して擬似的なテーブルのように扱える「ビュー（View）」。<br />
ビューは通常、データの参照（<code>SELECT</code>）に用いられるが、特定の条件をクリアしていれば、ビューに対して直接 <code>INSERT</code>、<code>UPDATE</code>、<code>DELETE</code> などの更新処理（DML）を行うことができる。</p>
<p>今回は、データベース設計や情報処理試験でも極めて重要となる、<b>標準SQLにおける「更新可能なビュー」が満たすべき8つの厳格な条件</b>を整理した。</p>
<hr />
<h3>1. 更新可能なビュー（Updatable View）の8大条件</h3>
<p>DBMSがビューの向こう側にある実テーブル（基底テーブル）に対して、どのレコードのどの列を書き換えるべきかを一意に特定（マッピング）できる必要があるため、以下の条件が定められている。</p>
<ul>
<li><b>① 1つだけのテーブルから作られていること</b><br />
複数のテーブルを結合（<code>JOIN</code>）して作成されたビューは、原則として標準SQLでは直接更新できない。対象となる基底テーブルが単一である必要がある。</li>
<li><b>② <code>GROUP BY</code> 句を使っていないこと</b><br />
データをグループ化してしまうと、ビュー上の1行が基底テーブルの複数行をまとめたものになってしまうため、どの行を更新すべきか特定できなくなる。</li>
<li><b>③ <code>HAVING</code> 句を使っていないこと</b><br />
<code>GROUP BY</code> と同様に、グループ化された集計結果に対する絞り込みを行う句が含まれているビューは更新対象外となる。</li>
<li><b>④ 集約関数（<code>SUM</code>, <code>AVG</code>, <code>COUNT</code>, <code>MAX</code>, <code>MIN</code> など）を使っていないこと</b><br />
計算・集計された結果の値を書き換えようとしても、基底テーブルの元のデータをどう変更すればよいか計算が成り立たないためである。</li>
<li><b>⑤ 計算列を使っていないこと</b><br />
<code>SELECT col1 + col2 AS total</code> のような演算式によって算出された列（計算列）は、直接値を書き換えることができない。</li>
<li><b>⑥ <code>UNION</code>、<code>INTERSECT</code>、<code>EXCEPT</code> を使っていないこと</b><br />
集合演算子を用いて複数のクエリ結果を統合・比較しているビューは、データの出所を一意にマッピングできないため更新できない。</li>
<li><b>⑦ <code>SELECT DISTINCT</code> 句を使っていないこと</b><br />
重複行を排除（一意化）して表示されたビューは、実テーブルのどの行に対応しているかの追跡性が失われるため、更新が許可されない。</li>
<li><b>⑧ ビューに含まれない基底テーブルのすべての列が、NULLを許可するか、デフォルト値が指定されていること</b><br />
ビュー経由で <code>INSERT</code>（行追加）を行う際、ビューに定義されていない列にはデータが渡らない。そのため、それらの列が <code>NOT NULL</code>（かつデフォルト値なし）の制約を持っていると、実テーブル側で制約エラーが発生して挿入できなくなる。</li>
</ul>
<hr />
<h3>2. まとめ：実務でのアプローチ</h3>
<p>上記のように、標準SQLでビューを更新可能にするためのハードルはかなり高い。実テーブルとビューの列が「1対1」できれいに対応しているシンプルなビューだけが、そのまま更新できる仕様になっている。</p>
<p>もし、これらの条件を満たさない複雑なビュー（複数テーブルの結合ビューなど）に対してどうしても更新処理を行いたい場合は、PostgreSQL等の主要なDBMSでサポートされている<b><code>INSTEAD OF</code> トリガー</b>をビューに実装し、内部の更新ロジックを開発者が手動で記述するアプローチをとるのが一般的である。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; font-size: 0.95em; margin: 15px 0; line-height: 1.6;"><b>【ビュー設計時のチェック項目】</b><br />
□ 参照専用（読み取り専用）として利用するビューか？<br />
□ アプリケーションからビューを介した DML 操作を想定しているか？<br />
□ 条件を満たさない場合、トリガーによる代替ロジックの実装が必要か？</div>]]>
    </description>
    <category>【データベースの知識】</category>
    <link>https://aieyzumcrgpdbggt.blog.shinobi.jp/Entry/918/</link>
    <pubDate>Sat, 11 Jul 2026 21:36:12 GMT</pubDate>
    <guid isPermaLink="false">aieyzumcrgpdbggt.blog.shinobi.jp://entry/918</guid>
  </item>
    <item>
    <title>【PostgreSQL】Ubuntu + PostgreSQL スクリプト実行ガイド 〜 .sql ファイルの作成から psql での実行・検証まで 〜</title>
    <description>
    <![CDATA[<p>本ガイドでは、Ubuntu環境において PostgreSQL のスクリプトファイル（<code>.sql</code>）を作成し、ターミナルから <code>psql</code> コマンドを使って実行する手順を解説する。</p>
<p>対話型シェルにログインして実行する基本方法から、シェルスクリプトなどの自動化（バッチ処理）に組み込む際の本質的な外部実行プロセスまで、ステップバイステップで検証を進めていく。</p>
<hr />
<h3>1. 開発環境の準備（ターミナルの操作）</h3>
<p>まずはUbuntu環境に PostgreSQL が導入されているか確認する。未インストールの場合は、パッケージ管理システムの <code>apt</code> を用いて以下の通り導入を行う。</p>
<h4>■ インストールの確認と実行</h4>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 15px; background-color: #222; color: #fff; font-size: 0.9em; margin: 15px 0; line-height: 1.5; overflow-x: auto;"># パッケージインデックスの更新とインストール<br />
sudo apt update<br />
sudo apt install -y postgresql postgresql-contrib<br />
<br />
# データベースサービスの起動ステータス確認<br />
sudo systemctl status postgresql</div>
<hr />
<h3>2. スクリプトファイルの作成</h3>
<p>検証用の作業ディレクトリを作成し、テストとして「Hello World」の文字列を出力するだけのシンプルなSQLファイルを用意する。</p>
<h4>■ 作業フォルダの作成と移動</h4>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 15px; background-color: #222; color: #fff; font-size: 0.9em; margin: 15px 0; line-height: 1.5; overflow-x: auto;">mkdir ~/psql-study &amp;&amp; cd ~/psql-study</div>
<h4>■ テスト用SQLファイルの作成（コマンドラインより生成）</h4>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 15px; background-color: #222; color: #fff; font-size: 0.9em; margin: 15px 0; line-height: 1.5; overflow-x: auto;">echo "SELECT 'Hello World' AS message;" &gt; hello.sql</div>
<hr />
<h3>3. PostgreSQLへのログイン</h3>
<p>UbuntuにおけるPostgreSQLの初期設定では、データベースの最高管理権限は <code>postgres</code> という名前のOSユーザーに紐づけられている。<br />
そのため、以下のようにOSの管理者権限を介して <code>psql</code> シェルへログインする。</p>
<h4>■ 管理者権限（スーパーユーザー）でのログイン</h4>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 15px; background-color: #222; color: #fff; font-size: 0.9em; margin: 15px 0; line-height: 1.5; overflow-x: auto;">sudo -u postgres psql</div>
<p>※ <code>sudo -u postgres</code> を付与することで、ログインパスワードの入力を求めることなく、安全にPostgreSQLの内部プロンプトへ入ることができる。</p>
<hr />
<h3>4. ファイルの実行（対話モードでの実践）</h3>
<p><code>psql</code> の対話型プロンプト内で、先ほど作成した外部の <code>.sql</code> ファイルを読み込んで実行させる。</p>
<h4>■ スクリプトの実行メタコマンド</h4>
<p>プロンプト <code>postgres=#</code> が表示されている状態で、ファイルを指定して以下のインクルードコマンドを入力する。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 15px; background-color: #222; color: #fff; font-size: 0.9em; margin: 15px 0; line-height: 1.5; overflow-x: auto;">postgres=# \i hello.sql</div>
<h4>■ 期待される実行出力</h4>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 15px; background-color: #f5f5f5; font-size: 0.9em; margin: 15px 0; line-height: 1.4;">&nbsp;&nbsp;&nbsp;message&nbsp;&nbsp;&nbsp;&nbsp;<br />
-------------<br />
&nbsp;Hello World<br />
(1 row)</div>
<p>無事に結果が得られたら、以下のメタコマンドで対話型シェルを終了（離脱）する。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 15px; background-color: #222; color: #fff; font-size: 0.9em; margin: 15px 0; line-height: 1.5; overflow-x: auto;">postgres=# \q</div>
<hr />
<h3>5. 本質的な「検証」：OSコマンドラインからの非対話実行</h3>
<p>実際のシステム運用や、シェルスクリプト（Cronジョブなど）による自動バッチ処理にSQLを組み込む際、わざわざ対話モードに手動ログインするのは現実的ではない。<br />
そこで、プロンプトに入らず、<b>Ubuntuのコマンドラインから直接SQLファイルを流し込んで結果を得る</b>方法を検証する。</p>
<p>ターミナル上で、ディレクトリが <code>~/psql-study</code> にあることを確認し、以下のコマンドを実行する。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 15px; background-color: #222; color: #fff; font-size: 0.9em; margin: 15px 0; line-height: 1.5; overflow-x: auto;">sudo -u postgres psql -f hello.sql</div>
<h4>■ 技術解説：<code>-f</code> オプションの役割</h4>
<p><code>-f</code>（file）オプションを使用することで、指定したファイルの中身を直接PostgreSQLのエンジンにパイプラインで流し込み、実行結果をそのまま標準出力（stdout）としてターミナルへ戻すことができる。</p>
<p>この非対話コマンドが正常に通れば、<b>「SQLファイルの外部実行プロセス」</b>がUbuntu環境において正しくセットアップできている証明となる。これをベースに、シェルスクリプトでのデータ抽出や定期バックアップタスク等への応用が可能だ。<br />
<br />
<br />
</p>]]>
    </description>
    <category>【データベース:PostgreSQL】</category>
    <link>https://aieyzumcrgpdbggt.blog.shinobi.jp/Entry/917/</link>
    <pubDate>Sun, 07 Jun 2026 21:44:23 GMT</pubDate>
    <guid isPermaLink="false">aieyzumcrgpdbggt.blog.shinobi.jp://entry/917</guid>
  </item>
    <item>
    <title>【データベースの知識】データベース運用の基本「3つのバックアップ方式」とその選び方</title>
    <description>
    <![CDATA[<p>データベース（DB）の運用において、万が一のシステム障害やデータ破損、誤操作からデータを守るバックアップ設計は生命線である。<br />
データベースのバックアップは、データの採取範囲や運用のコスト（容量や処理時間）に応じて主に<b>3つの方式</b>に分類される。今回はそれぞれの仕組みとメリット・デメリット、そして選定基準を分かりやすく解説する。</p>
<hr />
<h3>1. フルバックアップ（完全バックアップ）</h3>
<p>対象となるデータベース内の<b>すべてのデータ</b>を丸ごと丸ごとバックアップする方式。</p>
<ul>
<li><b>仕組み：</b> 基準となる時点のデータを1つのまとまったファイルとして完全に複製する。</li>
<li><b>メリット：</b> 復旧（リストア）作業が極めてシンプルである。万が一の際は、このフルバックアップデータを1回書き戻すだけで、その時点の状態を完全に再現できる。</li>
<li><b>デメリット：</b> データ量に比例して、バックアップの実行時間が最も長くかかり、保管に必要なストレージ容量も最大となる。</li>
</ul>
<hr />
<h3>2. 差分バックアップ（ディファレンシャル）</h3>
<p><b>「最後のフルバックアップ」から「現在」まで</b>の間に変更・追加されたデータのみを抽出してバックアップする方式。</p>
<ul>
<li><b>仕組み：</b> 起点は常に「直近のフルバックアップ」となる。そのため、フルバックアップからの日数が経つにつれて、日毎に差分データのサイズは徐々に肥大化していく。</li>
<li><b>メリット：</b> 復旧（リストア）の際は、「直近のフルバックアップ」と「最新の差分バックアップ」の<b>計2点</b>があれば良いため、比較的スピーディーに復旧が完了する。</li>
<li><b>デメリット：</b> フルバックアップから次のフルバックアップまでの期間が長いと、後半の差分バックアップのサイズが大きくなり、日々のバックアップ時間が長くなってしまう。</li>
</ul>
<hr />
<h3>3. 増分バックアップ（インクリメンタル）</h3>
<p>フルか差分かを問わず、<b>「前回のバックアップ（直近の何らかのバックアップ）」から「現在」まで</b>の間に変更・追加されたデータのみを抽出する方式。</p>
<ul>
<li><b>仕組み：</b> 常に「一回前のバックアップ時点」からの変化量だけを追いかける。日々のデータ量は最小限に抑えられる。</li>
<li><b>メリット：</b> 日常的なバックアップ実行時間が最も短く、消費するストレージ容量も最小限に抑えることができる。高頻度（1時間毎など）でバックアップを取りたい場合に最適。</li>
<li><b>デメリット：</b> 復旧（リストア）のハードルが上がる。復旧には「直近のフルバックアップ」に加え、それ以降に取得した<b>すべての増分バックアップファイルを順番通りにすべて適用する</b>必要がある。もし途中の1世代でもファイルが破損していると、それ以降のデータに復旧できなくなるリスクがある。</li>
</ul>
<hr />
<h3>4. まとめ：各方式の比較表と選定戦略</h3>
<p>運用の現場では、どれか一つの方式だけを採用するのではなく、一般的に<b>「週末にフルバックアップを取得し、平日に差分（または増分）を取得する」</b>といった組み合わせによる戦略（世代管理）がとられる。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; font-size: 0.95em; margin: 15px 0; line-height: 1.6;"><b>【3大バックアップ方式のクイック比較】</b><br />

<table style="width: 100%; border-collapse: collapse; margin-top: 10px;">
<tbody>
<tr style="background-color: #e5e5e5;"><th style="border: 1px solid #ccc; padding: 8px;">方式</th><th style="border: 1px solid #ccc; padding: 8px;">日々の実行時間</th><th style="border: 1px solid #ccc; padding: 8px;">消費容量</th><th style="border: 1px solid #ccc; padding: 8px;">リストアの容易さ</th></tr>
<tr>
<td style="border: 1px solid #ccc; padding: 8px; font-weight: bold;">フル</td>
<td style="border: 1px solid #ccc; padding: 8px;">長い</td>
<td style="border: 1px solid #ccc; padding: 8px;">大</td>
<td style="border: 1px solid #ccc; padding: 8px; color: #008000; font-weight: bold;">最高（1ファイルで完了）</td>
</tr>
<tr>
<td style="border: 1px solid #ccc; padding: 8px; font-weight: bold;">差分</td>
<td style="border: 1px solid #ccc; padding: 8px;">中</td>
<td style="border: 1px solid #ccc; padding: 8px;">中</td>
<td style="border: 1px solid #ccc; padding: 8px; color: #0055ff;">良好（フル ＋ 最新の差分）</td>
</tr>
<tr>
<td style="border: 1px solid #ccc; padding: 8px; font-weight: bold;">増分</td>
<td style="border: 1px solid #ccc; padding: 8px; color: #008000; font-weight: bold;">最短</td>
<td style="border: 1px solid #ccc; padding: 8px; color: #008000; font-weight: bold;">極小</td>
<td style="border: 1px solid #ccc; padding: 8px; color: #cc0000;">複雑（フル ＋ 全増分が必要）</td>
</tr>
</tbody>
</table>
</div>
<p>システムの許容できる停止時間（RTO）や、データ復旧の目標地点（RPO）、利用可能なディスク予算のバランスを考慮し、最適なバックアップ計画を組み立ててほしい。<br />
<br />
<br />
</p>]]>
    </description>
    <category>【データベースの知識】</category>
    <link>https://aieyzumcrgpdbggt.blog.shinobi.jp/Entry/916/</link>
    <pubDate>Sat, 06 Jun 2026 05:46:48 GMT</pubDate>
    <guid isPermaLink="false">aieyzumcrgpdbggt.blog.shinobi.jp://entry/916</guid>
  </item>
    <item>
    <title>【Oracle Cloud Free &amp; DB】第7回：初期状態の「ユーザー」を暴く！PaaSの中に並ぶアカウントの正体</title>
    <description>
    <![CDATA[<p><br />
前回まで、Autonomous Database（26ai）の論理的な表領域の特性や、裏側に隠されたマルチテナント（PDB）固有の物理ファイルパスを確認してきました。ストレージ構造の次は、データベースの『セキュリティ』に切り込んでみましょう。<br />
クラウドでインスタンスを作成した際、最初からどのようなユーザー（スキーマ）が定義されており、どんな状態で管理されているのか、データ・ディクショナリから実態を調査します。</p>
<h3 style="color: blue;">1. 初期ユーザーの定義状態とアカウントステータス</h3>
<p>まずは、データベース作成直後の初期状態で、どのようなユーザーが存在しているのかを一覧で確認します。Oracle全体のユーザー情報を一元管理している <b><code style="color: dimgray;">DBA_USERS</code></b> ビューから、主要なユーザーとそのアカウント状態（STATUS）を抽出してみましょう。なお、このクエリはすべて切り出された私たちの個室（PDB）側の環境を覗いています。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">★ <b>初期ユーザーの状態を確認するSQL</b>：<br />
<code style="color: dimgray;"> SELECT username, account_status, default_tablespace, profile<br />
FROM dba_users<br />
ORDER BY username; </code><br />
<br />
<b>【実行結果（主要なユーザーの抜粋）】</b><br />
"USERNAME","ACCOUNT_STATUS","DEFAULT_TABLESPACE","PROFILE"<br />
"ADMIN","OPEN","DATA","BM_PROFILE"<br />
"SYS","OPEN","SYSTEM","DEFAULT"<br />
"SYSTEM","OPEN","SYSTEM","DEFAULT"<br />
"AUDSYS","LOCKED","SYSAUX","DEFAULT"<br />
"APPQOSSYS","LOCKED","SYSAUX","DEFAULT"<br />
"DBSNMP","LOCKED","SYSAUX","MONITORING_PROFILE"<br />
"OJVMSYS","LOCKED","SYSTEM","DEFAULT"<br />
"XDB","LOCKED","SYSAUX","DEFAULT"</div>
<p><b>【結果解説：ACCOUNT_STATUS（アカウント状態）の意味】</b><br />
ズラリと並んだ実行結果のステータスには、Oracleのセキュリティ設計の基本がそのまま現れています。</p>
<ul>
<li><b>OPEN（オープン）：</b>現在、正常にログインして操作ができる「生きている」ユーザーです。私たちが使う <b><code style="color: dimgray;">ADMIN</code></b> や、裏で常に稼働している主要なコアシステム（<code style="color: dimgray;">SYS</code> や <code style="color: dimgray;">SYSTEM</code>）など、ごく僅かなアカウントだけがこの状態を許されています。</li>
<li><b>LOCKED（ロック）：</b>アカウントが凍結されている状態です。これらはOracle内部の特定の機能（監査や監視など）を動かすためだけに用意された専用ユーザーであり、悪意ある第三者が乗っ取って外部から不正ログインできないよう、安全のために最初からガチガチに鍵がかけされています。</li>
<li><b>EXPIRED &amp; LOCKED（期限切れ＆ロック）：</b>パスワードの有効期限が切れ、さらにアカウントもロックされている二重ロック状態です（上記抜粋外の多くのシステムユーザーが該当します）。現在は使われていない、完全に眠っている内部機能用のスキーマです。</li>
</ul>
<p><b>【マルチテナントの仕様：なぜPDBにSYSやSYSTEMがいるの？】</b><br />
「全体の親玉（CDB）ではなく個室（PDB）を見ているのに、なぜ最高権限のSYSやSYSTEMが一覧に並んでいるの？」と疑問に思うかもしれません。<br />
これはマルチテナントの仕様によるものです。新しく個室（PDB）が作成された瞬間、その個室単体を管理・独立稼働させるためのシステムユーザー一式が、各PDBの内部にも自動的に複製されて配置される仕組みになっています。つまり、ここに並んでいる `SYS` や `SYSTEM` は、全体の親玉ではなく<b>「この個室専用に配属された管理ユーザー」</b>なのです。PaaSの自律運用の邪魔をしないよう、安全に制御されています。</p>
<h3 style="color: blue;">2. まとめ</h3>
<p>実機のデータ・ディクショナリからユーザー構造を紐解くことで、PaaS環境であってもOracle Databaseとしての堅牢なシステム構成がそのまま引き継がれていることが確認できました。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">★ <b>本日のチェックリスト</b>：<br />
1. 私たちが操作する「ADMIN」は個室（PDB）内のローカルユーザーとして、正常にOPENされている。<br />
2. 内部のシステムユーザーは、セキュリティの定石通り基本「LOCKED」状態で保護されている。<br />
3. PDB内に見えているSYSやSYSTEMは、個室が作成された際に自動複製された「個室専用の管理アカウント」。</div>
<p><br />
ストレージ（論理・物理）に続き、ユーザーの初期状態まで確認できました。完全管理型（PaaS）データベースの内部検証シリーズはここで一区切りとなります。<br />
次回第8回は、この「枠からはみ出せない」PaaSの安心安全な世界から飛び出し、<b>「もう一つの無料枠（Compute VM）」を立ち上げて、Linuxのroot権限、そしてデータベース全体の親玉であるCDB$ROOTまですべてを自分の完全な支配下に置く『IaaS型・23ai Express Edition 自作構築編』</b>へ突入します。コントロールを100%自分で握るインフラ構築の世界へ。どうぞお楽しみに！<br />
<br />
<br />
<br />
</p>]]>
    </description>
    <category>【データベース:Oracle】</category>
    <link>https://aieyzumcrgpdbggt.blog.shinobi.jp/Entry/915/</link>
    <pubDate>Sun, 31 May 2026 11:54:45 GMT</pubDate>
    <guid isPermaLink="false">aieyzumcrgpdbggt.blog.shinobi.jp://entry/915</guid>
  </item>

    </channel>
</rss>