วิธีการเรียกใช้งานที่เกิดขึ้นซ้ำ ๆ บน Postgresql โดยไม่ต้องใช้เครื่องมือคล้าย cron ภายนอก


41

ฉันต้องการเรียกขั้นตอนการจัดเก็บเป็นประจำ บน Oracle ฉันจะสร้างงานสำหรับสิ่งนี้ ฉันพบว่า Postgresql สามารถเลียนแบบสิ่งนี้ได้ดีโดยใช้เครื่องมือภายนอก (cron ฯลฯ ) และ PgAgent

คุณรู้จักทางเลือก "ภายใน" ซึ่งไม่เกี่ยวข้องกับเครื่องมือภายนอกหรือไม่?

  • ฉันต้องการหลีกเลี่ยงปัญหาด้านความปลอดภัยด้วยรหัสผ่านที่จัดเก็บในบรรทัดคำสั่งของ pgAgent
  • ฉันต้องการหลีกเลี่ยงการกำหนดค่าระบบเพิ่มเติมใด ๆ สำหรับการซ่อนรหัสผ่าน ( ~/.pgpass)

Postgresql 8.3
Linux RedHat 64 บิต


คุณสามารถเพิ่มเหตุผลที่คุณไม่สามารถใช้ pgAgent หรือ crontab ได้หรือไม่? คุณลักษณะเฉพาะที่ขาดหายไป ..
WrinkleFree

@Rohan ฉันได้อัปเดตคำถามของฉันแล้ว
Stephan

โพสต์ดูเหมือนว่ามีการคัดลอกและวางไปที่stackoverflow.com/q/16958625/398670
Craig Ringer

คำตอบ:


30

แม้ว่าคุณจะใช้งาน PostgreSQL 10 หรือ PostgreSQL 9.6 ในปัจจุบันซึ่งไม่ใช่รุ่นโบราณเช่น 8.3 แต่ก็ยังไม่มีตัวจัดกำหนดการงานในตัว

ต้องการงาน PgAgent หรืองาน cron ภายนอกไม่มีวิธีแก้ไขปัญหาที่สะดวก

ฟีเจอร์ผู้ทำงานเบื้องหลังที่เปิดตัวใน 9.3 หวังว่าจะอนุญาตให้มีการย้ายเครื่องมือเช่น PgAgent ไปยังแกน PostgreSQL ในรุ่นที่ใหม่กว่า แต่ยังไม่ได้ดำเนินการ แม้แต่ใน 9.3 คุณยังคงต้องใช้ cron หรือ pgagent

มีคนไม่กี่คนกำลังทำงานตามตัวกำหนดเวลาที่ทำงานตามพื้นหลังและมีโปรแกรมแก้ไขบางตัวที่ควรให้ความช่วยเหลือในเรื่องนั้น แต่ในขณะที่ PostgreSQL 10 ยังไม่มีคุณภาพดีตัวกำหนดตารางเวลาที่ใช้กันอย่างแพร่หลายและคนส่วนใหญ่ใช้ cron / ms task scheduler / ฯลฯ

โปรดดูนโยบายรุ่นด้วย; คุณกำลังเปิดตัวรุ่นที่ล้าสมัยและไม่ได้รับการสนับสนุน


Please take a look at the version policyการอัพเกรด Postgresql ไม่ใช่ตัวเลือก
เตฟาน

2
@Alex คุณจะต้องอัพเกรดในบางจุดและมันจะยากขึ้นไปอีก 8.3 จุดไหนที่ปล่อยออกมา คุณหายไปจากการแก้ไขข้อผิดพลาดที่สำคัญกี่ครั้ง หรืออย่างน้อยคุณอยู่ที่ 8.3.23? ที่กล่าวว่าตามที่ฉันอธิบายคุณลักษณะที่คุณต้องการไม่มีอยู่แม้ในรุ่น 9.3 ที่จะมาถึงแม้ว่าบางส่วนของรากฐานที่จะอนุญาตให้มีการเพิ่มได้รับการเพิ่ม
Craig Ringer

ฉันจะมีการพูดคุยกับเจ้านายของฉัน :)
สเตฟาน

1
@Alex ความคิดที่ดี :-) อย่างน้อยอัปเดตเป็น 8.3.23 อย่างเร่งด่วนจากนั้นเริ่มทำงานกับแผนการอัพเกรดเป็นรีลีสที่ใหม่กว่า มันจะไม่แก้คำถามนี้ แต่มันเป็นความคิดที่ดีมากที่จะรักษาความเจ็บปวดในอนาคต จำนวนลูกค้าที่ฉันสนับสนุนซึ่งกำลังประสบปัญหาที่พวกเขาไม่เคยมีหากพวกเขาอยู่ในปัจจุบันเป็นที่น่าอัศจรรย์ เราไม่ได้เปิดตัวเวอร์ชั่นใหม่เพียงเพื่อ kicks ;-) อ่านบันทึกย่อประจำรุ่นสำหรับแต่ละรุ่น 0.0 สำหรับคำแนะนำเกี่ยวกับสิ่งที่คุณอาจต้องจัดการและอ่านคู่มือการอัปเกรด จุดปวดเพียงจุดเดียวของคุณคือstandard_conforming_stringsและbytea_output.
Craig Ringer

เครกคุณคิดอย่างไรเกี่ยวกับ pg_cron
เมห์เม็ต

21

ในฐานะของ PostgreSQL 9.5 คุณสามารถใช้ส่วนขยายpg_cronซึ่งโหลดเป็นไลบรารี่ที่แชร์ลงใน PostgreSQL

หลังจากตั้งค่าแล้วการสร้างงานง่าย ๆ :

SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);

นี่จะรันคำสั่งลบตามตารางเวลา cron ที่ระบุ คุณยังสามารถใช้@rebootเพื่อกำหนดเวลางานเมื่อเซิร์ฟเวอร์รีสตาร์ทและ pg_cron จะเริ่มทำงานโดยอัตโนมัติหากคุณโปรโมตสแตนด์บายร้อน

แทนที่จะใช้ .pgpass คุณสามารถให้การเข้าถึง localhost สำหรับผู้ใช้ cron ใน pg_hba.conf


-1

คุณไม่ต้องการทำสิ่งนี้จริงๆ Postgres ไม่ใช่ระบบปฏิบัติการ แต่เป็นเซิร์ฟเวอร์ฐานข้อมูล แม้ว่าฐานข้อมูลจะสนับสนุนการทำงานตามกำหนดเวลา แต่ก็ไม่ควรที่จะใช้ฐานข้อมูลแบบนั้นในทางที่ผิด

หากความกังวลของคุณคือคุณไม่ต้องการตั้งค่ารหัสผ่านและเนื้อหาต่าง ๆ นั่นเป็นเรื่องง่ายที่จะแก้ไข ตั้งค่าการเชื่อมต่อซ็อกเก็ต Unix ในเครื่องโดยใช้ trust หรือ ident authenticationแทนรัน cronjob ของคุณในฐานะผู้ใช้นั้น

ในการกำหนดค่านอกกรอบโดยปกติ postgres จะตั้งค่าผู้ใช้ระบบpostgresให้รันเซิร์ฟเวอร์ db และผู้ใช้ระบบนี้มักจะกำหนดค่าไว้ล่วงหน้าแล้วดังนั้นจึงสามารถเชื่อมต่อกับเซิร์ฟเวอร์ภายในโดยใช้การตรวจสอบความน่าเชื่อถือเมื่อทำการเชื่อมต่อผ่านซ็อกเก็ตยูนิกซ์ คุณสามารถรัน cronjob ของคุณในฐานะผู้ใช้ระบบ postgres เชื่อมต่อกับซ็อกเก็ตท้องถิ่นแล้วสลับบทบาทหากคุณไม่ต้องการให้กระบวนงานที่เก็บไว้ของคุณทำงานด้วยสิทธิ์ผู้ใช้ระดับสูง

ในการตั้งค่าเริ่มต้นคุณสามารถทำได้ดังนี้

$ sudo -u postgres crontab -e

ในตัวแก้ไขเพิ่มไปยังรายการ crontab ดังนี้:

0    0    *     *    * bash /path/to/run_stored_procedure.sh

และในไฟล์ /path/to/run_stored_procedure.sh คุณเพียงแค่ใช้ psql เพื่อเรียกขั้นตอนการจัดเก็บของคุณ

#!/usr/bin/env bash
psql my_db_name <<END
    SET ROLE limited_user;
    SELECT my_stored_proc();
    SELECT 1 FROM my_stored_proc();
END

1
'ไม่ใช่ความคิดที่ดีที่จะใช้ฐานข้อมูลที่ละเมิดเช่นนั้น' ทำไมคุณถึงคิดว่ามันเป็นการละเมิด RDBMS หลักที่แตกต่างกันมีแนวโน้มที่จะมีวิธีการที่คล้ายกันและฉันไม่คิดว่ามันจะแย่มาก นอกจากนี้หากคุณไม่สามารถเข้าถึงระบบปฏิบัติการได้แสดงว่าคุณไม่มีความรู้ด้าน crontab
dezso
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.