[PostgreSQL] pg_cron
pg_cron์ postgres ์์ฒด์์ ์ผ์ ๊ธฐ๋ฐ ์ค์ผ์ค๋ฌ๋ฅผ ๊ตฌํํ ์ ์๋ ๊ฐ๋ ฅํ ํ์ฅ ๋๊ตฌ๋ค.
์๋น์ค์ ๊ท๋ชจ๊ฐ ๋๋จํ๊ฒ ์๋๋ผ๋ฉด, ์ค์ผ์ค๋ฌ ์๋ฒ ๋์์ ๊ด๋ฆฌํฌ์ธํธ ๋๋ฆฌ๋ ๊ฒ๋ณด๋จ, ์ด๊ฒ ํจ์ฌ ๊ฐํธํ๊ณ ๋น์ฉ
ํจ์จ์ ์ผ ์ ์๋ค.
์ค์น
๊ด๋ฆฌํ PostgreSQL์ ์ด๋ค๋ฉด pg_cron์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์น๋์ด์๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. AWS์ GCP๋ฅผ ํฌํจํ ์๋น์์ ํด๋ผ์ฐ๋๋ค์ด ์ด ์ ๋๋ ๋ค ํด์ค๋ค.
๊ทธ๋ฐ ๊ฒฝ์ฐ์ ๋ค์ ์ ์ฐจ๋ฅผ ๋ค ์๋ตํ๊ณ CREATE Extension๋ง ํด๋ ๋๋ค.
์ผ๋ฐ์ ์ธ ๋ฆฌ๋ ์ค ํ๊ฒฝ์์๋ pg_cron ๋ชจ๋์ ์ค์นํ๊ณ , ์ค์ ๋ ์กฐ๊ธ์ ํด์ค์ผ ์ฌ์ฉํ ์ ์๋ค.
sudo apt-get -y install postgresql-16-cron
ํ์ฌ ์ฌ์ฉ์ค์ธ psql ๋ฒ์ ์ ๋ง๋ cron ๋ชจ๋์ ๋จผ์ ์ค์นํ๋ค.
psql ๋ฒ์ ์ด ๋๋ฌด ๋ฎ๋ค๋ฉด ์ค์นํ๊ธฐ ๋งค์ฐ ๋ถํธํ๊ฑฐ๋ ์ด๋ ค์ธ ์ ์๋ค.
ํจํค์ง ๋งค๋์ ์์ ๋ฒ์ ์ ๋ง๋๊ฑธ ์ง์ํ์ง ์๋๋ค๋ฉด, ์ง์ ๋ฐ์์ ๋น๋ํด์ผ ํ๋ค.
git clone https://github.com/citusdata/pg_cron.git
cd pg_cron
export PATH=/usr/pgsql-10/bin:$PATH
make && sudo PATH=$PATH make install
์ค์น๊ฐ ์ ๋์๋ค๋ฉด postgres ์ค์ ํ์ผ์ ์ฐพ์์ ์ด๊ณ

๋ค์ 2์ค์ ์ถ๊ฐํ ๋ค์
shared_preload_libraries = "pg_cron";
cron.database_name = "postgres";

๋ฆฌ์คํํธ๋ฅผ ๋๋ฆฌ๋ฉด ๋๋ค.
sudo systemctl restart postgresql

๊ทธ๋ฆฌ๊ณ psql์ ๋ค์ด๊ฐ์ ํ์ฅ์ ํ์ฑํํ๋ฉด ๊ธฐ๋ณธ ์ค์ ์ ๋์ด๋ค.
CREATE EXTENSION pg_cron;

๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
์ด๊ธฐํ๊ฐ ์ ๋์๋ค๋ฉด cron.job, cron.job_run_detail๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ํ ์ด๋ธ๋ค์ด ์์ฑ์ด ๋ ๊ฒ์ด๋ค.

ํ๋ฒ ํ ์ด๋ธ ํ๋ ๋ง๋ค๊ณ , ๊ฑฐ๊ธฐ์ 1๋ถ๋ง๋ค ๋ฐ์ดํฐ๋ฅผ ์ง์ด๋ฃ๋ cron์ ์ ์ํด๋ณด๊ฒ ๋ค.
create table cron_test (
id serial primary key,
time timestamp default now()
);
ํ
์ด๋ธ์ ๋์ถฉ ๋ง๋ค์๊ณ
SELECT cron.schedule(
'test_cron_job',
'* * * * *',
$$INSERT INTO cron_test (time) VALUES (now());$$
);
์ด๋ฐ ์์ผ๋ก ์ ์ํ๋ฉด ๋๋ค.
์ฒซ๋ฒ์งธ ์ธ์๊ฐ job ์ด๋ฆ, ๋๋ฒ์งธ ์ธ์๊ฐ cron์, ์ธ๋ฒ์งธ ์ธ์๊ฐ ์คํ๋ ์ฟผ๋ฆฌ๋ค.
๊ทธ๋ ๊ฒ ์์ฑํ๋ฉด job ๋ชฉ๋ก์ ํญ๋ชฉ์ด ์ถ๊ฐ๋๋ค.

๊ทธ๋ฆฌ๊ณ ์ข ๊ธฐ๋ค๋ฆฌ๋ฉด ์๋๋๋ก ์์ด๋๊ฑธ ๋ณผ ์ ์์ ๊ฒ์ด๋ค.
Connection Failed ๋ฌธ์
ํด๋ผ์ฐ๋๋ฅผ ์ฐ์ง ์๊ณ ์ง์ ๊ตฌ์ฑํ๋๋ฐ, ์ถ๊ฐ์ ์ธ ๋คํธ์ํฌ ์ค์ ์ ํ์ง ์์๋ค๋ฉด cron job๋ค์ด ์ค์ค์ด ์คํจํ๋ ๊ฒ์ ๋ณผ ํ๋ฅ ์ด ๋๋ค.
์ด๋ ๊ฒ ๋ง์ด๋ค.
pg_cron ํ์ฅ์ ์๊ฐ๋ณด๋ค postgres ์์ฒด์ ๊ฐํ๊ฒ ๊ฒฐํฉ๋์ด์๋ ๊ฒ์ ์๋๋ค.
๋ณ๋์ ํ๋ก์ธ์ค๋ก ๋ ์ postgres์ TCP ์์ฒญ์ ๋๋ฆฌ๋ ์์ผ๋ก ๋์ํ๋๋ฐ, ๊ทธ๋์ TCP ํต์ ์ ์ํ ๋ณด์ ์์ค ์ค์ ์ด ํ์ํ๋ค.
์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋๊ณ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์, ๊ทธ๋ฅ ๋ก์ปฌํธ์คํธ ๋ด์์๋ ์์ ๋กญ๊ฒ ํต์ ์ด ๊ฐ๋ฅํ๋๋ก ์ด์ด์ฃผ๋ ๊ฒ์ด๋ค.
pb_hba.conf ํ์ผ์ ์ด์ด์ trust๋ก ํ์ฉํด์ฃผ๊ณ


postgresql.conf์๋ ๋ค์ ํ์ค์ ์ถ๊ฐํด์ค ๋ค์
cron.host = "";
๋ฆฌ์คํํธ๋ฅผ ๋๋ฆฌ๋ฉด ๋๋ค.
sudo systemctl restart postgresql์ฐธ์กฐ
https://github.com/citusdata/pg_cron
https://github.com/citusdata/pg_cron/issues/48#issuecomment-386207327