<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>Wannabe Engineer&#39;s Journey</title>
      <link>https://wannabe-data-engineer.net</link>
      <description>クラウド・データ・AIなどについて記録するブログです。</description>
      <generator>Zola</generator>
      <language>ja</language>
      <atom:link href="https://wannabe-data-engineer.net/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Sun, 01 Nov 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>innodb_flush_log_at_trx_commitとinnodb_doublewriteについて</title>
          <pubDate>Sun, 08 Dec 2024 00:00:00 +0000</pubDate>
          <author>wannabe</author>
          <link>https://wannabe-data-engineer.net/innodb_flush_log_at_trx_commit-and-innodb_doublewrite/</link>
          <guid>https://wannabe-data-engineer.net/innodb_flush_log_at_trx_commit-and-innodb_doublewrite/</guid>
          <description xml:base="https://wannabe-data-engineer.net/innodb_flush_log_at_trx_commit-and-innodb_doublewrite/">&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/innodb_flush_log_at_trx_commit-and-innodb_doublewrite/eyechatch.png&quot; alt=&quot;innodb_flush_log_at_trx_commitとinnodb_doublewriteについて&quot; /&gt;&lt;/p&gt;
&lt;p&gt;MySQLのInnoDBの書き込み速度向上について、&lt;code&gt;innodb_flush_log_at_trx_commit&lt;/code&gt;や&lt;code&gt;innodb_doublewrite&lt;/code&gt;の設定を変更する方法が紹介されていることも多いです。&lt;/p&gt;
&lt;p&gt;紹介とともに設定変更による危険性について触れられているケースが大半ではありますが、先日、危険性を把握しないまま設定されているケースに遭遇しました。&lt;br /&gt;
危険性を説明しようと思った時に、実は自分でもそこまでよく理解していないことに気が付いたので、今回は改めてこれらの動作等についてまとめました。&lt;/p&gt;
&lt;h2 id=&quot;結論&quot;&gt;結論&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;innodb_flush_log_at_trx_commit&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;本番環境では原則的に&lt;code&gt;1&lt;/code&gt;にする&lt;/li&gt;
&lt;li&gt;クラッシュ時にデータが失われても問題がない場合(例えばやり直しがきくデータ移行のインポート時等)は&lt;code&gt;0&lt;/code&gt;または&lt;code&gt;2&lt;/code&gt;にしても問題ない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;innodb_doublewrite&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;クラッシュ時にデータが失われても問題がない場合(例えばやり直しがきくデータ移行のインポート時等)は&lt;code&gt;0&lt;/code&gt;にしても問題ない&lt;/li&gt;
&lt;li&gt;ファイルシステム側でページのアトミックな更新に対応しているのであれば&lt;code&gt;0&lt;/code&gt;にしても問題ない
&lt;ul&gt;
&lt;li&gt;例えば、&lt;code&gt;ZFS&lt;/code&gt;や&lt;code&gt;Fusion-io NVMFS&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RDS Optimized Writes&lt;/code&gt;を利用しているのであれば&lt;code&gt;0&lt;/code&gt;であっても問題ない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;データ更新の流れ&quot;&gt;データ更新の流れ&lt;/h2&gt;
&lt;p&gt;パラメータの役割に入る前に、どのような流れでデータが更新されているのかを、データの持ち方から確認していきます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/innodb_flush_log_at_trx_commit-and-innodb_doublewrite/innodb_data_change_simple_flow.png&quot; alt=&quot;innodb_flush_log_at_trx_commitとinnodb_doublewriteについて&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;バッファプール&quot;&gt;バッファプール&lt;/h3&gt;
&lt;p&gt;まず、InnoDBにおいては、データ操作はデータファイルを直接参照するのではなく、必ずデータファイルのデータをメモリ上に持ってきた上で行われます。これは、&lt;code&gt;SELECT&lt;/code&gt;、&lt;code&gt;UPDATE&lt;/code&gt;、&lt;code&gt;DELETE&lt;/code&gt;等の既に存在するデータに対する操作はもちろんのこと、まだデータが存在しない&lt;code&gt;INSERT&lt;/code&gt;処理も同様です。&lt;/p&gt;
&lt;p&gt;InnoDBは行本体がB-treeインデックスの葉の部分に格納されていますので、&lt;code&gt;INSERT&lt;/code&gt;処理の場合、その処理によって書き込まれる予定のページをB-treeインデックスをたどり、そのページ自体をメモリ上に展開し、それに対して書き込みます。&lt;/p&gt;
&lt;p&gt;このように、データを保存・操作する際に利用するのが、メモリ上のバッファプールと呼ばれる領域です。&lt;/p&gt;
&lt;h3 id=&quot;バッファプールとファイルデータの差異&quot;&gt;バッファプールとファイルデータの差異&lt;/h3&gt;
&lt;p&gt;さて、全ての操作がバッファプール上で行われるということは、バッファプールのデータとデータファイルのデータで必ず差異が発生してしまうということです。この、まだデータファイルに永続化が完了しておらず、差異が発生しているページのことをダーティページと呼びます。&lt;/p&gt;
&lt;p&gt;ダーティページは、定期的にページクリーナと呼ばれるバックグラウンドプロセスによりデータファイルにフラッシュ(書き込み)されます。フラッシュは、バッファプール上のダーティページの割合が&lt;code&gt;innodb_max_dirty_pages_pct_lwm&lt;/code&gt;で設定したパーセンテージを超えた後に開始されます。&lt;/p&gt;
&lt;p&gt;したがって、ダーティページが存在する状況というのは決して珍しいわけではありませんが、この状況でMySQLのプロセスが強制的に停止してしまうと、更新内容が消えてしまうということになります。これでは、コミットされたデータが失われないという「永続性」が担保できません。&lt;/p&gt;
&lt;p&gt;この対策として、コミットされたデータが失われないようにする、REDOログという仕組みがInnoDBには存在します。&lt;/p&gt;
&lt;h3 id=&quot;REDOログとログバッファ&quot;&gt;REDOログとログバッファ&lt;/h3&gt;
&lt;p&gt;REDOログとは、「どのような更新が行われたか」を保存しておくファイルのことです。ただし、これもバッファプールと同じく、まずはメモリ上にあるログバッファという領域で管理されます。&lt;/p&gt;
&lt;p&gt;それではバッファプールと同じで意味がないのではないかと思われますが、ログバッファの内容については、「通常」、トランザクションがコミットされた段階でREDOログにフラッシュされます。したがって、「コミットされたが永続化されていない」というケースは「通常」避けられているということです。&lt;/p&gt;
&lt;p&gt;これにより、万が一、ダーティページがある状態で意図せぬプロセス停止が発生したとしても、次回の起動時にREDOログからデータを復元することができます。このデータのリカバリ(クラッシュリカバリ)はMySQL側で自動的に行われます。&lt;/p&gt;
&lt;h2 id=&quot;innodb_flush_log_at_trx_commit&quot;&gt;innodb_flush_log_at_trx_commit&lt;/h2&gt;
&lt;p&gt;さて、いよいよ1つ目のパラメータ&lt;code&gt;innodb_flush_log_at_trx_commit&lt;/code&gt;についてです。上記でわざわざコミットされた段階でREDOログへフラッシュされる挙動を「通常」と記載したのは、これを設定でそのように動作させないこともできるためです。それが&lt;code&gt;innodb_flush_log_at_trx_commit&lt;/code&gt;です。&lt;/p&gt;
&lt;p&gt;通常、この値は&lt;code&gt;1&lt;/code&gt;であり、これは「コミット時にはログバッファの内容をフラッシュする」というものです。それでは、パフォーマンスを向上するという文脈で語られる、&lt;code&gt;innodb_flush_log_at_trx_commit&lt;/code&gt;を&lt;code&gt;0&lt;/code&gt;や&lt;code&gt;2&lt;/code&gt;に設定するとどうなるのでしょうか。まとめると、次の通りです。&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;値&lt;/th&gt;&lt;th&gt;挙動&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;ログバッファはコミット時にフラッシュされる&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;ログバッファは1秒間に1回フラッシュされる&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;ログバッファはコミット後と1秒間に1回フラッシュされる&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;code&gt;2&lt;/code&gt;は分かりにくいですが、&lt;code&gt;1&lt;/code&gt;がコミットが成功した時点でフラッシュされているのに対し、&lt;code&gt;2&lt;/code&gt;はコミット後にフラッシュを非同期で試みるため、ラグが発生し得るということです。&lt;/p&gt;
&lt;h3 id=&quot;innodb_flush_log_at_trx_commit_=_0_or_2_の使いどころ&quot;&gt;innodb_flush_log_at_trx_commit = 0 or 2 の使いどころ&lt;/h3&gt;
&lt;p&gt;前述の通り、&lt;code&gt;innodb_flush_log_at_trx_commit&lt;/code&gt;が&lt;code&gt;0&lt;/code&gt;だとIO自体が減り、&lt;code&gt;2&lt;/code&gt;だとコミット時のIO待ちがなくなるため、パフォーマンス向上につながります。&lt;br /&gt;
これは、データ移行のインポート処理時等に有用です。ここで仮にクラッシュしたとしても、またやり直せばいいからです。例えば、レプリカを手動で作成する際の初期データ移行時に設定して時間を短縮する等が考えられます。&lt;/p&gt;
&lt;p&gt;しかしながら、本番環境で&lt;code&gt;1&lt;/code&gt;以外を選択する場合、クラッシュした時に「コミットしたのにデータがない」という状況が発生してしまう可能性があるため、本当にそういった挙動で問題ないのかをしっかり考えた上で選択する必要があります。&lt;/p&gt;
&lt;p&gt;つまり、「処理が早くなるから」という理由だけで選択するのは極めて危険ということです。&lt;/p&gt;
&lt;h2 id=&quot;ダブルライト&quot;&gt;ダブルライト&lt;/h2&gt;
&lt;h3 id=&quot;概要&quot;&gt;概要&lt;/h3&gt;
&lt;p&gt;上記のデータ更新時の流れには記載していないのですが、実は、バッファプールからデータファイルにフラッシュする際は、「通常」、2度に分けて書き込まれます。1回目はダブルライトバッファと呼ばれるファイル上の連続した領域で、その後、データファイルに書き込みます。非常に紛らわしいのですが、バッファと言いつつメモリ上ではなくファイル上の領域です。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/innodb_flush_log_at_trx_commit-and-innodb_doublewrite/innodb_data_double_write_simple_flow.png&quot; alt=&quot;innodb_flush_log_at_trx_commitとinnodb_doublewriteについて&quot; /&gt;&lt;/p&gt;
&lt;p&gt;では、なぜこのような仕組みがとられているのでしょうか。それは、InnoDBのページサイズがファイルシステム側でアトミックに扱えるサイズを超えていることが多いためです。&lt;/p&gt;
&lt;p&gt;InnoDBのデフォルトのページサイズは16KBです。一方でext4やXFSのデフォルトは4KBです。例えば、最初の4KBを書き込んだ後にクラッシュした場合、残り12KBは書き込めていないので、データとして整合性がなく、かつ、リカバリもできません。&lt;br /&gt;
これを避け、正常にリカバリできるようにする仕組みがダブルライトです。&lt;/p&gt;
&lt;h3 id=&quot;不整合を避けられる理由&quot;&gt;不整合を避けられる理由&lt;/h3&gt;
&lt;p&gt;次の2パターンに分けて不整合を避けられる理由を考えてみます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ダブルライトバッファに書き込み中にクラッシュ&lt;/li&gt;
&lt;li&gt;ダブルライトバッファからデータファイルに書き込み中にクラッシュ&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;ダブルライトバッファに書き込み中にクラッシュ&quot;&gt;ダブルライトバッファに書き込み中にクラッシュ&lt;/h4&gt;
&lt;p&gt;この場合、データファイルにはまだ実際に書き込みが行われていません。したがって、データファイルはダーティページをフラッシュする前の段階で整合性を保っており、ダブルライトを利用していたおかげで破損することが避けられました(本来であればこのタイミングで破損してしまうのをダブルライトバッファ側で吸収した)。&lt;/p&gt;
&lt;p&gt;また、コミットされたデータは&lt;code&gt;innodb_flush_log_at_trx_commit&lt;/code&gt;が&lt;code&gt;1&lt;/code&gt;なのであれば、前述の通り必ずREDOログに存在しています。なので、このREDOログを利用することにより、正常なデータファイルに対してコミット済みのデータを適用することができます。&lt;/p&gt;
&lt;h4 id=&quot;ダブルライトバッファからデータファイルに書き込み中にクラッシュ&quot;&gt;ダブルライトバッファからデータファイルに書き込み中にクラッシュ&lt;/h4&gt;
&lt;p&gt;この場合、ダブルライトバッファ上のページは正常です。したがって、単純にダブルライトバッファの内容をデータファイルに改めて書き込めば正常な状態になります。&lt;/p&gt;
&lt;h2 id=&quot;innodb_doublewrite&quot;&gt;innodb_doublewrite&lt;/h2&gt;
&lt;p&gt;さて、ここで表題の2つ目のパラメータ&lt;code&gt;innodb_doublewrite&lt;/code&gt;が出てきます。これを&lt;code&gt;0&lt;/code&gt;に設定するか、&lt;code&gt;--skip-innodb-doublewrite&lt;/code&gt;オプションを指定してMySQLを起動することで、ここまで説明してきたダブルライトを無効にすることができます。&lt;/p&gt;
&lt;p&gt;ダブルライトにより2回書き込みが発生すると言っても、ダブルライトバッファはシーケンシャルな領域なので、データファイルへの書き込みより高速であり、2倍の時間がかかるわけではありませんが、2回書き込みが発生するのを1回に抑えることができるため、パフォーマンスは向上します。&lt;/p&gt;
&lt;p&gt;しかしながら、ダーティページのフラッシュ中にクラッシュした場合、データファイルが破損してしまうという大きなリスクがあります。&lt;/p&gt;
&lt;h3 id=&quot;innodb_doublewrite_=_0_の使いどころ&quot;&gt;innodb_doublewrite = 0 の使いどころ&lt;/h3&gt;
&lt;p&gt;まず、&lt;code&gt;innodb_flush_log_at_trx_commit&lt;/code&gt;と同じく、データ移行のインポート時には有用です。クラッシュしても再度実行すればいいためです。&lt;br /&gt;
また、前述の通り、&lt;code&gt;innodb_doublewrite&lt;/code&gt;が必要な理由はファイルシステム側にありました。したがって、ファイルシステム側でアトミックな書き込みが保証できるのであれば、ダブルライトを無効にしても問題ないということです。&lt;/p&gt;
&lt;p&gt;例えば、ファイルシステムとして&lt;code&gt;Fusion-io NVMFS&lt;/code&gt;や&lt;code&gt;ZFS&lt;/code&gt;を利用する場合、ダブルライトを無効にしてファイルシステム側にクラッシュ対策を任せてしまうというものです。なお、&lt;code&gt;Fusion-io NVMFS&lt;/code&gt;の場合、自動で&lt;code&gt;0&lt;/code&gt;になります。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;二重書き込みバッファーがアトミック書き込みをサポートする Fusion-io デバイス上にある場合、二重書き込みバッファーは自動的に無効になり、代わりに Fusion-io アトミック書き込みを使用してデータファイル書き込みが実行されます。&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://dev.mysql.com/doc/refman/8.0/ja/innodb-parameters.html#sysvar_innodb_doublewrite&quot;&gt;innodb_doublewrite&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;あとは、&lt;code&gt;RDS Optimized Writes&lt;/code&gt;を利用する場合です。これは、&lt;code&gt;rds.optimized_writes&lt;/code&gt;パラメータを設定することで利用できる機能であり、利用中の場合は&lt;code&gt;innodb_doublewrite&lt;/code&gt;が&lt;code&gt;0&lt;/code&gt;になります。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;これらのデータベースは、AWS Nitro System を使用する DB インスタンスクラスで実行されます。これらのシステムのハードウェア構成により、データベースは 16 KiB ページを 1 ステップで確実かつ永続的にデータファイルに直接書き込むことができます。AWS Nitro System により RDS Optimized Writes が可能になります。&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/rds-optimized-writes.html&quot;&gt;RDS Optimized Writes for MySQL による書き込みパフォーマンスの向上&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;REDOログとバイナリログ(binlog)の違い&quot;&gt;REDOログとバイナリログ(binlog)の違い&lt;/h2&gt;
&lt;p&gt;InnoDBのREDOログと、MySQLのバイナリログは混同しやすいものですので、バイナリログについても記載しておきます。&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;項目&lt;/th&gt;&lt;th&gt;REDOログ&lt;/th&gt;&lt;th&gt;バイナリログ&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;スコープ&lt;/td&gt;&lt;td&gt;InnoDB&lt;/td&gt;&lt;td&gt;MySQL全体&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;用途&lt;/td&gt;&lt;td&gt;クラッシュリカバリ&lt;/td&gt;&lt;td&gt;レプリケーション、PITR&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;保持内容&lt;/td&gt;&lt;td&gt;物理的変更内容&lt;/td&gt;&lt;td&gt;論理的変更内容&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ファイル上書き&lt;/td&gt;&lt;td&gt;される&lt;/td&gt;&lt;td&gt;されない&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;用途&quot;&gt;用途&lt;/h3&gt;
&lt;p&gt;REDOログは前述の通りクラッシュリカバリに利用することが目的ですが、バイナリログはレプリケーションやPITR(ポイント・イン・タイム・リカバリ)に利用することが目的です。&lt;/p&gt;
&lt;p&gt;REDOログはあくまでInnoDB側で出力するInnoDB向けのログであり、MySQL全体の記録にはならないため、レプリケーション等には利用できません。一方で、バイナリログも後述のように論理的な記録に過ぎないので、クラッシュリカバリの観点だと利用できません。&lt;/p&gt;
&lt;h3 id=&quot;物理的か論理的か&quot;&gt;物理的か論理的か&lt;/h3&gt;
&lt;p&gt;REDOログが「InnoDB」の変更を「物理的に」記録したものであるのに対して、バイナリログは、「MySQL全体」の変更を「論理的に」記録するものです。&lt;/p&gt;
&lt;p&gt;物理的な記録というのは、「このページのこの位置はこういうデータからこういうデータになりました」というものです。一方で論理的な記録というのは、「このテーブルはこのデータからこういうデータになりました」というものです。バイナリログ側では物理的なデータファイルを意識しません。&lt;/p&gt;
&lt;p&gt;また、バイナリログは出力形式を&lt;code&gt;STATEMENT&lt;/code&gt;、&lt;code&gt;MIXED&lt;/code&gt;、&lt;code&gt;ROW&lt;/code&gt;から選べますが、&lt;code&gt;STATEMENT&lt;/code&gt;の場合は、「このテーブルにはこういうSQLが実行されました」という記録しか行われません。&lt;/p&gt;
&lt;h3 id=&quot;ファイルが上書きされるかされないか&quot;&gt;ファイルが上書きされるかされないか&lt;/h3&gt;
&lt;p&gt;ファイルが上書きされるかされないかという点も違いがあります。&lt;/p&gt;
&lt;p&gt;REDOログはクラッシュリカバリが主目的であるため、データファイルにダーティページが書き込まれた後は、その情報をずっと保持しておく必要はありません。したがって、不要になった情報は上書きしても問題ないため、REDOログファイルは再利用(以前保存した情報が上書き)されます。&lt;/p&gt;
&lt;p&gt;一方でバイナリログは再利用されません。&lt;code&gt;expire_logs_days&lt;/code&gt;や&lt;code&gt;binlog_expire_logs_seconds&lt;/code&gt;で設定した期限を超過するか、手動で消されるまで情報が残り続けます。&lt;/p&gt;
&lt;h2 id=&quot;最後に&quot;&gt;最後に&lt;/h2&gt;
&lt;p&gt;パフォーマンス向上の観点で語られることもある&lt;code&gt;innodb_flush_log_at_trx_commit&lt;/code&gt;や&lt;code&gt;innodb_doublewrite&lt;/code&gt;は特徴を理解した上で設定変更する場合は有用ですが、安易な設定変更はクラッシュ時のデータ損失のリスクがあります。&lt;/p&gt;
&lt;p&gt;とりあえず「なんか早くなるらしい」ということで設定されているケースを見かけて改めて感じましたが、私自身も、気が付かないうちにそういうことをやっているのかもしれないなと思いました。&lt;/p&gt;
&lt;p&gt;人の振り見て我が振り直せと言いますが、私自身、そういうことがないよう、パラメータを変更する場合は、しっかり変更の意味を考えた上で対応できるようにしたいです。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>AWS Certified Data Engineer - Associate(DEA-C01)に合格しました</title>
          <pubDate>Sun, 28 Apr 2024 00:00:00 +0000</pubDate>
          <author>wannabe</author>
          <link>https://wannabe-data-engineer.net/aws-certified-data-engineer-associate/</link>
          <guid>https://wannabe-data-engineer.net/aws-certified-data-engineer-associate/</guid>
          <description xml:base="https://wannabe-data-engineer.net/aws-certified-data-engineer-associate/">&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/aws-certified-data-engineer-associate/eyechatch.png&quot; alt=&quot;AWS Certified Data Engineer&quot; /&gt;&lt;/p&gt;
&lt;p&gt;先日、AWS Certified Data Engineer - Associate(AWS 認定 データエンジニア アソシエイト)(DEA-C01)に合格しましたので、感想や対策について記載致します。&lt;/p&gt;
&lt;h2 id=&quot;試験感想&quot;&gt;試験感想&lt;/h2&gt;
&lt;p&gt;アソシエイトレベルだと思って軽く見ていましたが、深い部分まで問われるような問題もあります。中途半端な知識や、キーワードを知っているだけだと引っ掛かる問題もあります。&lt;br /&gt;
また、本当の本当にごく一部ですが、AWS Certified Database - Specialty(AWS 認定 データベース – 専門知識)向けに勉強したレベルのものが要求される部分もありました。&lt;/p&gt;
&lt;p&gt;したがって、後述する、試験を受ける上で重要そうなサービス等について、しっかり勉強することが合格への近道かと存じます。&lt;/p&gt;
&lt;p&gt;また、公式のガイドで下記のようにプログラミングについて言及されていますが、開発に関連する分野の問題(SQL等)も含まれると考えた方がいいかもしれません。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;この試験では、コーディングの深い実務経験は必要ありませんが、基本的なプログラミングの概念に精通していると有利です。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;なお、AWSの資格として、一番最初にDEAの取得を目指される方はあまりいらっしゃらないかもしれませんが、DEAとSAAならば、先にSAAを取得されることをお勧め致します。全体的なSAAレベルの知識は選択肢の絞り込みに役立ちますし、おそらく、SAAよりDEAの方が難しいです。&lt;/p&gt;
&lt;p&gt;スコアとしては1000/1000で合格できましたが、おそらく、分からなかった問題は運よく当たったのと、採点対象外の問題があったのかと存じます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/aws-certified-data-engineer-associate/dea-01_score_report.png&quot; alt=&quot;AWS Certified Data Engineer&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;試験対策&quot;&gt;試験対策&lt;/h2&gt;
&lt;p&gt;おおよそ、次のような流れで試験対策を実施しました。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;インプット
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://aws.amazon.com/jp/events/aws-event-resource/archive/&quot;&gt;AWS サービス別資料(BlackBelt)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;アウトプット
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.udemy.com/course/practice-exams-aws-certified-data-engineer-associate/&quot;&gt;Practice Exams | AWS Certified Data Engineer Associate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.udemy.com/course/aws-certified-data-engineer-associate-practice-exams-dea/&quot;&gt;AWS Certified Data Engineer Associate Practice Exams DEA-C01&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;インプット&quot;&gt;インプット&lt;/h3&gt;
&lt;p&gt;AWSのサービス概要をインプットする際の資料としては、&lt;a rel=&quot;external&quot; href=&quot;https://aws.amazon.com/jp/events/aws-event-resource/archive/&quot;&gt;AWS サービス別資料(BlackBelt)&lt;/a&gt;がお勧めです。&lt;br /&gt;
やや古い資料もあるため、最近の機能には触れられていない部分もありますが(試験では最近の機能について出ることもあります)、概要を理解するには最適です。&lt;/p&gt;
&lt;p&gt;下記に、あくまで執筆時点で個人的に重要そうだと感じた順番で、AWSサービスをリストします。&lt;br /&gt;
なお、下記のサービス以外も出題される可能性は十分あります。また、感想でも書きましたが、全体的にSAAレベルの内容は把握しておくと選択肢を絞り込む上で役に立ちます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;深い知識が必要
&lt;ul&gt;
&lt;li&gt;Glue&lt;/li&gt;
&lt;li&gt;Redshift&lt;/li&gt;
&lt;li&gt;Athena&lt;/li&gt;
&lt;li&gt;Lake Formation&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;それなりの知識が必要
&lt;ul&gt;
&lt;li&gt;S3&lt;/li&gt;
&lt;li&gt;Step Functions&lt;/li&gt;
&lt;li&gt;Lambda&lt;/li&gt;
&lt;li&gt;DynamoDB&lt;/li&gt;
&lt;li&gt;KMS(Key Management Service)&lt;/li&gt;
&lt;li&gt;Kinesis Data Streams&lt;/li&gt;
&lt;li&gt;Managed Service for Apache Flink(旧Kinesis Data Analytics)&lt;/li&gt;
&lt;li&gt;Data Firehose(旧Kinesis Data Firehose)&lt;/li&gt;
&lt;li&gt;RDS&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;周辺知識として必要
&lt;ul&gt;
&lt;li&gt;SageMaker&lt;/li&gt;
&lt;li&gt;EventBridge&lt;/li&gt;
&lt;li&gt;CloudTrail&lt;/li&gt;
&lt;li&gt;API Gateway&lt;/li&gt;
&lt;li&gt;AppFlow&lt;/li&gt;
&lt;li&gt;Data Exchange&lt;/li&gt;
&lt;li&gt;DMS(Database Migration Service)&lt;/li&gt;
&lt;li&gt;IAM&lt;/li&gt;
&lt;li&gt;VPC&lt;/li&gt;
&lt;li&gt;ElastiCache&lt;/li&gt;
&lt;li&gt;EKS(Elastic Kubernetes Service)&lt;/li&gt;
&lt;li&gt;ECS(Elastic Container Service)&lt;/li&gt;
&lt;li&gt;EC2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;アウトプット&quot;&gt;アウトプット&lt;/h3&gt;
&lt;p&gt;試験対策のアウトプットとしてお勧めなのが、Udemyの次の2つの問題集です。解説も丁寧ですし、他の方のレビューもいいので、役立つ問題集かと存じます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.udemy.com/course/practice-exams-aws-certified-data-engineer-associate/&quot;&gt;Practice Exams | AWS Certified Data Engineer Associate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.udemy.com/course/aws-certified-data-engineer-associate-practice-exams-dea/&quot;&gt;AWS Certified Data Engineer Associate Practice Exams DEA-C01&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;問題文は英語ですが、テキストとしてコピーすることが可能なため、翻訳サービスを利用することもできます。翻訳後の日本語も不自然すぎるようなものはありませんでした。&lt;/p&gt;
&lt;p&gt;そっくりそのまま出題されるわけではありませんが、解説を読んで不正解の選択肢がなぜ不正解なのかも含めて理解し、ドキュメントのリンクから周辺知識もインプットすると、試験に非常に役立ちます。&lt;/p&gt;
&lt;p&gt;2つの問題集で、各選択肢がなぜ不正解かの理由も含め、正解率95%以上を安定して出せるようになった段階で受験しました。&lt;/p&gt;
&lt;h2 id=&quot;試験Tips&quot;&gt;試験Tips&lt;/h2&gt;
&lt;p&gt;あまり深くは記載できませんが、受験にあたり、特に意識しておくと役に立つかもしれない項目について記載致します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Glueは深く問われる覚悟をする&lt;/li&gt;
&lt;li&gt;Redshiftの対策ついでにSQLも対策しておく&lt;/li&gt;
&lt;li&gt;複数が正解に思える時は最も重視されていることを考える&lt;/li&gt;
&lt;li&gt;迷ったらAWSが推してそうなものを選ぶ&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;Glueは深く問われる覚悟をする&quot;&gt;Glueは深く問われる覚悟をする&lt;/h3&gt;
&lt;p&gt;私が甘く見ていただけですが、「アソシエイトなのにそんなことまで聞いてくるの？」とテスト中に画面の前で青ざめてました。&lt;br /&gt;
「Glue」と一言で表しても、そこには様々な機能(Data Catalog、Workflows、Studio等)が内包されています。捨て機能はないものと思って対策しておいた方が良いかもしれません。&lt;/p&gt;
&lt;h3 id=&quot;Redshiftの対策ついでにSQLも対策しておく&quot;&gt;Redshiftの対策ついでにSQLも対策しておく&lt;/h3&gt;
&lt;p&gt;Redshiftの対策を行うついでに、ドキュメントでSQLも見ておくと安定するかもしれません。&lt;br /&gt;
「基礎的なSQLは知ってるから大丈夫」という方も、ざっと見ておくと実は知らない機能や使い方があるかもしれませんので、確認されるのをお勧め致します。&lt;/p&gt;
&lt;h3 id=&quot;複数が正解に思える時は最も重視されていることを考える&quot;&gt;複数が正解に思える時は最も重視されていることを考える&lt;/h3&gt;
&lt;p&gt;「技術的にはどちらも可能」という選択肢がある場合は、改めて何が重視されているのかを見ると絞れるケースがあるかもしれません。&lt;br /&gt;
特に実務をしていると「安い」「簡単」という選択肢に飛びつきがちですが、実は別のことが問われているかもしれません。&lt;/p&gt;
&lt;h3 id=&quot;迷ったらAWSが推してそうなものを選ぶ&quot;&gt;迷ったらAWSが推してそうなものを選ぶ&lt;/h3&gt;
&lt;p&gt;一種のメタ読みですが、試験対策の問題を解く過程、また、実際に試験を進めていく過程で、おおよそAWSが推したいサービスが見えてくるかと存じます。&lt;br /&gt;
したがって、どうしても絞れない時は、どちらのサービスが強く推されているかで選択すると、実は正解というケースもあるかもしれません。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Kinesisエージェントのアップデートについて</title>
          <pubDate>Fri, 31 Dec 2021 00:00:00 +0000</pubDate>
          <author>wannabe</author>
          <link>https://wannabe-data-engineer.net/update-kinesis-agent/</link>
          <guid>https://wannabe-data-engineer.net/update-kinesis-agent/</guid>
          <description xml:base="https://wannabe-data-engineer.net/update-kinesis-agent/">&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/update-kinesis-agent/eyechatch.png&quot; alt=&quot;Kinesisエージェントのアップデートについて&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Kinesisエージェントのアップデートについて、および、脆弱性にも関連するLog4jの利用について記載します。Kinesisエージェント自体に関する記事は&lt;a rel=&quot;external&quot; href=&quot;https://wannabe-data-engineer.net/kinesis-agent-to-s3-via-firehose/&quot;&gt;Kinesis AgentとFirehoseを利用してEC2からS3にログを転送する&lt;/a&gt;をご参照ください。&lt;/p&gt;
&lt;h2 id=&quot;アップデート&quot;&gt;アップデート&lt;/h2&gt;
&lt;p&gt;次のコマンドにてアップデートを行うことができます。&lt;/p&gt;
&lt;h3 id=&quot;Amazon_Linux系&quot;&gt;Amazon Linux系&lt;/h3&gt;
&lt;p&gt;Amazon Linux系については、通常通りパッケージ名を指定してアップデートが可能です。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# yum update aws-kinesis-agent&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;その他RHEL系&quot;&gt;その他RHEL系&lt;/h3&gt;
&lt;p&gt;その他、RHEL系のOSについては、更新先のKinesisエージェントのバージョンが1系か2系かで異なります。特別な事情等がない限り、2系にアップデートすることをお勧め致します。1系から2系にアップデートすることも可能です。&lt;/p&gt;
&lt;h4 id=&quot;バージョン1系&quot;&gt;バージョン1系&lt;/h4&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# yum update https://s3.amazonaws.com/streaming-data-agent/aws-kinesis-agent-latest.amzn1.noarch.rpm&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&quot;バージョン2系&quot;&gt;バージョン2系&lt;/h4&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# yum update https://s3.amazonaws.com/streaming-data-agent/aws-kinesis-agent-latest.amzn2.noarch.rpm&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;バージョン確認&quot;&gt;バージョン確認&lt;/h3&gt;
&lt;p&gt;次のようなコマンドにてバージョン等を含むパッケージの情報を取得することができます。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# rpm -qi aws-kinesis-agent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;        : aws-kinesis-agent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Version&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;     :&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 2.0.4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Release&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;     : 1.amzn2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Architecture:&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; noarch&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Install&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; Date: Fri&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 31&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; Dec&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 2021&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; 05:21:34 AM UTC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Group&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;       : Applications/Communications&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Size&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;        :&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 25523949&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;License&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;     : Amazon Software License and Apache&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 2.0&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; and MIT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Signature&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;   :&lt;/span&gt;&lt;span&gt; (none)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Source&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; RPM  : aws-kinesis-agent-2.0.4-1.amzn2.src.rpm&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Build&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; Date  : Wed&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 15&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; Dec&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 2021&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; 03:18:21 AM UTC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Build&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; Host  : build.amazon.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Relocations&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; :&lt;/span&gt;&lt;span&gt; (not&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; relocatable&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Packager&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;    : Amazon Linux&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Vendor&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;      : Amazon Linux&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;URL&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;         : http://aws.amazon.com/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Summary&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;     : Amazon Kinesis Streaming Data Agent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Description&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; :&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;aws-kinesis-agent&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; is a software service that runs on customer hosts and continuously monitors a set of log files&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;and&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; sends new data to the Amazon Kinesis Stream service and Amazon Kinesis Firehose service in near-real-time.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;アップデート後&quot;&gt;アップデート後&lt;/h3&gt;
&lt;p&gt;基本的に特別な対応は必要ない想定です。私の環境では、Kinesisエージェントの設定内容や、サービスの自動起動設定等も引き継がれたことが確認できました。&lt;/p&gt;
&lt;p&gt;念のため、事前に開発環境等にてアップデートが正常に実行できることと、アップデート後もKinesisにデータを転送できていることを確認する程度で問題ないかと存じます。&lt;/p&gt;
&lt;h2 id=&quot;Log4jについて&quot;&gt;Log4jについて&lt;/h2&gt;
&lt;p&gt;KinesisエージェントはLog4jを利用しています。しかしながら、内部的なログ出力に利用しているだけで、外部からの入力値をログ出力するような仕組みではないため、世間を騒がせた&lt;a rel=&quot;external&quot; href=&quot;https://www.jpcert.or.jp/at/2021/at210050.html&quot;&gt;Apache Log4jの任意のコード実行の脆弱性（CVE-2021-44228）に関する注意喚起&lt;/a&gt;の影響は受けない想定です。&lt;/p&gt;
&lt;p&gt;また、&lt;a rel=&quot;external&quot; href=&quot;https://github.com/awslabs/amazon-kinesis-agent/releases/tag/1.1.5&quot;&gt;Amazon Kinesis Agent 1.1.5.1&lt;/a&gt;未満を利用している場合は、そもそもLog4jがバージョン1系のものであるため、上記の脆弱性の影響は受けない想定です。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Upgraded log4j dependency to 2.x.&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/awslabs/amazon-kinesis-agent/releases/tag/1.1.5&quot;&gt;Amazon Kinesis Agent 1.1.5.1&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;しかしながら、「とにかくアップデートする」という方針もあるかもしれませんので、その場合は上述の方法をご参考にアップデートいただければと存じます。&lt;/p&gt;
&lt;p&gt;なお、下記のように、2系にアップデートしても、日本時間2021年12月31日時点では、エージェントは2.0.4で、Log4jは2.16でした。Log4jは2.17以降のバージョンでも脆弱性が見つかっているようなので、~~そちらには対応できていない状況です。~~おそらく、いずれ対応されてパッケージにもされるかとは存じます。&lt;br /&gt;
※追記: 日本時間2022年1月11日時点では、エージェントのバージョンが2.0.6で、Log4jについても2.17.1になっていました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;エージェント2.0.4&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# ls -1 /usr/share/aws-kinesis-agent/lib&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;aws-java-sdk-cloudwatch-1.11.700.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;aws-java-sdk-core-1.11.700.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;aws-java-sdk-ec2-1.11.700.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;aws-java-sdk-kinesis-1.11.700.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;aws-java-sdk-sts-1.11.700.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;AWSKinesisStreamingDataAgent-1.1.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;commons-cli-1.2.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;commons-codec-1.6.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;commons-lang3-3.4.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;commons-logging-adapters-1.1.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;commons-logging-api-1.1.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;guava-28.2-jre.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;httpclient-4.5.1.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;httpclient-cache-4.5.1.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;httpcore-4.4.3.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;httpcore-ab-4.4.3.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;httpcore-nio-4.4.3.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;httpmime-4.5.1.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;jackson-annotations-2.10.3.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;jackson-core-2.10.3.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;jackson-databind-2.10.5.1.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;jackson-dataformat-cbor-2.10.3.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;jackson-dataformat-xml-2.10.3.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;jcommander-1.48.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;joda-time-2.8.2.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;jsr305-3.0.1.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;log4j-1.2-api-2.16.0.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;log4j-api-2.16.0.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;log4j-core-2.16.0.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;log4j-slf4j-impl-2.16.0.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;slf4j-api-1.7.12.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;sqlite-jdbc-3.20.1.jar&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;エージェント2.0.6&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# rpm -qi aws-kinesis-agent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;        : aws-kinesis-agent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Version&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;     :&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 2.0.6&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Release&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;     : 1.amzn2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Architecture:&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; noarch&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Install&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; Date: Tue&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 11&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; Jan&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 2022&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; 10:16:31 AM UTC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Group&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;       : Applications/Communications&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Size&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;        :&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 25568570&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;License&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;     : Amazon Software License and Apache&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 2.0&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; and MIT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Signature&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;   :&lt;/span&gt;&lt;span&gt; (none)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Source&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; RPM  : aws-kinesis-agent-2.0.6-1.amzn2.src.rpm&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Build&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; Date  : Fri&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 07&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; Jan&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 2022&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; 05:44:46 PM UTC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Build&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; Host  : build.amazon.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Relocations&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; :&lt;/span&gt;&lt;span&gt; (not&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; relocatable&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Packager&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;    : Amazon Linux&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Vendor&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;      : Amazon Linux&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;URL&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;         : http://aws.amazon.com/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Summary&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;     : Amazon Kinesis Streaming Data Agent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Description&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; :&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;aws-kinesis-agent&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; is a software service that runs on customer hosts and continuously monitors a set of log files&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;and&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; sends new data to the Amazon Kinesis Stream service and Amazon Kinesis Firehose service in near-real-time.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# ls -1 /usr/share/aws-kinesis-agent/lib&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;aws-java-sdk-cloudwatch-1.11.700.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;aws-java-sdk-core-1.11.700.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;aws-java-sdk-ec2-1.11.700.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;aws-java-sdk-kinesis-1.11.700.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;aws-java-sdk-sts-1.11.700.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;AWSKinesisStreamingDataAgent-1.1.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;commons-cli-1.2.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;commons-codec-1.6.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;commons-lang3-3.4.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;commons-logging-adapters-1.1.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;commons-logging-api-1.1.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;guava-29.0-jre.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;httpclient-4.5.13.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;httpclient-cache-4.5.1.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;httpcore-4.4.3.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;httpcore-ab-4.4.3.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;httpcore-nio-4.4.3.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;httpmime-4.5.1.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;jackson-annotations-2.10.3.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;jackson-core-2.10.3.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;jackson-databind-2.10.5.1.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;jackson-dataformat-cbor-2.10.3.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;jackson-dataformat-xml-2.10.3.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;jcommander-1.48.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;joda-time-2.8.2.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;jsr305-3.0.1.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;log4j-1.2-api-2.17.1.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;log4j-api-2.17.1.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;log4j-core-2.17.1.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;log4j-slf4j-impl-2.17.1.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;slf4j-api-1.7.12.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;sqlite-jdbc-3.20.1.jar&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</description>
      </item>
      <item>
          <title>max_wal_sendersの調整に関するRDSイベントについて</title>
          <pubDate>Sat, 27 Nov 2021 00:00:00 +0000</pubDate>
          <author>wannabe</author>
          <link>https://wannabe-data-engineer.net/max_wal_senders-adjusted-rds-event/</link>
          <guid>https://wannabe-data-engineer.net/max_wal_senders-adjusted-rds-event/</guid>
          <description xml:base="https://wannabe-data-engineer.net/max_wal_senders-adjusted-rds-event/">&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/max_wal_senders-adjusted-rds-event/eyechatch.png&quot; alt=&quot;max_wal_sendersの調整に関するRDSイベントについて&quot; /&gt;&lt;/p&gt;
&lt;p&gt;RDS for PostgreSQLを利用時に&lt;code&gt;The parameter max_wal_senders was set to a value incompatible with replication. It has been adjusted from xx to yy.&lt;/code&gt;というRDSイベントが発生する件についてです。&lt;/p&gt;
&lt;h2 id=&quot;結論&quot;&gt;結論&lt;/h2&gt;
&lt;p&gt;結論としましては次のとおりです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;パラメータ&lt;code&gt;rds.logical_replication&lt;/code&gt;を有効(&lt;code&gt;1&lt;/code&gt;)に設定し、インスタンスの再起動を行った際に発生することがある&lt;/li&gt;
&lt;li&gt;インスタンスの稼働に影響がなく無視しても良いRDSイベント(執筆時点)
&lt;ul&gt;
&lt;li&gt;※フォーラムレベル、AWSサポートレベルで確認&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;max_wal_senders&lt;/code&gt;の値を&lt;code&gt;adjusted from xx to yy&lt;/code&gt;の調整値&lt;code&gt;yy&lt;/code&gt;に指定すれば出力されなくなる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;rds.logical_replicationについて&quot;&gt;rds.logical_replicationについて&lt;/h2&gt;
&lt;p&gt;当該パラメータはRDSでロジカルレプリケーションを行う際に指定するパラメータです。デフォルトは無効(&lt;code&gt;0&lt;/code&gt;)です。&lt;/p&gt;
&lt;p&gt;パラメータ名からも察しがつきますが、RDS独自のパラメータです。通常のPostgreSQLの&lt;code&gt;wal_level&lt;/code&gt;に相当するもので、有効(&lt;code&gt;1&lt;/code&gt;)に設定すると&lt;code&gt;wal_level&lt;/code&gt;も&lt;code&gt;logical&lt;/code&gt;に変更されます。&lt;br /&gt;
※RDSでは&lt;code&gt;wal_level&lt;/code&gt;パラメータを変更することができないため、その代替のようなものです。&lt;/p&gt;
&lt;p&gt;したがって、特にロジカルレプリケーションを実施されていない場合は、無効(&lt;code&gt;0&lt;/code&gt;)にしてしまっても問題ございません。&lt;/p&gt;
&lt;h2 id=&quot;検証&quot;&gt;検証&lt;/h2&gt;
&lt;p&gt;実際にRDS for PostgreSQL 13を利用して確認してみました。&lt;/p&gt;
&lt;h3 id=&quot;rds.logical_replication_=_0&quot;&gt;rds.logical_replication = 0&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;rds.logical_replication&lt;/code&gt;が&lt;code&gt;0&lt;/code&gt;の時の再起動時のRDSイベントです。再起動が行われても特に何も出力されないことが確認できます。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;log&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;November &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;26&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2021&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;10:26:36&lt;/span&gt;&lt;span&gt; PM UTC DB instance shutdown&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;November &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;26&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2021&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;10:26:51&lt;/span&gt;&lt;span&gt; PM UTC  DB instance restarted&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;rds.logical_replication_=_1&quot;&gt;rds.logical_replication = 1&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;rds.logical_replication&lt;/code&gt;を&lt;code&gt;1&lt;/code&gt;に変更して再起動を行った際のRDSイベントです。再起動に伴い、「The parameter max_wal_senders was set to a value incompatible with replication. It has been adjusted from 20 to 25.」というイベントが出力されていることが分かります。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;log&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;November &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;26&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2021&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;10:34:53&lt;/span&gt;&lt;span&gt; PM UTC Finished updating DB parameter group&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;November &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;26&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2021&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;10:35:21&lt;/span&gt;&lt;span&gt; PM UTC  DB instance shutdown&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;November &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;26&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2021&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;10:35:24&lt;/span&gt;&lt;span&gt; PM UTC  The parameter max_wal_senders was set to a value incompatible with replication. It has been adjusted from &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;20&lt;/span&gt;&lt;span&gt; to &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;25&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;November &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;26&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2021&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;10:35:37&lt;/span&gt;&lt;span&gt; PM UTC  DB instance restarted&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;rds.logical_replication_=_1_and_max_wal_senders_=_調整値&quot;&gt;rds.logical_replication = 1 and max_wal_senders = 調整値&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;rds.logical_replication&lt;/code&gt;を&lt;code&gt;1&lt;/code&gt;に設定している状態で、&lt;code&gt;max_wal_senders&lt;/code&gt;の値を調整後の&lt;code&gt;25&lt;/code&gt;に変更した場合です。再起動時のメッセージが出力されていないことが確認できます。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;log&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;November &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;26&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2021&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;10:47:22&lt;/span&gt;&lt;span&gt; PM UTC Finished updating DB parameter group&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;November &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;26&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2021&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;10:47:58&lt;/span&gt;&lt;span&gt; PM UTC  DB instance shutdown&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;November &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;26&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2021&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;10:48:14&lt;/span&gt;&lt;span&gt; PM UTC  DB instance restarted&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;しかしながら、特に有害というわけでもございませんので、無理して値を変更する必要もないかと存じます。&lt;/p&gt;
&lt;h2 id=&quot;フォーラム情報&quot;&gt;フォーラム情報&lt;/h2&gt;
&lt;p&gt;なお、フォーラムにも本件に関連する情報がございましたので、ご参考までに共有致します。&lt;/p&gt;
&lt;p&gt;原因についての言及はございませんが、既知の事象である点と、影響はない点の記載がございます。AWSサポートに確認した内容とも意味的な相違はございませんので、正しい情報かと存じます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Message: &quot;The parameter max_wal_senders was set to a value incompatible with replication. It has been adjusted from 10 to 15.&quot;,&quot;&lt;/p&gt;
&lt;p&gt;Please be assured the above message is a known message when an RDS instance is restarted, this event is harmless and has no performance impact on the instance. Kindly note that the internal team is aware of this event occurrence and is working on rolling out a fix.&lt;/p&gt;
&lt;p&gt;Hence, currently, there is no requirement of setting up the above parameter and you can safely ignore this Warning message until the internal team rolls out a fix at the backend.&lt;/p&gt;
&lt;p&gt;Unfortunately, I do not have a valid ETA for when the fix will be rolled out by internal team, however please be assured that this message is harmless and it&#39;s level is &quot;Warning&quot; and no action is required from your end.&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://forums.aws.amazon.com/thread.jspa?messageID=903598&amp;amp;tstart=0&quot;&gt;max_wal_senders invalid setting&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</description>
      </item>
      <item>
          <title>Pythonでgzipファイルを解凍する</title>
          <pubDate>Sun, 31 Oct 2021 00:00:00 +0000</pubDate>
          <author>wannabe</author>
          <link>https://wannabe-data-engineer.net/python-gunzip/</link>
          <guid>https://wannabe-data-engineer.net/python-gunzip/</guid>
          <description xml:base="https://wannabe-data-engineer.net/python-gunzip/">&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/python-gunzip/eyechatch.png&quot; alt=&quot;Pythonでgzipファイルを解凍する&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Pythonでgzipファイルを解凍する方法について記載します。gzip圧縮されたログファイル等を扱う際に利用できるかもしれません。&lt;/p&gt;
&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;/h2&gt;
&lt;p&gt;gzipファイルを扱う際は共通して&lt;a rel=&quot;external&quot; href=&quot;https://docs.python.org/ja/3/library/gzip.html&quot;&gt;gzip&lt;/a&gt;を利用しています。標準ライブラリです。&lt;br /&gt;
また、今回はPython 3.7を利用して動作確認を行っています。マイナーバージョンが違っても、3系なら動くとは思います。&lt;/p&gt;
&lt;h2 id=&quot;ファイルに解凍する&quot;&gt;ファイルに解凍する&lt;/h2&gt;
&lt;p&gt;gzipファイルを解凍した結果をファイルとして扱いたいケースです。例えば、ファイルのアップロードを行いたい場合や、他処理のインプットがファイル形式の場合等が考えられます。&lt;/p&gt;
&lt;h3 id=&quot;shutil.copyfileobj()&quot;&gt;shutil.copyfileobj()&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://docs.python.org/ja/3/library/shutil.html#shutil.copyfileobj&quot;&gt;shutil.copyfileobj()&lt;/a&gt;を利用して、読み込んだgzipのファイルオブジェクトを別ファイルとしてコピーする方法です。個人的には一番好きな手法です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;サンプル&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;import&lt;/span&gt;&lt;span&gt; gzip&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;import&lt;/span&gt;&lt;span&gt; shutil&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;source_file&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;quot;file.txt.gz&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;target_file&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;quot;file.txt&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;with&lt;/span&gt;&lt;span&gt; gzip.open(source_file,&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt; mode&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;rb&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; as&lt;/span&gt;&lt;span&gt; gzip_file:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;    with&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; open&lt;/span&gt;&lt;span&gt;(target_file,&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt; mode&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;wb&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; as&lt;/span&gt;&lt;span&gt; decompressed_file:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        shutil.copyfileobj(gzip_file, decompressed_file)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;write()&quot;&gt;write()&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://docs.python.org/ja/3/tutorial/inputoutput.html&quot;&gt;write()&lt;/a&gt;を利用して、読み込んだファイルオブジェクトを別ファイルに書き込む方法です。別の情報も併せて書き込みたい時等には役立つかもしれません。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;サンプル&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;import&lt;/span&gt;&lt;span&gt; gzip&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;source_file&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;quot;file.txt.gz&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;target_file&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;quot;file.txt&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;with&lt;/span&gt;&lt;span&gt; gzip.open(source_file,&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt; mode&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;rb&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; as&lt;/span&gt;&lt;span&gt; gzip_file:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    content&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; gzip_file.read()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;    with&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; open&lt;/span&gt;&lt;span&gt;(target_file,&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt; mode&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;wb&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; as&lt;/span&gt;&lt;span&gt; decompressed_file:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        decompressed_file.write(content)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;subprocess&quot;&gt;subprocess&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://docs.python.org/ja/3/library/subprocess.html&quot;&gt;subprocess&lt;/a&gt;を利用して、OSコマンドから解凍する方法です。自分で実装するより、OSコマンドを利用する方が安心できるという時には良いかもしれません。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;サンプル&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;import&lt;/span&gt;&lt;span&gt; subprocess&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;source_file&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;quot;file.txt.gz&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;command&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;gunzip&amp;quot;&lt;/span&gt;&lt;span&gt;, source_file]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;subprocess.run(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    command,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;    stdout&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;subprocess.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;PIPE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;    stderr&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;subprocess.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;STDOUT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;sh&quot;&gt;sh&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://amoffat.github.io/sh/&quot;&gt;sh&lt;/a&gt;を利用して、OSコマンドから解凍する方法です。なお、&lt;code&gt;sh&lt;/code&gt;は標準ライブラリではないので、別途インストールする必要があります(&lt;code&gt;pip&lt;/code&gt;で可能です)。全体の記述行を少しでも減らしたい場合には良いかもしれません。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;サンプル&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; sh&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; import&lt;/span&gt;&lt;span&gt; gunzip&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;source_file&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;quot;file.txt.gz&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;gunzip(source_file)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;中身を直接読み込む&quot;&gt;中身を直接読み込む&lt;/h2&gt;
&lt;p&gt;gzipファイルの中身を直接読み込むケースです。単純にファイルの情報が必要なだけで、解凍されたファイルが欲しいわけではないといった状況が考えられます。&lt;/p&gt;
&lt;p&gt;モードで&lt;code&gt;t&lt;/code&gt;を指定することでテキストとして、&lt;code&gt;b&lt;/code&gt;を指定することでバイナリとして読み込むことができます。&lt;/p&gt;
&lt;h3 id=&quot;元ファイル&quot;&gt;元ファイル&lt;/h3&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; cat&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;#39;_EOF_&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; file.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-2&quot;&gt;春は花&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-2&quot;&gt;夏ほととぎす&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-2&quot;&gt;秋は月&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-2&quot;&gt;冬雪さえて&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-2&quot;&gt;すずしかりけり&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-2&quot;&gt;_EOF_&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; gzip file.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;テキストモード&quot;&gt;テキストモード&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;str&lt;/code&gt;型で取得することができます。なお、&lt;code&gt;open&lt;/code&gt;時に&lt;code&gt;encoding&lt;/code&gt;のオプションを利用することで、エンコードモードを指定することもできます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;サンプル&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import&lt;/span&gt;&lt;span&gt; gzip&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; source_file&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;quot;file.txt.gz&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;&amp;gt;&amp;gt; with&lt;/span&gt;&lt;span&gt; gzip.open(source_file,&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt; mode&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;rt&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; as&lt;/span&gt;&lt;span&gt; gzip_file:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;...&lt;/span&gt;&lt;span&gt;     content&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; gzip_file.read()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;...     type&lt;/span&gt;&lt;span&gt;(content)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;...     print&lt;/span&gt;&lt;span&gt;(content)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;...&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;lt;class&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;str&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;春は花&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;夏ほととぎす&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;秋は月&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;冬雪さえて&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;すずしかりけり&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;バイナリモード&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;bytes&lt;/code&gt;型で取得することができます。今回のサンプルでは文字列をデコードして再表示していますが、もちろん、そのまま&lt;code&gt;bytes&lt;/code&gt;型で扱うこともできます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;サンプル&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import&lt;/span&gt;&lt;span&gt; gzip&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; source_file&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;quot;file.txt.gz&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;&amp;gt;&amp;gt; with&lt;/span&gt;&lt;span&gt; gzip.open(source_file,&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt; mode&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;rb&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; as&lt;/span&gt;&lt;span&gt; gzip_file:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;...&lt;/span&gt;&lt;span&gt;     content&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; gzip_file.read()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;...     type&lt;/span&gt;&lt;span&gt;(content)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;...     print&lt;/span&gt;&lt;span&gt;(content)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;...     print&lt;/span&gt;&lt;span&gt;(content.decode())&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;...&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;lt;class&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;bytes&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;\xe6\x98\xa5\xe3\x81\xaf\xe8\x8a\xb1\n\xe5\xa4\x8f\xe3\x81\xbb\xe3\x81\xa8\xe3\x81\xa8\xe3\x81\x8e\xe3\x81\x99\n\xe7\xa7\x8b\xe3\x81\xaf\xe6\x9c\x88\n\xe5\x86\xac\xe9\x9b\xaa\xe3\x81\x95\xe3\x81\x88\xe3\x81\xa6\n\xe3\x81\x99\xe3\x81\x9a\xe3\x81\x97\xe3\x81\x8b\xe3\x82\x8a\xe3\x81\x91\xe3\x82\x8a\n&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;春は花&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;夏ほととぎす&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;秋は月&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;冬雪さえて&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;すずしかりけり&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</description>
      </item>
      <item>
          <title>RDSのリストア・マルチAZ化時にはパフォーマンス低下に注意する</title>
          <pubDate>Sat, 25 Sep 2021 00:00:00 +0000</pubDate>
          <author>wannabe</author>
          <link>https://wannabe-data-engineer.net/rds-restore-performance-degradation/</link>
          <guid>https://wannabe-data-engineer.net/rds-restore-performance-degradation/</guid>
          <description xml:base="https://wannabe-data-engineer.net/rds-restore-performance-degradation/">&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/rds-restore-performance-degradation/eyechatch.png&quot; alt=&quot;RDSのリストア・マルチAZ化時にはパフォーマンス低下に注意する&quot; /&gt;&lt;/p&gt;
&lt;p&gt;構成変更や障害対応で、RDSをスナップショットからリストアしたり、マルチAZ化したりすることもあるかもしれません。その際、パフォーマンスが低下することがあります。本記事では、その点について記載致します。&lt;/p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;RDSをスナップショットからリストアしたり、マルチAZ化してから、全ブロックにIOが発生するまでの間は、IOパフォーマンスが著しく低下する可能性があります。&lt;/p&gt;
&lt;p&gt;これは、全てのストレージブロックがリストア時に物理的にロードされるわけではないためです。初回アクセス時には、S3からブロックをロードするというオーバーヘッドが発生する可能性があります。&lt;/p&gt;
&lt;p&gt;パフォーマンスが元に戻らなければサービスが再開できないような場合は、テーブル全件走査等でブロックにIOを発生させ、S3からのロードを完了させるという手順を踏む必要があります。&lt;/p&gt;
&lt;p&gt;また、本記事で詳細は記載しませんが、リストア後はキャッシュが空白となっているため、データがキャッシュの乗り切るまでパフォーマンスが低下することもあります。&lt;/p&gt;
&lt;p&gt;なお、Auroraについては、その他のRDSと根本的にアーキテクチャが異なるものになっているため、本記事で記載しているような問題は発生しません。&lt;/p&gt;
&lt;h2 id=&quot;RDSのスナップショットリストア&quot;&gt;RDSのスナップショットリストア&lt;/h2&gt;
&lt;h3 id=&quot;RDSのストレージ領域&quot;&gt;RDSのストレージ領域&lt;/h3&gt;
&lt;p&gt;まず、RDSは、各インスタンスがそれぞれストレージ領域として独立したEBSを利用する構成となっています(※)。これはマルチAZ構成にした場合のスタンバイ側も同じです。&lt;br /&gt;
※Auroraは、データのストレージについてはクラスタ内部のインスタンス間で共有しているため、個別に保有している領域としてはログや一時ファイルに利用する領域のみです。&lt;/p&gt;
&lt;p&gt;したがって、RDSのスナップショットを取得する機能は、RDSが利用しているEBSのスナップショットを取得することと意味合い的には同じとなります。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;MySQL、MariaDB、PostgreSQL、Oracle、および Microsoft SQL Server 用の Amazon RDS の DB インスタンスは、データベースおよびログのストレージに Amazon Elastic Block Store (Amazon EBS) ボリュームを使用します。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_Storage.html&quot;&gt;Amazon RDS DB インスタンスストレージ&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;EBSスナップショットのリストア&quot;&gt;EBSスナップショットのリストア&lt;/h3&gt;
&lt;p&gt;「EBSスナップショットのリストア」という文言になると思い当たる方もいらっしゃるかもしれませんが、リストアは全てのストレージブロックをロードするものではありません。実際には、ストレージブロックの初回アクセス時にS3から対象がロードされるような仕組みとなります。&lt;/p&gt;
&lt;p&gt;当然、この初回アクセス時には、S3からのロードという比較的コストの高いオーバーヘッドが発生するため、通常のIOよりもパフォーマンスが低下します。&lt;/p&gt;
&lt;p&gt;これが、RDSをスナップショットからリストアした際にパフォーマンスが低下する大きな原因の1つです(その他、キャッシュやAZ変更等の要因もあり得ますが)。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;スナップショットから作成されたボリュームの場合、アクセスする前に、ストレージブロックが Amazon S3 からプルダウンされてボリュームに書き込こまれる必要があります。この事前処理には一定の時間がかかるため、各ブロックへの初回アクセス時には、I/O 操作のレイテンシーが著しく増加する可能性があります。ボリュームのパフォーマンスは、すべてのブロックがダウンロードされてボリュームに書き込まれると正常値に達します。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-initialize.html&quot;&gt;Amazon EBS ボリュームの初期化&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;マルチAZ構成&quot;&gt;マルチAZ構成&lt;/h3&gt;
&lt;p&gt;また、RDSのマルチAZ構成は、プライマリ側のスナップショットを作成し、そのスナップショットを別のAZにリストアすることで実現します。つまり、ここでも「EBSスナップショットのリストア」が発生します。&lt;/p&gt;
&lt;p&gt;マルチAZ構成の場合、プライマリとスタンバイのレプリケーションは「同期」方式となるため、スタンバイ側のIOパフォーマンスが低下すると、プライマリ側のパフォーマンスもあわせて低下します。&lt;/p&gt;
&lt;p&gt;これが、マルチAZ構成に変更した直後のパフォーマンス低下の大きな原因の1つです(もちろん、AZ間通信等のオーバーヘッドもあるため、一般的にシングルAZ構成よりもパフォーマンスは低下します)。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;DB インスタンスでマルチ AZ を有効にするため、RDS はプライマリ DB インスタンスの EBS ボリュームのスナップショットを取得し、新しく作成されたスタンバイレプリカに復元してから、両方のボリュームを同期します。既存の EBS スナップショットを基に作成された新しいボリュームは、バックグラウンドで時間をかけて読み込まれます。この機能を使用すると、スナップショットから大量のボリュームをすばやく復元できますが、変更中および変更完了後にレイテンシーが高くなる可能性があります。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Concepts.MultiAZ.html#Concepts.MultiAZ.Migrating&quot;&gt;DB インスタンスをマルチ AZ 配置にする&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;スナップショットリストア後のパフォーマンス改善&quot;&gt;スナップショットリストア後のパフォーマンス改善&lt;/h2&gt;
&lt;h3 id=&quot;通常インスタンス&quot;&gt;通常インスタンス&lt;/h3&gt;
&lt;p&gt;スナップショットからリストアした通常のインスタンスの場合(マルチAZ構成のスタンバイインスタンスでない場合)、ユーザはデータベースにログインすることが可能です。&lt;/p&gt;
&lt;p&gt;したがって、&lt;code&gt;SELECT * FROM {table_name};&lt;/code&gt;等のSQLにより、全件走査を行うことで、ストレージブロックをS3からロードすることができます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;クイックアクセスが必要なテーブルに対する遅延ロードの影響を軽減するには、SELECT * など、テーブル全体をスキャンするようなオペレーションを実行します。これにより、Amazon RDS はバックアップされたテーブルデータをすべて S3 からダウンロードできます。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_RestoreFromSnapshot.html&quot;&gt;DB スナップショットからの復元&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Oracleの場合は、&lt;code&gt;DBMS_STATS.GATHER_SCHEMA_STATS&lt;/code&gt;や&lt;code&gt;ANALYZE(現在は非推奨)&lt;/code&gt;等を利用して統計情報を取得することでIOを発生させることもできます。&lt;br /&gt;
※経験則的に、なぜか&lt;code&gt;DBMS_STATS.GATHER_SCHEMA_STATS&lt;/code&gt;だとパフォーマンスが改善しないこともありましたが、効率的なIOのため、全件走査に至らなかったのかもしれません。&lt;/p&gt;
&lt;p&gt;PostgreSQLの場合は、&lt;code&gt;VACUUM FREEZE ANALYZE&lt;/code&gt;等でIOを発生させることもできます。&lt;br /&gt;
※&lt;code&gt;FREEZE&lt;/code&gt;を付けないと効率的なIOが選択され、全件走査に至らない可能性があります。&lt;/p&gt;
&lt;h3 id=&quot;スタンバイインスタンス&quot;&gt;スタンバイインスタンス&lt;/h3&gt;
&lt;p&gt;通常インスタンスと異なりユーザはログインすることができません。したがって、考えられる対応としては次のようなものに限られます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;フェイルオーバーを伴う再起動を行い、プライマリに昇格させて、全件走査を行う&lt;/li&gt;
&lt;li&gt;プライマリ側でデータを全件削除後、再度挿入を行う&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;対応自体に手間と時間を要するので、おとなしくパフォーマンスが改善するまで待つ方が現実的かもしれません。&lt;/p&gt;
&lt;h2 id=&quot;最後に&quot;&gt;最後に&lt;/h2&gt;
&lt;p&gt;知っていれば当たり前のことではありますが、スナップショットからのリストアやマルチAZ化は手軽であるがために、リストア後のパフォーマンス低下については考慮されていないケースも見かけます。&lt;/p&gt;
&lt;p&gt;経験上、リストア直後の処理に通常の3倍以上の時間を要したこともありますので、リストアやマルチAZ化を行う際は、バッチ処理等の時間が延びることも考えた上で、計画を立てた方が良いかもしれません。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>FargateからgsutilがCaught exception reading instance dataで実行できない事象について</title>
          <pubDate>Sat, 28 Aug 2021 00:00:00 +0000</pubDate>
          <author>wannabe</author>
          <link>https://wannabe-data-engineer.net/fargate-gsutil-caught-exception-reading-instance-data/</link>
          <guid>https://wannabe-data-engineer.net/fargate-gsutil-caught-exception-reading-instance-data/</guid>
          <description xml:base="https://wannabe-data-engineer.net/fargate-gsutil-caught-exception-reading-instance-data/">&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/fargate-gsutil-caught-exception-reading-instance-data/eyechatch.png&quot; alt=&quot;FargateからgsutilがCaught exception reading instance dataで実行できない事象について&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Fargateタスクから&lt;code&gt;gsutil&lt;/code&gt;コマンドを実行し、S3にアクセスする際、&lt;code&gt;Caught exception reading instance data&lt;/code&gt;というエラーが出て、認証に失敗する事象についてです。&lt;/p&gt;
&lt;h2 id=&quot;結論&quot;&gt;結論&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gsutil&lt;/code&gt;コマンドの仕様です(執筆時点)&lt;/li&gt;
&lt;li&gt;タスクロールではなく環境変数でAWSの認証情報を指定することで対応可能です
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AWS_ACCESS_KEY_ID&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AWS_SECRET_ACCESS_KEY&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AWS_DEFAULT_REGION&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下、詳細です。&lt;/p&gt;
&lt;h2 id=&quot;事象詳細&quot;&gt;事象詳細&lt;/h2&gt;
&lt;p&gt;S3に対する適切な権限を付与しているIAMロールをFargateタスクのタスクロールに指定している状態にも関わらず、&lt;code&gt;gsutil&lt;/code&gt;コマンドを利用してS3にアクセスすると、下記のようなエラーが発生するといった事象です。&lt;/p&gt;
&lt;p&gt;権限設定、シンタックス等に間違いはないため、例えば、EC2上で同じことを行った場合は処理が正常に完了します。つまり、Fargateタスクで実行する際に特有の事象です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;エラー&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;log&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-2&quot;&gt;ERROR&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 0904&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt; 05:23:14.152952&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; utils.py&lt;/span&gt;&lt;span&gt;] Caught exception reading instance data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Traceback (most recent call last):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  File &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;/usr/lib/python3.7/urllib/request.py&amp;quot;&lt;/span&gt;&lt;span&gt;, line &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1324&lt;/span&gt;&lt;span&gt;, in do_open&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    encode_chunked=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;req.has_header&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;#39;Transfer-encoding&amp;#39;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  File &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;/usr/lib/python3.7/http/client.py&amp;quot;&lt;/span&gt;&lt;span&gt;, line &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1244&lt;/span&gt;&lt;span&gt;, in request&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;    self._send_request&lt;/span&gt;&lt;span&gt;(method, url, body, headers, encode_chunked)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  File &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;/usr/lib/python3.7/http/client.py&amp;quot;&lt;/span&gt;&lt;span&gt;, line &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1290&lt;/span&gt;&lt;span&gt;, in _send_request&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;    self.endheaders&lt;/span&gt;&lt;span&gt;(body, encode_chunked=encode_chunked)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  File &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;/usr/lib/python3.7/http/client.py&amp;quot;&lt;/span&gt;&lt;span&gt;, line &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1239&lt;/span&gt;&lt;span&gt;, in endheaders&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;    self._send_output&lt;/span&gt;&lt;span&gt;(message_body, encode_chunked=encode_chunked)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  File &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;/usr/lib/python3.7/http/client.py&amp;quot;&lt;/span&gt;&lt;span&gt;, line &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1026&lt;/span&gt;&lt;span&gt;, in _send_output&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;    self.send&lt;/span&gt;&lt;span&gt;(msg)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  File &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;/usr/lib/python3.7/http/client.py&amp;quot;&lt;/span&gt;&lt;span&gt;, line &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;966&lt;/span&gt;&lt;span&gt;, in send&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;    self.connect&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  File &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;/usr/lib/python3.7/http/client.py&amp;quot;&lt;/span&gt;&lt;span&gt;, line &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;938&lt;/span&gt;&lt;span&gt;, in connect&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    (&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;self.host&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;self.port&lt;/span&gt;&lt;span&gt;), &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;self.timeout&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;self.source_address&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  File &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;/usr/lib/python3.7/socket.py&amp;quot;&lt;/span&gt;&lt;span&gt;, line &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;727&lt;/span&gt;&lt;span&gt;, in create_connection&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    raise err&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  File &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;/usr/lib/python3.7/socket.py&amp;quot;&lt;/span&gt;&lt;span&gt;, line &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;716&lt;/span&gt;&lt;span&gt;, in create_connection&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;    sock.connect&lt;/span&gt;&lt;span&gt;(sa)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;OSError: [Errno &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;22&lt;/span&gt;&lt;span&gt;] Invalid argument&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;During handling of the above exception, another exception occurred:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Traceback (most recent call last):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  File &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;/usr/lib/google-cloud-sdk/platform/gsutil/gslib/vendored/boto/boto/utils.py&amp;quot;&lt;/span&gt;&lt;span&gt;, line &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;220&lt;/span&gt;&lt;span&gt;, in retry_url&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    r = &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;opener.open&lt;/span&gt;&lt;span&gt;(req, timeout=timeout)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  File &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;/usr/lib/python3.7/urllib/request.py&amp;quot;&lt;/span&gt;&lt;span&gt;, line &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;525&lt;/span&gt;&lt;span&gt;, in open&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    response = &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;self._open&lt;/span&gt;&lt;span&gt;(req, data)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  File &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;/usr/lib/python3.7/urllib/request.py&amp;quot;&lt;/span&gt;&lt;span&gt;, line &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;543&lt;/span&gt;&lt;span&gt;, in _open&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-2&quot;&gt;    &amp;#39;_open&amp;#39;&lt;/span&gt;&lt;span&gt;, req)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  File &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;/usr/lib/python3.7/urllib/request.py&amp;quot;&lt;/span&gt;&lt;span&gt;, line &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;503&lt;/span&gt;&lt;span&gt;, in _call_chain&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    result = func(*args)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  File &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;/usr/lib/python3.7/urllib/request.py&amp;quot;&lt;/span&gt;&lt;span&gt;, line &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1352&lt;/span&gt;&lt;span&gt;, in http_open&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    return &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;self.do_open&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;http.client.HTTPConnection&lt;/span&gt;&lt;span&gt;, req)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  File &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;/usr/lib/python3.7/urllib/request.py&amp;quot;&lt;/span&gt;&lt;span&gt;, line &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1326&lt;/span&gt;&lt;span&gt;, in do_open&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    raise URLError(err)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;urllib.error.URLError&lt;/span&gt;&lt;span&gt;: &amp;lt;urlopen error [Errno &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;22&lt;/span&gt;&lt;span&gt;] Invalid argument&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-2&quot;&gt;ERROR&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 0904&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt; 05:23:14.154281&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; utils.py&lt;/span&gt;&lt;span&gt;] Unable to read instance data, giving up&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Caught non-retryable exception while listing s3://XXXXX/YYYYY/ZZZZZ/: No handler was ready to authenticate. &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt; handlers were checked. [&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;#39;S3HmacAuthV4Handler&amp;#39;&lt;/span&gt;&lt;span&gt;] Check your credentials&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-2&quot;&gt;CommandException&lt;/span&gt;&lt;span&gt;: Caught non-retryable exception - aborting rsync&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;原因&quot;&gt;原因&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;gsutil&lt;/code&gt;コマンドの仕様です(執筆時点)。&lt;/p&gt;
&lt;p&gt;下記のように関連Issuesがあります。初回報告が2016年で、現在オープン中のものは2020年に報告されたものなので、対応としては優先順位が低いものと想定されます。したがって、修正されるまで待つというよりも、後述の対応を行った方がよろしいかと存じます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/GoogleCloudPlatform/gsutil/issues/382&quot;&gt;gsutil has no handler when accessing s3 bucket.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/GoogleCloudPlatform/gsutil/issues/1098&quot;&gt;AWS Fargate Task - Caught exception reading instance data&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;対応&quot;&gt;対応&lt;/h2&gt;
&lt;h3 id=&quot;環境変数を利用する&quot;&gt;環境変数を利用する&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/GoogleCloudPlatform/gsutil/issues/1098&quot;&gt;AWS Fargate Task - Caught exception reading instance data&lt;/a&gt;にも記載がありますが、AWSの認証情報をIAMロールではなく環境変数で指定することで対応可能です。&lt;/p&gt;
&lt;p&gt;なお、上記Issueに記載された環境変数ではなく、&lt;a rel=&quot;external&quot; href=&quot;https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-envvars.html&quot;&gt;AWS CLI を設定する環境変数&lt;/a&gt;に記載のある次の3つの環境変数を指定することでも動作することが確認できました。つまり、上記のIssueに記載のある&lt;code&gt;AWS_SECURITY_TOKEN&lt;/code&gt;は明示的に指定していません。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AWS_ACCESS_KEY_ID&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AWS_SECRET_ACCESS_KEY&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AWS_DEFAULT_REGION&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;また、上記のIssueではFargateタスクのコンテナ内部でコマンドを実行することで対応を行っていますが、Fargateはパラメータストアに保存した機密情報を簡単に環境変数に指定する機能があります。&lt;/p&gt;
&lt;p&gt;好みの問題かもしれませんが、自前で実装するよりも簡単なので、次のページを参照してパラメータストアから情報を渡す構成をお勧め致します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参考
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://aws.amazon.com/jp/premiumsupport/knowledge-center/ecs-data-security-container-task/&quot;&gt;Amazon ECS タスクで秘密情報や機密情報をコンテナに安全に渡す方法を教えてください。&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ローカルストレージを利用する&quot;&gt;ローカルストレージを利用する&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;gsutil&lt;/code&gt;コマンドでS3にアクセスするということは、GCSとS3間でファイルを連携するといった実装を行っているものと思われます。&lt;/p&gt;
&lt;p&gt;セキュリティポリシー的にAWS側でキーの発行ができないといったような場合、一時的にローカルストレージにファイルをダウンロードするといった方式も考えられます。&lt;/p&gt;
&lt;p&gt;例: GCS→ローカル→S3 or S3→ローカル→GCS&lt;/p&gt;
&lt;p&gt;その場合、ファイルが200 GiB未満ならば、ローカルストレージ上で対応可能です。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;デフォルトでは、プラットフォームバージョン 1.4.0 以降を使用して Fargate でホストされる Amazon ECS タスクは、後に最低 20 GiB のエフェメラルストレージを受け取ります。エフェメラルストレージの総量は、タスク定義で ephemeralStorage パラメータを指定することで、最大 200 GiB まで増やすことができます。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/fargate-task-storage.html&quot;&gt;Fargate タスクストレージ&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ファイルが200 GiB以上の場合は、次のようにEFSをFargateにマウントし、その領域を利用するといった方法が考えられます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参考
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://aws.amazon.com/jp/premiumsupport/knowledge-center/ecs-fargate-mount-efs-containers-tasks/&quot;&gt;Fargate で実行されている Amazon ECS コンテナまたはタスクに Amazon EFS ファイルシステムをマウントする方法を教えてください。&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
      </item>
      <item>
          <title>GlueからS3のParquetに対してUpsertを行う</title>
          <pubDate>Sun, 25 Jul 2021 00:00:00 +0000</pubDate>
          <author>wannabe</author>
          <link>https://wannabe-data-engineer.net/glue-s3-parquet-upsert/</link>
          <guid>https://wannabe-data-engineer.net/glue-s3-parquet-upsert/</guid>
          <description xml:base="https://wannabe-data-engineer.net/glue-s3-parquet-upsert/">&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/glue-s3-parquet-upsert/eyechatch.png&quot; alt=&quot;GlueからS3のParquetに対してUpsertを行う&quot; /&gt;&lt;/p&gt;
&lt;p&gt;GlueからS3のParquetファイルに対してUpsert(データが存在すればInsert、存在しなければUpdate)処理を行う方法について記載します。&lt;/p&gt;
&lt;p&gt;ParquetファイルをGlueテーブルとしている場合、実質的にGlueテーブルのUpsert処理を行うことが可能です。&lt;/p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;大きく分けて次の3パターンでUpsertを実装することができます。&lt;/p&gt;
&lt;p&gt;実際のデータを利用したパフォーマンステスト等を実施し、チューニングを経て実行時間の制約を満たすことが可能なパターンを利用するのがよろしいかと存じます。&lt;/p&gt;
&lt;p&gt;なお、全て主キー相当の列が存在しないと実装できないことにご注意いただければと存じます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;【PySpark】更新ごとに増分する列を利用する(※1)&lt;/li&gt;
&lt;li&gt;【PySpark】差分となる主キーを利用する&lt;/li&gt;
&lt;li&gt;【AWS Data Wrangler】&lt;code&gt;merge_upsert_table&lt;/code&gt;を利用する(※2)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;※1 例えば「最終更新日時」等の、更新ごとに増分するような列が存在しない場合は利用できない手法です。&lt;/p&gt;
&lt;p&gt;※2 AWS Data Wranglerは内部的にPandasが利用されているため、&lt;a rel=&quot;external&quot; href=&quot;https://wannabe-data-engineer.net/glue-job_command-failed-with-exit-code-10/&quot;&gt;Glue Jobが&lt;code&gt;Command Failed with Exit Code 10.&lt;/code&gt;で失敗する&lt;/a&gt;で紹介した事象が発生する可能性があります。少量のデータに向いています。&lt;/p&gt;
&lt;p&gt;以下、詳細です。&lt;/p&gt;
&lt;h2 id=&quot;サンプルデータ&quot;&gt;サンプルデータ&lt;/h2&gt;
&lt;p&gt;サンプルとして次のような「元データ」と「差分データ」を利用します。処理の結果、最終的に「想定データ」のようになることを目指します。&lt;/p&gt;
&lt;h3 id=&quot;元データ&quot;&gt;元データ&lt;/h3&gt;
&lt;p&gt;主キーは&lt;code&gt;id&lt;/code&gt;列を想定しています。&lt;code&gt;last_updated&lt;/code&gt;列には最終更新のタイムスタンプが付与される想定です。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;log&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| id|     message|       last_updated|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|  &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;|Not Updated.|&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;2021-07-24 00:00:00&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|  &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2&lt;/span&gt;&lt;span&gt;|Not Updated.|&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;2021-07-24 00:00:00&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|  &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;3&lt;/span&gt;&lt;span&gt;|Not Updated.|&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;2021-07-24 00:00:00&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|  &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;4&lt;/span&gt;&lt;span&gt;|Not Updated.|&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;2021-07-24 00:00:00&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|  &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;5&lt;/span&gt;&lt;span&gt;|Not Updated.|&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;2021-07-24 00:00:00&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;差分データ&quot;&gt;差分データ&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;id&lt;/code&gt;が1および4のデータについては、&lt;code&gt;last_updated&lt;/code&gt;および&lt;code&gt;message&lt;/code&gt;が更新されています。&lt;/p&gt;
&lt;p&gt;また、元データに存在しない6および7のデータが存在しています。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;log&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| id|     message|       last_updated|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|  &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;|    Updated.|&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;2021-07-25 00:00:00&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|  &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;4&lt;/span&gt;&lt;span&gt;|    Updated.|&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;2021-07-25 00:00:00&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|  &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;6&lt;/span&gt;&lt;span&gt;|Not Updated.|&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;2021-07-25 00:00:00&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|  &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;7&lt;/span&gt;&lt;span&gt;|Not Updated.|&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;2021-07-25 00:00:00&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;想定データ&quot;&gt;想定データ&lt;/h3&gt;
&lt;p&gt;元データに存在している&lt;code&gt;id&lt;/code&gt;の1と4については更新が行われ、存在していない6と7については挿入が行われることを想定します。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;log&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| id|     message|       last_updated|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|  &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;|    Updated.|&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;2021-07-25 00:00:00&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|  &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2&lt;/span&gt;&lt;span&gt;|Not Updated.|&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;2021-07-24 00:00:00&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|  &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;3&lt;/span&gt;&lt;span&gt;|Not Updated.|&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;2021-07-24 00:00:00&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|  &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;4&lt;/span&gt;&lt;span&gt;|    Updated.|&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;2021-07-25 00:00:00&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|  &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;5&lt;/span&gt;&lt;span&gt;|Not Updated.|&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;2021-07-24 00:00:00&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|  &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;6&lt;/span&gt;&lt;span&gt;|Not Updated.|&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;2021-07-25 00:00:00&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|  &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;7&lt;/span&gt;&lt;span&gt;|Not Updated.|&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;2021-07-25 00:00:00&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;【PySpark】更新ごとに増分する列値を利用する&quot;&gt;【PySpark】更新ごとに増分する列値を利用する&lt;/h2&gt;
&lt;p&gt;PySpark上で結合を行い、主キーが重複している行は、増分する列値を利用して古い方を削除するというものです。大きく次のような流れにて対応します。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;S3から元データを読み込む&lt;/li&gt;
&lt;li&gt;S3から差分データを読み込む&lt;/li&gt;
&lt;li&gt;元データと差分データを結合する&lt;/li&gt;
&lt;li&gt;結合したデータを主キーと値が増分する列でソートする&lt;/li&gt;
&lt;li&gt;主キーが同じ行が存在する場合は古い行を削除する&lt;/li&gt;
&lt;li&gt;S3に新規ファイルとして書き込む&lt;/li&gt;
&lt;li&gt;新規で書き込んだファイルを読み取る&lt;/li&gt;
&lt;li&gt;既存の元データに上書きする&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;なお、残念ながら&lt;code&gt;overwrite&lt;/code&gt;を利用し、直接既存の元データを上書きすることはできませんでした。&lt;/p&gt;
&lt;p&gt;と言いますのも、当該メソッドを利用すると、まず、書き込み先に存在するファイルが削除され、その後、書き込み処理が行われるためです。書き込みデータは既存ファイルのデータから読み取りを行って作成されるものなので、書き込みタイミングで削除されていると処理に失敗してしまいます。&lt;/p&gt;
&lt;p&gt;したがって、いったん別ファイルとして保存し、その内容から元のデータが存在する場所に上書きで書き込む形としています。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;import&lt;/span&gt;&lt;span&gt; sys&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; awsglue.transforms&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; import *&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; awsglue.utils&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; import&lt;/span&gt;&lt;span&gt; getResolvedOptions&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; pyspark.context&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; import&lt;/span&gt;&lt;span&gt; SparkContext&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; pyspark.sql&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; import&lt;/span&gt;&lt;span&gt; SQLContext&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; awsglue.context&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; import&lt;/span&gt;&lt;span&gt; GlueContext&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; awsglue.job&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; import&lt;/span&gt;&lt;span&gt; Job&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; pyspark.sql.functions&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; import&lt;/span&gt;&lt;span&gt; row_number&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; pyspark.sql.window&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; import *&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; pyspark.sql.functions&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; import&lt;/span&gt;&lt;span&gt; col&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; pyspark.sql.functions&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; import&lt;/span&gt;&lt;span&gt; desc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;args&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; getResolvedOptions(sys.argv, [&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;JOB_NAME&amp;quot;&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sc&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; SparkContext()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;glueContext&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; GlueContext(sc)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;spark&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; glueContext.spark_session&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sqlContext&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; SQLContext(spark.sparkContext, spark)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;job&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; Job(glueContext)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;job.init(args[&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;JOB_NAME&amp;quot;&lt;/span&gt;&lt;span&gt;], args)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# S3から元データを読み込む&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;base&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; spark.read.parquet(&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;s3://xxxxx/base/&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## base.sort(&amp;quot;id&amp;quot;).show()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## | id|     message|       last_updated|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  1|Not Updated.|2021-07-24 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  2|Not Updated.|2021-07-24 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  3|Not Updated.|2021-07-24 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  4|Not Updated.|2021-07-24 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  5|Not Updated.|2021-07-24 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# S3から差分データを読み込む&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;delta&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; spark.read.parquet(&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;s3://xxxxx/delta/&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## delta.sort(&amp;quot;id&amp;quot;).show()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## | id|     message|       last_updated|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  1|    Updated.|2021-07-25 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  4|    Updated.|2021-07-25 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  6|Not Updated.|2021-07-25 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  7|Not Updated.|2021-07-25 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# 元データと差分データを結合する&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;upsert&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; base.union(delta)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## upsert.sort(&amp;quot;id&amp;quot;).show()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## | id|     message|       last_updated|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  1|Not Updated.|2021-07-24 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  1|    Updated.|2021-07-25 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  2|Not Updated.|2021-07-24 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  3|Not Updated.|2021-07-24 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  4|    Updated.|2021-07-25 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  4|Not Updated.|2021-07-24 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  5|Not Updated.|2021-07-24 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  6|Not Updated.|2021-07-25 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  7|Not Updated.|2021-07-25 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# 結合したデータを主キーと値が増分する列でソートする&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;upsert&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; upsert.withColumn(&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;row_num&amp;quot;&lt;/span&gt;&lt;span&gt;, row_number().over(Window.partitionBy(&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span&gt;).orderBy(desc(&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;last_updated&amp;quot;&lt;/span&gt;&lt;span&gt;))))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## upsert.show()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+-------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## | id|     message|       last_updated|row_num|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+-------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  1|    Updated.|2021-07-25 00:00:00|      1|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  1|Not Updated.|2021-07-24 00:00:00|      2|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  6|Not Updated.|2021-07-25 00:00:00|      1|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  3|Not Updated.|2021-07-24 00:00:00|      1|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  5|Not Updated.|2021-07-24 00:00:00|      1|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  4|    Updated.|2021-07-25 00:00:00|      1|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  4|Not Updated.|2021-07-24 00:00:00|      2|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  7|Not Updated.|2021-07-25 00:00:00|      1|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  2|Not Updated.|2021-07-24 00:00:00|      1|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+-------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# 主キーが同じ行が存在する場合は古い行を削除する&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;upsert&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; upsert.filter(col(&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;row_num&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1&lt;/span&gt;&lt;span&gt;).drop(col(&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;row_num&amp;quot;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## upsert.sort(&amp;quot;id&amp;quot;).show()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## | id|     message|       last_updated|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  1|    Updated.|2021-07-25 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  2|Not Updated.|2021-07-24 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  3|Not Updated.|2021-07-24 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  4|    Updated.|2021-07-25 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  5|Not Updated.|2021-07-24 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  6|Not Updated.|2021-07-25 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  7|Not Updated.|2021-07-25 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# ※Upsertの一連の処理をまとめることも可能(下記のようになる)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# upsert = base.union(delta).withColumn(&amp;quot;row_num&amp;quot;, row_number().over(Window.partitionBy(&amp;quot;id&amp;quot;).orderBy(desc(&amp;quot;last_updated&amp;quot;)))).filter(col(&amp;quot;row_num&amp;quot;) == 1).drop(col(&amp;quot;row_num&amp;quot;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# S3に新規ファイルとして書き込む&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;upsert.write.mode(&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;overwrite&amp;quot;&lt;/span&gt;&lt;span&gt;).parquet(&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;s3://xxxxx/tmp/&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# 新規で書き込んだファイルを読み取る&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;upsert&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; spark.read.parquet(&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;s3://xxxxx/tmp/&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# 既存の元データに上書きする&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;upsert.write.mode(&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;overwrite&amp;quot;&lt;/span&gt;&lt;span&gt;).parquet(&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;s3://xxxxx/base/&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;job.commit()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;【PySpark】差分となる主キーを利用する&quot;&gt;【PySpark】差分となる主キーを利用する&lt;/h2&gt;
&lt;p&gt;PySpark上で差分対象の主キーを抽出し、既存データから当該主キーを持つ行を削除したDataFrameに、差分対象を結合するというものです。大きく次のような流れにて対応します。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;S3から元データを読み込む&lt;/li&gt;
&lt;li&gt;S3から差分データを読み込む&lt;/li&gt;
&lt;li&gt;差分データから主キーを読み込む&lt;/li&gt;
&lt;li&gt;元データから差分データに存在する主キーを削除した一時的なデータを作成する&lt;/li&gt;
&lt;li&gt;一時的なデータと差分データを結合する&lt;/li&gt;
&lt;li&gt;S3に新規ファイルとして書き込む&lt;/li&gt;
&lt;li&gt;新規で書き込んだファイルを読み取る&lt;/li&gt;
&lt;li&gt;既存の元データに上書きする&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;この手法は、更新ごとに増加するような列がない場合でも対応できる点がメリットです。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;import&lt;/span&gt;&lt;span&gt; sys&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; awsglue.transforms&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; import *&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; awsglue.utils&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; import&lt;/span&gt;&lt;span&gt; getResolvedOptions&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; pyspark.context&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; import&lt;/span&gt;&lt;span&gt; SparkContext&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; pyspark.sql&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; import&lt;/span&gt;&lt;span&gt; SQLContext&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; awsglue.context&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; import&lt;/span&gt;&lt;span&gt; GlueContext&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; awsglue.job&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; import&lt;/span&gt;&lt;span&gt; Job&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;args&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; getResolvedOptions(sys.argv, [&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;JOB_NAME&amp;quot;&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sc&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; SparkContext()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;glueContext&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; GlueContext(sc)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;spark&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; glueContext.spark_session&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sqlContext&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; SQLContext(spark.sparkContext, spark)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;job&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; Job(glueContext)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;job.init(args[&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;JOB_NAME&amp;quot;&lt;/span&gt;&lt;span&gt;], args)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# S3から元データを読み込む&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;base&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; spark.read.parquet(&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;s3://xxxxx/base/&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## base.sort(&amp;quot;id&amp;quot;).show()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## | id|     message|       last_updated|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  1|Not Updated.|2021-07-24 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  2|Not Updated.|2021-07-24 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  3|Not Updated.|2021-07-24 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  4|Not Updated.|2021-07-24 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  5|Not Updated.|2021-07-24 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# S3から差分データを読み込む&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;delta&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; spark.read.parquet(&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;s3://xxxxx/delta/&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## delta.sort(&amp;quot;id&amp;quot;).show()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## | id|     message|       last_updated|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  1|    Updated.|2021-07-25 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  4|    Updated.|2021-07-25 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  6|Not Updated.|2021-07-25 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  7|Not Updated.|2021-07-25 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# 差分データから主キーを読み込む&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;delta_primary_keys&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; delta.select(&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span&gt;).rdd.flatMap(&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;lambda&lt;/span&gt;&lt;span&gt; x: x).collect()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## delta_primary_keys&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## [1, 4, 6, 7]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# 元データから差分データに存在する主キーを削除した一時的なデータを作成する&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;upsert&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; base.filter(&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;~&lt;/span&gt;&lt;span&gt;base[&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span&gt;].isin(delta_primary_keys))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## upsert.show()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## | id|     message|       last_updated|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  2|Not Updated.|2021-07-24 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  3|Not Updated.|2021-07-24 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  5|Not Updated.|2021-07-24 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# 一時的なデータと差分データを結合する&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;upsert&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; upsert.unionAll(delta)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## upsert.sort(&amp;quot;id&amp;quot;).show()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## | id|     message|       last_updated|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  1|    Updated.|2021-07-25 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  2|Not Updated.|2021-07-24 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  3|Not Updated.|2021-07-24 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  4|    Updated.|2021-07-25 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  5|Not Updated.|2021-07-24 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  6|Not Updated.|2021-07-25 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  7|Not Updated.|2021-07-25 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# S3に新規ファイルとして書き込む&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;upsert.write.mode(&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;overwrite&amp;quot;&lt;/span&gt;&lt;span&gt;).parquet(&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;s3://xxxxx/tmp/&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# 新規で書き込んだファイルを読み取る&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;upsert&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; spark.read.parquet(&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;s3://xxxxx/tmp/&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# 既存の元データに上書きする&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;upsert.write.mode(&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;overwrite&amp;quot;&lt;/span&gt;&lt;span&gt;).parquet(&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;s3://xxxxx/base/&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;job.commit()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;【AWS_Data_Wrangler】merge_upsert_tableを利用する&quot;&gt;【AWS Data Wrangler】merge_upsert_tableを利用する&lt;/h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/awslabs/aws-data-wrangler&quot;&gt;AWS Data Wrangler&lt;/a&gt;を利用し、Glueテーブルに紐づくS3ファイルを直接Upsertするというものです。&lt;/p&gt;
&lt;p&gt;AWS Data Wranglerは、下記のようにGlueのジョブパラメータに値を入れるだけでGlueジョブから利用することが可能です。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Key: --additional-python-modules&lt;/p&gt;
&lt;p&gt;Value: pyarrow==2,awswrangler&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://aws-data-wrangler.readthedocs.io/en/latest/install.html#aws-glue-python-shell-jobs&quot;&gt;Install — AWS Data Wrangler 2.10.0 documentation&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;大きく次のような流れにて対応します。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;S3から差分データを読み込む&lt;/li&gt;
&lt;li&gt;PandasのDataFrameに変換する&lt;/li&gt;
&lt;li&gt;merge_upsert_tableメソッドを呼び出す&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;なお、冒頭にも記載していますが、当該メソッドはPandasを利用するため、たとえ対象が分割可能なファイルであっても、1つのノードのメモリ上に全てのデータが乗り切らないと処理できません。&lt;/p&gt;
&lt;p&gt;したがって、大きなデータでの当該機能の利用は向いていません。小さなデータであれば、非常に実装もシンプルで良いものかと存じます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;import&lt;/span&gt;&lt;span&gt; sys&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; awsglue.transforms&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; import *&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; awsglue.utils&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; import&lt;/span&gt;&lt;span&gt; getResolvedOptions&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; pyspark.context&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; import&lt;/span&gt;&lt;span&gt; SparkContext&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; pyspark.sql&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; import&lt;/span&gt;&lt;span&gt; SQLContext&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; awsglue.context&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; import&lt;/span&gt;&lt;span&gt; GlueContext&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; awsglue.job&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; import&lt;/span&gt;&lt;span&gt; Job&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;import&lt;/span&gt;&lt;span&gt; awswrangler&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; as&lt;/span&gt;&lt;span&gt; wr&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;import&lt;/span&gt;&lt;span&gt; pandas&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; as&lt;/span&gt;&lt;span&gt; pd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;args&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; getResolvedOptions(sys.argv, [&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;JOB_NAME&amp;quot;&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sc&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; SparkContext()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;glueContext&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; GlueContext(sc)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;spark&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; glueContext.spark_session&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sqlContext&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; SQLContext(spark.sparkContext, spark)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;job&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; Job(glueContext)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;job.init(args[&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;JOB_NAME&amp;quot;&lt;/span&gt;&lt;span&gt;], args)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# S3から差分データを読み込む&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;delta&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; spark.read.parquet(&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;s3://xxxxx/delta/&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## delta.sort(&amp;quot;id&amp;quot;).show()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## | id|     message|       last_updated|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  1|    Updated.|2021-07-25 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  4|    Updated.|2021-07-25 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  6|Not Updated.|2021-07-25 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## |  7|Not Updated.|2021-07-25 00:00:00|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;## +---+------------+-------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# PandasのDataFrameに変換する&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;delta&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; delta.toPandas()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# merge_upsert_tableメソッドを呼び出す&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;wr.s3.merge_upsert_table(&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt;delta_df&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;delta,&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt; database&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;&amp;lt;database&amp;gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt; table&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt; primary_key&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;job.commit()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;最後に&quot;&gt;最後に&lt;/h2&gt;
&lt;p&gt;ParquetのUpsertを実施したいケースはそれなりにあると思うので、そういったメソッドが既に存在していると思いましたが、執筆時点では確認することができませんでした。&lt;/p&gt;
&lt;p&gt;そのため、回りくどい実装方法となっていますが、少しでもご参考になれば幸いです。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>読み取り専用のレプリカ側でロック待ちが発生する事象について</title>
          <pubDate>Sun, 20 Jun 2021 00:00:00 +0000</pubDate>
          <author>wannabe</author>
          <link>https://wannabe-data-engineer.net/postgresql-wait-lock-in-replica/</link>
          <guid>https://wannabe-data-engineer.net/postgresql-wait-lock-in-replica/</guid>
          <description xml:base="https://wannabe-data-engineer.net/postgresql-wait-lock-in-replica/">&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/postgresql-wait-lock-in-replica/eyechatch.png&quot; alt=&quot;読み取り専用のレプリカ側でロック待ちが発生する事象について&quot; /&gt;&lt;/p&gt;
&lt;p&gt;PostgreSQLでレプリケーションを行っている際、読み取り専用トランザクションにも関わらず、レプリカ側でロック待ちが発生(&lt;code&gt;still waiting for AccessShareLock&lt;/code&gt;)してしまう事象についてです。状況次第では、レプリカ側でデッドロックも発生(&lt;code&gt;deadlock detected&lt;/code&gt;)します。&lt;/p&gt;
&lt;h2 id=&quot;事象&quot;&gt;事象&lt;/h2&gt;
&lt;p&gt;レプリカ側で次のようなロック待ちが発生します。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;log&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2021-06-20 00:43:39&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;55558&lt;/span&gt;&lt;span&gt;):postgres@dev:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;10485&lt;/span&gt;&lt;span&gt;]:LOG: process &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;10485&lt;/span&gt;&lt;span&gt; still waiting for AccessShareLock on relation &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;143563&lt;/span&gt;&lt;span&gt; of database &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;139288&lt;/span&gt;&lt;span&gt; after &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1000&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;096&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2021-06-20 00:43:39&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;55558&lt;/span&gt;&lt;span&gt;):postgres@dev:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;10485&lt;/span&gt;&lt;span&gt;]:DETAIL: Process holding the lock: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1550&lt;/span&gt;&lt;span&gt;. Wait queue: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;10485&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;状況によっては、デッドロックも発生します。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;log&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2021-06-20 00:45:23&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;36128&lt;/span&gt;&lt;span&gt;):postgres@dev:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;22035&lt;/span&gt;&lt;span&gt;]:LOG:  process &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;22035&lt;/span&gt;&lt;span&gt; detected deadlock while waiting for AccessShareLock on relation &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;143563&lt;/span&gt;&lt;span&gt; of database &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;139288&lt;/span&gt;&lt;span&gt; after &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1000&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;048&lt;/span&gt;&lt;span&gt; ms at character &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;61&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2021-06-20 00:45:23&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;36128&lt;/span&gt;&lt;span&gt;):postgres@dev:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;22035&lt;/span&gt;&lt;span&gt;]:DETAIL:  Process holding the lock: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;26223&lt;/span&gt;&lt;span&gt;. Wait queue: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;13967&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;28211&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;9113&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2021-06-20 00:45:23&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;36128&lt;/span&gt;&lt;span&gt;):postgres@dev:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;22035&lt;/span&gt;&lt;span&gt;]:STATEMENT:  &amp;lt;SQL&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2021-06-20 00:45:23&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;36128&lt;/span&gt;&lt;span&gt;):postgres@dev:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;22035&lt;/span&gt;&lt;span&gt;]:&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;ERROR&lt;/span&gt;&lt;span&gt;:  deadlock detected at character &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;61&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2021-06-20 00:45:23&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;36128&lt;/span&gt;&lt;span&gt;):postgres@dev:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;22035&lt;/span&gt;&lt;span&gt;]:DETAIL:  Process &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;22035&lt;/span&gt;&lt;span&gt; waits for AccessShareLock on relation &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;143563&lt;/span&gt;&lt;span&gt; of database &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;139288&lt;/span&gt;&lt;span&gt;; blocked by process &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;26223&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Process &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;26223&lt;/span&gt;&lt;span&gt; waits for AccessExclusiveLock on relation &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;143563&lt;/span&gt;&lt;span&gt; of database &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;139288&lt;/span&gt;&lt;span&gt;; blocked by process &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;22035&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Process &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;22035&lt;/span&gt;&lt;span&gt;: &amp;lt;SQL&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Process &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;26223&lt;/span&gt;&lt;span&gt;: &amp;lt;backend information not available&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2021-06-20 00:45:23&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;36128&lt;/span&gt;&lt;span&gt;):postgres@dev:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;22035&lt;/span&gt;&lt;span&gt;]:&lt;/span&gt;&lt;span class=&quot;z-3 z-bg3&quot;&gt;HINT&lt;/span&gt;&lt;span&gt;:  See server log for query details.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2021-06-20 00:45:23&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;36128&lt;/span&gt;&lt;span&gt;):postgres@dev:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;22035&lt;/span&gt;&lt;span&gt;]:STATEMENT:  &amp;lt;SQL&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;レプリカ側は読み取り専用トランザクションであるため、本来、このようなロック待ちやデッドロックが発生する操作をユーザ側で行うことはできません。それにも関わらず、レプリカ側でロック関係の問題が発生してしまうという事象です。&lt;/p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;当該事象についてのまとめです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ACCESS EXCLUSIVE&lt;/code&gt;ロックがプライマリ側で取得されている可能性がある&lt;/li&gt;
&lt;li&gt;PostgreSQLやアプリケーション側のログから事象発生時に実行されていた操作を特定する&lt;/li&gt;
&lt;li&gt;自動バキュームが原因の場合は格納パラメータの変更や更新頻度の削減を検討する&lt;/li&gt;
&lt;li&gt;自動バキュームが原因でない場合はアプリケーション設定やレプリカ側でのロックタイムアウト導入を検討する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下、詳細です。&lt;/p&gt;
&lt;h2 id=&quot;原因&quot;&gt;原因&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;SELECT&lt;/code&gt;文が取得する&lt;code&gt;ACCESS SHARE&lt;/code&gt;ロックと競合し得る&lt;code&gt;ACCESS EXCLUSIVE&lt;/code&gt;ロックを取得する操作がプライマリ側で発生している可能性が高いものと考えられます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ACCESS EXCLUSIVEロックのみが、SELECT（FOR UPDATE/SHAREなし）文をブロックします。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.jp/document/12/html/explicit-locking.html&quot;&gt;13.3. 明示的ロック&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;ACCESS EXCLUSIVE&lt;/code&gt;ロックは次のような操作で発生し得ます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;DDL(一部除く)&lt;/li&gt;
&lt;li&gt;VACUUM FUL&lt;/li&gt;
&lt;li&gt;VACUUM(特殊なケース)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;ACCESS_EXCLUSIVEロックについて&quot;&gt;ACCESS EXCLUSIVEロックについて&lt;/h3&gt;
&lt;p&gt;多くのDDLやVACUUM FULLが&lt;code&gt;ACCESS EXCLUSIVE&lt;/code&gt;ロックを取得する件については、一般的にも知られているケースかと存じます。具体的には次のような種類のコマンドです。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;DROP TABLE、TRUNCATE、REINDEX、CLUSTER、VACUUM FULL、（CONCURRENTLYなしの）REFRESH MATERIALIZED VIEWコマンドによって獲得されます。 ALTER INDEXとALTER TABLEの多くの形式もこのレベルでロックを獲得します。 これはまた、明示的にモードを指定しないLOCK TABLE文のデフォルトのロックモードです。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.jp/document/12/html/explicit-locking.html&quot;&gt;13.3. 明示的ロック&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;しかしながら、通常のVACCUMも状況によっては取得するという部分につきましては、意外に感じられる方もいらっしゃるかもしれません。&lt;/p&gt;
&lt;p&gt;次のように、VACUUM(VACUUM FULLを除く)は&lt;code&gt;ACCESS SHARE&lt;/code&gt;ロックと競合しない&lt;code&gt;SHARE UPDATE EXCLUSIVE&lt;/code&gt;ロックを取得し、一般的に競合は発生しないというのが良く知られている挙動であるためです。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;VACUUMの標準形式は実運用のデータベースに対する操作と同時に実行させることができます。 （SELECT、INSERT、UPDATE、DELETEなどのコマンドは通常通りに動作し続けます。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.jp/document/12/html/routine-vacuuming.html&quot;&gt;24.1. 定常的なバキューム作業&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;また、自動バキュームを利用している場合、ロックが競合した際には相手に処理を譲る(自動VACUUM側が中断される)というのも、良く知られている挙動かと存じます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;自動バキュームワーカは通常は他のコマンドをブロックしません。 自動バキュームが保持するSHARE UPDATE EXCLUSIVEロックと衝突するロックを、プロセスが獲得しようとした場合には、ロックの獲得により自動バキュームが中断されます。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.jp/document/12/html/routine-vacuuming.html&quot;&gt;24.1. 定常的なバキューム作業&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;しかしながら、実は「テーブルの末尾に空のページが存在している」状態で、なおかつ、「テーブルの排他ロックを容易に獲得可能」という特殊な場合においては、通常のバキューム(自動バキュームを含む)でも排他ロックが取得されることがあります。これは盲点となり得る部分かと存じます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;標準形式のVACUUMは、テーブルとインデックス内の不要な行を削除し、その領域を将来の再利用が可能であるものとして記録します。 しかし、その領域をオペレーティングシステムに返却することはありません。 例外として、テーブルの末尾に完全に空のページが存在し、かつそのテーブルの排他ロックが容易に獲得できるような特殊な場合には、その領域を返却します。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.jp/document/12/html/routine-vacuuming.html&quot;&gt;24.1. 定常的なバキューム作業&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;調査&quot;&gt;調査&lt;/h2&gt;
&lt;h3 id=&quot;レプリカ側&quot;&gt;レプリカ側&lt;/h3&gt;
&lt;p&gt;ロックを取得しているプロセスがバックグラウンドプロセスであることを確認します。ちなみに、Auroraだと&lt;code&gt;aurora wal replay process&lt;/code&gt;が対象のプロセスです。&lt;br /&gt;
また、ロック待ちが発生している「時間帯」と「テーブル」も確認します。&lt;/p&gt;
&lt;p&gt;具体的には、下記のようなロック待ちのログ出力から、ロックを要求しているプロセスを特定します。下記の例で言うところの&lt;code&gt;Process holding the lock: 1550&lt;/code&gt;の&lt;code&gt;1550&lt;/code&gt;が、&lt;code&gt;ACCESS EXCLUSIVE&lt;/code&gt;を保持しているプロセスIDです。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;log&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2021-06-20 00:43:39&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;55558&lt;/span&gt;&lt;span&gt;):postgres@dev:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;10485&lt;/span&gt;&lt;span&gt;]:DETAIL: Process holding the lock: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1550&lt;/span&gt;&lt;span&gt;. Wait queue: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;10485&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;プロセスIDが確認できましたら、OSコマンド、RDSやAuroraの場合は拡張メトリクス、あるいは、&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.jp/document/12/html/monitoring-stats.html#PG-STAT-ACTIVITY-VIEW&quot;&gt;pg_stat_activity&lt;/a&gt;等から該当のプロセスがバックグラウンドプロセスであることを確認します。&lt;/p&gt;
&lt;h3 id=&quot;プライマリ側&quot;&gt;プライマリ側&lt;/h3&gt;
&lt;p&gt;レプリカ側で事象が確認できた「時間帯」「テーブル」の情報をベースに、「プライマリ側で&lt;code&gt;ACCESS EXCLUSIVE&lt;/code&gt;ロックを取得した操作を特定すること」が第一方針となるかと存じます。&lt;/p&gt;
&lt;h4 id=&quot;PostgreSQLログ&quot;&gt;PostgreSQLログ&lt;/h4&gt;
&lt;p&gt;ログに出力されたSQL文や自動バキュームから、当該時間帯にプライマリ側で&lt;code&gt;ACCESS EXCLUSIVE&lt;/code&gt;ロックを取得する操作が実行されていないかを確認します。&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.jp/document/12/html/runtime-config-logging.html#GUC-LOG-STATEMENT&quot;&gt;log_statement&lt;/a&gt;を有効にしている場合、設定レベルに応じてユーザによる操作が記録されているため、当該時間帯のSQLを確認することができます。&lt;/p&gt;
&lt;p&gt;また、&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.jp/document/12/html/runtime-config-autovacuum.html#GUC-LOG-AUTOVACUUM-MIN-DURATION&quot;&gt;log_autovacuum_min_duration&lt;/a&gt;を指定している場合、この値よりも長い時間を要した自動バキュームについてはログ出力されます。&lt;code&gt;0&lt;/code&gt;にすることで全ての自動バキュームが出力されます。&lt;/p&gt;
&lt;p&gt;RDSやAuroraの場合、&lt;code&gt;rds.force_autovacuum_logging_level&lt;/code&gt;も&lt;code&gt;disabled&lt;/code&gt;以外の値に設定する必要があります。&lt;/p&gt;
&lt;p&gt;なお、上記に挙げたパラメータは動的パラメータです。事象発生時点で有益な情報を取得可能な設定になっていなくとも、事象再現時に備えて再起動なしで設定を反映することができます。&lt;/p&gt;
&lt;h4 id=&quot;その他&quot;&gt;その他&lt;/h4&gt;
&lt;p&gt;アプリケーション側の実行ログ等から、当該時間帯にプライマリ側で&lt;code&gt;ACCESS EXCLUSIVE&lt;/code&gt;ロックを取得する操作が実行されていないかを確認します。&lt;/p&gt;
&lt;p&gt;また、関係者に当該時間帯の操作について確認するのも手段の一つです。&lt;/p&gt;
&lt;h2 id=&quot;対応&quot;&gt;対応&lt;/h2&gt;
&lt;p&gt;プライマリ側で&lt;code&gt;ACCESS EXCLUSIVE&lt;/code&gt;ロックを取得した操作を特定できたら、次のように対応します。&lt;/p&gt;
&lt;h3 id=&quot;自動バキュームだった場合&quot;&gt;自動バキュームだった場合&lt;/h3&gt;
&lt;p&gt;原因がテーブルに対する自動バキュームだった場合、次のような対応が考えられます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;【PostgreSQL 12以降】テーブルの格納パラメータ&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.jp/document/12/html/sql-createtable.html#RELOPTION-VACUUM-TRUNCATE&quot;&gt;vacuum_truncate&lt;/a&gt;を&lt;code&gt;false&lt;/code&gt;にする&lt;/li&gt;
&lt;li&gt;テーブルの格納パラメータ&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.jp/document/12/html/sql-createtable.html#RELOPTION-AUTOVACUUM-ENABLED&quot;&gt;autovacuum_enabled&lt;/a&gt;を&lt;code&gt;false&lt;/code&gt;にする&lt;/li&gt;
&lt;li&gt;テーブルに対する更新処理量を減らす&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;【PostgreSQL_12以降】当該テーブルの格納パラメータvacuum_truncateをfalseにする&quot;&gt;【PostgreSQL 12以降】当該テーブルの格納パラメータvacuum_truncateをfalseにする&lt;/h4&gt;
&lt;p&gt;残念ながらPostgreSQL 12以降にしか対応していませんが、&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.jp/document/12/html/sql-createtable.html#RELOPTION-VACUUM-TRUNCATE&quot;&gt;vacuum_truncate&lt;/a&gt;を&lt;code&gt;false&lt;/code&gt;にすることで、VACUUMにより&lt;code&gt;ACCESS EXCLUSIVE&lt;/code&gt;ロックが取得されるページ末尾の空ページ切り捨て操作を無効にできます。&lt;/p&gt;
&lt;p&gt;これにより&lt;code&gt;ACCESS EXCLUSIVE&lt;/code&gt;ロックは取得されないようになりますが、OSにページ末尾の空ページ領域を返さなくなるため、基本的にストレージ容量に余裕がある場合の設定となります。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;バキュームがテーブル末尾の空ページの切り捨てを試みることを、有効または無効にします。 デフォルト値はtrueです。 trueの場合、VACUUMと自動バキュームは切り捨てを行い切り捨てられたページのディスク領域はオペレーティングシステムに返されます。 切り捨てにはテーブルにACCESS EXCLUSIVEロックが必要であることに注意してください。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.jp/document/12/html/sql-createtable.html#RELOPTION-VACUUM-TRUNCATE&quot;&gt;vacuum_truncate&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;alter table &amp;lt;schema&amp;gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;lt;table&amp;gt; set&lt;/span&gt;&lt;span&gt; (vacuum_truncate &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt; false, &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;toast&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;vacuum_truncate&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; false);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&quot;テーブルの格納パラメータautovacuum_enabledをfalseにする&quot;&gt;テーブルの格納パラメータautovacuum_enabledをfalseにする&lt;/h4&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.jp/document/12/html/sql-createtable.html#RELOPTION-AUTOVACUUM-ENABLED&quot;&gt;autovacuum_enabled&lt;/a&gt;を&lt;code&gt;fase&lt;/code&gt;にすることで、対象のテーブルに対する自動バキュームを無効にすることができます。&lt;/p&gt;
&lt;p&gt;ただし、自動バキュームを無効にすることで、テーブルが肥大化し、結果として大幅なパフォーマンス低下に繋がる可能性があるため、定期的に手動でVACUUMを実行されることをお勧め致します。&lt;/p&gt;
&lt;p&gt;また、&lt;a rel=&quot;external&quot; href=&quot;https://wannabe-data-engineer.net/maximum-used-transaction-ids/&quot;&gt;MaximumUsedTransactionIDsについて&lt;/a&gt;にも記載がありますが、自動バキュームを無効にしていても、&lt;code&gt;autovacuum_freeze_max_age&lt;/code&gt;に達した場合は強制的にバキュームされます。不要域が多い程、強制バキューム時の負荷が高くなる可能性があるため、注意が必要です。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;alter table &amp;lt;schema&amp;gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;lt;table&amp;gt; set&lt;/span&gt;&lt;span&gt; (autovacuum_enabled &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt; false, &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;toast&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;autovacuum_enabled&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; false);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&quot;テーブルに対する更新処理量を減らす&quot;&gt;テーブルに対する更新処理量を減らす&lt;/h4&gt;
&lt;p&gt;当該テーブルに対する更新処理を減らすことで自動バキュームの発生頻度も減らすことができるため、結果として事象発生の頻度も下がります。&lt;/p&gt;
&lt;p&gt;例えば、毎回、全件DELETE→INSERTを行っていたり、全件UPDATE→INSERTを行っていたりするような場合、ロジックを変更することで自動バキュームの頻度を下げることができます。&lt;/p&gt;
&lt;p&gt;ただし、あくまでも頻度を減らせるだけなので、タイミング次第ではロック待ちの事象は再現します。&lt;/p&gt;
&lt;h4 id=&quot;自動バキュームでなかった場合&quot;&gt;自動バキュームでなかった場合&lt;/h4&gt;
&lt;p&gt;原因が自動バキュームではなく、その他の操作(アプリケーション側の処理等)だった場合、目的の処理を行う際に、&lt;code&gt;ACCESS EXCLUSIVE&lt;/code&gt;ロックを取得する操作が必要なのかを確認します。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ACCESS EXCLUSIVE&lt;/code&gt;ロックを伴う操作が必要ない場合(余分にロックをかけていた場合)は、それを改めることでロック待ちの事象を改善することができます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ACCESS EXCLUSIVE&lt;/code&gt;ロックを伴う操作が必要な場合は、レプリカ側に接続するクライアントで&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.jp/document/12/html/runtime-config-client.html#GUC-LOCK-TIMEOUT&quot;&gt;lock_timeout&lt;/a&gt;を設定することで、延々とロックを待ち続けるような挙動を避けることができます。結果として、全体のスループットが上昇することが予測されます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;テーブル、インデックス、行、またはその他のデータベースオブジェクトに対してロック獲得を試みている最中、指定された時間を超えて待機するいかなる命令も停止されます。 時間制限はそれぞれのロック取得の試みに対し個別に適用されます。 制限は明示的ロック要求（例えばLOCK TABLE、またはSELECT FOR UPDATE without NOWAITなど）および暗黙的に取得されるロックに適用されます。 この値が単位なしで指定された場合は、ミリ秒単位であるとみなします。 値ゼロ（デフォルト）はこの機能を無効にします。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.jp/document/12/html/runtime-config-client.html#GUC-LOCK-TIMEOUT&quot;&gt;lock_timeout&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</description>
      </item>
      <item>
          <title>Glue Jobが`Command Failed with Exit Code 10.`で失敗する</title>
          <pubDate>Sun, 02 May 2021 00:00:00 +0000</pubDate>
          <author>wannabe</author>
          <link>https://wannabe-data-engineer.net/glue-job_command-failed-with-exit-code-10/</link>
          <guid>https://wannabe-data-engineer.net/glue-job_command-failed-with-exit-code-10/</guid>
          <description xml:base="https://wannabe-data-engineer.net/glue-job_command-failed-with-exit-code-10/">&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/glue-job_command-failed-with-exit-code-10/eyechatch.png&quot; alt=&quot;Glue JobがCommand Failed with Exit Code 10.で失敗する&quot; /&gt;&lt;/p&gt;
&lt;p&gt;扱うデータ量を増やすとGlue Jobが&lt;code&gt;Command Failed with Exit Code 10.&lt;/code&gt;で失敗する事象に遭遇したため内容を記載致します。&lt;/p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Glue Jobワーカー1つのメモリ上に乗り切らないデータを処理している可能性がある&lt;/li&gt;
&lt;li&gt;データをメモリに読み込む部分の実装をSparkに変更することで改善される可能性がある&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下、詳細です。&lt;/p&gt;
&lt;h2 id=&quot;原因&quot;&gt;原因&lt;/h2&gt;
&lt;p&gt;Glue Jobワーカー1つのメモリ上に乗り切らないデータを処理している可能性があります。&lt;/p&gt;
&lt;p&gt;特に、次のような事象に合致している場合は、メモリに乗り切らないデータを処理している可能性が高いです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;扱うデータ量を減らすと改善する&lt;/li&gt;
&lt;li&gt;Sparkイベントログ(※1)が出力されていない&lt;/li&gt;
&lt;li&gt;&lt;code&gt;glue.XX.jvm.heap.usage&lt;/code&gt;(※2)が上昇していない&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;※1 モニタリングオプションの&lt;code&gt;Spark UI&lt;/code&gt;を有効化するとS3に出力されるファイルのことを指します。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Spark UI を有効にすると、 AWS Glue ETL ジョブと、 AWS Glue 開発エンドポイントの Spark アプリケーションの Spark イベントログを Amazon Simple Storage Service (Amazon S3) の指定個所に保持できます。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://docs.aws.amazon.com/ja_jp/glue/latest/dg/monitor-spark-ui-jobs.html&quot;&gt;AWS Glue ジョブ用の Apache Spark ウェブ UI の有効化&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;※2 GlueのCloudWatchメトリクスのことを指します。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Amazon CloudWatch を使用して AWS Glue をモニタリングすることで、AWS Glue から raw データを収集し、リアルタイムに近い読み取り可能なメトリクスに加工することができます。これらの統計は 2 週間記録されるため、履歴情報にアクセスしてウェブアプリケーションまたはサービスの動作をより的確に把握することができます。デフォルトでは、AWS Glue メトリクスデータは CloudWatch に自動的に送信されます。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://docs.aws.amazon.com/ja_jp/glue/latest/dg/monitor-cloudwatch.html&quot;&gt;Amazon CloudWatch によるモニタリング&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;対応&quot;&gt;対応&lt;/h2&gt;
&lt;p&gt;メモリにデータを読み込んでいる処理の具体的な実装を確認し、それがSparkでの実装でない場合は、Sparkに書き換えることで改善する可能性があります。&lt;/p&gt;
&lt;p&gt;1つのワーカーのメモリに乗り切らない場合でも、Sparkはデータを分割して複数のワーカー扱うことができるためです。&lt;/p&gt;
&lt;p&gt;私が当該の問題に直面したケースでは&lt;a rel=&quot;external&quot; href=&quot;https://github.com/awslabs/aws-data-wrangler&quot;&gt;AWS Data Wrangler&lt;/a&gt;(Pandasの拡張ライブラリ)を利用していました。ライブラリのメソッドが内部的にPandasでS3のParquetファイルを全て読み込むような実装をしていたため、1つのワーカーに乗り切らずに失敗していた形です。&lt;/p&gt;
&lt;p&gt;AWS Data Wrangler(Pandas)での実装をやめて、当該処理をSparkによる処理に変更したところ、改善しました。&lt;/p&gt;
&lt;p&gt;なお、Glueのワーカー1つに乗り切らないことで発生していたため、単純にワーカー数を倍々で増やしていっても解決しませんでした。&lt;/p&gt;
&lt;h2 id=&quot;備考&quot;&gt;備考&lt;/h2&gt;
&lt;p&gt;恐らく、本記事と同じ原因のため、つまり、1つのワーカーのメモリ上にデータが乗り切らないため失敗しているケースがフォーラムで報告されています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;I have a .sql.gz file (~50gb) on S3 - I&#39;m attempting to download it, unzip it, and upload the decompressed contents back to S3 (as .sql).&lt;/p&gt;
&lt;p&gt;The Glue job is able to successfully decompress/upload smaller files (largest I&#39;ve tested is ~1gb).&lt;/p&gt;
&lt;p&gt;However, whenever I attempt to process the larger ~50gb file I get back the following error:&lt;/p&gt;
&lt;p&gt;&quot;Command failed with exit code 10&quot;&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://forums.aws.amazon.com/thread.jspa?threadID=330260&quot;&gt;Glue job failing with exit code 10 (unable to decompress ~50gb file on S3)&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;執筆時点で明確な答えは出ていませんが、フォーラム投稿者の下記コードを見る限り、BytesIO部分でインメモリの実装をしているため発生しているものと推察致します。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;import&lt;/span&gt;&lt;span&gt; boto3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; io&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; import&lt;/span&gt;&lt;span&gt; BytesIO&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;import&lt;/span&gt;&lt;span&gt; gzip&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;s3_bucket_name&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;some-bucket&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;stage_s3_key_prefix&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;prefix/to/stage&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;source_s3_key&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; = f&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;{&lt;/span&gt;&lt;span&gt;stage_s3_key_prefix&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;/somefile.sql.gz&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;target_s3_key&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; = f&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;{&lt;/span&gt;&lt;span&gt;stage_s3_key_prefix&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;/somefile.sql&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;s3_client&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; boto3.client(&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;#39;s3&amp;#39;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;s3_client.upload_fileobj(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;    Fileobj&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;gzip.GzipFile( &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;        None&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-2&quot;&gt;        &amp;#39;rb&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;        fileobj&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;BytesIO(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            s3_client.get_object(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;                Bucket&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;s3_bucket_name,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;                Key&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;source_s3_key&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;             //&lt;/span&gt;&lt;span&gt; line below should be: body.read()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;             //&lt;/span&gt;&lt;span&gt; I cant index Body b&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;c this markdown will display a&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; URL&lt;/span&gt;&lt;span&gt; instead&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            ).read()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;    Bucket&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;s3_bucket_name, &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;    Key&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;target_s3_key &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;BytesIO はインメモリーのバイナリストリームです&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://docs.python.org/ja/3/library/io.html&quot;&gt;io --- ストリームを扱うコアツール&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;また、今回の記事とは別の原因とはなりますが、同じPythonライブラリを2回インポートした結果、同じようなエラーとなると言ったような報告もあります。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On my Glue job, I got this error when I imported the same external python library twice. Removing the duplicate library from the job parameter &#39;Python lib path&#39; worked for me and the job runs now.&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://forums.aws.amazon.com/thread.jspa?threadID=330260&quot;&gt;Glue job failing with exit code 10 (unable to decompress ~50gb file on S3)&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;こういった事象を鑑みると、データがメモリに乗り切らない場合や、何らかの理由でGlue Jobを開始できなかった際に、当該エラーが出るのかもしれません。&lt;/p&gt;
&lt;p&gt;メッセージから原因の推察を行うのが難しいエラーですが、少しでもご参考になれば幸いです。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>AWS 認定 データベース – 専門知識(DBS-C01)に合格しました</title>
          <pubDate>Sat, 03 Apr 2021 00:00:00 +0000</pubDate>
          <author>wannabe</author>
          <link>https://wannabe-data-engineer.net/aws-database-specialty-pass/</link>
          <guid>https://wannabe-data-engineer.net/aws-database-specialty-pass/</guid>
          <description xml:base="https://wannabe-data-engineer.net/aws-database-specialty-pass/">&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/aws-database-specialty-pass/eyechatch.png&quot; alt=&quot;AWS 認定 データベース – 専門知識&quot; /&gt;&lt;/p&gt;
&lt;p&gt;先日、AWS 認定 データベース – 専門知識(AWS Certified Database - Specialty)(DBS-C01)に合格しましたので、感想や試験対策について記載致します。&lt;/p&gt;
&lt;h2 id=&quot;試験感想&quot;&gt;試験感想&lt;/h2&gt;
&lt;p&gt;思っていたよりも深い部分まで問われるような問題が多かったように感じます。後述する「深い知識が必要」なサービス等について、曖昧な部分を少なくすることが合格への近道かと考えられます。&lt;br /&gt;
スコアとしましては900/1000点にて合格致しましたが、体感としましても、1割程度は「決め手になる知識が曖昧なため選択肢を絞り込めない」ような問題が出ました。&lt;br /&gt;
なお、下記のように「データベーステクノロジー分野における最低 5 年間の経験」が推奨されていますが、現時点では、一般的なデータベースに関する知識を直接問われるというよりも、それをベースにしたAWSサービスの利用が主軸となっている印象でした。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;認定によって検証される能力&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;AWS データベースサービスの各主要機能と、それぞれの違いを理解する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS のサービスを使うデータベースソリューションを、適切に提案および設計するための、必要事項と要件を分析する&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;推奨される知識と経験&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;データベーステクノロジー分野における最低 5 年間の経験&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS を使う実践的な業務における、最低 2 年間の経験&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;オンプレミスと AWS クラウドベースでの、リレーショナルおよび非リレーショナルデータベース業務に関する経験と専門知識&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://aws.amazon.com/jp/certification/certified-database-specialty/&quot;&gt;AWS 認定 データベース – 専門知識&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;試験対策&quot;&gt;試験対策&lt;/h2&gt;
&lt;p&gt;おおよそ、次のような流れで試験対策を実施しました。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;サービスの概要をつかむ
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/&quot;&gt;AWS サービス別資料(BlackBelt)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;試験対策(インプット)
&lt;ul&gt;
&lt;li&gt;&lt;del&gt;Ultimate AWS Certified Database Specialty&lt;/del&gt; (資格廃止につきUdemy削除)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;試験対策(アウトプット)
&lt;ul&gt;
&lt;li&gt;&lt;del&gt;Practice Exam | AWS Certified Database Specialty&lt;/del&gt; (資格廃止につきUdemy削除)&lt;/li&gt;
&lt;li&gt;&lt;del&gt;AWS Certified Database Specialty Practice Exams&lt;/del&gt; (資格廃止につきUdemy削除)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;サービスの概要をつかむ&quot;&gt;サービスの概要をつかむ&lt;/h3&gt;
&lt;p&gt;AWSのサービス概要を把握する際に非常に有益なのが&lt;a rel=&quot;external&quot; href=&quot;https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/&quot;&gt;AWS サービス別資料(BlackBelt)&lt;/a&gt;です。&lt;br /&gt;
実際の試験対策に進む前に、主として次のようなサービスの概要を、まずは、ざっくりとでも把握された方が分かりやすくなるかと存じます(※あくまで執筆時点で個人的に重要そうだと感じた順番です)。&lt;br /&gt;
なお、下記サービス以外にも出題される可能性がありますし、記載がなくとも、全体的にSAAレベルの基本的な内容は把握しておいた方が、問題文を把握する上で役立つと思われます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;深い知識が必要
&lt;ul&gt;
&lt;li&gt;Aurora&lt;/li&gt;
&lt;li&gt;RDS&lt;/li&gt;
&lt;li&gt;DynamoDB&lt;/li&gt;
&lt;li&gt;DMS(Database Migration Service)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ある程度の知識が必要
&lt;ul&gt;
&lt;li&gt;ElastiCache&lt;/li&gt;
&lt;li&gt;Redshift&lt;/li&gt;
&lt;li&gt;KMS(Key Management Service)&lt;/li&gt;
&lt;li&gt;CloudFormation&lt;/li&gt;
&lt;li&gt;DocumentDB&lt;/li&gt;
&lt;li&gt;Neptune&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;周辺知識として必要
&lt;ul&gt;
&lt;li&gt;IAM(Identity and Access Management)&lt;/li&gt;
&lt;li&gt;Direct Connect&lt;/li&gt;
&lt;li&gt;Site-to-Site VPN&lt;/li&gt;
&lt;li&gt;Systems Manager&lt;/li&gt;
&lt;li&gt;CloudWatch&lt;/li&gt;
&lt;li&gt;VPC&lt;/li&gt;
&lt;li&gt;S3&lt;/li&gt;
&lt;li&gt;Snowball&lt;/li&gt;
&lt;li&gt;Lambda&lt;/li&gt;
&lt;li&gt;Timestream&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;試験対策(インプット)&quot;&gt;試験対策(インプット)&lt;/h3&gt;
&lt;p&gt;※資格廃止に伴いUdemy講座は削除されました。&lt;/p&gt;
&lt;p&gt;&lt;del&gt;試験対策のインプットとして非常にお勧めなのが、Udemyの[Ultimate AWS Certified Database Specialty]です。&lt;a rel=&quot;external&quot; href=&quot;https://aws.amazon.com/jp/developer/community/heroes/&quot;&gt;AWS ヒーロー&lt;/a&gt;の一人である&lt;a rel=&quot;external&quot; href=&quot;https://aws.amazon.com/jp/developer/community/heroes/stephane-maarek/&quot;&gt;Stephane Maarek&lt;/a&gt;さんも講師として登場します。&lt;/del&gt;&lt;br /&gt;
&lt;del&gt;試験対策としての要点が非常に良くまとまっており、このコースで扱われる内容を把握していれば、高得点での合格に繋がるものと存じます。&lt;/del&gt;&lt;br /&gt;
&lt;del&gt;なお、章ごとのクイズは実際の試験よりも非常に易しいため、あくまでも知識の整理という観点で解いた方がよろしいかと存じます。&lt;/del&gt;&lt;br /&gt;
&lt;del&gt;コンテンツは英語ですが、動画に自動生成字幕(英語)を表示することもできるため、リスニングが苦手な場合でも視聴は可能です。字幕は自動生成なので少し誤りもありますが、意味は掴めるレベルです。&lt;/del&gt;&lt;br /&gt;
&lt;del&gt;実際に試験を受けてみて、コースの内容として、ほぼ試験に関係のないものは扱われていないとの印象を受けたため、全て試験に出る可能性があるものとして視聴いただいても問題ないものと個人的に思います。&lt;/del&gt;&lt;/p&gt;
&lt;h3 id=&quot;試験対策(アウトプット)&quot;&gt;試験対策(アウトプット)&lt;/h3&gt;
&lt;p&gt;※資格廃止に伴いUdemy講座は削除されました。&lt;/p&gt;
&lt;p&gt;&lt;del&gt;試験対策のアウトプットとしてお勧めなのが、次の2つの問題集です。&lt;/del&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;del&gt;Practice Exam | AWS Certified Database Specialty&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;AWS Certified Database Specialty Practice Exams&lt;/del&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;del&gt;問題文は英語ですが、英語が読めなくとも、テキストとしてコピーすることが可能なため、容易に翻訳サービスを利用することもできます。&lt;/del&gt;&lt;br /&gt;
&lt;del&gt;そっくりそのまま出題されるわけではありませんが、不正解の選択肢がなぜ不正解なのかも含めて理解することで、試験に非常に役立ちます。&lt;/del&gt;&lt;br /&gt;
&lt;del&gt;私は2つの問題集で正解率96%～100%程度を安定して出せるようになった段階で受験しました。&lt;/del&gt;&lt;/p&gt;
&lt;h2 id=&quot;試験Tips&quot;&gt;試験Tips&lt;/h2&gt;
&lt;p&gt;あまり深くは言及できませんが、受験にあたり、特に意識しておくと役に立つかもしれない項目について記載致します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AuroraとRDSの違いを意識する&lt;/li&gt;
&lt;li&gt;Auroraの機能ごとの制約を意識する&lt;/li&gt;
&lt;li&gt;データベースエンジンごとの違いを意識する&lt;/li&gt;
&lt;li&gt;冗長化機能の違いを意識する&lt;/li&gt;
&lt;li&gt;グローバル展開機能の違いを意識する&lt;/li&gt;
&lt;li&gt;複数が正解に見える時は最も重視されていることを考える&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;AuroraとRDSの違いを意識する&quot;&gt;AuroraとRDSの違いを意識する&lt;/h3&gt;
&lt;p&gt;「AuroraにできてRDSにできない」「この機能はAuroraだとこうなるがRDSだとこうなる」等のパターンを把握しておくと良いかもしれません。例えば前者はバックトラックやレプリカの自動フェイルオーバー、後者はマルチAZ構成時の同期方式等です。&lt;/p&gt;
&lt;h3 id=&quot;Auroraの機能ごとの制約を意識する&quot;&gt;Auroraの機能ごとの制約を意識する&lt;/h3&gt;
&lt;p&gt;Auroraは色々な機能を利用できますが、それぞれで細かな制約があります。例えば、サーバレス、グローバルデータベース、バックトラック等がありますが、それぞれの制約も意識しておくと良いかもしれません。&lt;/p&gt;
&lt;h3 id=&quot;データベースエンジンごとの違いを意識する&quot;&gt;データベースエンジンごとの違いを意識する&lt;/h3&gt;
&lt;p&gt;採用されているデータベースエンジンごとの差異についても把握しておくと良いかもしれません。例えば、リードレプリカの多段階生成可否、TDEの利用可否、IAM認証の利用可否等です。&lt;/p&gt;
&lt;h3 id=&quot;冗長化機能の違いを意識する&quot;&gt;冗長化機能の違いを意識する&lt;/h3&gt;
&lt;p&gt;マルチAZ構成できるのか、できないのか、できる場合は同期なのか、非同期なのか等も把握しておくと良いかもしれません。例えば、AuroraとRDSの違いにも関係しますが、それぞれでどういった冗長化機能の実現方式となっているか等です。&lt;/p&gt;
&lt;h3 id=&quot;グローバル展開機能の差異を意識する&quot;&gt;グローバル展開機能の差異を意識する&lt;/h3&gt;
&lt;p&gt;Aurora、RDS、DynamoDB、ElastiCache、Redshift等はグローバルに展開する機能を保持しています。DRとして他リージョンを利用する機能もあります。それぞれの特徴(例えば書き込み可否やデータコピーの方法)について把握しておくと良いかもしれません。&lt;/p&gt;
&lt;h3 id=&quot;複数が正解に見える時は最も重視されていることを考える&quot;&gt;複数が正解に見える時は最も重視されていることを考える&lt;/h3&gt;
&lt;p&gt;正直、複数の選択肢が正解に見えることもありますが、そういった時は、問題文で「何が最も重視されているか」を意識するようにしました。料金なのか、変更量なのか、ダウンタイムなのか、メンテナンス性なのか等、改めて見てみると正解が絞れることもあるかもしれません。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Aurora PostgreSQLでキャッシュをクリアする方法について</title>
          <pubDate>Sun, 07 Mar 2021 00:00:00 +0000</pubDate>
          <author>wannabe</author>
          <link>https://wannabe-data-engineer.net/aurora-postgresql-cache-clear/</link>
          <guid>https://wannabe-data-engineer.net/aurora-postgresql-cache-clear/</guid>
          <description xml:base="https://wannabe-data-engineer.net/aurora-postgresql-cache-clear/">&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/aurora-postgresql-cache-clear/eyechatch.png&quot; alt=&quot;Aurora PostgreSQLでキャッシュをクリアする方法について&quot; /&gt;&lt;/p&gt;
&lt;p&gt;データベース開発作業の一環として、パフォーマンスのテストを実施することもあるかと存じます。ただし、複数回のパフォーマンステストを実施する際には、実施前にキャッシュをクリアし、その影響を抑える必要があります。ここでは、Aurora PostgreSQLでキャッシュをクリアする際の手法について記載します。&lt;/p&gt;
&lt;h2 id=&quot;結論&quot;&gt;結論&lt;/h2&gt;
&lt;p&gt;結論としては次の通りです。残念ながら、執筆時点ではSQL等によりキャッシュをクリアすることはできません。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Aurora PostgreSQLクラスターは停止・起動することでキャッシュをクリアできる(再起動ではクリアできない)&lt;/li&gt;
&lt;li&gt;バーストパフォーマンスインスタンス(t系のインスタンス)は再起動でもキャッシュをクリアできる(&lt;code&gt;db.t3.medium&lt;/code&gt;で確認)&lt;/li&gt;
&lt;li&gt;キャッシュがクリアされたことは&lt;code&gt;pg_buffercache&lt;/code&gt;を利用することで確認することができる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下、詳細です。&lt;/p&gt;
&lt;h2 id=&quot;Aurora_PostgreSQLは再起動でキャッシュがクリアされない&quot;&gt;Aurora PostgreSQLは再起動でキャッシュがクリアされない&lt;/h2&gt;
&lt;p&gt;キャッシュはメモリ上の存在するため、揮発性を持ち、したがって、再起動によりキャッシュはクリアされるというのが一般的な感覚であるかと存じます。&lt;/p&gt;
&lt;p&gt;しかしながら、Auroraはクラウドに適したアーキテクチャとなっているからか、障害発生時の再起動を想定し、再起動後はキャッシュを自動的にウォームアップします。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Aurora では、データベースがシャットダウン後に起動したとき、または障害発生後に再起動したときに、バッファープールキャッシュを &quot;ウォームアップ&quot; します。つまり、Aurora では、メモリ内ページキャッシュに保存された既知の一般的なクエリのページを使用してバッファープールを事前にロードします。これにより、通常のデータベースの使用からバッファープールを &quot;ウォームアップ&quot; する必要性をバイパスすることでパフォーマンスが向上します。&lt;/p&gt;
&lt;p&gt;Aurora ページキャッシュはデータベースとは別のプロセスで管理されるため、ページキャッシュはデータベースとは無関係に存続できます。データベースに障害が発生した場合でも、ページキャッシュはメモリに残るため、バッファプールはデータベースの起動時に最新の状態にウォームアップされます。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Aurora.Overview.StorageReliability.html#Aurora.Overview.CacheWarming&quot;&gt;Amazon Aurora ストレージと信頼性&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ただし、執筆時点のAurora PostgreSQLで最も安価な&lt;code&gt;db.t3.medium&lt;/code&gt;インスタンスでは、再起動によりキャッシュがクリアされてしまいました。&lt;br /&gt;
Auroraでt系インスタンスを利用する場合は、多くのケースにおいては開発環境が想定されますので、キャッシュについての実装内容が異なるのかもしれません。&lt;/p&gt;
&lt;h2 id=&quot;Aurora_PostgreSQLでキャッシュをクリアする方法&quot;&gt;Aurora PostgreSQLでキャッシュをクリアする方法&lt;/h2&gt;
&lt;p&gt;上記のキャッシュのウォームアップは、執筆時点では「再起動」にのみ適用され、停止→起動には適用されません。したがって、停止→起動することで、Aurora PostgreSQLもキャッシュをクリアすることができます。&lt;/p&gt;
&lt;p&gt;パフォーマンステストを複数回実施する際には、事前にクラスターを停止→起動することでキャッシュをクリアし、キャッシュの内容による結果のブレを抑えるといった対応を行うことができます。&lt;/p&gt;
&lt;h2 id=&quot;Aurora_PostgreSQLでキャッシュを確認する方法&quot;&gt;Aurora PostgreSQLでキャッシュを確認する方法&lt;/h2&gt;
&lt;p&gt;通常のPostgreSQLと同じく、&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.org/docs/13/pgbuffercache.html&quot;&gt;pg_buffercache&lt;/a&gt;を利用することでキャッシュの中身を確認することができます。キャッシュがクリアされたかという点については、キャッシュ上にユーザテーブルが存在するかという観点で確認できます。&lt;/p&gt;
&lt;p&gt;Aurora PostgreSQLにおいても、マスターユーザにて&lt;code&gt;create extension pg_buffercache;&lt;/code&gt;を実施することで、&lt;code&gt;pg_buffercache&lt;/code&gt;の拡張機能を利用することができるようになります。&lt;/p&gt;
&lt;p&gt;以下に、停止→起動によりキャッシュがクリアされたことを確認する例を記載します。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt; -- キャッシュ状態の事前確認&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; SELECT&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; c&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;relname&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;count&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;*&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;AS&lt;/span&gt;&lt;span&gt; buffers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&amp;gt;              FROM&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; public&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;pg_buffercache&lt;/span&gt;&lt;span&gt; b &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;INNER JOIN&lt;/span&gt;&lt;span&gt; pg_class c&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&amp;gt;              ON&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; b&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;relfilenode&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; pg_relation_filenode(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;c&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;oid&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;AND&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;                 b&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;reldatabase&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; IN&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;, (&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;SELECT oid FROM&lt;/span&gt;&lt;span&gt; pg_database&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres(&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;                                       WHERE&lt;/span&gt;&lt;span&gt; datname &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt; current_database()))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&amp;gt;              GROUP BY&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; c&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;relname&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&amp;gt;              ORDER BY&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; DESC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&amp;gt;              LIMIT&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 5&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                 relname                 | buffers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-----------------------------------------+---------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_attribute                            |      &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;42&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_class                                |      &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;12&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_proc                                 |       &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_attribute_relid_attnum_index         |       &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;7&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_proc_oid_index                       |       &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;6&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt; -- `stats_test_table`を参照することでキャッシュに載せる&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; select * from&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; public&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;stats_test_table&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; col1 | col2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;------+------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;    1&lt;/span&gt;&lt;span&gt; | test&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;    2&lt;/span&gt;&lt;span&gt; | test&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;    3&lt;/span&gt;&lt;span&gt; | test&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;---省略---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt; -- `stats_test_table`がキャッシュに存在することを確認する&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; SELECT&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; c&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;relname&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;count&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;*&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;AS&lt;/span&gt;&lt;span&gt; buffers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&amp;gt;              FROM&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; public&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;pg_buffercache&lt;/span&gt;&lt;span&gt; b &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;INNER JOIN&lt;/span&gt;&lt;span&gt; pg_class c&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&amp;gt;              ON&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; b&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;relfilenode&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; pg_relation_filenode(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;c&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;oid&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;AND&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;                 b&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;reldatabase&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; IN&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;, (&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;SELECT oid FROM&lt;/span&gt;&lt;span&gt; pg_database&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres(&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;                                       WHERE&lt;/span&gt;&lt;span&gt; datname &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt; current_database()))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&amp;gt;              GROUP BY&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; c&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;relname&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&amp;gt;              ORDER BY&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; DESC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&amp;gt;              LIMIT&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 5&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                 relname                 | buffers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-----------------------------------------+---------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_attribute                            |      &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;42&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_class                                |      &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;12&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; stats_test_table                        |      &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;11&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_proc                                 |       &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_attribute_relid_attnum_index         |       &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;7&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt; -- Aurora PostgreSQLクラスターを停止→起動する&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt; -- 再接続しキャッシュ状況を確認する(`stats_test_table`が存在しない)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; SELECT&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; c&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;relname&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;count&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;*&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;AS&lt;/span&gt;&lt;span&gt; buffers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&amp;gt;              FROM&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; public&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;pg_buffercache&lt;/span&gt;&lt;span&gt; b &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;INNER JOIN&lt;/span&gt;&lt;span&gt; pg_class c&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&amp;gt;              ON&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; b&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;relfilenode&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; =&lt;/span&gt;&lt;span&gt; pg_relation_filenode(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;c&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;oid&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;AND&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;                 b&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;reldatabase&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; IN&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;, (&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;SELECT oid FROM&lt;/span&gt;&lt;span&gt; pg_database&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres(&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;                                       WHERE&lt;/span&gt;&lt;span&gt; datname &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt; current_database()))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&amp;gt;              GROUP BY&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; c&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;relname&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&amp;gt;              ORDER BY&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; DESC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&amp;gt;              LIMIT&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 5&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                 relname                 | buffers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-----------------------------------------+---------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_attribute                            |      &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;42&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_class                                |      &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;12&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_proc                                 |       &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_attribute_relid_attnum_index         |       &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;7&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_proc_oid_index                       |       &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;6&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Aurora PostgreSQLはクラウド環境に最適化されたエンジンで、優れた機能を多く持っていますが、結果として既存の感覚が通用しない挙動となることもあります。&lt;/p&gt;
&lt;p&gt;便利な分、ドキュメントを精読したり、動作確認をしたり、挙動の把握は大切ですね。なかなか事前に全ての挙動を把握するのは難しいですが。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>MaximumUsedTransactionIDsについて</title>
          <pubDate>Fri, 12 Feb 2021 00:00:00 +0000</pubDate>
          <author>wannabe</author>
          <link>https://wannabe-data-engineer.net/maximum-used-transaction-ids/</link>
          <guid>https://wannabe-data-engineer.net/maximum-used-transaction-ids/</guid>
          <description xml:base="https://wannabe-data-engineer.net/maximum-used-transaction-ids/">&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/maximum-used-transaction-ids/eyechatch.png&quot; alt=&quot;max_wal_sendersの調整に関するRDSイベントについて&quot; /&gt;&lt;/p&gt;
&lt;p&gt;RDS for PostgreSQLやAurora PostgreSQLでCloudWatchメトリクスとして用意されている&lt;code&gt;MaximumUsedTransactionIDs&lt;/code&gt;について記載致します。&lt;/p&gt;
&lt;h2 id=&quot;MaximumUsedTransactionIDsについてのまとめ&quot;&gt;MaximumUsedTransactionIDsについてのまとめ&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;MaximumUsedTransactionIDs&lt;/code&gt;は、当該インスタンス上の全データベース中で、最も長くトランザクションIDが凍結されていないテーブルの経過トランザクション数を示します。&lt;/p&gt;
&lt;p&gt;最も長くトランザクションIDが凍結されていないテーブルについて、下記のような条件が満たされると、当該メトリクスも低下します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;バキューム時に古いトランザクションIDを含むページが読み込まれた場合&lt;/li&gt;
&lt;li&gt;最後にトランザクションIDが凍結されてから&lt;code&gt;vacuum_freeze_table_age&lt;/code&gt;の設定値を経過した後にバキュームされた場合&lt;/li&gt;
&lt;li&gt;最後にトランザクションIDが凍結されてから&lt;code&gt;autovacuum_freeze_max_age&lt;/code&gt;の設定値に達して強制的にバキュームされた場合&lt;/li&gt;
&lt;li&gt;手動で&lt;code&gt;vacuum freeze&lt;/code&gt;を実行した場合&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最後にトランザクションIDが凍結されてからの経過トランザクション数をデータベースごとに確認するには下記のようなSQLを実行します。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;select&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  datname,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  age(datfrozenxid) &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;as&lt;/span&gt;&lt;span&gt; age&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  pg_database&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;order by&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  2&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; desc&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最後にトランザクションIDが凍結されてからの経過トランザクション数をテーブルごとに確認するには下記のようなSQLを実行します。&lt;/p&gt;
&lt;p&gt;上記で経過トランザクション数が多かったデータベースに接続して実施します。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;select&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  relname,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  age(relfrozenxid) &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;as&lt;/span&gt;&lt;span&gt; age&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  pg_class&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;where&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  relkind &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;r&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;order by&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  2&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; desc&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最終的には&lt;code&gt;MaximumUsedTransactionIDs&lt;/code&gt;が&lt;code&gt;autovacuum_freeze_max_age&lt;/code&gt;の設定値に達した段階で強制的なバキュームにより増加傾向が横ばいとなることが予測されますが、これは、必ずしも未対応で問題ないということは意味しません。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;autovacuum_freeze_max_age&lt;/code&gt;に達するまで、何らかの理由で長い期間バキュームされていなかったということを暗示するためです。また、このタイミングの強制的なバキュームの負荷が非常に高くなる可能性があります。&lt;/p&gt;
&lt;p&gt;したがって、&lt;code&gt;MaximumUsedTransactionIDs&lt;/code&gt;のメトリクスについて、少なくとも&lt;code&gt;vacuum_freeze_table_age&lt;/code&gt;の設定値付近にアラームを設定しておき、&lt;code&gt;autovacuum_freeze_max_age&lt;/code&gt;に達する前にバキュームするのが望ましい対応です。&lt;/p&gt;
&lt;p&gt;また、自動バキュームが適切に行われているか確認し、行われていない場合は、自動バキュームの閾値を再検討する形が望ましいです。&lt;/p&gt;
&lt;p&gt;自動バキュームが行われているかは、&lt;code&gt;rds.force_autovacuum_logging_level&lt;/code&gt;および&lt;code&gt;log_autovacuum_min_duration&lt;/code&gt;を適切に設定することで、ログ上から確認することができます。例えば、前者を&lt;code&gt;log&lt;/code&gt;とし、後者を&lt;code&gt;0&lt;/code&gt;とすることで、全ての自動バキュームに関する情報をログ出力させることができます。&lt;/p&gt;
&lt;p&gt;主なログの確認観点としては、「自動バキュームが行われているか」という点と、「自動バキュームがスキップされていないか」という点になります。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;rds.force_autovacuum_logging_level パラメータの値を log に設定し、log_autovacuum_min_duration パラメータを 1,000〜5,000 ミリ秒の値に設定することをお勧めします。この値を 5,000 に設定すると、Amazon RDS は、5 秒を超えるすべてのアクティビティをログに書き込みます。また、アプリケーションのロックによって autovacuum で意図的にテーブルがスキップされた場合は、「バキュームのスキップ」メッセージも表示されます。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html&quot;&gt;PostgreSQL の一般的な DBA タスク&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;以下、&lt;code&gt;MaximumUsedTransactionIDs&lt;/code&gt;に深く関連するトランザクションIDに関する説明です。&lt;/p&gt;
&lt;h2 id=&quot;トランザクションIDとは&quot;&gt;トランザクションIDとは&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;データのバージョン管理を行うための管理IDである&lt;/li&gt;
&lt;li&gt;トランザクションIDを比較することでどの時点のデータを見せるかを管理している&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PostgreSQLはデータ追記型のアーキテクチャです。データに対して更新を行っても、実際は最新版のデータが追記されます。つまり、更新前のデータは最新版として扱われなくなるだけで、バキュームで回収されるまでは物理的には存在しています。&lt;/p&gt;
&lt;p&gt;データ追記型アーキテクチャにおいて問題となるのが、データのバージョン管理です。物理的には複数データが存在するため、どれが最新のデータなのか、実行中のトランザクションからはどのデータを見れば良いのかという点を管理する必要があります。&lt;/p&gt;
&lt;p&gt;このバージョン管理を実施するために利用されているのがトランザクションIDです。&lt;/p&gt;
&lt;p&gt;イメージとしては、各トランザクションに昇順の数値であるトランザクションIDを割り当て、そのトランザクション内でデータが更新(実際は追記)された場合は、当該データに対して、更新を行ったトランザクションIDもメタデータとして保持させるような形です。&lt;/p&gt;
&lt;p&gt;各トランザクションに割り当てられたIDと、各データが保持するIDを比較することにより、トランザクションから参照可能なデータのバージョンの絞り込みが行えるようになります。&lt;/p&gt;
&lt;p&gt;このトランザクションIDの比較作業により、たとえ物理的には古いデータが存在している場合でも、論理的には新しいデータを見ることができるようになります。&lt;/p&gt;
&lt;p&gt;また、そのトランザクションから見えてはいけない時点のデータを見せないといったバージョン管理も実現することができます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PostgreSQLのMVCCトランザクションのセマンティクスは、トランザクションID（XID）番号の比較が可能であることに依存しています。 現在のトランザクションのXIDよりも新しい挿入時のXIDを持ったバージョンの行は、「未来のもの」であり、現在のトランザクションから可視であってはなりません。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.jp/document/12/html/routine-vacuuming.html&quot;&gt;24.1. 定常的なバキューム作業&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;トランザクションIDの周回とは&quot;&gt;トランザクションIDの周回とは&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;利用できるトランザクションIDを使い果たして最初から再利用し始める事象のこと&lt;/li&gt;
&lt;li&gt;何も対策が取られないと再利用後のトランザクションからは全てのデータが論理的に見えなくなる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;さて、上記でトランザクションIDについて記載しましたが、数値を扱う上で避けられないことがあります。それは扱える数値の上限です。&lt;/p&gt;
&lt;p&gt;PostgreSQLではトランザクションIDを32ビットの符号付き整数で表しているため、&lt;code&gt;-2,147,483,648&lt;/code&gt;から&lt;code&gt;2,147,483,647&lt;/code&gt;まで扱えます。&lt;/p&gt;
&lt;p&gt;つまり、トランザクションIDの最大値は&lt;code&gt;2,147,483,647&lt;/code&gt;ですが、PostgreSQLはこの約20億以上のトランザクションを超えても継続的に動作できるような仕組みを持っています。&lt;/p&gt;
&lt;p&gt;どのような仕組みかと言うと、トランザクションIDを最初からまた再利用するのです。これをトランザクションIDの周回と呼びます。&lt;/p&gt;
&lt;p&gt;しかしながら、再利用されて割り当てられたトランザクションIDは直前のトランザクションIDと比べると、圧倒的に若い値となります(極端に表現すると&lt;code&gt;2,147,483,647&lt;/code&gt;→&lt;code&gt;0&lt;/code&gt;)。&lt;/p&gt;
&lt;p&gt;そうなると、再利用されたトランザクションIDからは、全てのデータが未来のものとして扱われるようになります。&lt;/p&gt;
&lt;p&gt;したがって、物理的にはデータが存在する状態にも関わらず、論理的にはデータは存在しないものとして扱われてしまいます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;トランザクションIDのサイズには制限（32ビット）があり、長時間（40億トランザクション）稼働しているクラスタはトランザクションの周回を経験します。 XIDのカウンタが一周して0に戻り、そして、突然に、過去になされたトランザクションが将来のものと見えるように、つまり、その出力が不可視になります。 端的に言うと、破滅的なデータの損失です。 （実際はデータは保持されていますが、それを入手することができなければ、慰めにならないでしょう。）&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.jp/document/12/html/routine-vacuuming.html&quot;&gt;24.1. 定常的なバキューム作業&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;トランザクションIDの凍結とは&quot;&gt;トランザクションIDの凍結とは&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;データをどのトランザクションIDから見ても過去のものとして見えるトランザクションIDに更新すること&lt;/li&gt;
&lt;li&gt;これによりトランザクションIDの周回による論理的なデータ損失を避けることができる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;論理的にデータが損失するということは、実質的に約20億トランザクションまでしかPostgreSQLを利用できないのかと言うと、そうではありません。&lt;/p&gt;
&lt;p&gt;上記のトランザクションIDの周回に伴う論理的なデータの損失を避けるための仕組みも持っています。&lt;/p&gt;
&lt;p&gt;どのような仕組みかと言うと、データを「どのトランザクションIDから見ても過去のものとして見えるトランザクションID」として更新するのです。この特殊な更新をトランザクションIDの凍結と呼びます。&lt;/p&gt;
&lt;p&gt;この仕組みにより、たとえトランザクションIDの周回が発生し、急激に若いトランザクションIDが割り当てられ、単純なトランザクションIDの比較だとデータが論理的に損失するような場合でも、「どのトランザクションIDから見ても過去のものとして見えるトランザクションID」に凍結されたデータを見ることができるようになります。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PostgreSQLは特別なXID、FrozenTransactionIdを確保します。 このXIDは通常のXIDの比較規則には従わず、常に全ての通常のXIDよりも古いものとみなされます。&lt;/p&gt;
&lt;p&gt;～～中略～～&lt;/p&gt;
&lt;p&gt;凍結された行バージョンは挿入XIDがFrozenTransactionIdであるかのように扱われ、それで、周回問題に関係なく、すべての通常のトランザクションから「過去のもの」として認識され、また、そのバージョンの行はどれだけ古いものであろうと、削除されるまで有効状態となります。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.jp/document/12/html/routine-vacuuming.html&quot;&gt;24.1. 定常的なバキューム作業&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;トランザクションIDの凍結タイミング&quot;&gt;トランザクションIDの凍結タイミング&lt;/h2&gt;
&lt;p&gt;トランザクションIDの凍結は下記のタイミングにて実施されます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;バキューム時に古いトランザクションIDを含むページが読み込まれた場合&lt;/li&gt;
&lt;li&gt;最後にトランザクションIDが凍結されてから&lt;code&gt;vacuum_freeze_table_age&lt;/code&gt;の設定値を経過した後にバキュームされた場合&lt;/li&gt;
&lt;li&gt;最後にトランザクションIDが凍結されてから&lt;code&gt;autovacuum_freeze_max_age&lt;/code&gt;の設定値に達して強制的にバキュームされた場合&lt;/li&gt;
&lt;li&gt;手動で&lt;code&gt;vacuum freeze&lt;/code&gt;を実行した場合&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;バキューム時に古いトランザクションIDを含むページが読み込まれた場合&quot;&gt;バキューム時に古いトランザクションIDを含むページが読み込まれた場合&lt;/h3&gt;
&lt;p&gt;通常、バキューム処理はパフォーマンス向上のため、全てのページを読み込むわけではありません。この際、読み飛ばされたページに古いトランザクションIDがあった場合、それは凍結されません。&lt;/p&gt;
&lt;p&gt;したがって、普通のバキューム時には、古いトランザクションIDを含むページが読み込まれない限り、凍結は実施されません(必ず凍結されることは保証されていない)。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;通常は、不要な行バージョンを持っていないページを読み飛ばします。 このとき、そのページに古いXID値の行バージョンがまだある可能性があったとしても読み飛ばします。 したがって、通常のVACUUMでは必ずしもテーブル内のすべての古い行バージョンを凍結するわけではありません。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.jp/document/12/html/routine-vacuuming.html&quot;&gt;24.1. 定常的なバキューム作業&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;最後にトランザクションIDが凍結されてからvacuum_freeze_table_ageの設定値を経過した後にバキュームされた場合&quot;&gt;最後にトランザクションIDが凍結されてから&lt;code&gt;vacuum_freeze_table_age&lt;/code&gt;の設定値を経過した後にバキュームされた場合&lt;/h3&gt;
&lt;p&gt;テーブルで凍結されているトランザクションIDと、現在のトランザクションIDの差が&lt;code&gt;vacuum_freeze_table_age&lt;/code&gt;の設定値を超えた後にバキュームされると(最後にトランザクションIDが凍結されてから&lt;code&gt;vacuum_freeze_table_age&lt;/code&gt;経過すると)、そのテーブルに対しては積極的に凍結が試みられます。&lt;/p&gt;
&lt;p&gt;しかしながら、&lt;code&gt;vacuum_freeze_table_age&lt;/code&gt;を超えても、そもそもバキューム自体が実行されない場合には、凍結も実施されません。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;テーブルのpg_class.relfrozenxidフィールドがこの設定で指定した時期に達すると、VACUUMは積極的なテーブル全て走査を行います。 積極的な全て走査は、無効タプルを含む可能性のあるページだけではなく、凍結されていないXIDあるいはMXIDを含むすべてのページを読む点で通常のVACUUMとは異なります。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.jp/document/12/html/runtime-config-client.html#GUC-VACUUM-FREEZE-TABLE-AGE&quot;&gt;vacuum_freeze_table_age&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;最後にトランザクションIDが凍結されてからautovacuum_freeze_max_ageの設定値に達して強制的にバキュームされた場合&quot;&gt;最後にトランザクションIDが凍結されてから&lt;code&gt;autovacuum_freeze_max_age&lt;/code&gt;の設定値に達して強制的にバキュームされた場合&lt;/h3&gt;
&lt;p&gt;最後のトランザクションIDの凍結から&lt;code&gt;vacuum_freeze_table_age&lt;/code&gt;を超えてもバキュームされないままだと、最終的に&lt;code&gt;autovacuum_freeze_max_age&lt;/code&gt;の段階で強制的にバキュームされます。&lt;/p&gt;
&lt;p&gt;これにより、トランザクションIDの周回によるデータ損失対策が強制的に実施されます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;トランザクションID周回を防ぐためにVACUUM操作が強制される前までにテーブルのpg_class.relfrozenxid フィールドが到達できる最大（トランザクションにおける）年代を指定します。 自動バキュームが無効であった時でも、システムは周回を防ぐために自動バキューム子プロセスを起動することに注意してください。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.jp/document/12/html/runtime-config-autovacuum.html#GUC-AUTOVACUUM-FREEZE-MAX-AGE&quot;&gt;autovacuum_freeze_max_age&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;手動でvacuum_freezeを実行した場合&quot;&gt;手動で&lt;code&gt;vacuum freeze&lt;/code&gt;を実行した場合&lt;/h3&gt;
&lt;p&gt;手動でバキューム時に凍結を実施した場合も、トランザクションIDが凍結されます。バキューム時に&lt;code&gt;freeze&lt;/code&gt;オプションをつけることで手動で実施することができます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;FREEZE&lt;/p&gt;
&lt;p&gt;積極的なタプルの「凍結」を選択します。 FREEZE指定は、vacuum_freeze_min_ageおよびvacuum_freeze_table_ageパラメータをゼロとしてVACUUMを実行することと同じです。 テーブルが書き換えられる時は、必ず積極的な凍結が行われるので、FULLが指定されているときは、このオプションは冗長です。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.jp/document/12/html/sql-vacuum.html&quot;&gt;VACUUM&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;経過トランザクション数の確認&quot;&gt;経過トランザクション数の確認&lt;/h2&gt;
&lt;h3 id=&quot;データベースごと&quot;&gt;データベースごと&lt;/h3&gt;
&lt;p&gt;最後にトランザクションIDが凍結されてからの経過トランザクション数をデータベースごとに確認するには、例えば下記のようなSQLを実行します。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;select&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  datname,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  age(datfrozenxid) &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;as&lt;/span&gt;&lt;span&gt; age&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  pg_database&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;order by&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  2&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; desc&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;テーブルごと&quot;&gt;テーブルごと&lt;/h3&gt;
&lt;p&gt;最後にトランザクションIDが凍結されてからの経過トランザクション数をテーブルごとに確認するには、例えば下記のようなSQLを実行します。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;select&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  relname,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  age(relfrozenxid) &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;as&lt;/span&gt;&lt;span&gt; age&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  pg_class&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;order by&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  2&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; desc&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</description>
      </item>
      <item>
          <title>RDS for Oracle作成後に行う基本的な設定について</title>
          <pubDate>Fri, 01 Jan 2021 00:00:00 +0000</pubDate>
          <author>wannabe</author>
          <link>https://wannabe-data-engineer.net/rds-for-oracle-initial-task/</link>
          <guid>https://wannabe-data-engineer.net/rds-for-oracle-initial-task/</guid>
          <description xml:base="https://wannabe-data-engineer.net/rds-for-oracle-initial-task/">&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/rds-for-oracle-initial-task/eyechatch.png&quot; alt=&quot;RDS for Oracle作成後に行う基本的な設定について&quot; /&gt;&lt;/p&gt;
&lt;p&gt;RDS for Oracleを作成後、対象インスタンスの内部で共通して実施することの多い、基本的な設定を記載致します。パラメータグループやオプショングループ等のAWSコンソール上で設定可能な項目につきましては、記載対象外となっておりますので、ご了承いただければと存じます。また、全て網羅しているわけではない点につきましても、ご了承いただければと存じます。&lt;/p&gt;
&lt;h2 id=&quot;動作確認環境&quot;&gt;動作確認環境&lt;/h2&gt;
&lt;p&gt;今回はRDS for Oracle 12.1 SE2を利用して動作確認を実施致しました。&lt;/p&gt;
&lt;p&gt;エディションやバージョンが異なる場合、内容も若干異なる可能性がある点につきましても、ご了承いただければと存じます。&lt;/p&gt;
&lt;h2 id=&quot;REDOログ&quot;&gt;REDOログ&lt;/h2&gt;
&lt;h3 id=&quot;RDS初期構築時の設定&quot;&gt;RDS初期構築時の設定&lt;/h3&gt;
&lt;p&gt;RDS for Oracleでは、構築時に128MBのREDOログ・グループが4つ用意されています。各REDOログ・グループには1つのメンバが存在する状況です。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; select&lt;/span&gt;&lt;span&gt; group#, bytes&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span&gt; mb, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;status from&lt;/span&gt;&lt;span&gt; v$&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;log order by&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    GROUP#         MB &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;STATUS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;---------- ---------- --------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         1        128&lt;/span&gt;&lt;span&gt; ACTIVE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         2        128&lt;/span&gt;&lt;span&gt; CURRENT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         3        128&lt;/span&gt;&lt;span&gt; ACTIVE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         4        128&lt;/span&gt;&lt;span&gt; ACTIVE&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;オンプレミスに慣れ親しんだ方から見ると、REDOログ・メンバが1つという状況に違和感を覚えるかもしれませんが、RDS for Oracleではグループにメンバを追加することはできません。&lt;/p&gt;
&lt;p&gt;したがって、RDS for OracleにおいてのREDOログ管理は、「REDOログファイルのサイズ」と「REDOログ・グループの数」の2つの観点となります。&lt;/p&gt;
&lt;p&gt;更に、RDS for Oracleでは5分おきに強制的にログスイッチが発生するという内部仕様があります。これはRDSのPITR機能を実現するためのもので、変更することはできません。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;DB インスタンスの復元可能な直近の時間は、通常、現在時刻の 5 分以内です。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://aws.amazon.com/jp/rds/features/backup/&quot;&gt;Amazon RDS のバックアップと復元&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;つまり、どれだけREDOログを大きくしても、ログスイッチの発生間隔を5分より短くすることはできません。したがって、チェックポイントの発生間隔も5分より短くすることはできません。&lt;/p&gt;
&lt;p&gt;この仕様により、RDS for Oracleでは次のようなメッセージがアラートログに出力されやすくなっています。5分間隔で定期的に出力されており、かつ、具体的なパフォーマンス影響がない場合、現状では無視せざるを得ないメッセージです。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;log&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Thread &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt; cannot allocate new log, sequence &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;5154&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Checkpoint not complete&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Current log# &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;5&lt;/span&gt;&lt;span&gt; seq# &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;5153&lt;/span&gt;&lt;span&gt; mem# &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;: /rdsdbdata/db/ORCL_A/onlinelog/o1_mf_5_hq02flny_.log&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;5分間隔よりも短く、かつ、継続的に出力されているような場合は、REDOログのサイズを大きくしたり、REDOログのグループ数を増やしたりするといった対応の検討を行います。&lt;/p&gt;
&lt;p&gt;チェックポイントの発生があまりにも多すぎるという印象を持たれる方もいらっしゃるかとは存じますが、マネージドサービスのため、現状では受け入れるしかない仕様です。&lt;/p&gt;
&lt;h3 id=&quot;REDOログサイズ変更&quot;&gt;REDOログサイズ変更&lt;/h3&gt;
&lt;p&gt;RDSでは、具体的には次のような流れにてREDOログのサイズ変更を行います。流れ自体はオンプレミスと変わりありませんが、操作にはAWSが用意したプロシージャを利用する必要があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;十分な空きストレージ容量があることを確認する&lt;/li&gt;
&lt;li&gt;適切なサイズのREDOログを適切な数だけ追加する(&lt;code&gt;rdsadmin.rdsadmin_util.add_logfile&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;ログスイッチを行い追加したREDOログを&lt;code&gt;CURRENT&lt;/code&gt;にする(&lt;code&gt;rdsadmin.rdsadmin_util.switch_logfile&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;既存のREDOログが&lt;code&gt;INACTIVE&lt;/code&gt;でない場合はチェックポイントを手動で発生させる(&lt;code&gt;rdsadmin.rdsadmin_util.checkpoint&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;既存のREDOログを削除する(&lt;code&gt;rdsadmin.rdsadmin_util.drop_logfile&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;次の例では、REDOログのサイズを128MBから1GBに変更しています。REDOログの数は4つのままとしています。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-- 1GBのREDOログを4つ追加します(引数にはサイズを指定します)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; exec&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; rdsadmin&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;rdsadmin_util&lt;/span&gt;&lt;span&gt;.add_logfile(p_size &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;1024M&amp;#39;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;PL&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;SQLプロシージャが正常に完了しました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; exec&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; rdsadmin&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;rdsadmin_util&lt;/span&gt;&lt;span&gt;.add_logfile(p_size &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;1024M&amp;#39;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;PL&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;SQLプロシージャが正常に完了しました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; exec&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; rdsadmin&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;rdsadmin_util&lt;/span&gt;&lt;span&gt;.add_logfile(p_size &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;1024M&amp;#39;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;PL&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;SQLプロシージャが正常に完了しました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; exec&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; rdsadmin&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;rdsadmin_util&lt;/span&gt;&lt;span&gt;.add_logfile(p_size &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;1024M&amp;#39;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;PL&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;SQLプロシージャが正常に完了しました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-- 1GBのREDOログが4つ追加されたことを確認します&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; select&lt;/span&gt;&lt;span&gt; group#, bytes&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span&gt; mb, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;status from&lt;/span&gt;&lt;span&gt; v$&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;log order by&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    GROUP#         MB &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;STATUS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;---------- ---------- --------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         1        128&lt;/span&gt;&lt;span&gt; ACTIVE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         2        128&lt;/span&gt;&lt;span&gt; CURRENT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         3        128&lt;/span&gt;&lt;span&gt; ACTIVE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         4        128&lt;/span&gt;&lt;span&gt; ACTIVE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         5       1024&lt;/span&gt;&lt;span&gt; UNUSED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         6       1024&lt;/span&gt;&lt;span&gt; UNUSED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         7       1024&lt;/span&gt;&lt;span&gt; UNUSED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         8       1024&lt;/span&gt;&lt;span&gt; UNUSED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;8行が選択されました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-- ログスイッチを行い追加したREDOログを`CURRENT`にします&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; exec&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; rdsadmin&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;rdsadmin_util&lt;/span&gt;&lt;span&gt;.switch_logfile;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;PL&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;SQLプロシージャが正常に完了しました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; exec&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; rdsadmin&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;rdsadmin_util&lt;/span&gt;&lt;span&gt;.switch_logfile;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;PL&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;SQLプロシージャが正常に完了しました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; exec&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; rdsadmin&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;rdsadmin_util&lt;/span&gt;&lt;span&gt;.switch_logfile;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;PL&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;SQLプロシージャが正常に完了しました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; select&lt;/span&gt;&lt;span&gt; group#, bytes&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span&gt; mb, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;status from&lt;/span&gt;&lt;span&gt; v$&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;log order by&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    GROUP#         MB &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;STATUS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;---------- ---------- --------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         1        128&lt;/span&gt;&lt;span&gt; ACTIVE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         2        128&lt;/span&gt;&lt;span&gt; ACTIVE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         3        128&lt;/span&gt;&lt;span&gt; ACTIVE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         4        128&lt;/span&gt;&lt;span&gt; ACTIVE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         5       1024&lt;/span&gt;&lt;span&gt; ACTIVE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         6       1024&lt;/span&gt;&lt;span&gt; ACTIVE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         7       1024&lt;/span&gt;&lt;span&gt; CURRENT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         8       1024&lt;/span&gt;&lt;span&gt; UNUSED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;8行が選択されました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-- チェックポイントにより既存のREDOログを`INACTIVE`にします&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; exec&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; rdsadmin&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;rdsadmin_util&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;checkpoint&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;PL&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;SQLプロシージャが正常に完了しました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; select&lt;/span&gt;&lt;span&gt; group#, bytes&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span&gt; mb, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;status from&lt;/span&gt;&lt;span&gt; v$&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;log order by&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    GROUP#         MB &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;STATUS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;---------- ---------- --------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         1        128&lt;/span&gt;&lt;span&gt; INACTIVE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         2        128&lt;/span&gt;&lt;span&gt; INACTIVE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         3        128&lt;/span&gt;&lt;span&gt; INACTIVE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         4        128&lt;/span&gt;&lt;span&gt; INACTIVE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         5       1024&lt;/span&gt;&lt;span&gt; INACTIVE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         6       1024&lt;/span&gt;&lt;span&gt; INACTIVE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         7       1024&lt;/span&gt;&lt;span&gt; CURRENT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         8       1024&lt;/span&gt;&lt;span&gt; UNUSED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;8行が選択されました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-- 既存のREDOログを削除します(引数には削除するREDOログのグループ番号を指定します)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; exec&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; rdsadmin&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;rdsadmin_util&lt;/span&gt;&lt;span&gt;.drop_logfile(grp &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;PL&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;SQLプロシージャが正常に完了しました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; exec&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; rdsadmin&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;rdsadmin_util&lt;/span&gt;&lt;span&gt;.drop_logfile(grp &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 2&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;PL&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;SQLプロシージャが正常に完了しました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; exec&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; rdsadmin&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;rdsadmin_util&lt;/span&gt;&lt;span&gt;.drop_logfile(grp &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 3&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;PL&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;SQLプロシージャが正常に完了しました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; exec&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; rdsadmin&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;rdsadmin_util&lt;/span&gt;&lt;span&gt;.drop_logfile(grp &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 4&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;PL&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;SQLプロシージャが正常に完了しました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; select&lt;/span&gt;&lt;span&gt; group#, bytes&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span&gt; mb, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;status from&lt;/span&gt;&lt;span&gt; v$&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;log order by&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    GROUP#         MB &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;STATUS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;---------- ---------- --------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         5       1024&lt;/span&gt;&lt;span&gt; INACTIVE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         6       1024&lt;/span&gt;&lt;span&gt; INACTIVE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         7       1024&lt;/span&gt;&lt;span&gt; CURRENT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;         8       1024&lt;/span&gt;&lt;span&gt; UNUSED&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;UNDO表領域&quot;&gt;UNDO表領域&lt;/h2&gt;
&lt;h3 id=&quot;RDS初期構築時の設定-1&quot;&gt;RDS初期構築時の設定&lt;/h3&gt;
&lt;p&gt;RDS for Oracleでは、構築時に&lt;code&gt;UNDO_T1&lt;/code&gt;として自動拡張が有効になっているUNDO表領域(BIGFILE)が用意されます。私の環境だと320MBでした。自動拡張が有効で、かつ、BIGFILEという点が特徴的です。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; select&lt;/span&gt;&lt;span&gt; tablespace_name, bigfile, contents, segment_space_management, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;retention from&lt;/span&gt;&lt;span&gt; dba_tablespaces &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;where&lt;/span&gt;&lt;span&gt; contents &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;UNDO&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; order by&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;TABLESPACE_NAME                                              BIGFIL CONTENTS           SEGMENT_SPAC &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;RETENTION&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;------------------------------------------------------------ ------ ------------------ ------------ ----------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;UNDO_T1                                                      YES    UNDO               &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;MANUAL&lt;/span&gt;&lt;span&gt;       NOGUARANTEE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; select&lt;/span&gt;&lt;span&gt; tablespace_name, file_name, autoextensible, bytes&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span&gt; mb, maxbytes&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span&gt; maxmb &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; dba_data_files &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;where&lt;/span&gt;&lt;span&gt; tablespace_name &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;like&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;UNDO%&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; order by&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;TABLESPACE_NAME                                              FILE_NAME                                                 AUTOEX         MB      MAXMB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;------------------------------------------------------------ ----------------------------------------------------------------- ------ ---------- ----------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;UNDO_T1                                                      &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;rdsdbdata&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;ORCL_A&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;datafile&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;o1_mf_undo_t1_hv5s98qk_&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;dbf&lt;/span&gt;&lt;span&gt;         YES           &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;320     102400&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;しかしながら、定まった値を確保し、自動拡張させたくないという方もいらっしゃるかと存じます(個人的には、クラウドを利用するなら最大値を設けた上でUNDOもストレージも自動拡張させてしまいますが、予算都合等もありますので)。&lt;/p&gt;
&lt;h3 id=&quot;UNDO表領域サイズ変更&quot;&gt;UNDO表領域サイズ変更&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ALTER TABLESPACE&lt;/code&gt;文の&lt;code&gt;RESIZE&lt;/code&gt;を利用してUNDO表領域のサイズ変更を行います。なお、新しくUNDO表領域を作成し、&lt;code&gt;UNDO_TABLESPACE&lt;/code&gt;パラメータで新規作成したUNDO表領域を指定する方法もあります。&lt;/p&gt;
&lt;p&gt;UNDO表領域名は&lt;code&gt;UNDOTBS1&lt;/code&gt;でないと落ち着かないという方は、表領域名を変更することも可能ですが、新規作成された方が確実かとは存じます。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; alter&lt;/span&gt;&lt;span&gt; tablespace undo_t1 resize 500m;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;表領域が変更されました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; select&lt;/span&gt;&lt;span&gt; tablespace_name, file_name, autoextensible, bytes&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span&gt; mb, maxbytes&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span&gt; maxmb &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; dba_data_files &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;order by&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;TABLESPACE_NAME                                              FILE_NAME                                                 AUTOEX         MB      MAXMB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;------------------------------------------------------------ ----------------------------------------------------------------- ------ ---------- ----------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;UNDO_T1                                                      &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;rdsdbdata&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;ORCL_A&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;datafile&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;o1_mf_undo_t1_hv5s98qk_&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;dbf&lt;/span&gt;&lt;span&gt;         YES           &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;500     102400&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;UNDO表領域自動拡張変更&quot;&gt;UNDO表領域自動拡張変更&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ALTER TABLESPACE&lt;/code&gt;文の&lt;code&gt;AUTOEXTEND&lt;/code&gt;を利用してUNDO表領域のサイズ変更を行います。サイズと同様、新しくUNDO表領域を作成し、&lt;code&gt;UNDO_TABLESPACE&lt;/code&gt;パラメータで新規作成したUNDO表領域を指定する方法もあります。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; alter&lt;/span&gt;&lt;span&gt; tablespace undo_t1 autoextend &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;off&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;表領域が変更されました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; select&lt;/span&gt;&lt;span&gt; tablespace_name, file_name, autoextensible, bytes&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span&gt; mb, maxbytes&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span&gt; maxmb &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; dba_data_files &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;order by&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;TABLESPACE_NAME                                              FILE_NAME                                                 AUTOEX         MB      MAXMB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;------------------------------------------------------------ ----------------------------------------------------------------- ------ ---------- ----------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;UNDO_T1                                                      &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;rdsdbdata&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;ORCL_A&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;datafile&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;o1_mf_undo_t1_hv5s98qk_&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;dbf&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;         NO&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;            500          0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;その他&quot;&gt;その他&lt;/h3&gt;
&lt;p&gt;デフォルトのUNDO表領域において、UNDOの保証は&lt;code&gt;NOGUARANTEE&lt;/code&gt;となっています。したがって、UNDOを保証する場合は別途有効にする作業が必要です。また、自動拡張も有効にしておく必要がある点にも留意が必要です。&lt;/p&gt;
&lt;p&gt;ちなみに、パラメータグループ上で&lt;code&gt;UNDO_TABLESPACE&lt;/code&gt;にデフォルトのUNDO表領域名(&lt;code&gt;UNDO_T1&lt;/code&gt;)以外の名前を指定し、その表領域が存在しない状況で起動した場合、RDS側でデフォルト設定のUNDO表領域を自動的に作成してくれます。なお、これは確認時点の挙動なので、確証はございません。&lt;/p&gt;
&lt;h2 id=&quot;一時表領域&quot;&gt;一時表領域&lt;/h2&gt;
&lt;h3 id=&quot;RDS初期構築時の設定-2&quot;&gt;RDS初期構築時の設定&lt;/h3&gt;
&lt;p&gt;RDS for Oracleでは、構築時に&lt;code&gt;TEMP&lt;/code&gt;として自動拡張が有効になっている一時表領域(BIGFILE)が用意されます。私の環境だと100MBでした。UNDO表領域と同様、自動拡張が有効で、かつ、BIGFILEという点が特徴的です。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; select&lt;/span&gt;&lt;span&gt; tablespace_name, bigfile, contents, segment_space_management &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; dba_tablespaces &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;where&lt;/span&gt;&lt;span&gt; contents &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;TEMPORARY&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; order by&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;TABLESPACE_NAME                                              BIGFIL CONTENTS           SEGMENT_SPAC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;------------------------------------------------------------ ------ ------------------ ------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;TEMP                                                         YES    TEMPORARY          &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;MANUAL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; select&lt;/span&gt;&lt;span&gt; tablespace_name, file_name, autoextensible, bytes&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span&gt; mb, maxbytes&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span&gt; maxmb &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; dba_temp_files &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;order by&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;TABLESPACE_NAME                                              FILE_NAME                                                 AUTOEX         MB      MAXMB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;------------------------------------------------------------ ----------------------------------------------------------------- ------ ---------- ----------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;TEMP                                                         &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;rdsdbdata&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;ORCL_A&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;datafile&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;o1_mf_temp_hym2gnd6_&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;tmp&lt;/span&gt;&lt;span&gt;            YES           &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;100     102400&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;こちらも、UNDOと同様、一定サイズを指定し、自動拡張は無効にされたい方もいらっしゃるかと存じます。&lt;/p&gt;
&lt;h3 id=&quot;一時表領域サイズ変更&quot;&gt;一時表領域サイズ変更&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ALTER TABLESPACE&lt;/code&gt;文の&lt;code&gt;RESIZE&lt;/code&gt;を利用して一時表領域のサイズ変更を行います。UNDO表領域と同じです。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; alter&lt;/span&gt;&lt;span&gt; tablespace temp resize 200m;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;表領域が変更されました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; select&lt;/span&gt;&lt;span&gt; tablespace_name, file_name, autoextensible, bytes&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span&gt; mb, maxbytes&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span&gt; maxmb &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; dba_temp_files &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;order by&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;TABLESPACE_NAME                                              FILE_NAME                                                 AUTOEX         MB      MAXMB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;------------------------------------------------------------ ----------------------------------------------------------------- ------ ---------- ----------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;TEMP                                                         &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;rdsdbdata&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;ORCL_A&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;datafile&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;o1_mf_temp_hym2gnd6_&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;tmp&lt;/span&gt;&lt;span&gt;            YES           &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;200     102400&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;一時表領域自動拡張変更&quot;&gt;一時表領域自動拡張変更&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ALTER TABLESPACE&lt;/code&gt;文の&lt;code&gt;AUTOEXTEND&lt;/code&gt;を利用してUNDO表領域のサイズ変更を行います。こちらもUNDO表領域と同じです。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; alter&lt;/span&gt;&lt;span&gt; tablespace temp autoextend &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;off&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;表領域が変更されました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; select&lt;/span&gt;&lt;span&gt; tablespace_name, file_name, autoextensible, bytes&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span&gt; mb, maxbytes&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1024&lt;/span&gt;&lt;span&gt; maxmb &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; dba_temp_files &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;order by&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;TABLESPACE_NAME                                              FILE_NAME                                                 AUTOEX         MB      MAXMB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;------------------------------------------------------------ ----------------------------------------------------------------- ------ ---------- ----------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;TEMP                                                         &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;rdsdbdata&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;ORCL_A&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;datafile&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;o1_mf_temp_hym2gnd6_&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;tmp&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;            NO&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;            200          0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;自動メンテナンスタスク&quot;&gt;自動メンテナンスタスク&lt;/h2&gt;
&lt;h3 id=&quot;RDS初期構築時の設定-3&quot;&gt;RDS初期構築時の設定&lt;/h3&gt;
&lt;p&gt;ライセンス等の関係で、とりあえず無効にされることもある自動メンテナンスタスクですが、RDS for Oracleにおいても健在で、全て有効状態となっています。&lt;/p&gt;
&lt;p&gt;また、バッチ時間帯と重複して統計情報を取得されたら困るということで、自動メンテナンスタスクの実行時間帯を変更することも多いかと存じますが、RDS for Oracleにおいては、時間だけでなくタイムゾーンも考慮する必要があります。&lt;/p&gt;
&lt;p&gt;ウィンドウのタイムゾーン設定が&lt;code&gt;ETC/UTC&lt;/code&gt;であるためです。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; select&lt;/span&gt;&lt;span&gt; client_name, window_group, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;status from&lt;/span&gt;&lt;span&gt; dba_autotask_client &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;order by&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CLIENT_NAME                      WINDOW_GROUP     &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;STATUS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-------------------------------- ---------------- ----------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;auto&lt;/span&gt;&lt;span&gt; optimizer &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;stats collection&lt;/span&gt;&lt;span&gt;  ORA$AT_WGRP_OS   &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;ENABLED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;auto&lt;/span&gt;&lt;span&gt; space advisor               ORA$AT_WGRP_SA   &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;ENABLED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;sql&lt;/span&gt;&lt;span&gt; tuning advisor               ORA$AT_WGRP_SQ   &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;ENABLED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; select&lt;/span&gt;&lt;span&gt; window_group_name, number_of_windows, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;enabled&lt;/span&gt;&lt;span&gt;, next_start_date &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; dba_scheduler_window_groups &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;order by&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WINDOW_GROUP_NAME         NUMBER_OF_WINDOWS &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;ENABLED&lt;/span&gt;&lt;span&gt;    NEXT_START_DATE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;------------------------- ----------------- ---------- ------------------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;MAINTENANCE_WINDOW_GROUP                  &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;7&lt;/span&gt;&lt;span&gt; TRUE       &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29 22&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000000&lt;/span&gt;&lt;span&gt; ETC&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;UTC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ORA$AT_WGRP_OS                            &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;7&lt;/span&gt;&lt;span&gt; TRUE       &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29 22&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000000&lt;/span&gt;&lt;span&gt; ETC&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;UTC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ORA$AT_WGRP_SA                            &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;7&lt;/span&gt;&lt;span&gt; TRUE       &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29 22&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000000&lt;/span&gt;&lt;span&gt; ETC&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;UTC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ORA$AT_WGRP_SQ                            &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;7&lt;/span&gt;&lt;span&gt; TRUE       &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29 22&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000000&lt;/span&gt;&lt;span&gt; ETC&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;UTC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; select * from&lt;/span&gt;&lt;span&gt; dba_autotask_window_clients &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;order by&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WINDOW_NAME          WINDOW_NEXT_TIME                                                            WINDOW_ACT AUTOTASK_STATUS  OPTIMIZER_STATS  SEGMENT_ADVISOR  SQL_TUNE_ADVISOR HEALTH_MONITOR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-------------------- --------------------------------------------------------------------------- ---------- ---------------- ---------------- ---------------- ---------------- ----------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;FRIDAY_WINDOW        &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;21&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;01&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;01 22&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000000&lt;/span&gt;&lt;span&gt; ETC&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;UTC                                            FALSE      &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;ENABLED          ENABLED          ENABLED          ENABLED          DISABLED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;MONDAY_WINDOW        &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;21&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;01&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;04 22&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000000&lt;/span&gt;&lt;span&gt; ETC&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;UTC                                            FALSE      &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;ENABLED          ENABLED          ENABLED          ENABLED          DISABLED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SATURDAY_WINDOW      &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;21&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;01&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;02 06&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000000&lt;/span&gt;&lt;span&gt; ETC&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;UTC                                            FALSE      &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;ENABLED          ENABLED          ENABLED          ENABLED          DISABLED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SUNDAY_WINDOW        &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;21&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;01&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;03 06&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000000&lt;/span&gt;&lt;span&gt; ETC&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;UTC                                            FALSE      &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;ENABLED          ENABLED          ENABLED          ENABLED          DISABLED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;THURSDAY_WINDOW      &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;31 22&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000000&lt;/span&gt;&lt;span&gt; ETC&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;UTC                                            FALSE      &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;ENABLED          ENABLED          ENABLED          ENABLED          DISABLED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;TUESDAY_WINDOW       &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29 22&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000000&lt;/span&gt;&lt;span&gt; ETC&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;UTC                                            FALSE      &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;ENABLED          ENABLED          ENABLED          ENABLED          DISABLED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WEDNESDAY_WINDOW     &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;30 22&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000000&lt;/span&gt;&lt;span&gt; ETC&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;UTC                                            FALSE      &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;ENABLED          ENABLED          ENABLED          ENABLED          DISABLED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;7行が選択されました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; select&lt;/span&gt;&lt;span&gt; window_name, repeat_interval, duration, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;enabled from&lt;/span&gt;&lt;span&gt; dba_scheduler_windows &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;order by&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WINDOW_NAME          REPEAT_INTERVAL                                                        DURATION                                                            &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;ENABLED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-------------------- ---------------------------------------------------------------------- --------------------------------------------------------------------------- ----------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;FRIDAY_WINDOW        freq&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;daily;byday&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;FRI;byhour&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;22&lt;/span&gt;&lt;span&gt;;byminute&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;; bysecond&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;                  +&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000 04&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;                                                               TRUE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;MONDAY_WINDOW        freq&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;daily;byday&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;MON;byhour&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;22&lt;/span&gt;&lt;span&gt;;byminute&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;; bysecond&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;                  +&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000 04&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;                                                               TRUE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SATURDAY_WINDOW      freq&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;daily;byday&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;SAT;byhour&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;6&lt;/span&gt;&lt;span&gt;;byminute&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;; bysecond&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;                   +&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000 20&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;                                                               TRUE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SUNDAY_WINDOW        freq&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;daily;byday&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;SUN;byhour&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;6&lt;/span&gt;&lt;span&gt;;byminute&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;; bysecond&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;                   +&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000 20&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;                                                               TRUE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;THURSDAY_WINDOW      freq&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;daily;byday&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;THU;byhour&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;22&lt;/span&gt;&lt;span&gt;;byminute&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;; bysecond&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;                  +&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000 04&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;                                                               TRUE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;TUESDAY_WINDOW       freq&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;daily;byday&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;TUE;byhour&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;22&lt;/span&gt;&lt;span&gt;;byminute&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;; bysecond&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;                  +&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000 04&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;                                                               TRUE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WEDNESDAY_WINDOW     freq&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;daily;byday&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;WED;byhour&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;22&lt;/span&gt;&lt;span&gt;;byminute&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;; bysecond&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;                  +&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000 04&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;                                                               TRUE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WEEKEND_WINDOW       freq&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;daily;byday&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;SAT;byhour&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;;byminute&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;;bysecond&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;                    +&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;002 00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;                                                               FALSE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WEEKNIGHT_WINDOW     freq&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;daily;byday&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;MON,TUE,WED,THU,FRI;byhour&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;22&lt;/span&gt;&lt;span&gt;;byminute&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;; bysecond&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;  +&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000 08&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;                                                               FALSE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;9行が選択されました。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;自動メンテナンスタスク無効化&quot;&gt;自動メンテナンスタスク無効化&lt;/h3&gt;
&lt;p&gt;RDSでも&lt;code&gt;DBMS_AUTO_TASK_ADMIN&lt;/code&gt;を利用して無効化を行います。次の例ではSQLチューニング・アドバイザーを無効にしています。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; begin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  2    dbms_auto_task_admin&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;disable&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  3&lt;/span&gt;&lt;span&gt;        client_name &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;sql tuning advisor&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  4&lt;/span&gt;&lt;span&gt;        operation   &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  5&lt;/span&gt;&lt;span&gt;        window_name &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  6&lt;/span&gt;&lt;span&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  7&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;  end&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  8&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;  /&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;PL&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;SQLプロシージャが正常に完了しました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; select&lt;/span&gt;&lt;span&gt; client_name, window_group, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;status from&lt;/span&gt;&lt;span&gt; dba_autotask_client &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;order by&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CLIENT_NAME                      WINDOW_GROUP     &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;STATUS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-------------------------------- ---------------- ----------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;auto&lt;/span&gt;&lt;span&gt; optimizer &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;stats collection&lt;/span&gt;&lt;span&gt;  ORA$AT_WGRP_OS   &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;ENABLED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;auto&lt;/span&gt;&lt;span&gt; space advisor               ORA$AT_WGRP_SA   &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;ENABLED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;sql&lt;/span&gt;&lt;span&gt; tuning advisor               ORA$AT_WGRP_SQ   &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;DISABLED&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;メンテナンスウィンドウ変更(タイムゾーン)&quot;&gt;メンテナンスウィンドウ変更(タイムゾーン)&lt;/h3&gt;
&lt;p&gt;ウィンドウのタイムゾーンが&lt;code&gt;ETC/UTC&lt;/code&gt;になっているということは、&lt;code&gt;JST&lt;/code&gt;から見た場合9時間遅いということになります。そのままだと、夜間のつもりが日本時間だと昼間だったということも起こり得るため、タイムゾーンを変更します。&lt;/p&gt;
&lt;p&gt;タイムゾーンの変更には&lt;code&gt;DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE&lt;/code&gt;を利用します。&lt;/p&gt;
&lt;p&gt;次の例では、タイムゾーンを&lt;code&gt;Asia/Tokyo&lt;/code&gt;に変更しています。なお、&lt;code&gt;Asia/Tokyo&lt;/code&gt;の部分を&lt;code&gt;+09:00&lt;/code&gt;としても&lt;code&gt;JST&lt;/code&gt;を表します。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; begin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  2    dbms_scheduler&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;set_scheduler_attribute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  3&lt;/span&gt;&lt;span&gt;      attribute &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;default_timezone&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  4&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;      value     =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;Asia/Tokyo&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  5&lt;/span&gt;&lt;span&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  6&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;  end&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  7&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;  /&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;PL&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;SQLプロシージャが正常に完了しました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; select * from&lt;/span&gt;&lt;span&gt; dba_autotask_window_clients &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;order by&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WINDOW_NAME          WINDOW_NEXT_TIME                                                            WINDOW_ACT AUTOTASK_STATUS  OPTIMIZER_STATS  SEGMENT_ADVISOR  SQL_TUNE_ADVISOR HEALTH_MONITOR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-------------------- --------------------------------------------------------------------------- ---------- ---------------- ---------------- ---------------- ---------------- ----------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;FRIDAY_WINDOW        &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;21&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;01&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;01 22&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000000&lt;/span&gt;&lt;span&gt; ASIA&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;TOKYO                                         FALSE      &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;ENABLED          ENABLED          ENABLED          DISABLED         DISABLED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;MONDAY_WINDOW        &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;21&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;01&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;04 22&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000000&lt;/span&gt;&lt;span&gt; ASIA&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;TOKYO                                         FALSE      &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;ENABLED          ENABLED          ENABLED          DISABLED         DISABLED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SATURDAY_WINDOW      &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;21&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;01&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;02 06&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000000&lt;/span&gt;&lt;span&gt; ASIA&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;TOKYO                                         FALSE      &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;ENABLED          ENABLED          ENABLED          DISABLED         DISABLED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SUNDAY_WINDOW        &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;21&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;01&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;03 06&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000000&lt;/span&gt;&lt;span&gt; ASIA&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;TOKYO                                         FALSE      &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;ENABLED          ENABLED          ENABLED          DISABLED         DISABLED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;THURSDAY_WINDOW      &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;31 22&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000000&lt;/span&gt;&lt;span&gt; ASIA&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;TOKYO                                         FALSE      &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;ENABLED          ENABLED          ENABLED          DISABLED         DISABLED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;TUESDAY_WINDOW       &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29 22&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000000&lt;/span&gt;&lt;span&gt; ASIA&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;TOKYO                                         FALSE      &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;ENABLED          ENABLED          ENABLED          DISABLED         DISABLED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WEDNESDAY_WINDOW     &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;30 22&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000000&lt;/span&gt;&lt;span&gt; ASIA&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;TOKYO                                         FALSE      &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;ENABLED          ENABLED          ENABLED          DISABLED         DISABLED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;7行が選択されました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; select&lt;/span&gt;&lt;span&gt; window_group_name, number_of_windows, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;enabled&lt;/span&gt;&lt;span&gt;, next_start_date &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; dba_scheduler_window_groups &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;order by&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WINDOW_GROUP_NAME         NUMBER_OF_WINDOWS &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;ENABLED&lt;/span&gt;&lt;span&gt;    NEXT_START_DATE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;------------------------- ----------------- ---------- ------------------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;MAINTENANCE_WINDOW_GROUP                  &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;7&lt;/span&gt;&lt;span&gt; TRUE       &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29 22&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000000&lt;/span&gt;&lt;span&gt; ASIA&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;TOKYO&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ORA$AT_WGRP_OS                            &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;7&lt;/span&gt;&lt;span&gt; TRUE       &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29 22&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000000&lt;/span&gt;&lt;span&gt; ASIA&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;TOKYO&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ORA$AT_WGRP_SA                            &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;7&lt;/span&gt;&lt;span&gt; TRUE       &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29 22&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000000&lt;/span&gt;&lt;span&gt; ASIA&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;TOKYO&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ORA$AT_WGRP_SQ                            &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;7&lt;/span&gt;&lt;span&gt; TRUE       &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29 22&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000000&lt;/span&gt;&lt;span&gt; ASIA&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;TOKYO&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;メンテナンスウィンドウ変更(時間帯)&quot;&gt;メンテナンスウィンドウ変更(時間帯)&lt;/h3&gt;
&lt;p&gt;メンテナンスウィンドウの時間帯を変更したいというケースもあるかと存じます。デフォルトですと、平日は22時から4時間、土日は6時から20時間が実行時間帯となっていますが、これがベストという場合は少ないものと存じます。&lt;/p&gt;
&lt;p&gt;ウィンドウ時間の変更には&lt;code&gt;DBMS_SCHEDULER.SET_ATTRIBUTE&lt;/code&gt;を利用します。&lt;/p&gt;
&lt;p&gt;次の例では、月火水木金のウィンドウを2時30分から4時間、土日のウィンドウを2時30分から8時間としています。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; begin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  2    dbms_scheduler&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;set_attribute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  3&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;      name      =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;sys.monday_window&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  4&lt;/span&gt;&lt;span&gt;      attribute &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;repeat_interval&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  5&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;      value     =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;freq=daily;byday=mon;byhour=2;byminute=30; bysecond=0&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  6&lt;/span&gt;&lt;span&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  7    dbms_scheduler&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;set_attribute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  8&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;      name      =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;sys.tuesday_window&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  9&lt;/span&gt;&lt;span&gt;      attribute &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;repeat_interval&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 10&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;      value     =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;freq=daily;byday=tue;byhour=2;byminute=30; bysecond=0&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 11&lt;/span&gt;&lt;span&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 12    dbms_scheduler&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;set_attribute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 13&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;      name      =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;sys.wednesday_window&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 14&lt;/span&gt;&lt;span&gt;      attribute &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;repeat_interval&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 15&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;      value     =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;freq=daily;byday=wed;byhour=2;byminute=30; bysecond=0&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 16&lt;/span&gt;&lt;span&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 17    dbms_scheduler&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;set_attribute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 18&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;      name      =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;sys.thursday_window&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 19&lt;/span&gt;&lt;span&gt;      attribute &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;repeat_interval&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 20&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;      value     =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;freq=daily;byday=thu;byhour=2;byminute=30; bysecond=0&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 21&lt;/span&gt;&lt;span&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 22    dbms_scheduler&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;set_attribute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 23&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;      name      =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;sys.friday_window&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 24&lt;/span&gt;&lt;span&gt;      attribute &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;repeat_interval&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 25&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;      value     =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;freq=daily;byday=fri;byhour=2;byminute=30; bysecond=0&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 26&lt;/span&gt;&lt;span&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 27    dbms_scheduler&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;set_attribute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 28&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;      name      =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;sys.saturday_window&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 29&lt;/span&gt;&lt;span&gt;      attribute &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;repeat_interval&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 30&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;      value     =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;freq=daily;byday=sat;byhour=2;byminute=30; bysecond=0&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 31&lt;/span&gt;&lt;span&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 32    dbms_scheduler&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;set_attribute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 33&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;      name      =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;sys.saturday_window&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 34&lt;/span&gt;&lt;span&gt;      attribute &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;duration&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 35&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;      value     =&amp;gt;&lt;/span&gt;&lt;span&gt; numtodsinterval(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;8&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;#39;hour&amp;#39;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 36&lt;/span&gt;&lt;span&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 37    dbms_scheduler&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;set_attribute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 38&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;      name      =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;sys.sunday_window&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 39&lt;/span&gt;&lt;span&gt;      attribute &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;repeat_interval&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 40&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;      value     =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;freq=daily;byday=sat;byhour=2;byminute=30; bysecond=0&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 41&lt;/span&gt;&lt;span&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 42    dbms_scheduler&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;set_attribute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 43&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;      name      =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;sys.sunday_window&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 44&lt;/span&gt;&lt;span&gt;      attribute &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;duration&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 45&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;      value     =&amp;gt;&lt;/span&gt;&lt;span&gt; numtodsinterval(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;8&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;#39;hour&amp;#39;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 46&lt;/span&gt;&lt;span&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 47&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;  end&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 48&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;  /&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;PL&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;SQLプロシージャが正常に完了しました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; select&lt;/span&gt;&lt;span&gt; window_name, repeat_interval, duration, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;enabled from&lt;/span&gt;&lt;span&gt; dba_scheduler_windows &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;order by&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WINDOW_NAME          REPEAT_INTERVAL                                                        DURATION                                                            &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;ENABLED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-------------------- ---------------------------------------------------------------------- --------------------------------------------------------------------------- ----------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;FRIDAY_WINDOW        freq&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;daily;byday&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;fri;byhour&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2&lt;/span&gt;&lt;span&gt;;byminute&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;30&lt;/span&gt;&lt;span&gt;; bysecond&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;                  +&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000 04&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;                                                               TRUE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;MONDAY_WINDOW        freq&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;daily;byday&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;mon;byhour&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2&lt;/span&gt;&lt;span&gt;;byminute&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;30&lt;/span&gt;&lt;span&gt;; bysecond&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;                  +&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000 04&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;                                                               TRUE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SATURDAY_WINDOW      freq&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;daily;byday&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;sat;byhour&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2&lt;/span&gt;&lt;span&gt;;byminute&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;30&lt;/span&gt;&lt;span&gt;; bysecond&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;                  +&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000 08&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;                                                               TRUE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SUNDAY_WINDOW        freq&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;daily;byday&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;sat;byhour&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2&lt;/span&gt;&lt;span&gt;;byminute&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;30&lt;/span&gt;&lt;span&gt;; bysecond&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;                  +&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000 08&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;                                                               TRUE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;THURSDAY_WINDOW      freq&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;daily;byday&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;thu;byhour&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2&lt;/span&gt;&lt;span&gt;;byminute&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;30&lt;/span&gt;&lt;span&gt;; bysecond&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;                  +&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000 04&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;                                                               TRUE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;TUESDAY_WINDOW       freq&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;daily;byday&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;tue;byhour&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2&lt;/span&gt;&lt;span&gt;;byminute&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;30&lt;/span&gt;&lt;span&gt;; bysecond&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;                  +&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000 04&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;                                                               TRUE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WEDNESDAY_WINDOW     freq&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;daily;byday&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;wed;byhour&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2&lt;/span&gt;&lt;span&gt;;byminute&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;30&lt;/span&gt;&lt;span&gt;; bysecond&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;                  +&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000 04&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;                                                               TRUE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WEEKEND_WINDOW       freq&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;daily;byday&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;SAT;byhour&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;;byminute&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;;bysecond&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;                    +&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;002 00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;                                                               FALSE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WEEKNIGHT_WINDOW     freq&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;daily;byday&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;MON,TUE,WED,THU,FRI;byhour&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;22&lt;/span&gt;&lt;span&gt;;byminute&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;; bysecond&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;  +&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;000 08&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;                                                               FALSE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;9行が選択されました。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;Statspack&quot;&gt;Statspack&lt;/h2&gt;
&lt;h3 id=&quot;Statspack導入&quot;&gt;Statspack導入&lt;/h3&gt;
&lt;p&gt;RDSでは&lt;a rel=&quot;external&quot; href=&quot;https://aws.amazon.com/jp/rds/performance-insights/&quot;&gt;Performance Insights&lt;/a&gt;という非常に便利なパフォーマンス分析ツールを利用できますが、Web上にも情報量が多いStatspackを導入されたいという方もいらっしゃるかと存じます。&lt;/p&gt;
&lt;p&gt;導入についての流れは&lt;a rel=&quot;external&quot; href=&quot;https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Appendix.Oracle.Options.Statspack.html#Appendix.Oracle.Options.Statspack.setting-up&quot;&gt;Oracle Statspack のセットアップ&lt;/a&gt;に公式案内がございますので、そちらを参考に実施します。&lt;/p&gt;
&lt;p&gt;なお、&lt;code&gt;PERFSTAT&lt;/code&gt;ユーザのデフォルト表領域は&lt;code&gt;SYSAUX&lt;/code&gt;で作成されます。つまり、&lt;code&gt;SYSAUX&lt;/code&gt;にStatspack関連情報が格納されます。これについては、気持ち悪いと感じられる方もいらっしゃるかと存じます。&lt;/p&gt;
&lt;p&gt;後々この格納先を変更することも可能とは推察しますが(表領域作成、クォータ設定、デフォルト表領域変更、既存テーブルの表領域変更)、手動で色々と変更するリスクを考えると、あくまで私個人の意見としては、このまま利用されるのもよろしいかと存じます。&lt;/p&gt;
&lt;p&gt;※万が一、Statspack関係で何かあった際、サポートに共有する背景が減るため、結果として楽になるかもしれないというのが本音です。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; select&lt;/span&gt;&lt;span&gt; username, default_tablespace, temporary_tablespace, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;profile&lt;/span&gt;&lt;span&gt;, authentication_type &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span&gt; dba_users &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;where&lt;/span&gt;&lt;span&gt; username &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;PERFSTAT&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;USERNAME   DEFAULT_TABLESPACE                                           TEMPORARY_TABLESPACE                                 &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;PROFILE&lt;/span&gt;&lt;span&gt;    AUTHENTICATION_T&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;---------- ------------------------------------------------------------ ------------------------------------------------------------ ---------- ----------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;PERFSTAT   SYSAUX                                                       TEMP                                                 &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;DEFAULT    PASSWORD&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;Statspackスナップショット作成ジョブ&quot;&gt;Statspackスナップショット作成ジョブ&lt;/h3&gt;
&lt;p&gt;公式情報として&lt;a rel=&quot;external&quot; href=&quot;https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Appendix.Oracle.Options.Statspack.html#Appendix.Oracle.Options.Statspack.generating-reports&quot;&gt;Statspack レポートの生成&lt;/a&gt;でスナップショット作成ジョブのサンプルが提供されていますが、非推奨の&lt;code&gt;DBMS_JOB&lt;/code&gt;を利用したものです。&lt;/p&gt;
&lt;p&gt;したがって、&lt;code&gt;DBMS_SCHEDULER&lt;/code&gt;を利用したサンプルを記載致します。また、スナップショット作成と併せて、スナップショット削除のジョブも実装することが多いと存じますため、そちらのサンプルも記載致します。&lt;/p&gt;
&lt;p&gt;下記は、毎時0分にスナップショットを作成し(レベル7)、毎日0時に90日経過したスナップショットを削除するジョブのサンプルです。&lt;code&gt;CREATE JOB&lt;/code&gt;権限を保有している&lt;code&gt;PERFSTAT&lt;/code&gt;でログインして実行することを想定しています(&lt;code&gt;grant create job to perfstat;&lt;/code&gt;)。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; select&lt;/span&gt;&lt;span&gt; job_name, job_action, next_run_date, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;enabled from&lt;/span&gt;&lt;span&gt; dba_scheduler_jobs &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;where owner =&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;PERFSTAT&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;レコードが選択されませんでした。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; begin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  2    dbms_scheduler&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;create_job&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  3&lt;/span&gt;&lt;span&gt;     job_name        &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;statspack_snapshot&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  4&lt;/span&gt;&lt;span&gt;     job_type        &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;plsql_block&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  5&lt;/span&gt;&lt;span&gt;     job_action      &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;begin statspack.snap(i_snap_level=&amp;gt;7); end;&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  6&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;     start_date      =&amp;gt; null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  7&lt;/span&gt;&lt;span&gt;     repeat_interval &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;freq=hourly; byminute=0; bysecond=0&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  8&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;     auto_drop       =&amp;gt;&lt;/span&gt;&lt;span&gt; false,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  9&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;     enabled         =&amp;gt;&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 10&lt;/span&gt;&lt;span&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 11&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;  end&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 12&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;  /&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;PL&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;SQLプロシージャが正常に完了しました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; begin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  2    dbms_scheduler&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;create_job&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  3&lt;/span&gt;&lt;span&gt;     job_name        &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;statspack_snapshot_purge&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  4&lt;/span&gt;&lt;span&gt;     job_type        &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;plsql_block&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  5&lt;/span&gt;&lt;span&gt;     job_action      &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;begin statspack.purge(i_num_days=&amp;gt;90); end;&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  6&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;     start_date      =&amp;gt; null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  7&lt;/span&gt;&lt;span&gt;     repeat_interval &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;freq=daily; byhour=0; byminute=0; bysecond=0&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  8&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;     auto_drop       =&amp;gt;&lt;/span&gt;&lt;span&gt; false,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  9&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;     enabled         =&amp;gt;&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 10&lt;/span&gt;&lt;span&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 11&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;  end&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 12&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;  /&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;PL&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;SQLプロシージャが正常に完了しました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; select&lt;/span&gt;&lt;span&gt; job_name, job_action, next_run_date, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;enabled from&lt;/span&gt;&lt;span&gt; dba_scheduler_jobs &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;where owner =&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;PERFSTAT&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;JOB_NAME                  JOB_ACTION                                    NEXT_RUN_DATE                                                       &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;ENABLED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;------------------------- --------------------------------------------- --------------------------------------------------------------------------- ----------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;STATSPACK_SNAPSHOT        &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; statspack&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;snap&lt;/span&gt;&lt;span&gt;(i_snap_level&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;7&lt;/span&gt;&lt;span&gt;); &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;end&lt;/span&gt;&lt;span&gt;;   &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29 18&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;352110&lt;/span&gt;&lt;span&gt; ASIA&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;TOKYO                                         TRUE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;STATSPACK_SNAPSHOT_PURGE  &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; statspack&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;purge&lt;/span&gt;&lt;span&gt;(i_num_days&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;90&lt;/span&gt;&lt;span&gt;); &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;end&lt;/span&gt;&lt;span&gt;;   &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;30 00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;737920&lt;/span&gt;&lt;span&gt; ASIA&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;TOKYO                                         TRUE&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;統計情報取得&quot;&gt;統計情報取得&lt;/h2&gt;
&lt;p&gt;おそらく、上記のような対応と共に、ユーザ表領域の作成、業務ユーザの作成、オブジェクトの作成やデータのロード等を、初期作業の一環として実施されるものと存じます。&lt;/p&gt;
&lt;p&gt;オブジェクトを作成したスキーマの統計情報取得については意識的に実行されるケースも多いものと存じますが、スキーマの統計情報に加えて、個人的にディクショナリと固定オブジェクトの統計情報も気休めとして最後に取得するようにしています。&lt;/p&gt;
&lt;p&gt;ディクショナリと固定オブジェクトを取得するため、具体的には、次のパッケージを利用します。RDSでもオンプレミスと変わりません。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DBMS_STATS.GATHER_DICTIONARY_STATS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DBMS_STATS.GATHER_FIXED_OBJECTS_STATS&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;次に、ディクショナリと固定オブジェクトの統計情報を取得する例を記載します。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt; -- ディクショナリ統計情報&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; begin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  2    dbms_stats&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;gather_dictionary_stats&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  3&lt;/span&gt;&lt;span&gt;      options &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;GATHER&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  4&lt;/span&gt;&lt;span&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  5&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;  end&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  6&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;  /&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;PL&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;SQLプロシージャが正常に完了しました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt; -- 固定オブジェクト統計情報&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; begin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  2    dbms_stats&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;gather_fixed_objects_stats&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  3&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;  end&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  4&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;  /&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;PL&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;SQLプロシージャが正常に完了しました。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;なお、上記に加えてシステムの統計情報を&lt;code&gt;DBMS_STATS.GATHER_SYSTEM_STATS&lt;/code&gt;を利用して取得することも可能ですが、下記のようにデフォルト値を推奨する記載があるため、システムの統計情報は取得していません。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Unless there is a good reason to gather manually, Oracle recommends using the defaults for system statistics.&lt;/p&gt;
&lt;p&gt;---中略---&lt;/p&gt;
&lt;p&gt;Oracle recommends using the defaults for system statistics in most cases.&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/gathering-optimizer-statistics.html#GUID-BABC67C0-F851-4849-906E-E2588CFD7F2B&quot;&gt;13.4.2 Guidelines for Gathering System Statistics&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;RDS for Oracleはマネージドサービスのため、作成したら即座に使えるという素晴らしさがあります。しかしながら、意図した通りに動作させるためには、追加での設定が必要になります。&lt;/p&gt;
&lt;p&gt;同じような構成のRDS for Oracleを利用することが見込まれる場合、毎回、同じ作業を実施するのも手間となりますので、初期作業を実施した後のRDSから手動スナップショットを作成し、テンプレートとして保存しておくという運用も考えられるかもしれません。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>work_memと一時ファイルの容量の関係性について</title>
          <pubDate>Fri, 25 Dec 2020 00:00:00 +0000</pubDate>
          <author>wannabe</author>
          <link>https://wannabe-data-engineer.net/postgresql-work_mem-and-temporary-file/</link>
          <guid>https://wannabe-data-engineer.net/postgresql-work_mem-and-temporary-file/</guid>
          <description xml:base="https://wannabe-data-engineer.net/postgresql-work_mem-and-temporary-file/">&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/postgresql-work_mem-and-temporary-file/eyechatch.png&quot; alt=&quot;work_memと一時ファイルの容量の関係性について&quot; /&gt;&lt;/p&gt;
&lt;p&gt;PostgreSQLでのチューニングのアプローチとして、&lt;code&gt;log_temp_files&lt;/code&gt;を&lt;code&gt;0&lt;/code&gt;に設定し、ログに記録された一時ファイルの容量を元に&lt;code&gt;work_mem&lt;/code&gt;を調整するといったものがあるかと存じます。これで一時ファイルの作成が抑制され、パフォーマンスが向上するケースもございますが、今回、そのアプローチでは解決できない事象が確認できましたので、参考までに記録致します。&lt;/p&gt;
&lt;h2 id=&quot;結論&quot;&gt;結論&lt;/h2&gt;
&lt;p&gt;ワークロードによる部分もあるかとは存じますが、今回の検証の結論としましては、&lt;code&gt;log_temp_files&lt;/code&gt;によりログ出力された一時ファイルの容量は、必ずしも「&lt;code&gt;work_mem&lt;/code&gt;で不足している容量」を意味するわけではないことが確認できました。&lt;/p&gt;
&lt;p&gt;言い換えますと、&lt;code&gt;log_temp_files&lt;/code&gt;を&lt;code&gt;0&lt;/code&gt;に設定することで、一時ファイルが作成されたということは分かりますが、容量はあくまでも参考値であるということを意味します。&lt;/p&gt;
&lt;p&gt;したがって、&lt;code&gt;work_mem&lt;/code&gt;の最適値を探る場合、最終的には、何パターンかの設定値を試していくという原始的なアプローチが必要になるものと推察致します。&lt;/p&gt;
&lt;p&gt;また、容量が参考値であるということは、一時ファイルの作成についてログ出力を行うのであれば(&lt;code&gt;-1&lt;/code&gt;以外)、&lt;code&gt;log_temp_files&lt;/code&gt;の値を&lt;code&gt;0&lt;/code&gt;以外にする意味も薄いのではないかと考えます。&lt;/p&gt;
&lt;h2 id=&quot;work_memと一時ファイル容量の検証&quot;&gt;work_memと一時ファイル容量の検証&lt;/h2&gt;
&lt;h3 id=&quot;検証の流れ&quot;&gt;検証の流れ&lt;/h3&gt;
&lt;p&gt;具体的には次のような流れにて検証を実施しました。なお、PostgreSQL 11.6を利用して検証を行っています。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;log_temp_files&lt;/code&gt;を&lt;code&gt;0&lt;/code&gt;に設定する&lt;/li&gt;
&lt;li&gt;サンプルテーブルを作成する(100万行)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;work_mem&lt;/code&gt;を1MBに設定する&lt;/li&gt;
&lt;li&gt;サンプルテーブルを全件SELECT+ソートする&lt;/li&gt;
&lt;li&gt;一時ファイルが作成されたことを確認する(約72MB)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;work_mem&lt;/code&gt;の値を作成された一時ファイルの容量より大きな100MBまで増やす&lt;/li&gt;
&lt;li&gt;再度サンプルテーブルを全件SELECT+ソートする&lt;/li&gt;
&lt;li&gt;一時ファイルが作成されたことを確認する(約72MB)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;work_mem&lt;/code&gt;の値を更に300MBまで増やす&lt;/li&gt;
&lt;li&gt;再度サンプルテーブルを全件SELECT+ソートする&lt;/li&gt;
&lt;li&gt;最終的に利用されたメモリ容量を確認する(約162MB)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;work_mem&lt;/code&gt;の値を必要なメモリ量に合わせて162MBにする&lt;/li&gt;
&lt;li&gt;再度サンプルテーブルを全件SELECT+ソートする&lt;/li&gt;
&lt;li&gt;一時ファイルが作成されないことを確認する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;work_mem&lt;/code&gt;の値を必要なメモリ量より若干少ない160MBにする&lt;/li&gt;
&lt;li&gt;再度サンプルテーブルを全件SELECT+ソートする&lt;/li&gt;
&lt;li&gt;一時ファイルが作成されたことを確認する(約72MB)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;検証の事前準備&quot;&gt;検証の事前準備&lt;/h3&gt;
&lt;p&gt;まずは、&lt;code&gt;log_temp_files&lt;/code&gt;の設定とサンプルテーブルの作成を行います。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; show log_temp_files;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; log_temp_files&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;----------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; row&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; set&lt;/span&gt;&lt;span&gt; log_temp_files &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SET&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; show log_temp_files;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; log_temp_files&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;----------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; row&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; create table&lt;/span&gt;&lt;span&gt; sample_table &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;as select&lt;/span&gt;&lt;span&gt; seq_number &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;as&lt;/span&gt;&lt;span&gt; id, random()&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; as&lt;/span&gt;&lt;span&gt; random_number, md5(random()::&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;text&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;as&lt;/span&gt;&lt;span&gt; random_data &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; generate_series&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1000000&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;as&lt;/span&gt;&lt;span&gt; seq_number;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1000000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;work_mem(1MB)での検証&quot;&gt;work_mem(1MB)での検証&lt;/h3&gt;
&lt;p&gt;まず、&lt;code&gt;work_mem&lt;/code&gt;を1MBに設定した際の挙動を確認します。&lt;code&gt;external merge&lt;/code&gt;(一時ファイルでソートを行う処理)が選択されていますが、ソート処理を行う2つのワーカーが更に一時ファイルを作成している様子が見受けられます。つまり、合計3つの一時ファイルが作成されています。&lt;/p&gt;
&lt;p&gt;最終的に、ログには合計で75218944(18743296+17203200+39272448)バイト、つまり、約72MBの一時ファイルが作成されている様子が記録されています。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SQL実行&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; set&lt;/span&gt;&lt;span&gt; work_mem &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1024&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SET&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; show work_mem;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; work_mem&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;----------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; 1MB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; row&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; explain analyze &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;work_mem: 1MB&amp;#39;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;* from&lt;/span&gt;&lt;span&gt; sample_table &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;order by&lt;/span&gt;&lt;span&gt; random_number, random_data;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                                                QUERY PLAN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-------------------------------------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; Gather &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Merge&lt;/span&gt;&lt;span&gt;  (cost&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;109914&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;50&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;207143&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;59&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;833334&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;77&lt;/span&gt;&lt;span&gt;) (actual &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;time=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;891&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;912&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1371&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;145&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1000000&lt;/span&gt;&lt;span&gt; loops&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   Workers Planned: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   Workers Launched: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;   -&amp;gt;&lt;/span&gt;&lt;span&gt;  Sort  (cost&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;108914&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;48&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;109956&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;15&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;416667&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;77&lt;/span&gt;&lt;span&gt;) (actual &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;time=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;748&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;924&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;852&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;871&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;333333&lt;/span&gt;&lt;span&gt; loops&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;3&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         Sort &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Key&lt;/span&gt;&lt;span&gt;: random_number, random_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         Sort Method: &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;external merge  Disk&lt;/span&gt;&lt;span&gt;: 38352kB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         Worker &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;:  Sort Method: &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;external merge  Disk&lt;/span&gt;&lt;span&gt;: 16800kB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         Worker &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;:  Sort Method: &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;external merge  Disk&lt;/span&gt;&lt;span&gt;: 18304kB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;         -&amp;gt;&lt;/span&gt;&lt;span&gt;  Parallel Seq Scan &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;on&lt;/span&gt;&lt;span&gt; sample_table  (cost&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;14476&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;67&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;416667&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;77&lt;/span&gt;&lt;span&gt;) (actual &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;time=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;014&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;98&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;434&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;333333&lt;/span&gt;&lt;span&gt; loops&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;3&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; Planning &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Time&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;123&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; Execution &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Time&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1431&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;612&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;PostgreSQLログ&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;log&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2020-12-25 11:15:15&lt;/span&gt;&lt;span&gt; UTC::@:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;5608&lt;/span&gt;&lt;span&gt;]:LOG: temporary file: path &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;base/pgsql_tmp/pgsql_tmp5608.0&amp;quot;&lt;/span&gt;&lt;span&gt;, size &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;18743296&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2020-12-25 11:15:15&lt;/span&gt;&lt;span&gt; UTC::@:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;5608&lt;/span&gt;&lt;span&gt;]:STATEMENT: explain analyze select &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;#39;work_mem: 1MB&amp;#39;&lt;/span&gt;&lt;span&gt;, * from sample_table order by random_number, random_data;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2020-12-25 11:15:15&lt;/span&gt;&lt;span&gt; UTC::@:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;5609&lt;/span&gt;&lt;span&gt;]:LOG: temporary file: path &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;base/pgsql_tmp/pgsql_tmp5609.0&amp;quot;&lt;/span&gt;&lt;span&gt;, size &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;17203200&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2020-12-25 11:15:15&lt;/span&gt;&lt;span&gt; UTC::@:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;5609&lt;/span&gt;&lt;span&gt;]:STATEMENT: explain analyze select &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;#39;work_mem: 1MB&amp;#39;&lt;/span&gt;&lt;span&gt;, * from sample_table order by random_number, random_data;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2020-12-25 11:15:15&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;63725&lt;/span&gt;&lt;span&gt;):postgres@postgres:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;19529&lt;/span&gt;&lt;span&gt;]:LOG: temporary file: path &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;base/pgsql_tmp/pgsql_tmp19529.1&amp;quot;&lt;/span&gt;&lt;span&gt;, size &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;39272448&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2020-12-25 11:15:15&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;63725&lt;/span&gt;&lt;span&gt;):postgres@postgres:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;19529&lt;/span&gt;&lt;span&gt;]:STATEMENT: explain analyze select &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;#39;work_mem: 1MB&amp;#39;&lt;/span&gt;&lt;span&gt;, * from sample_table order by random_number, random_data;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;work_mem(100MB)での検証&quot;&gt;work_mem(100MB)での検証&lt;/h3&gt;
&lt;p&gt;さて、前述の検証にて、作成された一時ファイルは合計約72MBであることが確認できました。現在の&lt;code&gt;work_mem&lt;/code&gt;は1MBなので、バッファも含んで&lt;code&gt;work_mem&lt;/code&gt;を100MBに設定して確認を行ってみます。&lt;/p&gt;
&lt;p&gt;ログ出力される一時ファイルの容量が、単純に不足しているメモリ量を表しているのであれば、これで一時ファイルが作成されなくなることが予測されます。&lt;/p&gt;
&lt;p&gt;しかし、ワーカーが更に一時ファイルを作成するようなことはなくなりましたが、依然として一時ファイルが作成されている様子が確認できます。容量は75153408バイト、つまり、約72MBであり、先程の結果と変わりません。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SQL実行&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; set&lt;/span&gt;&lt;span&gt; work_mem &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 102400&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SET&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; show work_mem;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; work_mem&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;----------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; 100MB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; row&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; explain analyze &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;work_mem: 100MB&amp;#39;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;* from&lt;/span&gt;&lt;span&gt; sample_table &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;order by&lt;/span&gt;&lt;span&gt; random_number, random_data;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                                          QUERY PLAN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-------------------------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; Sort  (cost&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;119967&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;84&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;122467&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;84&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1000000&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;77&lt;/span&gt;&lt;span&gt;) (actual &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;time=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;939&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;331&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1066&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;320&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1000000&lt;/span&gt;&lt;span&gt; loops&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   Sort &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Key&lt;/span&gt;&lt;span&gt;: random_number, random_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   Sort Method: &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;external merge  Disk&lt;/span&gt;&lt;span&gt;: 73392kB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;   -&amp;gt;&lt;/span&gt;&lt;span&gt;  Seq Scan &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;on&lt;/span&gt;&lt;span&gt; sample_table  (cost&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;20310&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1000000&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;77&lt;/span&gt;&lt;span&gt;) (actual &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;time=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;012&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;126&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;879&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1000000&lt;/span&gt;&lt;span&gt; loops&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; Planning &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Time&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;038&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; Execution &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Time&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1115&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;965&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;PostgreSQLログ&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;log&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2020-12-25 11:20:40&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;63725&lt;/span&gt;&lt;span&gt;):postgres@postgres:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;19529&lt;/span&gt;&lt;span&gt;]:LOG: temporary file: path &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;base/pgsql_tmp/pgsql_tmp19529.2&amp;quot;&lt;/span&gt;&lt;span&gt;, size &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;75153408&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2020-12-25 11:20:40&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;63725&lt;/span&gt;&lt;span&gt;):postgres@postgres:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;19529&lt;/span&gt;&lt;span&gt;]:STATEMENT: explain analyze select &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;#39;work_mem: 100MB&amp;#39;&lt;/span&gt;&lt;span&gt;, * from sample_table order by random_number, random_data;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;work_mem(300MB)での検証&quot;&gt;work_mem(300MB)での検証&lt;/h3&gt;
&lt;p&gt;直前の結果から、作成された一時ファイルは約72MBであることが確認できましたが、もはや信じられなくなりましたので、一気に&lt;code&gt;work_mem&lt;/code&gt;を300MBに増やして確認を行ってみます。&lt;/p&gt;
&lt;p&gt;結果として、無事、全てメモリ上で処理が実行されるようになりました。実行計画から、必要なメモリは165202kB、つまり、約162MBであったことが分かりました。&lt;/p&gt;
&lt;p&gt;一時ファイルは作成されていませんので、ログ出力はありません。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SQL実行&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; set&lt;/span&gt;&lt;span&gt; work_mem &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 307200&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SET&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; show work_mem;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; work_mem&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;----------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; 300MB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; row&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; explain analyze &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;work_mem: 300MB&amp;#39;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;* from&lt;/span&gt;&lt;span&gt; sample_table &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;order by&lt;/span&gt;&lt;span&gt; random_number, random_data;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                                          QUERY PLAN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-------------------------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; Sort  (cost&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;119967&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;84&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;122467&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;84&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1000000&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;77&lt;/span&gt;&lt;span&gt;) (actual &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;time=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;797&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;481&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;949&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;152&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1000000&lt;/span&gt;&lt;span&gt; loops&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   Sort &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Key&lt;/span&gt;&lt;span&gt;: random_number, random_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   Sort Method: quicksort  Memory: 165202kB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;   -&amp;gt;&lt;/span&gt;&lt;span&gt;  Seq Scan &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;on&lt;/span&gt;&lt;span&gt; sample_table  (cost&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;20310&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1000000&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;77&lt;/span&gt;&lt;span&gt;) (actual &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;time=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;010&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;143&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;166&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1000000&lt;/span&gt;&lt;span&gt; loops&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; Planning &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Time&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;037&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; Execution &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Time&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;992&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;700&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;work_mem(162MB)での検証&quot;&gt;work_mem(162MB)での検証&lt;/h3&gt;
&lt;p&gt;必要なメモリ量が分かったので、&lt;code&gt;work_mem&lt;/code&gt;を162MBに設定して確認してみます。無事にメモリ上だけで完結していることが確認できました。したがって、当該SQLでは約162MBが適正値であろうということが分かりました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SQL実行&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; set&lt;/span&gt;&lt;span&gt; work_mem &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 165888&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SET&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; show work_mem;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; work_mem&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;----------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; 162MB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; row&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; explain analyze &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;work_mem: 162MB&amp;#39;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;* from&lt;/span&gt;&lt;span&gt; sample_table &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;order by&lt;/span&gt;&lt;span&gt; random_number, random_data;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                                          QUERY PLAN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-------------------------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; Sort  (cost&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;119967&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;84&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;122467&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;84&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1000000&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;77&lt;/span&gt;&lt;span&gt;) (actual &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;time=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;798&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;385&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;948&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;632&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1000000&lt;/span&gt;&lt;span&gt; loops&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   Sort &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Key&lt;/span&gt;&lt;span&gt;: random_number, random_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   Sort Method: quicksort  Memory: 164324kB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;   -&amp;gt;&lt;/span&gt;&lt;span&gt;  Seq Scan &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;on&lt;/span&gt;&lt;span&gt; sample_table  (cost&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;20310&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1000000&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;77&lt;/span&gt;&lt;span&gt;) (actual &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;time=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;011&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;155&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;280&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1000000&lt;/span&gt;&lt;span&gt; loops&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; Planning &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Time&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;038&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; Execution &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Time&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;990&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;769&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;work_mem(160MB)での検証&quot;&gt;work_mem(160MB)での検証&lt;/h3&gt;
&lt;p&gt;最後に、&lt;code&gt;work_mem&lt;/code&gt;を必要量より若干少ない160MBに設定して確認を行ってみます。2MB程度足らないだけですが、一時ファイルが作成されてしまったことが確認できました。&lt;/p&gt;
&lt;p&gt;当該一時ファイルは、ログ出力上、75153408バイトとなっています。これまで作成されてきた一時ファイルと同様、約72MBです。正直に受け止め、&lt;code&gt;work_mem&lt;/code&gt;から約72MBあふれているものと捉えてしまうと、&lt;code&gt;work_mem&lt;/code&gt;は162MBで済むにも関わらず、232MB(160MB+72MB)と設定してしまうことになります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SQL実行&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; set&lt;/span&gt;&lt;span&gt; work_mem &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 163840&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SET&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; show work_mem;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; work_mem&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;----------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; 160MB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; row&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; explain analyze &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;work_mem: 160MB&amp;#39;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;* from&lt;/span&gt;&lt;span&gt; sample_table &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;order by&lt;/span&gt;&lt;span&gt; random_number, random_data;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                                          QUERY PLAN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-------------------------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; Sort  (cost&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;119967&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;84&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;122467&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;84&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1000000&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;77&lt;/span&gt;&lt;span&gt;) (actual &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;time=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1055&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;562&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1185&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;475&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1000000&lt;/span&gt;&lt;span&gt; loops&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   Sort &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Key&lt;/span&gt;&lt;span&gt;: random_number, random_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   Sort Method: &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;external merge  Disk&lt;/span&gt;&lt;span&gt;: 73392kB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;   -&amp;gt;&lt;/span&gt;&lt;span&gt;  Seq Scan &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;on&lt;/span&gt;&lt;span&gt; sample_table  (cost&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;20310&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1000000&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;77&lt;/span&gt;&lt;span&gt;) (actual &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;time=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;011&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;144&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;824&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1000000&lt;/span&gt;&lt;span&gt; loops&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; Planning &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Time&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;038&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; Execution &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Time&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1236&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;575&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;PostgreSQLログ&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;log&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2020-12-25 11:34:48&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;63725&lt;/span&gt;&lt;span&gt;):postgres@postgres:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;19529&lt;/span&gt;&lt;span&gt;]:LOG: temporary file: path &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;base/pgsql_tmp/pgsql_tmp19529.3&amp;quot;&lt;/span&gt;&lt;span&gt;, size &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;75153408&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2020-12-25 11:34:48&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;63725&lt;/span&gt;&lt;span&gt;):postgres@postgres:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;19529&lt;/span&gt;&lt;span&gt;]:STATEMENT: explain analyze select &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;#39;work_mem: 160MB&amp;#39;&lt;/span&gt;&lt;span&gt;, * from sample_table order by random_number, random_data;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ワークロードによるかとは存じますが、今回のケースですと、次のことが確認できました。PostgreSQLは奥が深いですね。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;log_temp_files&lt;/code&gt;の設定で出力された一時ファイルの容量は、必ずしも&lt;code&gt;work_mem&lt;/code&gt;で不足している容量を意味しない&lt;/li&gt;
&lt;li&gt;&lt;code&gt;work_mem&lt;/code&gt;の最適値を探るには、何パターンかの設定値を試していくという原始的なアプローチが必要になる&lt;/li&gt;
&lt;li&gt;一時ファイル作成についてログ出力するのであれば、&lt;code&gt;log_temp_files&lt;/code&gt;を&lt;code&gt;0&lt;/code&gt;以外に設定する意味は薄い&lt;/li&gt;
&lt;/ul&gt;
</description>
      </item>
      <item>
          <title>Aurora PostgreSQLの統計情報についてのTips</title>
          <pubDate>Wed, 02 Dec 2020 00:00:00 +0000</pubDate>
          <author>wannabe</author>
          <link>https://wannabe-data-engineer.net/aurora-postgresql-stats-tips/</link>
          <guid>https://wannabe-data-engineer.net/aurora-postgresql-stats-tips/</guid>
          <description xml:base="https://wannabe-data-engineer.net/aurora-postgresql-stats-tips/">&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/aurora-postgresql-stats-tips/eyechatch.png&quot; alt=&quot;Aurora PostgreSQLの統計情報についてのTips&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Aurora PostgreSQLは、クラスタにリードレプリカを追加することにより、容易に読み取り処理をスケールアウトすることができます。また、プライマリインスタンスに障害が発生した場合でも、リードレプリカがあればフェイルオーバーが実施され、ダウンタイムを常に短くすることができます。非常に便利なサービスではありますが、統計情報についての仕様に個人的に意外性を感じましたので、Tipsとしてまとめてみました。&lt;/p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Aurora PostgreSQLの統計情報については、下記のような特徴があります。特に&lt;code&gt;pg_stat_all_tables&lt;/code&gt;の特徴を把握していなかったことで、プライマリとリードレプリカで&lt;code&gt;pg_stat_all_tables&lt;/code&gt;から取得できる差異が発生していることより、リードレプリカにおいては実行計画が適切に選ばれないのではないかと勘違いしていました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;実行計画に用いられる統計情報は&lt;code&gt;pg_statistic&lt;/code&gt;に記録されている&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pg_statistic&lt;/code&gt;の情報はプライマリとリードレプリカで同期されている&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pg_statistic&lt;/code&gt;の情報は停止・再起動しても保持される&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pg_stat_all_tables&lt;/code&gt;の情報はプライマリとリードレプリカで同期されない&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pg_stat_all_tables&lt;/code&gt;の情報は停止・再起動等により削除される&lt;/li&gt;
&lt;li&gt;手動で統計情報を更新できないシステムカタログが存在する&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;pg_stat_all_tablesについて&quot;&gt;pg_stat_all_tablesについて&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;pg_stat_all_tables&lt;/code&gt;は、下記の記載通り、テーブルごとの統計情報を表示するビューです。最後にバキューム処理や統計情報更新が行われた時刻等を確認する際に参照することが多いビューかと存じます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;pg_stat_all_tablesビューは現在のデータベース内のテーブル（TOASTテーブルを含む）毎に１行の形式で、特定のテーブルへのアクセスに関する統計情報を表示します。 pg_stat_user_tablesおよびpg_stat_sys_tablesビューにも同じ情報が含まれますが、それぞれユーザテーブルとシステムテーブルのみにフィルタされています。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.jp/document/11/html/monitoring-stats.html#PG-STAT-ALL-TABLES-VIEW&quot;&gt;28.2. 統計情報コレクタ&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;実際に、Aurora PostgreSQLのプライマリとリードレプリカで、当該ビューの中身を確認いただくと分かるかと存じますが、起動時間が長く、自動バキュームが行われた回数が多くなるにつれて、内容に大きな差異が生じてきます。これは、冒頭にも記載させていただいた下記の特徴のためです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pg_stat_all_tables&lt;/code&gt;の情報はプライマリとリードレプリカで同期されない&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pg_stat_all_tables&lt;/code&gt;の情報は停止・再起動等により削除される&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ビューであるため、実情報が同期されていればユーザ側で取得する結果に差異は生じないのが普通ですが、これは、恐らく次の仕様によるものと推測致します。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;統計情報コレクタは収集した情報を他のPostgreSQLプロセスに一時ファイルを介して送信します。 これらのファイルはstats_temp_directoryで指名されたディレクトリ、デフォルトはpg_stat_tmp内に格納されます。 性能を向上させるために、stats_temp_directoryをRAMベースのファイルシステムを指し示すようにして、物理的なI/O要求を減らすことができます。 サーバが正しくシャットダウンした際は、統計情報がサーバの再起動を跨がって保持されるように、統計情報データの永続的なコピーがpg_statサブディレクトリに格納されます。 サーバ起動時にリカバリが実施される場合(例えば、即時シャットダウンやサーバクラッシュ、ポイントインタイムリカバリ)、統計カウンタをすべてリセットします。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.jp/document/11/html/monitoring-stats.html&quot;&gt;28.2. 統計情報コレクタ&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Aurora PostgreSQLはクラスターボリュームというストレージをプライマリとリードレプリカで共有しています。しかし、次の記載通り、一時ファイルは別です。上述の通り、統計情報は他のPostgreSQLプロセスに一時ファイルを介して送信されるため、プライマリとリードレプリカで差異が生じているものと考えられます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Aurora PostgreSQL は、非永続的な一時ファイル用に別の一時ストレージを使用します。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Managing.html#AuroraPostgreSQL.Managing.TempStorage&quot;&gt;Aurora PostgreSQL 用の一時ストレージの制限&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;上記から、実運用において&lt;code&gt;pg_stat_all_tables&lt;/code&gt;を確認する際には、次のような方針にした方が良いものと考えられます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プライマリインスタンスの情報を確認する&lt;/li&gt;
&lt;li&gt;フェイルオーバー直後のプライマリインスタンスの情報は実態とかけ離れている可能性があることを考慮する&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;pg_statisticについて&quot;&gt;pg_statisticについて&lt;/h2&gt;
&lt;p&gt;一方で&lt;code&gt;pg_statistic&lt;/code&gt;ですが、こちらは下記の記載通り、実際の統計データを保持している「テーブル」です。また、プランナに利用されるデータを保持しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;pg_statisticカタログはデータベースの内容に関する統計データを保存します。 項目はANALYZEで作成され、後に問い合わせプランナで使用されます。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.jp/document/11/html/catalog-pg-statistic.html&quot;&gt;52.50. pg_statistic&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;こちらも、実際にAurora PostgreSQLのプライマリとリードレプリカで、当該テーブルや当該テーブルを見やすくした&lt;code&gt;pg_stats&lt;/code&gt;ビューの中身を確認いただくと分かるかと存じますが、プライマリ側で情報に変更があっても、きちんと同期されています。&lt;/p&gt;
&lt;p&gt;また、実行計画も正常にプライマリとリードレプリカで同じものが選択されることが確認できます。そして、テーブルに保持されている情報ですので、インスタンスを停止したり再起動したりしても、情報がなくなるようなことはありません。&lt;/p&gt;
&lt;p&gt;上記から、実運用において「本当に統計情報がプライマリとリードレプリカで同期されているのか」という点を確認する際には、次のような方針にした方が良いものと考えられます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pg_statistic&lt;/code&gt;(または&lt;code&gt;pg_stats&lt;/code&gt;)の中身が同じことを確認する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;explain&lt;/code&gt;を利用して実際に導かれる実行計画が同じことを確認する&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;手動の統計情報更新について&quot;&gt;手動の統計情報更新について&lt;/h2&gt;
&lt;p&gt;バッチ処理等でテーブルのデータを大量に更新後、手動でデータベース単位で統計情報を更新をするようなケースもあるものと存じます。この場合ですが、マスターユーザを利用している場合でも、次のように、特定のシステムカタログについては権限の問題から対象外となることが確認できました。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; analyze;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WARNING:  skipping &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;pg_authid&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt; --- only superuser can analyze it&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WARNING:  skipping &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;pg_subscription&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt; --- only superuser can analyze it&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WARNING:  skipping &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;pg_database&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt; --- only superuser can analyze it&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WARNING:  skipping &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;pg_db_role_setting&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt; --- only superuser can analyze it&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WARNING:  skipping &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;pg_tablespace&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt; --- only superuser can analyze it&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WARNING:  skipping &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;pg_pltemplate&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt; --- only superuser can analyze it&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WARNING:  skipping &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;pg_auth_members&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt; --- only superuser can analyze it&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WARNING:  skipping &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;pg_shdepend&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt; --- only superuser can analyze it&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WARNING:  skipping &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;pg_shdescription&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt; --- only superuser can analyze it&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WARNING:  skipping &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;pg_replication_origin&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt; --- only superuser can analyze it&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WARNING:  skipping &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;pg_shseclabel&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt; --- only superuser can analyze it&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;したがって、上記システムカタログの統計情報については、自動バキュームワーカーによる自動更新を行う以外に更新手段がない形となります。自動バキュームを無効にするケースは少ないかとは存じますが、無効にして手動による更新のみを行う運用の場合、上記のシステムカタログが肥大化したり、実態と統計情報に乖離が生じたりする可能性について考慮する必要があります。&lt;/p&gt;
&lt;h2 id=&quot;参考:_確認方法&quot;&gt;参考: 確認方法&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;pg_stat_all_tables&lt;/code&gt;や&lt;code&gt;pg_statistic&lt;/code&gt;の仕様について確認した際の方法について記載します(プライマリとリードレプリカの処理を時系列順に横並びで表示)。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-- プライマリ                                                                                                           -- リードレプリカ&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; select&lt;/span&gt;&lt;span&gt; inet_server_addr();                                                                                   postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; select&lt;/span&gt;&lt;span&gt; inet_server_addr();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; inet_server_addr                                                                                                        inet_server_addr&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;------------------                                                                                                      ------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt; 192&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;168&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx                                                                                                           192&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;168&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;yy&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;yy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; row&lt;/span&gt;&lt;span&gt;)                                                                                                                 (&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; row&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; \x                                                                                                           postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; \x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Expanded display &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;is on&lt;/span&gt;&lt;span&gt;.                                                                                                 Expanded display &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;is on&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-- テーブル作成&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; create table&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; public&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;stats_test_table&lt;/span&gt;&lt;span&gt; (col1 &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;int primary key&lt;/span&gt;&lt;span&gt;,col2 &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;10&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;CREATE TABLE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; \d &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;public&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;stats_test_table&lt;/span&gt;&lt;span&gt;                                                                                   postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; \d &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;public&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;stats_test_table&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;                 Table&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;quot;public.stats_test_table&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;                                                                                         Table&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;quot;public.stats_test_table&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; Column |         &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Type&lt;/span&gt;&lt;span&gt;          | Collation | Nullable | &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Default&lt;/span&gt;&lt;span&gt;                                                         Column |         &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Type&lt;/span&gt;&lt;span&gt;          | Collation | Nullable | &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Default&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;--------+-----------------------+-----------+----------+---------                                                       --------+-----------------------+-----------+----------+---------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; col1   | &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;integer&lt;/span&gt;&lt;span&gt;               |           | &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;not null&lt;/span&gt;&lt;span&gt; |                                                                 col1   | &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;integer&lt;/span&gt;&lt;span&gt;               |           | &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;not null&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; col2   | &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;character varying&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;10&lt;/span&gt;&lt;span&gt;) |           |          |                                                                 col2   | &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;character varying&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;10&lt;/span&gt;&lt;span&gt;) |           |          |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Indexes:                                                                                                                Indexes:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-2&quot;&gt;    &amp;quot;stats_test_table_pkey&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; PRIMARY KEY&lt;/span&gt;&lt;span&gt;, btree (col1)                                                                       &lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;stats_test_table_pkey&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; PRIMARY KEY&lt;/span&gt;&lt;span&gt;, btree (col1)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-- 作成時点で`seq_scan`に差異あり&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; select * from&lt;/span&gt;&lt;span&gt; pg_stat_all_tables &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;where&lt;/span&gt;&lt;span&gt; relname &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;stats_test_table&amp;#39;&lt;/span&gt;&lt;span&gt;;                                         postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; select * from&lt;/span&gt;&lt;span&gt; pg_stat_all_tables &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;where&lt;/span&gt;&lt;span&gt; relname &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;stats_test_table&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span&gt;[ RECORD 1 ]&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;-------+-----------------                                                                                  -[ RECORD 1 ]-------+-----------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;relid               | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;90141&lt;/span&gt;&lt;span&gt;                                                                                             relid               | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;90141&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;schemaname          | public                                                                                            schemaname          | public&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;relname             | stats_test_table                                                                                  relname             | stats_test_table&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;seq_scan            | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;                                                                                                 seq_scan            | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;seq_tup_read        | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 seq_tup_read        | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;idx_scan            | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 idx_scan            | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;idx_tup_fetch       | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 idx_tup_fetch       | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_tup_ins           | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 n_tup_ins           | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_tup_upd           | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 n_tup_upd           | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_tup_del           | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 n_tup_del           | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_tup_hot_upd       | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 n_tup_hot_upd       | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_live_tup          | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 n_live_tup          | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_dead_tup          | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 n_dead_tup          | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_mod_since_analyze | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 n_mod_since_analyze | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;last_vacuum         |                                                                                                   last_vacuum         |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;last_autovacuum     |                                                                                                   last_autovacuum     |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;last_analyze        |                                                                                                   last_analyze        |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;last_autoanalyze    |                                                                                                   last_autoanalyze    |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;vacuum_count        | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 vacuum_count        | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;autovacuum_count    | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 autovacuum_count    | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;analyze_count       | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 analyze_count       | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;autoanalyze_count   | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 autoanalyze_count   | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; select * from&lt;/span&gt;&lt;span&gt; pg_stats &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;where&lt;/span&gt;&lt;span&gt; tablename &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;stats_test_table&amp;#39;&lt;/span&gt;&lt;span&gt;;                                                 postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; select * from&lt;/span&gt;&lt;span&gt; pg_stats &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;where&lt;/span&gt;&lt;span&gt; tablename &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;stats_test_table&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows&lt;/span&gt;&lt;span&gt;)                                                                                                                (&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-- テスト用の行挿入ファンクション作成&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; create function&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; public&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;stats_test_insert&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; returns int as&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-2&quot;&gt;postgres&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;   declare&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;int&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;#39;&amp;gt;   begin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-2&quot;&gt;postgres&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;     for&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;in&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;10000&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; loop&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;#39;&amp;gt;       insert into public.stats_test_table values(i,&amp;#39;&amp;#39;test&amp;#39;&amp;#39;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-2&quot;&gt;postgres&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;     end loop&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;#39;&amp;gt;     return 0;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-2&quot;&gt;postgres&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;   end&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;#39;&amp;gt; &amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&amp;gt; language&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;plpgsql&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; ;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;CREATE FUNCTION&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; select&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; public&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;stats_test_insert&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span&gt;[ RECORD 1 ]&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;-----+--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;stats_test_insert | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-- `pg_stat_all_tables`側は`n_tup_ins`、`n_live_tup`に差異が生じている&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; select * from&lt;/span&gt;&lt;span&gt; pg_stat_all_tables &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;where&lt;/span&gt;&lt;span&gt; relname &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;stats_test_table&amp;#39;&lt;/span&gt;&lt;span&gt;;                                         postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; select * from&lt;/span&gt;&lt;span&gt; pg_stat_all_tables &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;where&lt;/span&gt;&lt;span&gt; relname &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;stats_test_table&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span&gt;[ RECORD 1 ]&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;-------+-----------------                                                                                  -[ RECORD 1 ]-------+-----------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;relid               | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;90141&lt;/span&gt;&lt;span&gt;                                                                                             relid               | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;90141&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;schemaname          | public                                                                                            schemaname          | public&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;relname             | stats_test_table                                                                                  relname             | stats_test_table&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;seq_scan            | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;                                                                                                 seq_scan            | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;seq_tup_read        | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 seq_tup_read        | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;idx_scan            | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 idx_scan            | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;idx_tup_fetch       | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 idx_tup_fetch       | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_tup_ins           | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;10000&lt;/span&gt;&lt;span&gt;                                                                                             n_tup_ins           | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_tup_upd           | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 n_tup_upd           | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_tup_del           | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 n_tup_del           | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_tup_hot_upd       | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 n_tup_hot_upd       | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_live_tup          | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;10000&lt;/span&gt;&lt;span&gt;                                                                                             n_live_tup          | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_dead_tup          | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 n_dead_tup          | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_mod_since_analyze | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;10000&lt;/span&gt;&lt;span&gt;                                                                                             n_mod_since_analyze | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;last_vacuum         |                                                                                                   last_vacuum         |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;last_autovacuum     |                                                                                                   last_autovacuum     |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;last_analyze        |                                                                                                   last_analyze        |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;last_autoanalyze    |                                                                                                   last_autoanalyze    |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;vacuum_count        | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 vacuum_count        | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;autovacuum_count    | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 autovacuum_count    | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;analyze_count       | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 analyze_count       | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;autoanalyze_count   | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 autoanalyze_count   | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-- `pg_stats`側は差異なく同期されている&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; select * from&lt;/span&gt;&lt;span&gt; pg_stats &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;where&lt;/span&gt;&lt;span&gt; tablename &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;stats_test_table&amp;#39;&lt;/span&gt;&lt;span&gt;;                                                 postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; select * from&lt;/span&gt;&lt;span&gt; pg_stats &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;where&lt;/span&gt;&lt;span&gt; tablename &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;stats_test_table&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span&gt;[ RECORD 1 ]&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;----------+-------------------------------------------------                                               -[ RECORD 1 ]----------+-------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;schemaname             | public                                                                                         schemaname             | public&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;tablename              | stats_test_table                                                                               tablename              | stats_test_table&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;attname                | col1                                                                                           attname                | col1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;inherited              | f                                                                                              inherited              | f&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;null_frac              | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                              null_frac              | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;avg_width              | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;4&lt;/span&gt;&lt;span&gt;                                                                                              avg_width              | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_distinct             | &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;                                                                                             n_distinct             | &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;most_common_vals       |                                                                                                most_common_vals       |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;most_common_freqs      |                                                                                                most_common_freqs      |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;histogram_bounds       | {&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;100&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;200&lt;/span&gt;&lt;span&gt;,～省略～,&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;9800&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;9900&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;10000&lt;/span&gt;&lt;span&gt;}                                                               histogram_bounds       | {&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;100&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;200&lt;/span&gt;&lt;span&gt;,～省略～,&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;9800&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;9900&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;10000&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;correlation            | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;                                                                                              correlation            | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;most_common_elems      |                                                                                                most_common_elems      |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;most_common_elem_freqs |                                                                                                most_common_elem_freqs |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;elem_count_histogram   |                                                                                                elem_count_histogram   |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span&gt;[ RECORD 2 ]&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;----------+-------------------------------------------------                                               -[ RECORD 2 ]----------+-------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;schemaname             | public                                                                                         schemaname             | public&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;tablename              | stats_test_table                                                                               tablename              | stats_test_table&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;attname                | col2                                                                                           attname                | col2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;inherited              | f                                                                                              inherited              | f&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;null_frac              | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                              null_frac              | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;avg_width              | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;5&lt;/span&gt;&lt;span&gt;                                                                                              avg_width              | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_distinct             | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;                                                                                              n_distinct             | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;most_common_vals       | {test}                                                                                         most_common_vals       | {test}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;most_common_freqs      | {&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;}                                                                                            most_common_freqs      | {&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;histogram_bounds       |                                                                                                histogram_bounds       |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;correlation            | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;                                                                                              correlation            | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;most_common_elems      |                                                                                                most_common_elems      |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;most_common_elem_freqs |                                                                                                most_common_elem_freqs |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;elem_count_histogram   |                                                                                                elem_count_histogram   |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-- 同じ実行計画が選択されている&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; explain &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;verbose select * from&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; public&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;stats_test_table&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; where&lt;/span&gt;&lt;span&gt; col1 &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1000&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; and&lt;/span&gt;&lt;span&gt; col1 &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2000&lt;/span&gt;&lt;span&gt;;                     postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; explain &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;verbose select * from&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; public&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;stats_test_table&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; where&lt;/span&gt;&lt;span&gt; col1 &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1000&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; and&lt;/span&gt;&lt;span&gt; col1 &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2000&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span&gt;[ RECORD 1 ]&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;-------------------------------------------------------------------------------------------------------    -[ RECORD 1 ]-------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;QUERY PLAN | &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Index&lt;/span&gt;&lt;span&gt; Scan &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;using&lt;/span&gt;&lt;span&gt; stats_test_table_pkey &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; public&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;stats_test_table&lt;/span&gt;&lt;span&gt;  (cost&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;41&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;28&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1000&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;9&lt;/span&gt;&lt;span&gt;)    QUERY PLAN | &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Index&lt;/span&gt;&lt;span&gt; Scan &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;using&lt;/span&gt;&lt;span&gt; stats_test_table_pkey &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; public&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;stats_test_table&lt;/span&gt;&lt;span&gt;  (cost&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;41&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;28&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1000&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;9&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span&gt;[ RECORD 2 ]&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;-------------------------------------------------------------------------------------------------------    -[ RECORD 2 ]-------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;QUERY PLAN |   &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Output&lt;/span&gt;&lt;span&gt;: col1, col2                                                                                       QUERY PLAN |   &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Output&lt;/span&gt;&lt;span&gt;: col1, col2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span&gt;[ RECORD 3 ]&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;-------------------------------------------------------------------------------------------------------    -[ RECORD 3 ]-------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;QUERY PLAN |   &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Index&lt;/span&gt;&lt;span&gt; Cond: ((&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;stats_test_table&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;col1&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1000&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;AND&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;stats_test_table&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;col1&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; &amp;lt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 2000&lt;/span&gt;&lt;span&gt;))                         QUERY PLAN |   &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Index&lt;/span&gt;&lt;span&gt; Cond: ((&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;stats_test_table&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;col1&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1000&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;AND&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;stats_test_table&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;col1&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; &amp;lt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 2000&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-- 実行計画を変えるために行を削除する&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; delete from&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; public&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;stats_test_table&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; where&lt;/span&gt;&lt;span&gt; col1 &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 2000&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;DELETE&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 8000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-- `pg_stat_all_tables`側での自動バキュームや統計情報更新情報も差異が生じている&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; select * from&lt;/span&gt;&lt;span&gt; pg_stat_all_tables &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;where&lt;/span&gt;&lt;span&gt; relname &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;stats_test_table&amp;#39;&lt;/span&gt;&lt;span&gt;;                                         postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; select * from&lt;/span&gt;&lt;span&gt; pg_stat_all_tables &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;where&lt;/span&gt;&lt;span&gt; relname &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;stats_test_table&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span&gt;[ RECORD 1 ]&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;-------+------------------------------                                                                     -[ RECORD 1 ]-------+-----------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;relid               | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;90141&lt;/span&gt;&lt;span&gt;                                                                                             relid               | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;90141&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;schemaname          | public                                                                                            schemaname          | public&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;relname             | stats_test_table                                                                                  relname             | stats_test_table&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;seq_scan            | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2&lt;/span&gt;&lt;span&gt;                                                                                                 seq_scan            | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;seq_tup_read        | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;10000&lt;/span&gt;&lt;span&gt;                                                                                             seq_tup_read        | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;idx_scan            | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 idx_scan            | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;idx_tup_fetch       | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 idx_tup_fetch       | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_tup_ins           | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;10000&lt;/span&gt;&lt;span&gt;                                                                                             n_tup_ins           | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_tup_upd           | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 n_tup_upd           | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_tup_del           | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;8000&lt;/span&gt;&lt;span&gt;                                                                                              n_tup_del           | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_tup_hot_upd       | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 n_tup_hot_upd       | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_live_tup          | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2000&lt;/span&gt;&lt;span&gt;                                                                                              n_live_tup          | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_dead_tup          | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 n_dead_tup          | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_mod_since_analyze | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 n_mod_since_analyze | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;last_vacuum         |                                                                                                   last_vacuum         |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;last_autovacuum     | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2020&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;01 21&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;24&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;09&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;70559&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;09&lt;/span&gt;&lt;span&gt;                                                                      last_autovacuum     |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;last_analyze        |                                                                                                   last_analyze        |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;last_autoanalyze    | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2020&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;01 21&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;24&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;09&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;730183&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;09&lt;/span&gt;&lt;span&gt;                                                                     last_autoanalyze    |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;vacuum_count        | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 vacuum_count        | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;autovacuum_count    | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;                                                                                                 autovacuum_count    | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;analyze_count       | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                                 analyze_count       | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;autoanalyze_count   | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2&lt;/span&gt;&lt;span&gt;                                                                                                 autoanalyze_count   | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-- `pg_stats`側は差異なく同期されている&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; select * from&lt;/span&gt;&lt;span&gt; pg_stats &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;where&lt;/span&gt;&lt;span&gt; tablename &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;stats_test_table&amp;#39;&lt;/span&gt;&lt;span&gt;;                                                 postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; select * from&lt;/span&gt;&lt;span&gt; pg_stats &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;where&lt;/span&gt;&lt;span&gt; tablename &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;stats_test_table&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span&gt;[ RECORD 1 ]&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;----------+-------------------------------------------------                                               -[ RECORD 1 ]----------+-------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;schemaname             | public                                                                                         schemaname             | public&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;tablename              | stats_test_table                                                                               tablename              | stats_test_table&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;attname                | col1                                                                                           attname                | col1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;inherited              | f                                                                                              inherited              | f&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;null_frac              | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                              null_frac              | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;avg_width              | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;4&lt;/span&gt;&lt;span&gt;                                                                                              avg_width              | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_distinct             | &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;                                                                                             n_distinct             | &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;most_common_vals       |                                                                                                most_common_vals       |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;most_common_freqs      |                                                                                                most_common_freqs      |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;histogram_bounds       | {&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;20&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;40&lt;/span&gt;&lt;span&gt;,～省略～,&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1960&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1980&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2000&lt;/span&gt;&lt;span&gt;}                                                                  histogram_bounds       | {&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;20&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;40&lt;/span&gt;&lt;span&gt;,～省略～,&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1960&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1980&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2000&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;correlation            | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;                                                                                              correlation            | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;most_common_elems      |                                                                                                most_common_elems      |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;most_common_elem_freqs |                                                                                                most_common_elem_freqs |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;elem_count_histogram   |                                                                                                elem_count_histogram   |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span&gt;[ RECORD 2 ]&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;----------+-------------------------------------------------                                               -[ RECORD 2 ]----------+-------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;schemaname             | public                                                                                         schemaname             | public&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;tablename              | stats_test_table                                                                               tablename              | stats_test_table&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;attname                | col2                                                                                           attname                | col2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;inherited              | f                                                                                              inherited              | f&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;null_frac              | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;                                                                                              null_frac              | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;avg_width              | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;5&lt;/span&gt;&lt;span&gt;                                                                                              avg_width              | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n_distinct             | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;                                                                                              n_distinct             | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;most_common_vals       | {test}                                                                                         most_common_vals       | {test}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;most_common_freqs      | {&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;}                                                                                            most_common_freqs      | {&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;histogram_bounds       |                                                                                                histogram_bounds       |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;correlation            | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;                                                                                              correlation            | &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;most_common_elems      |                                                                                                most_common_elems      |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;most_common_elem_freqs |                                                                                                most_common_elem_freqs |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;elem_count_histogram   |                                                                                                elem_count_histogram   |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-- 同じ実行計画が選択されている&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; explain &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;verbose select * from&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; public&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;stats_test_table&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; where&lt;/span&gt;&lt;span&gt; col1 &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1000&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; and&lt;/span&gt;&lt;span&gt; col1 &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2000&lt;/span&gt;&lt;span&gt;;                     postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; explain &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;verbose select * from&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; public&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;stats_test_table&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; where&lt;/span&gt;&lt;span&gt; col1 &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1000&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; and&lt;/span&gt;&lt;span&gt; col1 &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2000&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span&gt;[ RECORD 1 ]&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;------------------------------------------------------------------------------                             -[ RECORD 1 ]------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;QUERY PLAN | Seq Scan &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; public&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;stats_test_table&lt;/span&gt;&lt;span&gt;  (cost&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;41&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1000&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;9&lt;/span&gt;&lt;span&gt;)                                  QUERY PLAN | Seq Scan &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; public&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;stats_test_table&lt;/span&gt;&lt;span&gt;  (cost&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;41&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; rows=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1000&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;9&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span&gt;[ RECORD 2 ]&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;------------------------------------------------------------------------------                             -[ RECORD 2 ]------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;QUERY PLAN |   &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Output&lt;/span&gt;&lt;span&gt;: col1, col2                                                                                       QUERY PLAN |   &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Output&lt;/span&gt;&lt;span&gt;: col1, col2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span&gt;[ RECORD 3 ]&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;------------------------------------------------------------------------------                             -[ RECORD 3 ]------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;QUERY PLAN |   &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Filter&lt;/span&gt;&lt;span&gt;: ((&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;stats_test_table&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;col1&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1000&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;AND&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;stats_test_table&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;col1&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; &amp;lt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 2000&lt;/span&gt;&lt;span&gt;))                             QUERY PLAN |   &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Filter&lt;/span&gt;&lt;span&gt;: ((&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;stats_test_table&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;col1&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 1000&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;AND&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;stats_test_table&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;col1&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; &amp;lt;=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 2000&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt;                                                                                                              postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</description>
      </item>
      <item>
          <title>OracleとPostgreSQLのデッドロックの比較</title>
          <pubDate>Sat, 20 Jun 2020 00:00:00 +0000</pubDate>
          <author>wannabe</author>
          <link>https://wannabe-data-engineer.net/oracle-postgresql-deadlock/</link>
          <guid>https://wannabe-data-engineer.net/oracle-postgresql-deadlock/</guid>
          <description xml:base="https://wannabe-data-engineer.net/oracle-postgresql-deadlock/">&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/oracle-postgresql-deadlock/eyechatch.png&quot; alt=&quot;OracleとPostgreSQLのデッドロックの比較&quot; /&gt;&lt;/p&gt;
&lt;p&gt;本記事では、OracleとPostgreSQLのデッドロックを簡単に比較した内容について記載していきます。それぞれ、業務システムで良く使われている有償/無償のRDBMSの筆頭で、移行も盛んに行われていますが、デッドロック時の挙動に若干の違いがあります。実運用時にデッドロックが多発するようなことはないと思いますが、万が一発生した時に、頭の片隅に置いてあると、役に立つかもしれません。&lt;/p&gt;
&lt;h2 id=&quot;OracleとPostgreSQLのデッドロックまとめ&quot;&gt;OracleとPostgreSQLのデッドロックまとめ&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;項目&lt;/th&gt;&lt;th&gt;Oracle&lt;/th&gt;&lt;th&gt;PostgreSQL&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;デッドロック検知&lt;/td&gt;&lt;td&gt;自動&lt;/td&gt;&lt;td&gt;自動&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;デッドロックタイムアウト時間&lt;/td&gt;&lt;td&gt;設定できない(1～2秒程度)&lt;/td&gt;&lt;td&gt;設定できる(deadlock_timeout)(デフォルト1秒)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;デッドロック後のトランザクション&lt;/td&gt;&lt;td&gt;ロールバックされない&lt;/td&gt;&lt;td&gt;中断される&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;デッドロックにより影響を受けるトランザクション&lt;/td&gt;&lt;td&gt;デッドロックを誘発させた方&lt;/td&gt;&lt;td&gt;いずれか&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;デッドロックのログ&lt;/td&gt;&lt;td&gt;アラートログ、トレースファイル&lt;/td&gt;&lt;td&gt;サーバログ&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;デッドロック検知&quot;&gt;デッドロック検知&lt;/h2&gt;
&lt;p&gt;OracleもPostgreSQLも、デッドロックはデータベースにより自動的に検知されます。したがって、ユーザ側によるデッドロック確認機能の実装は必要ありません。&lt;/p&gt;
&lt;h2 id=&quot;デッドロックタイムアウト時間&quot;&gt;デッドロックタイムアウト時間&lt;/h2&gt;
&lt;p&gt;デッドロックのタイムアウト時間(デッドロックだとみなすまでの時間)ですが、データベース上、Oracleは明示的な設定ができませんが、PostgreSQLは明示的な設定ができます。&lt;/p&gt;
&lt;h3 id=&quot;Oracleのデッドロックタイムアウト時間&quot;&gt;Oracleのデッドロックタイムアウト時間&lt;/h3&gt;
&lt;p&gt;Oracleはデッドロックを数秒(おおよそ1～2秒)以内で検知します。具体的な秒数について英語情報も含めて検索しましたが、下記のフォーラムレベルのもの(1～2秒)しか見当たりませんでした。個人的な体感としても、毎回1～2秒以内には検知されるように思います。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Usually, Oracle takes a second or two to detect a deadlock and throws the error.&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://stackoverflow.com/questions/28455231/deadlocks-in-oracle&quot;&gt;Deadlocks in Oracle - Stack Overflow&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;PostgreSQLのデッドロックタイムアウト時間&quot;&gt;PostgreSQLのデッドロックタイムアウト時間&lt;/h3&gt;
&lt;p&gt;PostgreSQLは&lt;code&gt;deadlock_timeout&lt;/code&gt;パラメータを設定することにより、デッドロック検知までの時間を明示的に設定することができます。デフォルトは1秒です。&lt;/p&gt;
&lt;p&gt;パラメータのコンテキストは&lt;code&gt;superuser&lt;/code&gt;であるため、セッションごとに変更するといったようなことはできません。あくまで、データベース全体に統一的に設定されます。&lt;/p&gt;
&lt;h2 id=&quot;デッドロック後のトランザクション&quot;&gt;デッドロック後のトランザクション&lt;/h2&gt;
&lt;p&gt;検知後のトランザクションの扱いについては、OracleとPostgreSQLで明確に相違があります。&lt;/p&gt;
&lt;p&gt;Oracleはトランザクション自体はロールバックせず、あくまでデッドロックを検知したSQL文がロールバックされます。したがって、検知後もSQL文の発行は可能となります。しかし、デッドロックを検知したトランザクションを明示的にコミットかロールバックしない限り、もう片方のトランザクションはロックを待機し続けます。&lt;/p&gt;
&lt;p&gt;PostgreSQLはトランザクション自体が強制的に中断されます。したがって、検知後はロールバック操作以外、一切のSQL文が受け付けられなくなります。しかし、もう片方のトランザクションはロックを取得できるため、そちらはほぼ影響なく操作を続けることができます。&lt;/p&gt;
&lt;h3 id=&quot;Oracle上のデッドロック後のトランザクション&quot;&gt;Oracle上のデッドロック後のトランザクション&lt;/h3&gt;
&lt;p&gt;Oracle側の実際の動きを見てみましょう。次の例では、テーブル&lt;code&gt;foo&lt;/code&gt;と&lt;code&gt;bar&lt;/code&gt;について、トランザクションAとBがたすき掛けで排他ロックを取得しようとしています。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-- トランザクションA                         -- トランザクションB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt;&lt;/span&gt;&lt;span&gt; lock &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;table&lt;/span&gt;&lt;span&gt; foo &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;in&lt;/span&gt;&lt;span&gt; exclusive mode;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;表がロックされました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;                                             SQL&amp;gt;&lt;/span&gt;&lt;span&gt; lock &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;table&lt;/span&gt;&lt;span&gt; bar &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;in&lt;/span&gt;&lt;span&gt; exclusive mode;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                             表がロックされました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-- 先にロック&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt;&lt;/span&gt;&lt;span&gt; lock &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;table&lt;/span&gt;&lt;span&gt; bar &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;in&lt;/span&gt;&lt;span&gt; exclusive mode;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;                                             -- 後にロック&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;                                             SQL&amp;gt;&lt;/span&gt;&lt;span&gt; lock &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;table&lt;/span&gt;&lt;span&gt; foo &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;in&lt;/span&gt;&lt;span&gt; exclusive mode;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;lock &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;table&lt;/span&gt;&lt;span&gt; bar &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;in&lt;/span&gt;&lt;span&gt; exclusive mode&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;*&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;行1でエラーが発生しました。:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ORA&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00060&lt;/span&gt;&lt;span&gt;: リソース待機の間にデッドロックが検出されました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; insert into&lt;/span&gt;&lt;span&gt; foo &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;values&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;null&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;1行が作成されました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SQL&amp;gt; rollback&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ロールバックが完了しました。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;                                             -- トランザクションAロールバック後にロック取得&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                             表がロックされました。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;デッドロックを検知したトランザクションA側は、トランザクション全体はロールバックされませんでした。したがって、トランザクションA側は既にロック取得済みの&lt;code&gt;foo&lt;/code&gt;テーブルに行を挿入できましたし、トランザクションB側は&lt;code&gt;foo&lt;/code&gt;テーブルに対するロック取得を待機し続け、トランザクションAが完了した後にロックを取得しています。&lt;/p&gt;
&lt;h3 id=&quot;PostgreSQL上のデッドロック後のトランザクション&quot;&gt;PostgreSQL上のデッドロック後のトランザクション&lt;/h3&gt;
&lt;p&gt;PostgreSQL側の実際の動きを見てみましょう。次の例では、テーブル&lt;code&gt;foo&lt;/code&gt;と&lt;code&gt;bar&lt;/code&gt;について、トランザクションAとBがたすき掛けで排他ロックを取得しようとしています。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-- トランザクションA                              -- トランザクションB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; begin&lt;/span&gt;&lt;span&gt;;                                 postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; begin&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;BEGIN                                             BEGIN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;# lock &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;table&lt;/span&gt;&lt;span&gt; foo &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;in&lt;/span&gt;&lt;span&gt; exclusive mode;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;LOCK &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;TABLE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                                  postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;# lock &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;table&lt;/span&gt;&lt;span&gt; bar &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;in&lt;/span&gt;&lt;span&gt; exclusive mode;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                                  LOCK &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;TABLE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-- 先にロック&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;# lock &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;table&lt;/span&gt;&lt;span&gt; bar &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;in&lt;/span&gt;&lt;span&gt; exclusive mode;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;                                                  -- 後にロック&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                                  postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;# lock &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;table&lt;/span&gt;&lt;span&gt; foo &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;in&lt;/span&gt;&lt;span&gt; exclusive mode;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                                  ERROR:  deadlock detected&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                                  DETAIL:  Process &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;7548&lt;/span&gt;&lt;span&gt; waits &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;for&lt;/span&gt;&lt;span&gt; ExclusiveLock &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;on&lt;/span&gt;&lt;span&gt; relation &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;16384&lt;/span&gt;&lt;span&gt; of &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;database&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 13938&lt;/span&gt;&lt;span&gt;; blocked &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;by&lt;/span&gt;&lt;span&gt; process &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;7510&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                                  Process &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;7510&lt;/span&gt;&lt;span&gt; waits &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;for&lt;/span&gt;&lt;span&gt; ExclusiveLock &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;on&lt;/span&gt;&lt;span&gt; relation &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;16387&lt;/span&gt;&lt;span&gt; of &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;database&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 13938&lt;/span&gt;&lt;span&gt;; blocked &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;by&lt;/span&gt;&lt;span&gt; process &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;7548&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                                  HINT:  See &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;server log for&lt;/span&gt;&lt;span&gt; query details.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-- トランザクションB自動中断後に自動的にロック取得&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;LOCK &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;TABLE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;                                                  -- 中断されたトランザクションでは操作できない&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                                  postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; insert into&lt;/span&gt;&lt;span&gt; bar &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;values&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                                  ERROR:  current &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;transaction is&lt;/span&gt;&lt;span&gt; aborted, commands ignored until &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;end&lt;/span&gt;&lt;span&gt; of &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;transaction block&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;デッドロックを検知したトランザクションB側は、トランザクション全体が中断されました。こうなると、ロールバックの操作しか受け付けなくなります。したがって、トランザクションB側で追加で実施したSQL文は無視されていますし、トランザクションA側は&lt;code&gt;bar&lt;/code&gt;テーブルに対するロックを自動的に取得できました。&lt;/p&gt;
&lt;h2 id=&quot;デッドロックにより影響を受けるトランザクション&quot;&gt;デッドロックにより影響を受けるトランザクション&lt;/h2&gt;
&lt;p&gt;前述の検証では、OracleとPostgreSQL両方で同じようにデッドロックを発生させても、ロールバックまたは中断させられるトランザクション(影響を受けるトランザクション)は、それぞれ異なる結果となりました。&lt;/p&gt;
&lt;p&gt;公式情報の公開記載は見つけられませんでしたが、これは、デッドロック後の対応を行うトランザクションの判定が、OracleとPostgreSQLで異なっているためと推測されます。&lt;/p&gt;
&lt;p&gt;Oracleは「デッドロックを誘発させたトランザクション」について対処し、PostgreSQLは「デッドロックに関わったトランザクションのどちらか」について対処するというものです(※誤りがあったら申し訳ございません)。&lt;/p&gt;
&lt;h3 id=&quot;Oracle上でデッドロックにより影響を受けるトランザクション&quot;&gt;Oracle上でデッドロックにより影響を受けるトランザクション&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;If your ORA-00060 is caused by competing resources, the perpetual embrace happens when the aborted task (Task B) attempts to lock a row which is being held by another task (Task A), which, in-turn, is waiting for task B to release a lock. To prevent a perpetual wait, Oracle aborts the transaction that caused the deadlock.&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;http://www.dba-oracle.com/t_deadlock.htm&quot;&gt;Oracle deadlocks tips&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;上記の記載を見ると、中断されるトランザクションは、競合するトランザクションが既にロックしている行に対してロックを試みた側というように捉えられます。「先に仕掛けた方が悪い」ということですね。実際のデッドロック検証時もそのような形でロールバックが行われています。&lt;/p&gt;
&lt;h3 id=&quot;PostgreSQL上でデッドロックにより影響を受けるトランザクション&quot;&gt;PostgreSQL上でデッドロックにより影響を受けるトランザクション&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;PostgreSQLの場合は、ロック待機が1秒を超えるとデットロックが起こってるんじゃないか考えて、デッドロックの有無を確認するチェックが実行されます。このチェックのロジックが走った結果、デットロックが見つかると、どれかのセッションがABORTされ、残ったセッションは継続できる、ということになります。つまり、このデットロックの輪の確認が一秒に1回チェックが走り、問題があればデッドロックを破る、という処理が行われています。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.postgresqlinternals.org/chapter6/&quot;&gt;6. ロック制御・PostgreSQL Internals&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;上記の記載を見ると、中断されるトランザクションは、先にデータベースによるチェックで見つかった側というように捉えられます。実際のデッドロック検証時も、Oracleとは違い、被害を受けた側(トランザクションB)のトランザクションが中断されています。&lt;/p&gt;
&lt;p&gt;ちなみに、上記では1秒と記載がありますが、これは&lt;code&gt;deadlock_timeout&lt;/code&gt;のデフォルト値が1秒だからであり、この値を変更するとこの検証間隔も長くなります。&lt;/p&gt;
&lt;h2 id=&quot;デッドロックのログ&quot;&gt;デッドロックのログ&lt;/h2&gt;
&lt;p&gt;デッドロックはロジックの設計ミスを暗示するものであるため、デッドロックの検出を監視し、後から情報を確認するというケースもあるかと思います。&lt;/p&gt;
&lt;p&gt;Oracleはアラートログにデッドロックが検出されたということが出力され、詳細な情報はトレースファイルに記録されるという形となります。&lt;/p&gt;
&lt;p&gt;PostgreSQLはサーバログにデッドロックが検出されたということが出力され、詳細な情報(Oracleに比べると簡易的ですが)も同じくサーバログに記録されるという形となります。&lt;/p&gt;
&lt;h3 id=&quot;Oracle上のデッドロックのログ&quot;&gt;Oracle上のデッドロックのログ&lt;/h3&gt;
&lt;p&gt;Oracleでは、まず、アラートログ上に次のようなメッセージが出力されます。したがって、よくある運用通り、アラートログに&lt;code&gt;ORA-&lt;/code&gt;という出力があるかという監視を行えば、デッドロックに気が付くことができます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Oracle上のデッドロックのアラートログ出力例&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;log&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Sat Jun &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt; 12:24:05&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 2020&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ORA-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00060&lt;/span&gt;&lt;span&gt;: Deadlock detected. More info in file /u01/app/oracle/diag/rdbms/orcl/orcl/&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;trace&lt;/span&gt;&lt;span&gt;/orcl_ora_19394.trc.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;その上で、詳細な情報はアラートログに出力されたトレースファイルに記録されます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Oracle上のデッドロックのトレースファイル出力例&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;log&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;*** &lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;2020-06-13 12:24:05.843&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;*** SESSION ID:(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;39&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2553&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;2020-06-13 12:24:05.843&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;*** CLIENT ID:() &lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;2020-06-13 12:24:05.843&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;*** SERVICE NAME:(SYS$USERS) &lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;2020-06-13 12:24:05.843&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;*** MODULE NAME:(sqlplus@oracle01 (TNS V1-V3)) &lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;2020-06-13 12:24:05.843&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;*** ACTION NAME:() &lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;2020-06-13 12:24:05.843&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;*** &lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;2020-06-13 12:24:05.843&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;DEADLOCK DETECTED ( ORA-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00060&lt;/span&gt;&lt;span&gt; )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[Transaction Deadlock]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;The following deadlock is not an ORACLE error. It is a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;deadlock due to user error in the design of an application&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;or from issuing incorrect ad-hoc SQL. The following&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;information may aid in determining the deadlock:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Deadlock graph:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                       ---------Blocker(s)--------  ---------Waiter(s)---------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Resource Name          process session holds waits  process session holds waits&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;TM-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00012232-00000000        28      39&lt;/span&gt;&lt;span&gt;     X             &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29       1&lt;/span&gt;&lt;span&gt;           X&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;TM-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00012234-00000000        29       1&lt;/span&gt;&lt;span&gt;     X             &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;28      39&lt;/span&gt;&lt;span&gt;           X&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;session &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;39&lt;/span&gt;&lt;span&gt;: DID &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0001-001C-00000C5F&lt;/span&gt;&lt;span&gt;      session &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;: DID &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0001-001D-00000410&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;session &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;: DID &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0001-001D-00000410&lt;/span&gt;&lt;span&gt;       session &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;39&lt;/span&gt;&lt;span&gt;: DID &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0001-001C-00000C5F&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Rows waited on:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Session &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;39&lt;/span&gt;&lt;span&gt;: obj - rowid = &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00012234&lt;/span&gt;&lt;span&gt; - AAAAAAAAAAAAAAAAAA&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (dictionary objn - &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;74292&lt;/span&gt;&lt;span&gt;, file - &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;, block - &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;, slot - &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Session &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;: obj - rowid = &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;00012232&lt;/span&gt;&lt;span&gt; - AAAAAAAAAAAAAAAAAA&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (dictionary objn - &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;74290&lt;/span&gt;&lt;span&gt;, file - &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;, block - &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;, slot - &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;----- Information for the OTHER waiting sessions -----&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Session &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  sid: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt; ser: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;5545&lt;/span&gt;&lt;span&gt; audsid: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;4294967295&lt;/span&gt;&lt;span&gt; user: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0&lt;/span&gt;&lt;span&gt;/SYS flags: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;0x41&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  pid: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29&lt;/span&gt;&lt;span&gt; O/S &lt;/span&gt;&lt;span class=&quot;z-3 z-bg3&quot;&gt;info:&lt;/span&gt;&lt;span&gt; user: oracle, term: UNKNOWN, ospid: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;19396&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    image: oracle@oracle01 (TNS V1-V3)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  client details:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    O/S &lt;/span&gt;&lt;span class=&quot;z-3 z-bg3&quot;&gt;info:&lt;/span&gt;&lt;span&gt; user: oracle, term: pts/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1&lt;/span&gt;&lt;span&gt;, ospid: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;19395&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    machine: oracle01 program: sqlplus@oracle01 (TNS V1-V3)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    application name: sqlplus@oracle01 (TNS V1-V3), hash value=&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1634161439&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  current SQL:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  lock table foo in exclusive mode&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;----- End of information for the OTHER waiting sessions -----&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Information for THIS session:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;----- Current SQL Statement for this session (sql_id=5g9s5xfpspx7s) -----&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;lock table bar in exclusive mode&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;主に次のようなことが分かります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;*** SESSION ID:(39.2553)&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;セッション識別子&lt;code&gt;39&lt;/code&gt;がデッドロックにより影響を受けた&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Deadlock graph&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;セッション識別子&lt;code&gt;1&lt;/code&gt;と&lt;code&gt;39&lt;/code&gt;の間でデッドロックが発生した&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Information for the OTHER waiting sessions&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;セッション識別子&lt;code&gt;1&lt;/code&gt;は&lt;code&gt;lock table foo in exclusive mode&lt;/code&gt;を実行していた&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Current SQL Statement for this session&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;セッション識別子&lt;code&gt;39&lt;/code&gt;は&lt;code&gt;lock table bar in exclusive mode&lt;/code&gt;を実行していた&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;PostgreSQL上のデッドロックのログ&quot;&gt;PostgreSQL上のデッドロックのログ&lt;/h3&gt;
&lt;p&gt;PostgreSQLでは、&lt;code&gt;log_lock_waits&lt;/code&gt;のパラメータを&lt;code&gt;on&lt;/code&gt;に設定すると、&lt;code&gt;deadlock_timeout&lt;/code&gt;よりも長い時間ロック状態となっているSQL文をログ出力できます。サーバログ上に全ての情報が出力されます。&lt;/p&gt;
&lt;p&gt;内容はOracleより非常にシンプルです。デッドロック検出自体は&lt;code&gt;ERROR: deadlock detected&lt;/code&gt;で記録されるため、こちらも良くある通り、&lt;code&gt;ERROR:&lt;/code&gt;で監視していれば気が付くことができます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PostgreSQL上のデッドロックのサーバログ出力例&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;log&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2020-06-15 02:01:56&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;55590&lt;/span&gt;&lt;span&gt;):postgres@postgres:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29366&lt;/span&gt;&lt;span&gt;]:LOG: process &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29366&lt;/span&gt;&lt;span&gt; still waiting for ExclusiveLock on relation &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;28685&lt;/span&gt;&lt;span&gt; of database &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;14007&lt;/span&gt;&lt;span&gt; after &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;10&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;061&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2020-06-15 02:01:56&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;55590&lt;/span&gt;&lt;span&gt;):postgres@postgres:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29366&lt;/span&gt;&lt;span&gt;]:DETAIL: Process holding the lock: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29052&lt;/span&gt;&lt;span&gt;. Wait queue: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29366&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2020-06-15 02:01:56&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;55590&lt;/span&gt;&lt;span&gt;):postgres@postgres:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29366&lt;/span&gt;&lt;span&gt;]:STATEMENT: lock table bar in exclusive mode;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2020-06-15 02:01:58&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;55582&lt;/span&gt;&lt;span&gt;):postgres@postgres:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29052&lt;/span&gt;&lt;span&gt;]:LOG: process &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29052&lt;/span&gt;&lt;span&gt; detected deadlock while waiting for ExclusiveLock on relation &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;28682&lt;/span&gt;&lt;span&gt; of database &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;14007&lt;/span&gt;&lt;span&gt; after &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;10&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;059&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2020-06-15 02:01:58&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;55582&lt;/span&gt;&lt;span&gt;):postgres@postgres:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29052&lt;/span&gt;&lt;span&gt;]:DETAIL: Process holding the lock: &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29366&lt;/span&gt;&lt;span&gt;. Wait queue: .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2020-06-15 02:01:58&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;55582&lt;/span&gt;&lt;span&gt;):postgres@postgres:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29052&lt;/span&gt;&lt;span&gt;]:STATEMENT: lock table foo in exclusive mode;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2020-06-15 02:01:58&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;55582&lt;/span&gt;&lt;span&gt;):postgres@postgres:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29052&lt;/span&gt;&lt;span&gt;]:&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;ERROR&lt;/span&gt;&lt;span&gt;: deadlock detected&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2020-06-15 02:01:58&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;55582&lt;/span&gt;&lt;span&gt;):postgres@postgres:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29052&lt;/span&gt;&lt;span&gt;]:DETAIL: Process &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29052&lt;/span&gt;&lt;span&gt; waits for ExclusiveLock on relation &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;28682&lt;/span&gt;&lt;span&gt; of database &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;14007&lt;/span&gt;&lt;span&gt;; blocked by process &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29366&lt;/span&gt;&lt;span&gt;. Process &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29366&lt;/span&gt;&lt;span&gt; waits for ExclusiveLock on relation &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;28685&lt;/span&gt;&lt;span&gt; of database &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;14007&lt;/span&gt;&lt;span&gt;; blocked by process &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29052&lt;/span&gt;&lt;span&gt;. Process &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29052&lt;/span&gt;&lt;span&gt;: lock table foo in exclusive mode; Process &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29366&lt;/span&gt;&lt;span&gt;: lock table bar in exclusive mode;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2020-06-15 02:01:58&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;55582&lt;/span&gt;&lt;span&gt;):postgres@postgres:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29052&lt;/span&gt;&lt;span&gt;]:&lt;/span&gt;&lt;span class=&quot;z-3 z-bg3&quot;&gt;HINT&lt;/span&gt;&lt;span&gt;: See server log for query details.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2020-06-15 02:01:58&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;55582&lt;/span&gt;&lt;span&gt;):postgres@postgres:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29052&lt;/span&gt;&lt;span&gt;]:STATEMENT: lock table foo in exclusive mode;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2020-06-15 02:01:58&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;55590&lt;/span&gt;&lt;span&gt;):postgres@postgres:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29366&lt;/span&gt;&lt;span&gt;]:LOG: process &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29366&lt;/span&gt;&lt;span&gt; acquired ExclusiveLock on relation &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;28685&lt;/span&gt;&lt;span&gt; of database &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;14007&lt;/span&gt;&lt;span&gt; after &lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;1553&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;795&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;2020-06-15 02:01:58&lt;/span&gt;&lt;span&gt; UTC:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;xx.xx.xx.xx&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;55590&lt;/span&gt;&lt;span&gt;):postgres@postgres:[&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;29366&lt;/span&gt;&lt;span&gt;]:STATEMENT: lock table bar in exclusive mode;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;主に次のようなことが分かります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プロセス&lt;code&gt;29366&lt;/code&gt;は&lt;code&gt;lock table bar in exclusive mode&lt;/code&gt;を実行しロック取得待機をしていた&lt;/li&gt;
&lt;li&gt;プロセス&lt;code&gt;29052&lt;/code&gt;は&lt;code&gt;lock table foo in exclusive mode&lt;/code&gt;を実行しロック取得待機をしていた&lt;/li&gt;
&lt;li&gt;プロセス&lt;code&gt;29052&lt;/code&gt;でのロック取得待機中にデッドロックを検出した&lt;/li&gt;
&lt;li&gt;プロセス&lt;code&gt;29366&lt;/code&gt;は&lt;code&gt;lock table bar in exclusive mode&lt;/code&gt;の実行によりロック取得を行えた&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;以上、OracleとPostgreSQLのデッドロックの挙動について簡単に比較してきました。&lt;/p&gt;
&lt;p&gt;Oracleはデッドロック時の挙動が分かりやすく、より詳細な情報が得られますが、PostgreSQLはデッドロックのタイムアウト時間をユーザ側で指定できるため、チューニングに幅が出ます。&lt;/p&gt;
&lt;p&gt;一長一短だとは思いますが、それぞれのデッドロック時の挙動の違いを考えながら設計を行うと、面白いかもしれません。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Active Directory on EC2をバックアップ・リストアする方法(全台障害)</title>
          <pubDate>Sat, 21 Mar 2020 00:00:00 +0000</pubDate>
          <author>wannabe</author>
          <link>https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/</link>
          <guid>https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/</guid>
          <description xml:base="https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/">&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/eyechatch.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;本記事では、EC2にActive Directoryをインストールした環境での、バックアップ・リストア手法の一例について記載します。想定シナリオとしては、FSMOを含め、ドメインコントローラーの役割を持つEC2の全てに障害が発生しているという状況です。つまり、EC2を新規作成し、ドメインコントローラーに昇格するという手段は使えないという状況を想定しています。&lt;/p&gt;
&lt;h2 id=&quot;Active_Directory_on_EC2_バックアップ・リストアの流れ&quot;&gt;Active Directory on EC2 バックアップ・リストアの流れ&lt;/h2&gt;
&lt;p&gt;全台障害時のActive Directoryのバックアップ・リストアについて、大まかな流れを記載します。なお、Windows Server バックアップを利用しているのは、VSSに対応しており、かつ、サードパーティ製のソフトウェアが不要であるためです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Windows Server バックアップでバックアップを取得する&lt;/li&gt;
&lt;li&gt;EC2のAMIイメージを取得する&lt;/li&gt;
&lt;li&gt;AMIイメージからEC2をリストアする&lt;/li&gt;
&lt;li&gt;Windows Server バックアップからリストアする&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;上記のバックアップ・リストア工程を経ると、最終的にWindows Server バックアップを利用してバックアップを取得した段階にActive Directoryの内部状態が戻ります。最新の状態というわけではありませんが、全てのドメインコントローラーが壊れてしまっている壊滅的な状態からの復旧なので、そこは妥協点となります。&lt;br /&gt;
なお、ドメインコントローラーを冗長化している状態に戻すためには、追加で次のような作業も必要になりますが、取り急ぎ、上記の時点でActive Directoryは最低限度のレベルで復旧となります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;他ドメインコントローラーの強制降格を行う&lt;/li&gt;
&lt;li&gt;他ドメインコントローラーのメタデータを削除する&lt;/li&gt;
&lt;li&gt;他ドメインコントローラーの再昇格を行う&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;それでは、具体的な流れに入ります。&lt;/p&gt;
&lt;h2 id=&quot;Windows_Server_バックアップでバックアップを取得する&quot;&gt;Windows Server バックアップでバックアップを取得する&lt;/h2&gt;
&lt;p&gt;本項目では次のような内容を記載します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows Server バックアップ専用のEBSを用意する&lt;/li&gt;
&lt;li&gt;Windows Server バックアップの機能を追加する&lt;/li&gt;
&lt;li&gt;Windows Server バックアップの設定を行う&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;Windows_Server_バックアップ専用のEBSを用意する&quot;&gt;Windows Server バックアップ専用のEBSを用意する&lt;/h3&gt;
&lt;p&gt;Windows Server バックアップを利用したバックアップ先は専用ディスクを利用することが推奨されています。今回も専用EBSを用意し、そちらにバックアップを行うように設定します。&lt;br /&gt;
まず、EBSのボリュームコンソールから&lt;code&gt;ボリュームの作成&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-1.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;特に次の2点に注意しつつ値を埋めて&lt;code&gt;ボリュームの作成&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ボリュームのサイズは保存世代数等の要件に応じて事前に検証して見積もります&lt;/li&gt;
&lt;li&gt;AZはEC2が存在するものと同じものを指定します&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回は次のような値を設定しました。&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;項目&lt;/th&gt;&lt;th&gt;値&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;ボリュームタイプ&lt;/td&gt;&lt;td&gt;汎用 SSD (gp2)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;サイズ(GiB)&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;アベイラビリティーゾーン&lt;/td&gt;&lt;td&gt;ap-northeast-1a&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;スナップショット ID&lt;/td&gt;&lt;td&gt;なし&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;暗号化&lt;/td&gt;&lt;td&gt;有効&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-2.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-3.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;作成したEBSを右クリックし&lt;code&gt;ボリュームのアタッチ&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-4.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;インスタンス&lt;/code&gt;にはActive DirectoryがインストールされたEC2を指定します。ここでは、FSMOの役割を保有しているドメインコントローラーを指定することをお勧め致します。リストア後、他ドメインコントローラーを追加する際に、FSMOの強制以降を行う手順が減るためです。&lt;br /&gt;
また、&lt;code&gt;デバイス&lt;/code&gt;は環境に合わせて指定する必要がありますが、今回は他にEBSをアタッチしていないため、&lt;code&gt;xvdf&lt;/code&gt;を指定しました。&lt;code&gt;アタッチ&lt;/code&gt;をクリックすると該当のインスタンスにEBSをアタッチできます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-5.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;Windows_Server_バックアップの機能を追加する&quot;&gt;Windows Server バックアップの機能を追加する&lt;/h3&gt;
&lt;p&gt;続いて、上述の手順でEBSをアタッチしたEC2上にWindows Server バックアップの機能を追加します。まずは、サーバマネージャーから&lt;code&gt;管理 &amp;gt; 役割と機能の追加&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-6.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;開始する前に&lt;/code&gt;が表示された場合は&lt;code&gt;次へ&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-7.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;インストールの種類の選択&lt;/code&gt;では&lt;code&gt;役割ベースまたは機能ベースのインストール&lt;/code&gt;を選択し&lt;code&gt;次へ&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-8.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;対象サーバーの選択&lt;/code&gt;では自分自身を選択し&lt;code&gt;次へ&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-9.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;サーバーの役割の選択&lt;/code&gt;では特に何も追加で選択せずに&lt;code&gt;次へ&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-10.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;機能の選択&lt;/code&gt;で&lt;code&gt;Windows Server バックアップ&lt;/code&gt;をにチェックを入れ&lt;code&gt;次へ&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-11.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;インストール&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-12.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;インストールが完了するまで待ちます。これで機能を追加することができました。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-13.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-14.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;Windows_Server_バックアップの設定を行う&quot;&gt;Windows Server バックアップの設定を行う&lt;/h3&gt;
&lt;p&gt;ここではスケジュールからWindows Server バックアップを行うように設定します。まずはサーバーマネージャーから&lt;code&gt;ツール &amp;gt; Windows Server バックアップ&lt;/code&gt;で&lt;code&gt;wbadmin&lt;/code&gt;を起動します。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-15.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;左ペインの&lt;code&gt;ローカル バックアップ&lt;/code&gt;を選択し、右ペインの&lt;code&gt;操作&lt;/code&gt;にある&lt;code&gt;バックアップ スケジュール&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-16.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;はじめに&lt;/code&gt;では&lt;code&gt;次へ&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-17.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;バックアップの構成の選択&lt;/code&gt;では&lt;code&gt;カスタム&lt;/code&gt;を選択し&lt;code&gt;次へ&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-18.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;バックアップする項目を選択&lt;/code&gt;では、まず&lt;code&gt;項目の追加&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-19.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;項目の選択&lt;/code&gt;ウィンドウが出てくるので&lt;code&gt;システム状態&lt;/code&gt;を選択し&lt;code&gt;OK&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-20.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;システム状態&lt;/code&gt;が追加されていることを確認し&lt;code&gt;次へ&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-21.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;バックアップの時間の設定&lt;/code&gt;では実際のバックアップ時刻を選択します。今回は日次で20時30分としています。設定したら&lt;code&gt;次へ&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-22.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;作成先の種類の選択&lt;/code&gt;では、今回は専用EBSを用意しているので、&lt;code&gt;バックアップ専用のハードディスクにバックアップする&lt;/code&gt;を選択し&lt;code&gt;次へ&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-23.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;作成先ディスクの選択&lt;/code&gt;では、まず&lt;code&gt;すべての使用可能なディスクを表示&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-24.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;すべての使用可能なディスクを表示&lt;/code&gt;ウィンドウが出てくるので、追加したEBS専用のディスクを選択し、&lt;code&gt;OK&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-25.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;EBS専用のディスクにチェックを入れ、&lt;code&gt;次へ&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-26.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;該当のディスクがフォーマットされる旨の警告が出てくるので、&lt;code&gt;はい&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-27.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;内容を確認し&lt;code&gt;完了&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-28.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;スケジュールが作成されるまで待ちます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-29.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;これでスケジュールの設定ができました。スケジュール時刻まで待ちましょう。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-30.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;EC2のAMIイメージを取得する&quot;&gt;EC2のAMIイメージを取得する&lt;/h2&gt;
&lt;p&gt;ここからは、先程の工程で設定したスケジュールでバックアップが正常に取れていることを前提としています。&lt;br /&gt;
実際の運用では、手動ではなく自動で作成するパターンがほとんどだと思います。ただし、今回はAMIを手動で取得します。インスタンスを右クリックし&lt;code&gt;イメージ &amp;gt; イメージの作成&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-32.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;今回は&lt;code&gt;再起動しない&lt;/code&gt;にチェックを入れて&lt;code&gt;イメージの作成&lt;/code&gt;をクリックしAMIイメージを取得します。EBSには、Windows Server バックアップ専用のものが含まれていることを確認します。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-33.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;Windows_Server_バックアップからリストアする&quot;&gt;Windows Server バックアップからリストアする&lt;/h2&gt;
&lt;p&gt;本項目では次のような内容を記載します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AMIイメージからEC2をリストアする&lt;/li&gt;
&lt;li&gt;EC2がディレクトリサービス復元モードで起動するように設定する&lt;/li&gt;
&lt;li&gt;Windows Server バックアップからリストアする&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;AMIイメージからEC2をリストアする&quot;&gt;AMIイメージからEC2をリストアする&lt;/h3&gt;
&lt;p&gt;AMIイメージからリストアする際の前提としては、次のようなものを想定しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;リストア対象となるドメインコントローラーのEC2は削除済みである&lt;/li&gt;
&lt;li&gt;リストア後はリストア前と同じIPアドレスを利用する&lt;/li&gt;
&lt;li&gt;リストア対象を含み全てのドメインコントローラーは削除または停止されておりリストア中に通信は発生し得ない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;元々、全てのドメインコントローラーに障害が発生した状況を想定してはいますが、作業中に何らかの意図しない通信が発生し、Active Directoryが完全に破損してしまうようなことがあってはいけないので、全てのドメインコントローラーが削除または停止された状態を想定しています。今回も、該当のEC2は削除してからリストア作業を実施しています。&lt;/p&gt;
&lt;p&gt;当該AMIイメージを右クリックし&lt;code&gt;起動&lt;/code&gt;からEC2をリストアします。この際、IPアドレスは元々のものを利用するように設定することを忘れないようにします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-34.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;起動できました。 元々のEC2は既に削除済みであるため、同じサブネットにも作成できます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-35.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;EC2がディレクトリサービス復元モードで起動するように設定する&quot;&gt;EC2がディレクトリサービス復元モードで起動するように設定する&lt;/h3&gt;
&lt;p&gt;ディレクトリサービス復元モード(DSRM)とは、Active Directoryを停止した状態でOSを起動するモードです。主として、名前の通り、Active Directoryを復元するために用いられます。通常はサーバ起動時にF8キーを押すことでこのモードを選択できるのですが、EC2では起動時にF8キーを押すことができませんので、次のように少し手間がかかります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;復元したEC2からルートボリュームのEBSをデタッチする&lt;/li&gt;
&lt;li&gt;デタッチしたEBSを作業用のEC2にアタッチする&lt;/li&gt;
&lt;li&gt;ディレクトリサービス復元モードで起動するように設定する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;実際に流れを見ていきましょう。&lt;/p&gt;
&lt;p&gt;まずは、リストアしたEC2を右クリックし&lt;code&gt;インスタンスの状態 &amp;gt; 停止&lt;/code&gt;で停止します。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-36.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;インスタンスが停止したら、ルートボリュームとして利用しているEBSを右クリックし&lt;code&gt;ボリュームのデタッチ&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-43.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-38.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;デタッチできたら、再度同じEBSを右クリックし&lt;code&gt;ボリュームのアタッチ&lt;/code&gt;をクリックします。アタッチ対象のインスタンスは復元したインスタンス以外の作業用Windows系インスタンスです。なお、&lt;strong&gt;作業用インスタンスは復元するサーバとは別バージョンを利用する&lt;/strong&gt;ことをお勧め致します(※詳細は「詰まった点」にて後述します)。他にEBSをアタッチしていないため、デバイスは&lt;code&gt;xvdf&lt;/code&gt;とします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-39.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-40.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;EBSをアタッチしたら、作業用インスタンスに接続します。&lt;code&gt;ディスクの管理&lt;/code&gt;を開き、アタッチしたEBSがオンラインになっていない場合、右クリックし&lt;code&gt;オンライン&lt;/code&gt;でオンライン状態にします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-41.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;管理者権限でコマンドプロンプトを起動し、次のコマンドを実行します。&lt;code&gt;D:\Boot\BCD&lt;/code&gt;の部分はアタッチしたデバイス名に応じて修正します。なお、このコマンドは起動モードを編集するものです。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;powershell&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;bcdedit &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;store D:\Boot\BCD &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;set {&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;default&lt;/span&gt;&lt;span&gt;} safeboot dsrepair&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;成功すると次のように&lt;code&gt;この操作を正しく終了しました。&lt;/code&gt;と出力されます。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;powershell&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;C:\Users\Administrator&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;bcdedit &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;store D:\Boot\BCD &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;/&lt;/span&gt;&lt;span&gt;set {&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;default&lt;/span&gt;&lt;span&gt;} safeboot dsrepair&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;この操作を正しく終了しました。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再度、作業用インスタンス上で&lt;code&gt;ディスクの管理&lt;/code&gt;を開き、アタッチしたEBSを右クリックし&lt;code&gt;オフライン&lt;/code&gt;でオフライン状態にします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-42.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;該当のEBSを作業用インスタンスからデタッチします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-43.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-44.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;デタッチしたEBSを復元したEC2のルートボリュームにアタッチしなおします。OSバージョンやAMI等により異なる場合はありますが、今回はルートボリュームの&lt;code&gt;/dev/sda1&lt;/code&gt;を指定しています。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-45.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-46.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;これで、復元したEC2がディレクトリサービス復元モードで起動するようになります。&lt;/p&gt;
&lt;h3 id=&quot;Windows_Server_バックアップからリストアする-1&quot;&gt;Windows Server バックアップからリストアする&lt;/h3&gt;
&lt;p&gt;該当のEC2がディレクトリサービス復元モードで起動するようになったので、コンソールから起動し、ログインします。なお、ログイン時のユーザは&lt;code&gt;Administrator&lt;/code&gt;で、パスワードは&lt;code&gt;ドメインコントローラー昇格時に指定したディレクトリサービス復元モードのパスワード&lt;/code&gt;であることに注意が必要です。Active Directoryが動作していないので、ドメインユーザでログインはできません。&lt;/p&gt;
&lt;p&gt;起動したら、サーバマネージャーから&lt;code&gt;ツール &amp;gt; Windows Server バックアップ&lt;/code&gt;で&lt;code&gt;wbadmin&lt;/code&gt;を開きます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-47.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;左ペインの&lt;code&gt;ローカル バックアップ&lt;/code&gt;を選択し、右ペインの&lt;code&gt;操作&lt;/code&gt;にある&lt;code&gt;回復&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-48.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;はじめに&lt;/code&gt;では&lt;code&gt;このサーバー&lt;/code&gt;を選択します。バックアップ先のEBSは自分自身にアタッチされているためです。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-49.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;バックアップの日付の選択&lt;/code&gt;では要件に応じてバックアップを選択し&lt;code&gt;次へ&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-50.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;回復の種類の選択&lt;/code&gt;では&lt;code&gt;システム状態&lt;/code&gt;を選択し&lt;code&gt;次へ&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-51.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;システム状態の回復先の場所を選択&lt;/code&gt;では&lt;code&gt;元の場所&lt;/code&gt;を選択し&lt;code&gt;Active Directory ファイルの Authoritative Restore を実行する&lt;/code&gt;にもチェックを入れて&lt;code&gt;次へ&lt;/code&gt;をクリックします。今回のシナリオでは、この時点で他にドメインコントローラーが存在しないため、バックアップを正とします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-52.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;警告が出てきますが、&lt;code&gt;OK&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-53.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;確認&lt;/code&gt;では次のように指定されていることを確認し&lt;code&gt;回復&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;回復項目: システム状態&lt;/li&gt;
&lt;li&gt;回復先: 元の場所&lt;/li&gt;
&lt;li&gt;回復オプション: Authoritative Restore&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-54.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;警告が出てきますが、&lt;code&gt;はい&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-55.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;回復が終わるまで待ちます。スペックにもよると思いますが、&lt;code&gt;t3a.small&lt;/code&gt;では、ディレクトリのオブジェクトが初期状態でも30分～40分程度かかりました。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-56.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;終了すると再起動を促すダイアログが出てくるので&lt;code&gt;再起動&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-57.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;再起動完了後、&lt;code&gt;Administrator&lt;/code&gt;かつ&lt;code&gt;ドメインコントローラー昇格時に指定したディレクトリサービス復元モードのパスワード&lt;/code&gt;でログインすると、次のように回復が正常完了した旨のコマンドプロンプトが出てきます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-58.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;このままだと、延々とディレクトリサービス復元モードで起動してしまうようになってしまうので、解除します。&lt;code&gt;ファイル名を指定して実行&lt;/code&gt;に&lt;code&gt;msconfig&lt;/code&gt;と入力して&lt;code&gt;システム構成&lt;/code&gt;を起動します。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-59.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ブート&lt;/code&gt;タブの&lt;code&gt;セーフ ブート&lt;/code&gt;のチェックを外して&lt;code&gt;OK&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-60.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;ダイアログが出てくるので&lt;code&gt;再起動&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-61.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;再起動完了後、今度はドメインユーザでログインします。正常に回復できていればログインできます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-62.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;以上で取り急ぎ1台目のドメインコントローラーのリストアはできました。一応サービスは再開可能な段階です。&lt;/p&gt;
&lt;h2 id=&quot;備考&quot;&gt;備考&lt;/h2&gt;
&lt;h3 id=&quot;後続作業&quot;&gt;後続作業&lt;/h3&gt;
&lt;p&gt;冒頭にも記載しましたが、この後、複数のドメインコントローラーでの冗長構成を復活させるためには、次のような作業が必要になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;他ドメインコントローラーの強制降格を行う&lt;/li&gt;
&lt;li&gt;他ドメインコントローラーのメタデータを削除する&lt;/li&gt;
&lt;li&gt;他ドメインコントローラーの再昇格を行う&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こちらにつきましては、&lt;a rel=&quot;external&quot; href=&quot;https://social.technet.microsoft.com/Forums/ja-JP/63e43e4e-6c22-4d51-9d53-cc495d055a4c/12489125131245212531?forum=Wcsupportja&quot;&gt;ドメイン コントローラー降格手順 (Windows Server 2012) RRS feed&lt;/a&gt;に公開情報がありますため、そちらをご参考に実施いただければと存じます。&lt;/p&gt;
&lt;h3 id=&quot;その他の方法&quot;&gt;その他の方法&lt;/h3&gt;
&lt;p&gt;今回は非常に回りくどいリストア手順となりました。未確認ですが、FSMOの役割を持っているドメインコントローラーを停止できるのであれば、停止して一貫性のあるAMIイメージを取得するのも手段としてあり得るものと思います。また、VSSに対応したスナップショットを利用するのも手段として考えられるかもしれません。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参考
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://aws.amazon.com/jp/blogs/news/take-microsoft-vss-enabled-snapshots-using-amazon-ec2-systems-manager/&quot;&gt;Amazon EC2 Systems Manager による Microsoft VSS を使用したスナップショットサポート&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://docs.aws.amazon.com/ja_jp/aws-backup/latest/devguide/windows-backups.html&quot;&gt;VSS 対応 Windows バックアップの作成 - AWS Backup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;詰まった点&quot;&gt;詰まった点&lt;/h2&gt;
&lt;h3 id=&quot;ディレクトリサービス復元モードにしたら0xc000000eで起動しない&quot;&gt;ディレクトリサービス復元モードにしたら0xc000000eで起動しない&lt;/h3&gt;
&lt;p&gt;今回、Active DirectoryはWindows Server 2019を利用して検証を行っていたのですが、途中、ルートボリュームをディレクトリサービス復元モードにする際に利用する作業用インスタンスもWindows Server 2019を利用したところ、次のようなエラーでEC2が起動できなくなってしまいました。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;状態: 0xc000000e&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;情報: 要求されたデバイスが接続されていないか、デバイスにアクセスできません。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/ad-on-ec2-backup-restore/ad-on-ec2-backup-restore-63.png&quot; alt=&quot;ADバックアップ・リストア&quot; /&gt;&lt;/p&gt;
&lt;p&gt;フォーラムレベルの情報ですが、どうやら、同じOSバージョンだとこの事象に陥ることがあるようです。試しに別のOSバージョンであるWindows Server 2016を利用したところ、上手くいくようになりました。今回、別バージョンのOSを利用するようにお勧めさせていただいた理由です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参考
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://forums.aws.amazon.com/thread.jspa?threadID=115993&quot;&gt;AWS Developer Forums: Windows Instance won&#39;t boot after EBS Re-attach&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
      </item>
      <item>
          <title>RDS for PostgreSQLにユーザを移行する際の権限エラーについて</title>
          <pubDate>Mon, 24 Feb 2020 00:00:00 +0000</pubDate>
          <author>wannabe</author>
          <link>https://wannabe-data-engineer.net/user-migration-to-rds-for-postgresql/</link>
          <guid>https://wannabe-data-engineer.net/user-migration-to-rds-for-postgresql/</guid>
          <description xml:base="https://wannabe-data-engineer.net/user-migration-to-rds-for-postgresql/">&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/user-migration-to-rds-for-postgresql/eyechatch.png&quot; alt=&quot;RDS for PostgreSQLにユーザを移行する際の権限エラーについて&quot; /&gt;&lt;/p&gt;
&lt;p&gt;本記事では、オンプレミス、または、EC2にインストールされているPostgreSQLからRDS for PostgreSQLにユーザを移行する際に発生するエラーについて記載します。この権限エラーは、移行元のPostgreSQLに存在するユーザの設定次第で発生し、そのままだと移行することができません。&lt;/p&gt;
&lt;h2 id=&quot;ユーザ移行時に発生する権限エラー&quot;&gt;ユーザ移行時に発生する権限エラー&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;pg_dumpall&lt;/code&gt;等を用いてユーザを移行するためのSQL文を発行し、それをそのままRDSで実行すると、次のような権限エラーが発生することがあります。本記事では、このエラーに対応するのが目的です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ユーザ移行時の権限エラー例&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;log&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-2&quot;&gt;ERROR&lt;/span&gt;&lt;span&gt;:  must be superuser to alter superusers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-2&quot;&gt;ERROR&lt;/span&gt;&lt;span&gt;:  must be superuser to alter replication users&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ご参考までに、今回検証に利用したユーザの情報を記載致します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;test_superuser{Superuser}&lt;/li&gt;
&lt;li&gt;test_repuser{Replication}&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;参考:検証用ユーザ&lt;/strong&gt;(移行元)&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; create&lt;/span&gt;&lt;span&gt; user test_superuser &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;with&lt;/span&gt;&lt;span&gt; superuser &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;password&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;CREATE ROLE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; create&lt;/span&gt;&lt;span&gt; user test_repuser &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;with&lt;/span&gt;&lt;span&gt; replication &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;password&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;CREATE ROLE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span&gt;# \du&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                List of roles&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;   Role name&lt;/span&gt;&lt;span&gt;    |                   Attributes                   | Member of&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;----------------+------------------------------------------------+-----------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; postgres       | Superuser, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Create role&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Create&lt;/span&gt;&lt;span&gt; DB, Replication | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; test_repuser   |                                     | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; test_superuser | Superuser                                      | {}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;参考:移行用SQL文例&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span&gt;bash&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;4&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;2&lt;/span&gt;&lt;span&gt;$ pg_dumpall &lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;--roles-only&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-- PostgreSQL database cluster dump&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SET&lt;/span&gt;&lt;span&gt; default_transaction_read_only &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;= off&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SET&lt;/span&gt;&lt;span&gt; client_encoding &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;UTF8&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;SET&lt;/span&gt;&lt;span&gt; standard_conforming_strings &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;= on&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-- Roles&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;CREATE ROLE&lt;/span&gt;&lt;span&gt; postgres;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;ALTER ROLE&lt;/span&gt;&lt;span&gt; postgres &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;WITH&lt;/span&gt;&lt;span&gt; SUPERUSER INHERIT CREATEROLE CREATEDB &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;LOGIN&lt;/span&gt;&lt;span&gt; REPLICATION;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;CREATE ROLE&lt;/span&gt;&lt;span&gt; test_repuser;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;ALTER ROLE&lt;/span&gt;&lt;span&gt; test_repuser &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;WITH&lt;/span&gt;&lt;span&gt; NOSUPERUSER INHERIT NOCREATEROLE NOCREATEDB &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;LOGIN&lt;/span&gt;&lt;span&gt; REPLICATION &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;PASSWORD&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;md56063c92b21c1aa4fc63a8dd9dde8a617&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;CREATE ROLE&lt;/span&gt;&lt;span&gt; test_superuser;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;ALTER ROLE&lt;/span&gt;&lt;span&gt; test_superuser &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;WITH&lt;/span&gt;&lt;span&gt; SUPERUSER INHERIT NOCREATEROLE NOCREATEDB &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;LOGIN&lt;/span&gt;&lt;span&gt; NOREPLICATION &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;PASSWORD&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;md52a52fb0807d3bfdc833db8158def1d4a&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;-- PostgreSQL database cluster dump complete&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;--&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;ユーザ移行時の権限エラー対策&quot;&gt;ユーザ移行時の権限エラー対策&lt;/h2&gt;
&lt;p&gt;次の対応を行うことでユーザを移行することができます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;移行不可の権限を外す
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SUPERUSER&lt;/code&gt;の権限を外す&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NOSUPERUSER&lt;/code&gt;の権限を外す&lt;/li&gt;
&lt;li&gt;&lt;code&gt;REPLICATION&lt;/code&gt;の権限を外す&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NOREPLICATION&lt;/code&gt;の権限を外す&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;代替ロールを付与する
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SUPERUSER&lt;/code&gt;の権限を&lt;code&gt;rds_superuser&lt;/code&gt;ロールに置き換える&lt;/li&gt;
&lt;li&gt;&lt;code&gt;REPLICATION&lt;/code&gt;の権限を&lt;code&gt;rds_replication&lt;/code&gt;ロールに置き換える&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;移行不可の権限を外す&quot;&gt;移行不可の権限を外す&lt;/h3&gt;
&lt;p&gt;上述の通り、次の権限についてはSQL文に記載することができません。記載した場合、上述のエラーが発生します。したがって、ユーザの移行時には必ずSQL文から削除する必要があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SUPERUSER&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NOSUPERUSER&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;REPLICATION&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NOREPLICATION&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;例:変更前のユーザ変更文&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;ALTER ROLE&lt;/span&gt;&lt;span&gt; test_repuser &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;WITH&lt;/span&gt;&lt;span&gt; NOSUPERUSER INHERIT NOCREATEROLE NOCREATEDB &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;LOGIN&lt;/span&gt;&lt;span&gt; REPLICATION &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;PASSWORD&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;md56063c92b21c1aa4fc63a8dd9dde8a617&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;ALTER ROLE&lt;/span&gt;&lt;span&gt; test_superuser &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;WITH&lt;/span&gt;&lt;span&gt; SUPERUSER INHERIT NOCREATEROLE NOCREATEDB &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;LOGIN&lt;/span&gt;&lt;span&gt; NOREPLICATION &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;PASSWORD&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;md52a52fb0807d3bfdc833db8158def1d4a&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;例:変更後のユーザ変更文&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;ALTER ROLE&lt;/span&gt;&lt;span&gt; test_repuser &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;WITH&lt;/span&gt;&lt;span&gt; INHERIT NOCREATEROLE NOCREATEDB &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;LOGIN PASSWORD&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;md56063c92b21c1aa4fc63a8dd9dde8a617&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;ALTER ROLE&lt;/span&gt;&lt;span&gt; test_superuser &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;WITH&lt;/span&gt;&lt;span&gt; INHERIT NOCREATEROLE NOCREATEDB &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;LOGIN PASSWORD&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;md52a52fb0807d3bfdc833db8158def1d4a&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;なお、&lt;code&gt;SUPERUSER&lt;/code&gt;および&lt;code&gt;REPLICATION&lt;/code&gt;だけでなく、それらを打ち消す&lt;code&gt;NOSUPERUSER&lt;/code&gt;および&lt;code&gt;NOREPLICATION&lt;/code&gt;もSQL文に含めることができない点に注意する必要があります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例:NO系のオプション指定エラー&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; alter role&lt;/span&gt;&lt;span&gt; foobarbaz &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;with&lt;/span&gt;&lt;span&gt; noreplication;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ERROR:  must be superuser &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;to alter&lt;/span&gt;&lt;span&gt; replication users&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; alter role&lt;/span&gt;&lt;span&gt; foobarbaz &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;with&lt;/span&gt;&lt;span&gt; nosuperuser;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ERROR:  must be superuser &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;to alter&lt;/span&gt;&lt;span&gt; superusers&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ここまで実施すれば、該当のユーザを利用してRDSに接続する部分までは進むことができます。しかしながら、次の記載通り、作成したユーザは特別な権限を持っていません。次のステップで代替となるロールを付与する必要があります。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; \du&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                                               List of roles&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;         Role name&lt;/span&gt;&lt;span&gt;         |                   Attributes                   |                          Member of&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;---------------------------+------------------------------------------------+----------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;----&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; foobarbaz                 | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_execute_server_program | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_monitor                | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {pg_read_all_settings,pg_read_all_stats,pg_stat_scan_tabl&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;es}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_read_all_settings      | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_read_all_stats         | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_read_server_files      | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_signal_backend         | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_stat_scan_tables       | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_write_server_files     | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; postgres                  | &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Create role&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Create&lt;/span&gt;&lt;span&gt; DB                        &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;+&lt;/span&gt;&lt;span&gt;| {rds_superuser}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                           | &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Password&lt;/span&gt;&lt;span&gt; valid until infinity                  |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; rds_ad                    | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; rds_iam                   | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; rds_password              | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; rds_replication           | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; rds_superuser             | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {pg_monitor,pg_signal_backend,rds_replication,rds_passwor&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;d}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; rdsadmin                  | Superuser, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Create role&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Create&lt;/span&gt;&lt;span&gt; DB, Replication&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;+&lt;/span&gt;&lt;span&gt;| {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                           | &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Password&lt;/span&gt;&lt;span&gt; valid until infinity                  |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; rdsrepladmin              | &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;No&lt;/span&gt;&lt;span&gt; inheritance, Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;, Replication      | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; test_repuser              |                                                | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; test_superuser            |                                                | {}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;代替ロールを付与する&quot;&gt;代替ロールを付与する&lt;/h3&gt;
&lt;p&gt;そもそもRDSでは機能が制限されており、本来の意味での&lt;code&gt;SUPERUSER&lt;/code&gt;を利用することができないため、完全な代替とはなり得ませんが、RDSが用意しているロールを付与することで、ある程度は代替することが可能です。&lt;/p&gt;
&lt;p&gt;なお、執筆時点でRDSはストリーミングレプリケーションに対応していませんので、レプリケーショ用の代替ロールと言っても、ロジカルレプリケーションとなる点にも注意が必要です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SUPERUSER&lt;/code&gt; -&amp;gt; &lt;code&gt;rds_superuser&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;REPLICATION&lt;/code&gt; -&amp;gt; &lt;code&gt;rds_replication&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;例:代替ロールの付与&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; grant&lt;/span&gt;&lt;span&gt; rds_superuser &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;to&lt;/span&gt;&lt;span&gt; test_superuser;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;GRANT ROLE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt; grant&lt;/span&gt;&lt;span&gt; rds_replication &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;to&lt;/span&gt;&lt;span&gt; test_repuser;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;GRANT ROLE&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上記でRDSの用意するロールのメンバーとなることができました。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; \du&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                                               List of roles&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;         Role name&lt;/span&gt;&lt;span&gt;         |                   Attributes                   |                          Member of&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;---------------------------+------------------------------------------------+----------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;----&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; foobarbaz                 | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_execute_server_program | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_monitor                | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {pg_read_all_settings,pg_read_all_stats,pg_stat_scan_tabl&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;es}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_read_all_settings      | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_read_all_stats         | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_read_server_files      | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_signal_backend         | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_stat_scan_tables       | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; pg_write_server_files     | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; postgres                  | &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Create role&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Create&lt;/span&gt;&lt;span&gt; DB                        &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;+&lt;/span&gt;&lt;span&gt;| {rds_superuser}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                           | &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Password&lt;/span&gt;&lt;span&gt; valid until infinity                  |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; rds_ad                    | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; rds_iam                   | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; rds_password              | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; rds_replication           | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; rds_superuser             | Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;                                   | {pg_monitor,pg_signal_backend,rds_replication,rds_passwor&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;d}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; rdsadmin                  | Superuser, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Create role&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Create&lt;/span&gt;&lt;span&gt; DB, Replication&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;+&lt;/span&gt;&lt;span&gt;| {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                           | &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;Password&lt;/span&gt;&lt;span&gt; valid until infinity                  |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; rdsrepladmin              | &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;No&lt;/span&gt;&lt;span&gt; inheritance, Cannot &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;login&lt;/span&gt;&lt;span&gt;, Replication      | {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; test_repuser              |                                                | {rds_replication}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; test_superuser            |                                                | {rds_superuser}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上の対応を行うことで、RDSの制限上完全に一致とはいきませんが、RDSの制限に即した形でユーザを移行することができました。&lt;/p&gt;
&lt;h2 id=&quot;おまけ(SQL文書き換えコマンド例)&quot;&gt;おまけ(SQL文書き換えコマンド例)&lt;/h2&gt;
&lt;p&gt;おまけとして、&lt;code&gt;pg_dumpall&lt;/code&gt;で出力したユーザ移行用のSQL文を書き換えるコマンド例を記載致します。数ユーザ程度だったら手動対応も良いのですが、ユーザ数が増えると厳しい面もありますからね。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ユーザ移行SQL文書き換えコマンド例&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# 環境変数&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;incompatible_users_list&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;そのままだと移行できないユーザのリスト&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-6&quot;&gt;任意の場所&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# 対象ユーザ洗い出し&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;users_sql&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;pg_dumpallで出力したユーザ移行SQLファイル&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;super_users_list&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;SUPERUSERのユーザリスト&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-6&quot;&gt;任意の場所&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;grep&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;quot;^ALTER ROLE .* SUPERUSER &amp;quot; &amp;quot;${&lt;/span&gt;&lt;span&gt;users_sql&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;}&amp;quot;&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-6&quot;&gt; awk&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; -F&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;quot; &amp;quot; &amp;#39;{print $3}&amp;#39;&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-6&quot;&gt; tee&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;quot;${&lt;/span&gt;&lt;span&gt;super_users_list&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;}&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;replication_users_list&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;=&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;REPLICATIONのユーザリスト&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-6&quot;&gt;任意の場所&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;grep&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;quot;^ALTER ROLE .* REPLICATION &amp;quot; &amp;quot;${&lt;/span&gt;&lt;span&gt;users_sql&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;}&amp;quot;&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-6&quot;&gt; awk&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; -F&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;quot; &amp;quot; &amp;#39;{print $3}&amp;#39;&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-6&quot;&gt; tee&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;quot;${&lt;/span&gt;&lt;span&gt;replication_users_list&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;}&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# 非対応部分の削除&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;cp&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; -p&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;quot;${&lt;/span&gt;&lt;span&gt;users_sql&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;}&amp;quot; &amp;quot;${&lt;/span&gt;&lt;span&gt;users_sql&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;}.bk&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;sed&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; -i -e&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;s/NOSUPERUSER//g&amp;#39;&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;      -e&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;s/SUPERUSER//g&amp;#39;&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;      -e&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;s/NOREPLICATION//g&amp;#39;&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;      -e&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;#39;s/REPLICATION//g&amp;#39;&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;      &amp;quot;${&lt;/span&gt;&lt;span&gt;users_sql&lt;/span&gt;&lt;span class=&quot;z-6&quot;&gt;}&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-5&quot;&gt;# 代替ロール付与文の追加&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;cat&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;#39;_description_&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-6&quot;&gt;&amp;quot;${&lt;/span&gt;&lt;span&gt;users_sql&lt;/span&gt;&lt;span class=&quot;z-6&quot;&gt;}&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-2&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-2&quot;&gt;--- Grant RDS role to users&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-2&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-2&quot;&gt;_description_&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; read&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; superuser&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  echo&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;quot;grant rds_superuser to ${&lt;/span&gt;&lt;span&gt;superuser&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;};&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;done &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;${&lt;/span&gt;&lt;span&gt;super_users_list&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;}&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;${&lt;/span&gt;&lt;span&gt;users_sql&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;}&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; read&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; replication&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;  echo&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; &amp;quot;grant rds_replication to ${&lt;/span&gt;&lt;span&gt;replication&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;};&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8&quot;&gt;done &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;${&lt;/span&gt;&lt;span&gt;replication_users_list&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;}&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;&amp;quot;${&lt;/span&gt;&lt;span&gt;users_sql&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;}&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;最後に&quot;&gt;最後に&lt;/h2&gt;
&lt;p&gt;今回は、記事内でも触れましたが、&lt;code&gt;SUPERUSER&lt;/code&gt;および&lt;code&gt;REPLICATION&lt;/code&gt;だけでなく、それらを打ち消す&lt;code&gt;NOSUPERUSER&lt;/code&gt;および&lt;code&gt;NOREPLICATION&lt;/code&gt;も記載できないという部分で少しだけ詰まったため、記事にしました。&lt;/p&gt;
&lt;p&gt;「打ち消す指定なら良いのでは？」とも一瞬思いましたが、おそらく、RDSに最初から存在している&lt;code&gt;rdsadmin&lt;/code&gt;や&lt;code&gt;rdsrepladmin&lt;/code&gt;の権限を剥奪されると内部的に影響が出かねないため、このような制限をしているのだと思います。&lt;/p&gt;
&lt;p&gt;RDSは非常に便利なサービスではありますが、通常のサーバにインストールしたデータベースとは挙動が異なる点もありますので、また、何か詰まった点等があれば、記事にしていきたいと思います。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>VPCピアリングで別VPCのRDSにプライベートで接続する</title>
          <pubDate>Tue, 11 Feb 2020 00:00:00 +0000</pubDate>
          <author>wannabe</author>
          <link>https://wannabe-data-engineer.net/rds-private-access-via-vpc-peering/</link>
          <guid>https://wannabe-data-engineer.net/rds-private-access-via-vpc-peering/</guid>
          <description xml:base="https://wannabe-data-engineer.net/rds-private-access-via-vpc-peering/">&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/rds-private-access-via-vpc-peering/eyechatch.png&quot; alt=&quot;VPCピアリングで別VPCのRDSにプライベートで接続する&quot; /&gt;&lt;/p&gt;
&lt;p&gt;本記事では、VPCピアリングで別VPCのRDSにプライベートで接続する方法を記載します。単純にVPCピアリングを設定するだけで良さそうに見えますが、パブリックアクセシビリティが有効になっている場合、少し詰まった点があったため、記録しておきます。&lt;/p&gt;
&lt;h2 id=&quot;そもそもVPCピアリングとは&quot;&gt;そもそもVPCピアリングとは&lt;/h2&gt;
&lt;p&gt;VPCピアリングとは、2つのVPC(別アカウント/別リージョンも可)を接続することで、別VPCのリソースに対してもプライベート接続可能なようにする機能のことです。VPC間でインターネットを経由した通信を行いたくない(行えない)場合、この機能の利用が最有力候補となります。&lt;/p&gt;
&lt;p&gt;ただし、VPCピアリングの作成条件には制限もあるため、事前に確認する必要があります。特に、VPCのCIDRが重複する場合には作成できないというのが、最も大きな制限事項です。&lt;/p&gt;
&lt;p&gt;詳しくは、以下をご確認ください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-peering.html&quot;&gt;VPC ピアリング接続&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://docs.aws.amazon.com/ja_jp/vpc/latest/peering/vpc-peering-basics.html#vpc-peering-limitations&quot;&gt;VPC ピア機能の制限事項&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;検証環境の構成&quot;&gt;検証環境の構成&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/rds-private-access-via-vpc-peering/rds-private-access-via-vpc-peering-test.png&quot; alt=&quot;VPCピアリングで別VPCのRDSにプライベートで接続する&quot; /&gt;&lt;/p&gt;
&lt;p&gt;2つのCIDRが異なるVPCをVPCピアリングを使って接続しています。VPCにはパブリックサブネットを作成し、接続元のEC2と接続先のRDSを配置する構成です。EC2もRDSもパブリックIPを持っています。&lt;/p&gt;
&lt;p&gt;この場合、何もしなければ、EC2からRDSに対する接続はインターネットを経由して行われます。RDSのパブリックアクセシビリティが有効になっているため、エンドポイント名がパブリックIPアドレスに解決されるためです。&lt;/p&gt;
&lt;p&gt;ただし、VPCエンドポイントを導入することで、パブリックアクセシビリティが有効になっているRDSのエンドポイントをプライベートIPアドレスに解決することができるため、プライベートでの接続が可能になります。&lt;/p&gt;
&lt;h2 id=&quot;検証環境の構築&quot;&gt;検証環境の構築&lt;/h2&gt;
&lt;h3 id=&quot;VPCの設定&quot;&gt;VPCの設定&lt;/h3&gt;
&lt;p&gt;冒頭で「パブリックアクセシビリティが有効になっている場合、少し詰まった点があった」と記載しましたが、それがここです。この設定を忘れてしまうと、パブリックアクセシビリティが有効になっているRDSのエンドポイント名をプライベートIPに解決することができません。&lt;/p&gt;
&lt;p&gt;その設定とは何かと言いますと、VPCの&lt;code&gt;DNS 解決&lt;/code&gt;および&lt;code&gt;DNS ホスト名&lt;/code&gt;を有効にするという点です。また、この設定は、VPCピアリングを行う両方のVPCで行う必要がある点に注意が必要です。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/rds-private-access-via-vpc-peering/vpc-default-settings.png&quot; alt=&quot;VPCピアリングで別VPCのRDSにプライベートで接続する&quot; /&gt;&lt;/p&gt;
&lt;p&gt;上図の通り、執筆時点では、VPCのデフォルト設定値として、次のような値が利用されています。デフォルトから変更しない場合は&lt;code&gt;DNS ホスト名&lt;/code&gt;が&lt;code&gt;無効&lt;/code&gt;となっているのです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DNS 解決
&lt;ul&gt;
&lt;li&gt;有効&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DNS ホスト名
&lt;ul&gt;
&lt;li&gt;無効&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このままだと、別VPCのRDSのエンドポイントをプライベートIPアドレスに解決することができないため、&lt;code&gt;DNS ホスト名&lt;/code&gt;をデフォルト値から変更していきます。まずは、該当のVPCを選択し、&lt;code&gt;アクション　＞　DNS ホスト名の編集&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/rds-private-access-via-vpc-peering/vpc-enable-dns-hostname-01.png&quot; alt=&quot;VPCピアリングで別VPCのRDSにプライベートで接続する&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;DNS ホスト名&lt;/code&gt;の&lt;code&gt;有効化&lt;/code&gt;にチェックを付け、&lt;code&gt;保存&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/rds-private-access-via-vpc-peering/vpc-enable-dns-hostname-02.png&quot; alt=&quot;VPCピアリングで別VPCのRDSにプライベートで接続する&quot; /&gt;&lt;/p&gt;
&lt;p&gt;該当のVPCについて、&lt;code&gt;DNS ホスト名&lt;/code&gt;が&lt;code&gt;有効&lt;/code&gt;となっていることを確認します。もし、&lt;code&gt;DNS 解決&lt;/code&gt;が&lt;code&gt;無効&lt;/code&gt;になっている場合は、同じようにして&lt;code&gt;アクション　＞　DNS 解決の編集&lt;/code&gt;から設定することができます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/rds-private-access-via-vpc-peering/vpc-enable-dns-hostname-03.png&quot; alt=&quot;VPCピアリングで別VPCのRDSにプライベートで接続する&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;VPCピアリングの作成&quot;&gt;VPCピアリングの作成&lt;/h3&gt;
&lt;h4 id=&quot;VPCピアリング接続の作成&quot;&gt;VPCピアリング接続の作成&lt;/h4&gt;
&lt;p&gt;ダッシュボードから&lt;code&gt;ピアリング接続&lt;/code&gt;を選択し、&lt;code&gt;ピアリング接続の作成&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/rds-private-access-via-vpc-peering/create-vpc-peering-01.png&quot; alt=&quot;VPCピアリングで別VPCのRDSにプライベートで接続する&quot; /&gt;&lt;/p&gt;
&lt;p&gt;ここでは、次のように設定しています。重要なのは、 &lt;code&gt;VPC (リクエスタ)&lt;/code&gt;には接続元を、&lt;code&gt;VPC (アクセプタ)&lt;/code&gt;には接続先を指定する点です。 今回の構成だと、&lt;code&gt;VPC (リクエスタ)&lt;/code&gt;を&lt;code&gt;VPC-A&lt;/code&gt;に、&lt;code&gt;VPC (アクセプタ)&lt;/code&gt;を&lt;code&gt;VPC-B&lt;/code&gt;にします。指定後、&lt;code&gt;ピアリング接続の作成&lt;/code&gt;をクリックします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ピアリング接続ネームタグ
&lt;ul&gt;
&lt;li&gt;test-peering&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;VPC (リクエスタ)
&lt;ul&gt;
&lt;li&gt;VPC-A&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;アカウント
&lt;ul&gt;
&lt;li&gt;自分のアカウント&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;リージョン
&lt;ul&gt;
&lt;li&gt;このリージョン (ap-northeast-1)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;VPC (アクセプタ)
&lt;ul&gt;
&lt;li&gt;VPC-B&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/rds-private-access-via-vpc-peering/create-vpc-peering-02.png&quot; alt=&quot;VPCピアリングで別VPCのRDSにプライベートで接続する&quot; /&gt;&lt;/p&gt;
&lt;h4 id=&quot;VPCピアリングの承諾&quot;&gt;VPCピアリングの承諾&lt;/h4&gt;
&lt;p&gt;上記で作成したVPCピアリング接続ですが、承認作業を経ていないため、&lt;code&gt;承諾の保留中&lt;/code&gt;となり利用することができません。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/rds-private-access-via-vpc-peering/create-vpc-peering-03.png&quot; alt=&quot;VPCピアリングで別VPCのRDSにプライベートで接続する&quot; /&gt;&lt;/p&gt;
&lt;p&gt;該当のVPCピアリングを選択し、&lt;code&gt;アクション　＞　リクエストの承諾&lt;/code&gt;をクリックすることで、このVPCピアリングが&lt;code&gt;アクティブ&lt;/code&gt;となります。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/rds-private-access-via-vpc-peering/create-vpc-peering-04.png&quot; alt=&quot;VPCピアリングで別VPCのRDSにプライベートで接続する&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/rds-private-access-via-vpc-peering/create-vpc-peering-06.png&quot; alt=&quot;VPCピアリングで別VPCのRDSにプライベートで接続する&quot; /&gt;&lt;/p&gt;
&lt;h4 id=&quot;VPCピアリングのDNS設定&quot;&gt;VPCピアリングのDNS設定&lt;/h4&gt;
&lt;p&gt;VPCだけでなく、VPCピアリング自体でもDNSにまつわる設定を行う必要があります。デフォルトだと&lt;code&gt;リクエスタ VPC からプライベート IP への DNS 解決&lt;/code&gt;が&lt;code&gt;無効&lt;/code&gt;となっているためです。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/rds-private-access-via-vpc-peering/create-vpc-peering-07.png&quot; alt=&quot;VPCピアリングで別VPCのRDSにプライベートで接続する&quot; /&gt;&lt;/p&gt;
&lt;p&gt;設定の変更のために、&lt;code&gt;アクション　＞　DNS 設定の編集&lt;/code&gt;から&lt;code&gt;アクセプタ DNS 解決&lt;/code&gt;にチェックを入れて&lt;code&gt;保存&lt;/code&gt;します。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/rds-private-access-via-vpc-peering/create-vpc-peering-08.png&quot; alt=&quot;VPCピアリングで別VPCのRDSにプライベートで接続する&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/rds-private-access-via-vpc-peering/create-vpc-peering-09.png&quot; alt=&quot;VPCピアリングで別VPCのRDSにプライベートで接続する&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;ルートテーブルの編集&quot;&gt;ルートテーブルの編集&lt;/h3&gt;
&lt;p&gt;続いて、VPCピアリングを利用したいサブネットのルートテーブルを&lt;code&gt;アクション　＞　ルートの編集&lt;/code&gt;から編集します。接続元と先の両方で編集します。今回の構成で言うと、&lt;code&gt;PublicSubnetA&lt;/code&gt;および&lt;code&gt;PublicSubnetB&lt;/code&gt;サブネットが利用している両方のルートテーブルを編集します。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/rds-private-access-via-vpc-peering/create-vpc-peering-10.png&quot; alt=&quot;VPCピアリングで別VPCのRDSにプライベートで接続する&quot; /&gt;&lt;/p&gt;
&lt;p&gt;それぞれのルートテーブルでは、通信先、つまり、VPCピアリング先のIPアドレスをVPCピアリングに向けるようなルートを追加します。今回はピアリング先のCIDR単位で指定します。片方だけの設定ですと、戻りの通信が迷子になりますので、両方指定する必要があります。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/rds-private-access-via-vpc-peering/create-vpc-peering-11.png&quot; alt=&quot;VPCピアリングで別VPCのRDSにプライベートで接続する&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://wannabe-data-engineer.net/rds-private-access-via-vpc-peering/create-vpc-peering-12.png&quot; alt=&quot;VPCピアリングで別VPCのRDSにプライベートで接続する&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;名前解決の確認&quot;&gt;名前解決の確認&lt;/h3&gt;
&lt;p&gt;最後に、名前解決の確認を行います。VPCピアリング元から、VPCピアリング先のRDSのエンドポイントを解決してみます。無事にプライベートIPアドレスに解決できたことを確認できました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;プライベートIPアドレスへの解決&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[ec2-user@ip-10-10-0-104 &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;~&lt;/span&gt;&lt;span&gt;]$ nslookup testdb.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Server:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;         10.10.0.2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Address:&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;        10.10.0.2#53&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Non-authoritative&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; answer:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;testdb.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;    canonical name = ec2-18-176-xx-xx.ap-northeast-1.compute.amazonaws.com.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Name:&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;   ec2-18-176-xx-xx.ap-northeast-1.compute.amazonaws.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Address:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; 10.20.0.218&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;また、RDSへの接続時にも、きちんとプライベートIPアドレスを利用していることが確認できます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RDSへの接続&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[ec2-user@ip-10-10-0-104 &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;~&lt;/span&gt;&lt;span&gt;]$ netstat -an&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Active&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; Internet connections&lt;/span&gt;&lt;span&gt; (servers&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; and established&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Proto&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; Recv-Q Send-Q Local Address           Foreign Address         State&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;tcp&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;        0      0&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; 0.0.0.0:111             0.0.0.0:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;               LISTEN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;tcp&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;        0      0&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; 0.0.0.0:22              0.0.0.0:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;               LISTEN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;tcp&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;        0      0&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; 127.0.0.1:25            0.0.0.0:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;               LISTEN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;tcp&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;        0      0&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; 10.10.0.104:44472       10.20.0.218:5432        TIME_WAIT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;tcp&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;        0    252&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; 10.10.0.104:22          xx.xx.xx.xx:65333       ESTABLISHED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;tcp&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;        0      0&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; 10.10.0.104:44476       10.20.0.218:5432        ESTABLISHED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;tcp&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;        0      0&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; 10.10.0.104:22          xx.xx.xx.xx:65288       ESTABLISHED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;tcp6&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;       0      0&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; :::111                  :::&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;                    LISTEN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;tcp6&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;       0      0&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; :::22                   :::&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;                    LISTEN&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ちなみに、VPCの&lt;code&gt;DNS ホスト名&lt;/code&gt;を&lt;code&gt;無効&lt;/code&gt;にした状態だと、次のように、グローバルIPアドレスがエンドポイントから解決されます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;パブリックIPアドレスへの接続&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[ec2-user@ip-10-10-0-104 &lt;/span&gt;&lt;span class=&quot;z-8&quot;&gt;~&lt;/span&gt;&lt;span&gt;]$ nslookup testdb.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Server:&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;         10.10.0.2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Address:&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;        10.10.0.2#53&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Non-authoritative&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; answer:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;testdb.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;    canonical name = ec2-18-176-xx-xx.ap-northeast-1.compute.amazonaws.com.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Name:&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt;   ec2-18-176-xx-xx.ap-northeast-1.compute.amazonaws.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-6&quot;&gt;Address:&lt;/span&gt;&lt;span class=&quot;z-2&quot;&gt; 18.176.xx.xx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;最後に&quot;&gt;最後に&lt;/h2&gt;
&lt;p&gt;VPCピアリングでパブリックアクセシビリティが有効になっているRDSに対してプライベートIPアドレスで接続するためには、接続元先のVPC自体で&lt;code&gt;DNS 解決&lt;/code&gt;および&lt;code&gt;DNS ホスト名&lt;/code&gt;を有効にする必要があるという記事でした。&lt;/p&gt;
&lt;p&gt;そもそも、RDSをパブリックサブネットに配置するパターンは多くないかもしれませんが、そのような構成を取らざるを得ない時に、役に立つ構成かもしれません。&lt;/p&gt;
</description>
      </item>
    </channel>
</rss>
