🕐

PostgreSQLにpg_cron を導入する

に公開

はじめに

PostgreSQL に pg_cron を導入することで、SQL ベースでの定期実行(スケジューリング)が可能になります。
つまり、UNIX の cron のようなジョブスケジューラを、PostgreSQL の内部で直接扱えるようになります。

環境

  • OS:rockylinux:9
  • DB:PostgreSQL 15

前提

DB の場所

/var/lib/pgsql/[バージョン番号]/data が「PostgreSQL のデータベースクラスタ(≒ 物理データファイル)」が置かれる親ディレクトリです。

スーパーユーザーの確認方法

\du

ポート番号

5432

手順

事前準備

yum のインストール

dnf -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm

pg_cron のインストール

yum install pg_cron_15

設定ファイルの編集

対象ファイル

/var/lib/pgsql/15/data/postgresql.conf

下記を追記

  • shared_preload_libraries = 'pg_cron'
  • cron.database_name = 'mydb'

または下記を実行

echo "shared_preload_libraries = 'pg_cron'" >> /var/lib/pgsql/15/data/postgresql.conf
echo "cron.database_name = 'mydb'" >> /var/lib/pgsql/15/data/postgresql.conf

再起動する


事前準備~設定ファイルの編集まで Docker でやってしまう場合

dockerfile

FROM rockylinux:9

# PostgreSQL 15 YUMリポジトリ追加 & インストール
RUN dnf -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm && \
    dnf -qy module disable postgresql && \
    dnf -y install postgresql15-server postgresql15 pg_cron_15 && \
    dnf clean all

# データディレクトリ作成
RUN mkdir -p /var/lib/pgsql/15/data && chown -R postgres:postgres /var/lib/pgsql

USER postgres

# データベース初期化
RUN /usr/pgsql-15/bin/initdb -D /var/lib/pgsql/15/data && \
    echo "shared_preload_libraries = 'pg_cron'" >> /var/lib/pgsql/15/data/postgresql.conf && \
    echo "cron.database_name = 'mydb'" >> /var/lib/pgsql/15/data/postgresql.conf

# ここでロールとDBを作成する
RUN /usr/pgsql-15/bin/pg_ctl -D /var/lib/pgsql/15/data -o "-c listen_addresses=''" -w start && \
    /usr/pgsql-15/bin/psql -c "CREATE ROLE admin WITH LOGIN PASSWORD 'password';" && \
    /usr/pgsql-15/bin/psql -c "CREATE DATABASE mydb OWNER admin;" && \
    /usr/pgsql-15/bin/pg_ctl -D /var/lib/pgsql/15/data -m fast stop

EXPOSE 5432

# PostgreSQL起動コマンド
CMD ["/usr/pgsql-15/bin/postgres", "-D", "/var/lib/pgsql/15/data"]

docker-compose.yml

version: "3.8"

services:
  db:
    build: .
    container_name: pg_cron
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/pgsql/15/data
    restart: unless-stopped

volumes:
  pgdata:

コンテナを作成

docker compose up -d --build

スーパーユーザーで入りパスワードを入力する

docker exec -it pg_cron psql -U postgres -d mydb

拡張機能を有効にする

ここからは docker か否か共通です。

下記の SQL を実行

CREATE EXTENSION pg_cron;

Discussion