🕐
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