AWS เช•เซเชฒเชพเช‰เชกเชฎเชพเช‚เชฅเซ€ PostgreSQL เชฒเซ‹เช— เช…เชชเชฒเซ‹เชก เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เช…เชฅเชตเชพ เชฅเซ‹เชกเซ€ เชฒเชพเช—เซ เชŸเซ‡เชŸเซเชฐเชฟเชธเซ‹เชฒเซ‹เชœเซ€.
เชจเชตเซเช‚ เชฌเชงเซเช‚ เชœเซ‚เชจเซ€ เชธเชพเชฐเซ€ เชฐเซ€เชคเซ‡ เชญเซ‚เชฒเซ€ เชœเชพเชฏ เช›เซ‡.
เชเชชเชฟเช—เซเชฐเชพเชซเซเชธ.
AWS เช•เซเชฒเชพเช‰เชกเชฎเชพเช‚เชฅเซ€ PostgreSQL เชฒเซ‹เช— เช…เชชเชฒเซ‹เชก เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชธเชฎเชธเซเชฏเชพเชจเซ€ เชฐเชšเชจเชพ

AWS เช•เซเชฒเชพเช‰เชกเชฎเชพเช‚เชฅเซ€ เชธเซเชฅเชพเชจเชฟเช• Linux เชนเซ‹เชธเซเชŸ เชชเชฐ เชตเชฐเซเชคเชฎเชพเชจ PostgreSQL เชฒเซ‹เช— เชซเชพเช‡เชฒเชจเซ‡ เชธเชฎเชฏเชพเช‚เชคเชฐเซ‡ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเชตเซ€ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡. เชตเชพเชธเซเชคเชตเชฟเช• เชธเชฎเชฏเชฎเชพเช‚ เชจเชนเซ€เช‚, เชชเชฐเช‚เชคเซ, เช†เชชเชฃเซ‡ เช•เชนเซ€เชถเซเช‚, เชธเชนเซ‡เชœ เชตเชฟเชฒเช‚เชฌ เชธเชพเชฅเซ‡.
เชฒเซ‹เช— เชซเชพเช‡เชฒ เช…เชชเชกเซ‡เชŸ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเชตเชพเชจเซ€ เช…เชตเชงเชฟ 5 เชฎเชฟเชจเชฟเชŸ เช›เซ‡.
AWS เชฎเชพเช‚ เชฒเซ‹เช— เชซเชพเช‡เชฒ เชฆเชฐ เช•เชฒเชพเช•เซ‡ เชซเซ‡เชฐเชตเชพเชฏ เช›เซ‡.

เชตเชชเชฐเชพเชฏเซ‡เชฒ เชธเชพเชงเชจเซ‹

เชนเซ‹เชธเซเชŸ เชชเชฐ เชฒเซ‹เช— เชซเชพเช‡เชฒ เช…เชชเชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชฌเซ‡เชถ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เชœเซ‡ AWS API เชจเซ‡ เช•เซ‰เชฒ เช•เชฐเซ‡ เช›เซ‡ "aws rds เชกเชพเช‰เชจเชฒเซ‹เชก-เชกเซ€เชฌเซ€-เชฒเซ‹เช—-เชซเชพเช‡เชฒ-เชญเชพเช—ยป.

เชชเชฐเชฟเชฎเชพเชฃเซ‹:

  • --db-เช‡เชจเซเชธเซเชŸเชจเซเชธ-เช“เช‡เชกเซ‡เชจเซเชŸเชฟเชซเชพเชฏเชฐ: AWS เชฎเชพเช‚ เช‡เชจเซเชธเซเชŸเชจเซเชธ เชจเชพเชฎ;
  • --log-file-name: เชนเชพเชฒเชฎเชพเช‚ เชœเชจเชฐเซ‡เชŸ เชฅเชฏเซ‡เชฒ เชฒเซ‹เช— เชซเชพเชˆเชฒเชจเซเช‚ เชจเชพเชฎ
  • --max-item: เช†เชฆเซ‡เชถเชจเชพ เช†เช‰เชŸเชชเซเชŸเชฎเชพเช‚ เชชเชฐเชค เช•เชฐเชพเชฏเซ‡เชฒเซ€ เชตเชธเซเชคเซเช“เชจเซ€ เช•เซเชฒ เชธเช‚เช–เซเชฏเชพ.เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซ‡เชฒเซ€ เชซเชพเช‡เชฒเชจเชพ เชญเชพเช—เชจเซเช‚ เช•เชฆ.
  • --starting-token: เชŸเซ‹เช•เชจ เชŸเซ‹เช•เชจ เชถเชฐเซ‚ เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช

เช† เชšเซ‹เช•เซเช•เชธ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชฒเซ‹เช— เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเชตเชพเชจเซเช‚ เช•เชพเชฐเซเชฏ เช•เชพเชฎ เชฆเชฐเชฎเชฟเชฏเชพเชจ เช‰เชญเซเช‚ เชฅเชฏเซเช‚ PostgreSQL เช•เซเชตเซ‡เชฐเซ€เชเชจเซเช‚ เชชเซเชฐเชฆเชฐเซเชถเชจ เชฎเซ‹เชจเซ€เชŸเชฐเซ€เช‚เช—.

เชนเชพ, เช…เชจเซ‡ เชธเชฐเชณ เชฐเซ€เชคเซ‡ - เช•เชพเชฎเชจเชพ เช•เชฒเชพเช•เซ‹ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชคเชพเชฒเซ€เชฎ เช…เชจเซ‡ เชตเชฟเชตเชฟเชงเชคเชพ เชฎเชพเชŸเซ‡ เชเช• เชฐเชธเชชเซเชฐเชฆ เช•เชพเชฐเซเชฏ.
เชนเซเช‚ เชฎเชพเชจเซเช‚ เช›เซเช‚ เช•เซ‡ เชธเชฎเชธเซเชฏเชพเชจเซ‹ เชจเชฟเชคเซเชฏเช•เซเชฐเชฎเชจเชพ เช†เชงเชพเชฐเซ‡ เช‰เช•เซ‡เชฒ เช†เชตเซ€ เช—เชฏเซ‹ เช›เซ‡. เชชเชฐเช‚เชคเซ เชเชกเชชเซ€ เช—เซ‚เช—เชฒเซ‡ เช‰เช•เซ‡เชฒเซ‹ เชธเซ‚เชšเชตเซเชฏเชพ เชจ เชนเชคเชพ, เช…เชจเซ‡ เชตเชงเซ เชŠเช‚เชกเชพเชฃเชฎเชพเช‚ เชถเซ‹เชงเชตเชพเชจเซ€ เช•เซ‹เชˆ เช–เชพเชธ เช‡เชšเซเช›เชพ เชจเชนเซ‹เชคเซ€. เช•เซ‹เชˆ เชชเชฃ เชธเช‚เชœเซ‹เช—เซ‹เชฎเชพเช‚, เชคเซ‡ เชเช• เชธเชพเชฐเซ€ เชตเชฐเซเช•เช†เช‰เชŸ เช›เซ‡.

เช•เชพเชฐเซเชฏเชจเซเช‚ เช”เชชเชšเชพเชฐเชฟเช•เช•เชฐเชฃ

เช…เช‚เชคเชฟเชฎ เชฒเซ‹เช— เชซเชพเช‡เชฒ เช เชšเชฒ เชฒเช‚เชฌเชพเชˆเชจเซ€ เชฐเซ‡เช–เชพเช“เชจเซ‹ เชธเชฎเซ‚เชน เช›เซ‡. เช—เซเชฐเชพเชซเชฟเช•เชฒเซ€, เชฒเซ‹เช— เชซเชพเช‡เชฒเชจเซ‡ เช† เชฐเซ€เชคเซ‡ เชฐเชœเซ‚ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡:
AWS เช•เซเชฒเชพเช‰เชกเชฎเชพเช‚เชฅเซ€ PostgreSQL เชฒเซ‹เช— เช…เชชเชฒเซ‹เชก เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชถเซเช‚ เชคเซ‡ เชคเชฎเชจเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เช•เช‚เชˆเช• เชฏเชพเชฆ เช…เชชเชพเชตเซ‡ เช›เซ‡? "เชŸเซ‡เชŸเซเชฐเชฟเชธ" เชธเชพเชฅเซ‡ เชถเซเช‚ เช›เซ‡? เช…เชจเซ‡ เช…เชนเซ€เช‚ เชถเซเช‚ เช›เซ‡.
เชœเซ‹ เช†เชชเชฃเซ‡ เช†เช—เชณเชจเซ€ เชซเชพเช‡เชฒเชจเซ‡ เช—เซเชฐเชพเชซเชฟเช•เชฒเซ€ เชฒเซ‹เชก เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เช‰เชฆเซเชญเชตเชคเชพ เชธเช‚เชญเชตเชฟเชค เชตเชฟเช•เชฒเซเชชเซ‹เชจเซเช‚ เชชเซเชฐเชคเชฟเชจเชฟเชงเชฟเชคเซเชต เช•เชฐเซ€เช (เชธเชฐเชณเชคเชพ เชฎเชพเชŸเซ‡, เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชฒเซ€เชŸเซ€เช“เชจเซ€ เชฒเช‚เชฌเชพเชˆ เชธเชฎเชพเชจ เชนเซ‹เชฏ), เชคเซ‹ เช†เชชเชฃเชจเซ‡ เชฎเชณเชถเซ‡. เชฎเชพเชจเช• เชŸเซ‡เชŸเซเชฐเชฟเชธ เช†เช•เซƒเชคเชฟเช“:

1) เชซเชพเช‡เชฒ เชคเซ‡เชจเซ€ เชธเช‚เชชเซ‚เชฐเซเชฃ เชฐเซ€เชคเซ‡ เชกเชพเช‰เชจเชฒเซ‹เชก เชฅเชฏเซ‡เชฒ เช›เซ‡ เช…เชจเซ‡ เช…เช‚เชคเชฟเชฎ เช›เซ‡. เชญเชพเช—เชจเซเช‚ เช•เชฆ เช…เช‚เชคเชฟเชฎ เชซเชพเช‡เชฒ เช•เชฆ เช•เชฐเชคเชพเช‚ เชฎเซ‹เชŸเซเช‚ เช›เซ‡:
AWS เช•เซเชฒเชพเช‰เชกเชฎเชพเช‚เชฅเซ€ PostgreSQL เชฒเซ‹เช— เช…เชชเชฒเซ‹เชก เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

2) เชซเชพเช‡เชฒเชฎเชพเช‚ เชธเชพเชคเชคเซเชฏ เช›เซ‡. เชญเชพเช—เชจเซเช‚ เช•เชฆ เช…เช‚เชคเชฟเชฎ เชซเชพเช‡เชฒ เช•เชฆ เช•เชฐเชคเชพเช‚ เชจเชพเชจเซเช‚ เช›เซ‡:
AWS เช•เซเชฒเชพเช‰เชกเชฎเชพเช‚เชฅเซ€ PostgreSQL เชฒเซ‹เช— เช…เชชเชฒเซ‹เชก เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

3) เชซเชพเช‡เชฒ เช เช…เช—เชพเช‰เชจเซ€ เชซเชพเช‡เชฒเชจเซเช‚ เชšเชพเชฒเซ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซเช‚ เชšเชพเชฒเซ เช›เซ‡. เชญเชพเช—เชจเซเช‚ เช•เชฆ เชฌเชพเช•เซ€เชจเซ€ เช…เช‚เชคเชฟเชฎ เชซเชพเช‡เชฒเชจเชพ เช•เชฆ เช•เชฐเชคเชพเช‚ เช“เช›เซเช‚ เช›เซ‡:
AWS เช•เซเชฒเชพเช‰เชกเชฎเชพเช‚เชฅเซ€ PostgreSQL เชฒเซ‹เช— เช…เชชเชฒเซ‹เชก เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

4) เชซเชพเช‡เชฒ เช เช…เช—เชพเช‰เชจเซ€ เชซเชพเช‡เชฒเชจเซเช‚ เชšเชพเชฒเซ เช›เซ‡ เช…เชจเซ‡ เช…เช‚เชคเชฟเชฎ เช›เซ‡. เชญเชพเช—เชจเซเช‚ เช•เชฆ เชฌเชพเช•เซ€เชจเซ€ เช…เช‚เชคเชฟเชฎ เชซเชพเช‡เชฒเชจเชพ เช•เชฆ เช•เชฐเชคเชพเช‚ เชฎเซ‹เชŸเซเช‚ เช›เซ‡:
AWS เช•เซเชฒเชพเช‰เชกเชฎเชพเช‚เชฅเซ€ PostgreSQL เชฒเซ‹เช— เช…เชชเชฒเซ‹เชก เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เช•เชพเชฐเซเชฏ เชเช• เชฒเช‚เชฌเชšเซ‹เชฐเชธ เชเชธเซ‡เชฎเซเชฌเชฒ เช…เชฅเชตเชพ เชจเชตเชพ เชธเซเชคเชฐ เชชเชฐ เชŸเซ‡เชŸเซเชฐเชฟเชธ เชฐเชฎเชตเชพเชจเซเช‚ เช›เซ‡.
AWS เช•เซเชฒเชพเช‰เชกเชฎเชพเช‚เชฅเซ€ PostgreSQL เชฒเซ‹เช— เช…เชชเชฒเซ‹เชก เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชธเชฎเชธเซเชฏเชพเชจเชพ เชจเชฟเชฐเชพเช•เชฐเชฃ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชŠเชญเซ€ เชฅเชคเซ€ เชธเชฎเชธเซเชฏเชพเช“

1) 2 เชญเชพเช—เซ‹เชจเซ€ เชธเซเชŸเซเชฐเชฟเช‚เช—เชจเซ‡ เช—เซเช‚เชฆเชฐ เช•เชฐเซ‹

AWS เช•เซเชฒเชพเช‰เชกเชฎเชพเช‚เชฅเซ€ PostgreSQL เชฒเซ‹เช— เช…เชชเชฒเซ‹เชก เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡
เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡, เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เช–เชพเชธ เชธเชฎเชธเซเชฏเชพเช“ เชจเชนเซ‹เชคเซ€. เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เช•เซ‹เชฐเซเชธเชฎเชพเช‚เชฅเซ€ เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค เช•เชพเชฐเซเชฏ.

เชถเซเชฐเซ‡เชทเซเช  เชธเชฐเซเชตเชฟเช‚เช— เช•เชฆ

เชชเชฐเช‚เชคเซ เช† เชฅเซ‹เชกเซ€ เชตเชงเซ เชฐเชธเชชเซเชฐเชฆ เช›เซ‡.
เช•เชฎเชจเชธเซ€เชฌเซ‡, เชธเซเชŸเชพเชฐเซเชŸ เชšเช‚เช• เชฒเซ‡เชฌเชฒ เชชเช›เซ€ เช‘เชซเชธเซ‡เชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เช•เซ‹เชˆ เชฐเซ€เชค เชจเชฅเซ€:

เชœเซ‡เชฎ เชคเชฎเซ‡ เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เชœเชพเชฃเซ‹ เช›เซ‹ เชตเชฟเช•เชฒเซเชช --starting-token เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เซเชฏเชพเช‚เชฅเซ€ เชถเชฐเซ‚ เช•เชฐเชตเซ‹ เชคเซ‡ เชธเซเชชเชทเซเชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡. เช† เชตเชฟเช•เชฒเซเชช เชธเซเชŸเซเชฐเชฟเช‚เช— เชฎเซ‚เชฒเซเชฏเซ‹ เชฒเซ‡ เช›เซ‡ เชœเซ‡เชจเซ‹ เช…เชฐเซเชฅ เช เชฅเชถเซ‡ เช•เซ‡ เชœเซ‹ เชคเชฎเซ‡ เชจเซ‡เช•เซเชธเซเชŸ เชŸเซ‹เช•เชจ เชธเซเชŸเซเชฐเชฟเช‚เช—เชจเซ€ เชธเชพเชฎเซ‡ เช‘เชซเชธเซ‡เชŸ เชฎเซ‚เชฒเซเชฏ เช‰เชฎเซ‡เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ‹ เช›เซ‹, เชคเซ‹ เชตเชฟเช•เชฒเซเชชเชจเซ‡ เช‘เชซเชธเซ‡เชŸ เชคเชฐเซ€เช•เซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เชจเชนเซ€เช‚.

เช…เชจเซ‡ เชคเซ‡เชฅเซ€, เชคเชฎเชพเชฐเซ‡ เชญเชพเช—เซ‹-เชญเชพเช—เซ‹เชฎเชพเช‚ เชตเชพเช‚เชšเชตเซเช‚ เชชเชกเชถเซ‡.
เชœเซ‹ เชคเชฎเซ‡ เชฎเซ‹เชŸเชพ เชญเชพเช—เซ‹เชฎเชพเช‚ เชตเชพเช‚เชšเซ‹ เช›เซ‹, เชคเซ‹ เชตเชพเช‚เชšเชจเชจเซ€ เชธเช‚เช–เซเชฏเชพ เชจเซเชฏเซ‚เชจเชคเชฎ เชนเชถเซ‡, เชชเชฐเช‚เชคเซ เชตเซ‹เชฒเซเชฏเซเชฎ เชฎเชนเชคเซเชคเชฎ เชนเชถเซ‡.
เชœเซ‹ เชคเชฎเซ‡ เชจเชพเชจเชพ เชญเชพเช—เซ‹เชฎเชพเช‚ เชตเชพเช‚เชšเซ‹ เช›เซ‹, เชคเซ‹ เชคเซ‡เชจเชพเชฅเซ€ เชตเชฟเชชเชฐเซ€เชค, เชตเชพเช‚เชšเชจเชจเซ€ เชธเช‚เช–เซเชฏเชพ เชฎเชนเชคเซเชคเชฎ เชนเชถเซ‡, เชชเชฐเช‚เชคเซ เชตเซ‹เชฒเซเชฏเซเชฎ เชจเซเชฏเซ‚เชจเชคเชฎ เชนเชถเซ‡.
เชคเซ‡เชฅเซ€, เชŸเซเชฐเชพเชซเชฟเช• เช˜เชŸเชพเชกเชตเชพ เช…เชจเซ‡ เชธเซ‹เชฒเซเชฏเซเชถเชจเชจเซ€ เชเช•เช‚เชฆเชฐ เชธเซเช‚เชฆเชฐเชคเชพ เชฎเชพเชŸเซ‡, เชฎเชพเชฐเซ‡ เช•เซ‹เชˆ เชชเซเชฐเช•เชพเชฐเชจเซเช‚ เชธเซ‹เชฒเซเชฏเซเชถเชจ เชฒเชพเชตเชตเซเช‚ เชชเชกเซเชฏเซเช‚, เชœเซ‡ เช•เชฎเชจเชธเซ€เชฌเซ‡, เช•เซเชฐเซ‰เชš เชœเซ‡เชตเซเช‚ เชฒเชพเช—เซ‡ เช›เซ‡.

เชธเชฎเชœเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชšเชพเชฒเซ‹ 2 เชฎเซ‹เชŸเชพ เชชเซเชฐเชฎเชพเชฃเชฎเชพเช‚ เชธเชฐเชณ เชธเช‚เชธเซเช•เชฐเชฃเซ‹เชฎเชพเช‚ เชฒเซ‹เช— เชซเชพเช‡เชฒ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเชตเชพเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเชˆเช. เชฌเช‚เชจเซ‡ เช•เชฟเชธเซเชธเชพเช“เชฎเชพเช‚ เชตเชพเช‚เชšเชจเชจเซ€ เชธเช‚เช–เซเชฏเชพ เชญเชพเช—เชจเชพ เช•เชฆ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เช›เซ‡.

1) เชจเชพเชจเชพ เชญเชพเช—เซ‹เชฎเชพเช‚ เชฒเซ‹เชก เช•เชฐเซ‹:
AWS เช•เซเชฒเชพเช‰เชกเชฎเชพเช‚เชฅเซ€ PostgreSQL เชฒเซ‹เช— เช…เชชเชฒเซ‹เชก เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

2) เชฎเซ‹เชŸเชพ เชญเชพเช—เซ‹เชฎเชพเช‚ เชฒเซ‹เชก เช•เชฐเซ‹:
AWS เช•เซเชฒเชพเช‰เชกเชฎเชพเช‚เชฅเซ€ PostgreSQL เชฒเซ‹เช— เช…เชชเชฒเซ‹เชก เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชนเช‚เชฎเซ‡เชถเชจเซ€ เชœเซ‡เชฎ, เชถเซเชฐเซ‡เชทเซเช  เช‰เช•เซ‡เชฒ เชฎเชงเซเชฏเชฎเชพเช‚ เช›เซ‡.
เชญเชพเช—เชจเซเช‚ เช•เชฆ เชจเซเชฏเซ‚เชจเชคเชฎ เช›เซ‡, เชชเชฐเช‚เชคเซ เชตเชพเช‚เชšเชจเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชฎเชพเช‚, เชตเชพเช‚เชšเชจเชจเซ€ เชธเช‚เช–เซเชฏเชพ เช˜เชŸเชพเชกเชตเชพ เชฎเชพเชŸเซ‡ เช•เชฆ เชตเชงเชพเชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡.

เชคเซ‡ เชจเซ‹เช‚เชงเชตเซเช‚ เชœเซ‹เช‡เช เชตเชพเช‚เชšเซ‡เชฒเชพ เชญเชพเช—เชจเชพ เชถเซเชฐเซ‡เชทเซเช  เช•เชฆเชจเซ‡ เชชเชธเช‚เชฆ เช•เชฐเชตเชพเชจเซ€ เชธเชฎเชธเซเชฏเชพ เชนเชœเซ เชธเซเชงเซ€ เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เชนเชฒ เชฅเชˆ เชจเชฅเซ€ เช…เชจเซ‡ เชคเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เชŠเช‚เชกเชพ เช…เชญเซเชฏเชพเชธ เช…เชจเซ‡ เชตเชฟเชถเซเชฒเซ‡เชทเชฃเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช•เชฆเชพเชš เชฅเซ‹เชกเซ€ เชตเชพเชฐ เชชเช›เซ€.

เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซเช‚ เชธเชพเชฎเชพเชจเซเชฏ เชตเชฐเซเชฃเชจ

เชตเชชเชฐเชพเชฏเซ‡เชฒ เชธเซ‡เชตเชพ เช•เซ‹เชทเซเชŸเช•เซ‹

CREATE TABLE endpoint
(
id SERIAL ,
host text 
);

TABLE database
(
id SERIAL , 
โ€ฆ
last_aws_log_time text ,
last_aws_nexttoken text ,
aws_max_item_size integer 
);
last_aws_log_time โ€” ะฒั€ะตะผะตะฝะฝะฐั ะผะตั‚ะบะฐ ะฟะพัะปะตะดะฝะตะณะพ ะทะฐะณั€ัƒะถะตะฝะฝะพะณะพ ะปะพะณ-ั„ะฐะนะปะฐ ะฒ ั„ะพั€ะผะฐั‚ะต YYYY-MM-DD-HH24.
last_aws_nexttoken โ€” ั‚ะตะบัั‚ะพะฒะฐั ะผะตั‚ะบะฐ ะฟะพัะปะตะดะฝะตะน ะทะฐะณั€ัƒะถะตะฝะฝะพะน ะฟะพั€ั†ะธะธ.
aws_max_item_size- ัะผะฟะธั€ะธั‡ะตัะบะธะผ ะฟัƒั‚ะตะผ, ะฟะพะดะพะฑั€ะฐะฝะฝั‹ะน ะฝะฐั‡ะฐะปัŒะฝั‹ะน ั€ะฐะทะผะตั€ ะฟะพั€ั†ะธะธ.

เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‹ เชธเช‚เชชเซ‚เชฐเซเชฃ เชŸเซ‡เช•เซเชธเซเชŸ

เชกเชพเช‰เชจเชฒเซ‹เชก_aws_piece.sh

#!/bin/bash
#########################################################
# download_aws_piece.sh
# downloan piece of log from AWS
# version HABR
 let min_item_size=1024
 let max_item_size=1048576
 let growth_factor=3
 let growth_counter=1
 let growth_counter_max=3

 echo $(date +%Y%m%d%H%M)':    download_aws_piece.sh:''STARTED'
 
 AWS_LOG_TIME=$1
 echo $(date +%Y%m%d%H%M)':    download_aws_piece.sh:AWS_LOG_TIME='$AWS_LOG_TIME
  
 database_id=$2
 echo $(date +%Y%m%d%H%M)':    download_aws_piece.sh:database_id='$database_id
 RESULT_FILE=$3 
  
 endpoint=`psql -h MONITOR_ENDPOINT.rds.amazonaws.com -U USER -d MONITOR_DATABASE_DATABASE -A -t -c "select e.host from endpoint e join database d on e.id = d.endpoint_id where d.id = $database_id "`
 echo $(date +%Y%m%d%H%M)':    download_aws_piece.sh:endpoint='$endpoint
  
 db_instance=`echo $endpoint | awk -F"." '{print toupper($1)}'`
 
 echo $(date +%Y%m%d%H%M)':    download_aws_piece.sh:db_instance='$db_instance

 LOG_FILE=$RESULT_FILE'.tmp_log'
 TMP_FILE=$LOG_FILE'.tmp'
 TMP_MIDDLE=$LOG_FILE'.tmp_mid'  
 TMP_MIDDLE2=$LOG_FILE'.tmp_mid2'  
  
 current_aws_log_time=`psql -h MONITOR_ENDPOINT.rds.amazonaws.com -U USER -d MONITOR_DATABASE -A -t -c "select last_aws_log_time from database where id = $database_id "`

 echo $(date +%Y%m%d%H%M)':      download_aws_piece.sh:current_aws_log_time='$current_aws_log_time
  
  if [[ $current_aws_log_time != $AWS_LOG_TIME  ]];
  then
    is_new_log='1'
	if ! psql -h MONITOR_ENDPOINT.rds.amazonaws.com -U USER -d MONITOR_DATABASE -v ON_ERROR_STOP=1 -A -t -q -c "update database set last_aws_log_time = '$AWS_LOG_TIME' where id = $database_id "
	then
	  echo $(date +%Y%m%d%H%M)':    download_aws_piece.sh: FATAL_ERROR - update database set last_aws_log_time .'
	  exit 1
	fi
  else
    is_new_log='0'
  fi
  
  echo $(date +%Y%m%d%H%M)':    download_aws_piece.sh:is_new_log='$is_new_log
  
  let last_aws_max_item_size=`psql -h MONITOR_ENDPOINT.rds.amazonaws.com -U USER -d MONITOR_DATABASE -A -t -c "select aws_max_item_size from database where id = $database_id "`
  echo $(date +%Y%m%d%H%M)':    download_aws_piece.sh: last_aws_max_item_size='$last_aws_max_item_size
  
  let count=1
  if [[ $is_new_log == '1' ]];
  then    
	echo $(date +%Y%m%d%H%M)':    download_aws_piece.sh: START DOWNLOADING OF NEW AWS LOG'
	if ! aws rds download-db-log-file-portion 
		--max-items $last_aws_max_item_size 
		--region REGION 
		--db-instance-identifier  $db_instance 
		--log-file-name error/postgresql.log.$AWS_LOG_TIME > $LOG_FILE
	then
		echo $(date +%Y%m%d%H%M)':    download_aws_piece.sh: FATAL_ERROR - Could not get log from AWS .'
		exit 2
	fi  	
  else
    next_token=`psql -h MONITOR_ENDPOINT.rds.amazonaws.com -U USER -d MONITOR_DATABASE -v ON_ERROR_STOP=1 -A -t -c "select last_aws_nexttoken from database where id = $database_id "`
	
	if [[ $next_token == '' ]];
	then
	  next_token='0'	  
	fi
	
	echo $(date +%Y%m%d%H%M)':    download_aws_piece.sh: CONTINUE DOWNLOADING OF AWS LOG'
	if ! aws rds download-db-log-file-portion 
	    --max-items $last_aws_max_item_size 
		--starting-token $next_token 
		--region REGION 
		--db-instance-identifier  $db_instance 
		--log-file-name error/postgresql.log.$AWS_LOG_TIME > $LOG_FILE
	then
		echo $(date +%Y%m%d%H%M)':    download_aws_piece.sh: FATAL_ERROR - Could not get log from AWS .'
		exit 3
	fi       
	
	line_count=`cat  $LOG_FILE | wc -l`
	let lines=$line_count-1
	  
	tail -$lines $LOG_FILE > $TMP_MIDDLE 
	mv -f $TMP_MIDDLE $LOG_FILE
  fi
  
  next_token_str=`cat $LOG_FILE | grep NEXTTOKEN` 
  next_token=`echo $next_token_str | awk -F" " '{ print $2}' `
  
  grep -v NEXTTOKEN $LOG_FILE  > $TMP_FILE 
  
  if [[ $next_token == '' ]];
  then
	  cp $TMP_FILE $RESULT_FILE
	  
	  echo $(date +%Y%m%d%H%M)':    download_aws_piece.sh:  NEXTTOKEN NOT FOUND - FINISH '
	  rm $LOG_FILE 
	  rm $TMP_FILE
	  rm $TMP_MIDDLE
          rm $TMP_MIDDLE2	  
	  exit 0  
  else
	psql -h MONITOR_ENDPOINT.rds.amazonaws.com -U USER -d MONITOR_DATABASE -v ON_ERROR_STOP=1 -A -t -q -c "update database set last_aws_nexttoken = '$next_token' where id = $database_id "
  fi
  
  first_str=`tail -1 $TMP_FILE`
  
  line_count=`cat  $TMP_FILE | wc -l`
  let lines=$line_count-1    
  
  head -$lines $TMP_FILE  > $RESULT_FILE

###############################################
# MAIN CIRCLE
  let count=2
  while [[ $next_token != '' ]];
  do 
    echo $(date +%Y%m%d%H%M)':    download_aws_piece.sh: count='$count
	
	echo $(date +%Y%m%d%H%M)':    download_aws_piece.sh: START DOWNLOADING OF AWS LOG'
	if ! aws rds download-db-log-file-portion 
             --max-items $last_aws_max_item_size 
             --starting-token $next_token 
             --region REGION 
             --db-instance-identifier  $db_instance 
             --log-file-name error/postgresql.log.$AWS_LOG_TIME > $LOG_FILE
	then
		echo $(date +%Y%m%d%H%M)':    download_aws_piece.sh: FATAL_ERROR - Could not get log from AWS .'
		exit 4
	fi

	next_token_str=`cat $LOG_FILE | grep NEXTTOKEN` 
	next_token=`echo $next_token_str | awk -F" " '{ print $2}' `

	TMP_FILE=$LOG_FILE'.tmp'
	grep -v NEXTTOKEN $LOG_FILE  > $TMP_FILE  
	
	last_str=`head -1 $TMP_FILE`
  
    if [[ $next_token == '' ]];
	then
	  concat_str=$first_str$last_str
	  	  
	  echo $concat_str >> $RESULT_FILE
		 
	  line_count=`cat  $TMP_FILE | wc -l`
	  let lines=$line_count-1
	  
	  tail -$lines $TMP_FILE >> $RESULT_FILE
	  
	  echo $(date +%Y%m%d%H%M)':    download_aws_piece.sh:  NEXTTOKEN NOT FOUND - FINISH '
	  rm $LOG_FILE 
	  rm $TMP_FILE
	  rm $TMP_MIDDLE
          rm $TMP_MIDDLE2	  
	  exit 0  
	fi
	
    if [[ $next_token != '' ]];
	then
		let growth_counter=$growth_counter+1
		if [[ $growth_counter -gt $growth_counter_max ]];
		then
			let last_aws_max_item_size=$last_aws_max_item_size*$growth_factor
			let growth_counter=1
		fi
	
		if [[ $last_aws_max_item_size -gt $max_item_size ]]; 
		then
			let last_aws_max_item_size=$max_item_size
		fi 

	  psql -h MONITOR_ENDPOINT.rds.amazonaws.com -U USER -d MONITOR_DATABASE -A -t -q -c "update database set last_aws_nexttoken = '$next_token' where id = $database_id "
	  
	  concat_str=$first_str$last_str
	  	  
	  echo $concat_str >> $RESULT_FILE
		 
	  line_count=`cat  $TMP_FILE | wc -l`
	  let lines=$line_count-1
	  
	  #############################
	  #Get middle of file
	  head -$lines $TMP_FILE > $TMP_MIDDLE
	  
	  line_count=`cat  $TMP_MIDDLE | wc -l`
	  let lines=$line_count-1
	  tail -$lines $TMP_MIDDLE > $TMP_MIDDLE2
	  
	  cat $TMP_MIDDLE2 >> $RESULT_FILE	  
	  
	  first_str=`tail -1 $TMP_FILE`	  
	fi
	  
    let count=$count+1

  done
#
#################################################################

exit 0  

เช•เซ‡เชŸเชฒเชพเช• เช–เซเชฒเชพเชธเชพ เชธเชพเชฅเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเชพ เชŸเซเช•เชกเชพเช“:

เชธเซเช•เซเชฐเชฟเชชเซเชŸ เช‡เชจเชชเซเชŸ เชชเชฐเชฟเชฎเชพเชฃเซ‹:

  • YYYY-MM-DD-HH24 เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เชฒเซ‹เช— เชซเชพเช‡เชฒ เชจเชพเชฎเชจเซ‹ เชŸเชพเช‡เชฎเชธเซเชŸเซ‡เชฎเซเชช: AWS_LOG_TIME=$1
  • เชกเซ‡เชŸเชพเชฌเซ‡เช ID: database_id=$2
  • เชเช•เชคเซเชฐเชฟเชค เชฒเซ‰เช— เชซเชพเช‡เชฒเชจเซเช‚ เชจเชพเชฎ: RESULT_FILE=$3

เช›เซ‡เชฒเซเชฒเซ€ เช…เชชเชฒเซ‹เชก เช•เชฐเซ‡เชฒเซ€ เชฒเซ‹เช— เชซเชพเช‡เชฒเชจเซ‹ เชŸเชพเช‡เชฎเชธเซเชŸเซ‡เชฎเซเชช เชฎเซ‡เชณเชตเซ‹:

current_aws_log_time=`psql -h MONITOR_ENDPOINT.rds.amazonaws.com -U USER -d MONITOR_DATABASE -A -t -c "select last_aws_log_time from database where id = $database_id "`

เชœเซ‹ เช›เซ‡เชฒเซเชฒเซ€ เชฒเซ‹เชก เช•เชฐเซ‡เชฒเซ€ เชฒเซ‹เช— เชซเชพเช‡เชฒเชจเซ‹ เชŸเชพเช‡เชฎเชธเซเชŸเซ‡เชฎเซเชช เช‡เชจเชชเซเชŸ เชชเซ‡เชฐเชพเชฎเซ€เชŸเชฐ เชธเชพเชฅเซ‡ เชฎเซ‡เชณ เช–เชพเชคเซ‹ เชจเชฅเซ€, เชคเซ‹ เชจเชตเซ€ เชฒเซ‹เช— เชซเชพเช‡เชฒ เชฒเซ‹เชก เชฅเชพเชฏ เช›เซ‡:

if [[ $current_aws_log_time != $AWS_LOG_TIME  ]];
  then
    is_new_log='1'
	if ! psql -h ENDPOINT.rds.amazonaws.com -U USER -d MONITOR_DATABASE -v ON_ERROR_STOP=1 -A -t -c "update database set last_aws_log_time = '$AWS_LOG_TIME' where id = $database_id "
	then
	  echo '***download_aws_piece.sh -FATAL_ERROR - update database set last_aws_log_time .'
	  exit 1
	fi
  else
    is_new_log='0'
  fi

เช…เชฎเซ‡ เชฒเซ‹เชก เช•เชฐเซ‡เชฒเซ€ เชซเชพเช‡เชฒเชฎเชพเช‚เชฅเซ€ เชจเซ‡เช•เซเชธเซเชŸเชŸเซ‹เช•เชจ เชฒเซ‡เชฌเชฒเชจเซ€ เช•เชฟเช‚เชฎเชค เชฎเซ‡เชณเชตเซ€เช เช›เซ€เช:

  next_token_str=`cat $LOG_FILE | grep NEXTTOKEN` 
  next_token=`echo $next_token_str | awk -F" " '{ print $2}' `

เชกเชพเช‰เชจเชฒเซ‹เชกเชจเชพ เช…เช‚เชคเชจเซ€ เชจเชฟเชถเชพเชจเซ€ เชจเซ‡เช•เซเชธเซเชŸเชŸเซ‹เช•เชจเชจเซ€ เช–เชพเชฒเซ€ เช•เชฟเช‚เชฎเชค เช›เซ‡.

เชฒเซ‚เชชเชฎเชพเช‚, เช…เชฎเซ‡ เชซเชพเช‡เชฒเชจเชพ เชญเชพเช—เซ‹เชจเซ€ เช—เชฃเชคเชฐเซ€ เช•เชฐเซ€เช เช›เซ€เช, เชฐเชธเซเชคเชพเชฎเชพเช‚, เชฐเซ‡เช–เชพเช“ เชœเซ‹เชกเซ€เช เช›เซ€เช เช…เชจเซ‡ เชญเชพเช—เชจเซเช‚ เช•เชฆ เชตเชงเชพเชฐเซ€เช เช›เซ€เช:
เชฎเซเช–เซเชฏ เชฒเซ‚เชช

# MAIN CIRCLE
  let count=2
  while [[ $next_token != '' ]];
  do 
    echo $(date +%Y%m%d%H%M)':    download_aws_piece.sh: count='$count
	
	echo $(date +%Y%m%d%H%M)':    download_aws_piece.sh: START DOWNLOADING OF AWS LOG'
	if ! aws rds download-db-log-file-portion 
     --max-items $last_aws_max_item_size 
	 --starting-token $next_token 
     --region REGION 
     --db-instance-identifier  $db_instance 
     --log-file-name error/postgresql.log.$AWS_LOG_TIME > $LOG_FILE
	then
		echo $(date +%Y%m%d%H%M)':    download_aws_piece.sh: FATAL_ERROR - Could not get log from AWS .'
		exit 4
	fi

	next_token_str=`cat $LOG_FILE | grep NEXTTOKEN` 
	next_token=`echo $next_token_str | awk -F" " '{ print $2}' `

	TMP_FILE=$LOG_FILE'.tmp'
	grep -v NEXTTOKEN $LOG_FILE  > $TMP_FILE  
	
	last_str=`head -1 $TMP_FILE`
  
    if [[ $next_token == '' ]];
	then
	  concat_str=$first_str$last_str
	  	  
	  echo $concat_str >> $RESULT_FILE
		 
	  line_count=`cat  $TMP_FILE | wc -l`
	  let lines=$line_count-1
	  
	  tail -$lines $TMP_FILE >> $RESULT_FILE
	  
	  echo $(date +%Y%m%d%H%M)':    download_aws_piece.sh:  NEXTTOKEN NOT FOUND - FINISH '
	  rm $LOG_FILE 
	  rm $TMP_FILE
	  rm $TMP_MIDDLE
         rm $TMP_MIDDLE2	  
	  exit 0  
	fi
	
    if [[ $next_token != '' ]];
	then
		let growth_counter=$growth_counter+1
		if [[ $growth_counter -gt $growth_counter_max ]];
		then
			let last_aws_max_item_size=$last_aws_max_item_size*$growth_factor
			let growth_counter=1
		fi
	
		if [[ $last_aws_max_item_size -gt $max_item_size ]]; 
		then
			let last_aws_max_item_size=$max_item_size
		fi 

	  psql -h MONITOR_ENDPOINT.rds.amazonaws.com -U USER -d MONITOR_DATABASE -A -t -q -c "update database set last_aws_nexttoken = '$next_token' where id = $database_id "
	  
	  concat_str=$first_str$last_str
	  	  
	  echo $concat_str >> $RESULT_FILE
		 
	  line_count=`cat  $TMP_FILE | wc -l`
	  let lines=$line_count-1
	  
	  #############################
	  #Get middle of file
	  head -$lines $TMP_FILE > $TMP_MIDDLE
	  
	  line_count=`cat  $TMP_MIDDLE | wc -l`
	  let lines=$line_count-1
	  tail -$lines $TMP_MIDDLE > $TMP_MIDDLE2
	  
	  cat $TMP_MIDDLE2 >> $RESULT_FILE	  
	  
	  first_str=`tail -1 $TMP_FILE`	  
	fi
	  
    let count=$count+1

  done

เช†เช—เชณ เชถเซเช‚ เช›เซ‡?

เชคเซ‡เชฅเซ€, เชชเซเชฐเชฅเชฎ เชฎเชงเซเชฏเชตเชฐเซเชคเซ€ เช•เชพเชฐเซเชฏ - "เช•เซเชฒเชพเช‰เชกเชฎเชพเช‚เชฅเซ€ เชฒเซ‹เช— เชซเชพเช‡เชฒ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซ‹" เชนเชฒ เชฅเชพเชฏ เช›เซ‡. เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซ‡เชฒ เชฒเซ‹เช—เชจเซเช‚ เชถเซเช‚ เช•เชฐเชตเซเช‚?
เชชเซเชฐเชฅเชฎ เชคเชฎเชพเชฐเซ‡ เชฒเซ‹เช— เชซเชพเช‡เชฒเชจเซ‡ เชชเชพเชฐเซเชธ เช•เชฐเชตเชพเชจเซ€ เช…เชจเซ‡ เชคเซ‡เชฎเชพเช‚เชฅเซ€ เชตเชพเชธเซเชคเชตเชฟเช• เชตเชฟเชจเช‚เชคเซ€เช“ เช•เชพเชขเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.
เช•เชพเชฐเซเชฏ เชฌเชนเซ เชฎเซเชถเซเช•เซ‡เชฒ เชจเชฅเซ€. เชธเซŒเชฅเซ€ เชธเชฐเชณ เชฌเชพเชถ-เชธเซเช•เซเชฐเซ€เชชเซเชŸ เชฌเชฐเชพเชฌเชฐ เช•เชฐเซ‡ เช›เซ‡.
upload_log_query.sh

#!/bin/bash
#########################################################
# upload_log_query.sh
# Upload table table from dowloaded aws file 
# version HABR
###########################################################  
echo 'TIMESTAMP:'$(date +%c)' Upload log_query table '
source_file=$1
echo 'source_file='$source_file
database_id=$2
echo 'database_id='$database_id

beginer=' '
first_line='1'
let "line_count=0"
sql_line=' '
sql_flag=' '    
space=' '
cat $source_file | while read line
do
  line="$space$line"

  if [[ $first_line == "1" ]]; then
    beginer=`echo $line | awk -F" " '{ print $1}' `
    first_line='0'
  fi

  current_beginer=`echo $line | awk -F" " '{ print $1}' `

  if [[ $current_beginer == $beginer ]]; then
    if [[ $sql_flag == '1' ]]; then
     sql_flag='0' 
     log_date=`echo $sql_line | awk -F" " '{ print $1}' `
     log_time=`echo $sql_line | awk -F" " '{ print $2}' `
     duration=`echo $sql_line | awk -F" " '{ print $5}' `

     #replace ' to ''
     sql_modline=`echo "$sql_line" | sed 's/'''/''''''/g'`
     sql_line=' '

	 ################
	 #PROCESSING OF THE SQL-SELECT IS HERE
     if ! psql -h ENDPOINT.rds.amazonaws.com -U USER -d DATABASE -v ON_ERROR_STOP=1 -A -t -c "select log_query('$ip_port',$database_id , '$log_date' , '$log_time' , '$duration' , '$sql_modline' )" 
     then
        echo 'FATAL_ERROR - log_query '
        exit 1
     fi
	 ################

    fi #if [[ $sql_flag == '1' ]]; then

    let "line_count=line_count+1"

    check=`echo $line | awk -F" " '{ print $8}' `
    check_sql=${check^^}    

    #echo 'check_sql='$check_sql
    
    if [[ $check_sql == 'SELECT' ]]; then
     sql_flag='1'    
     sql_line="$sql_line$line"
	 ip_port=`echo $sql_line | awk -F":" '{ print $4}' `
    fi
  else       

    if [[ $sql_flag == '1' ]]; then
      sql_line="$sql_line$line"
    fi   
    
  fi #if [[ $current_beginer == $beginer ]]; then

done

เชนเชตเซ‡ เชคเชฎเซ‡ เชฒเซ‹เช— เชซเชพเชˆเชฒเชฎเชพเช‚เชฅเซ€ เช•เชพเชขเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒ เช•เซเชตเซ‡เชฐเซ€ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

เช…เชจเซ‡ เชคเซเชฏเชพเช‚ เช˜เชฃเซ€ เช‰เชชเชฏเซ‹เช—เซ€ เชถเช•เซเชฏเชคเชพเช“ เช›เซ‡.

เชตเชฟเชถเซเชฒเซ‡เชทเชฟเชค เชชเซเชฐเชถเซเชจเซ‹ เช•เซเชฏเชพเช‚เช• เชธเช‚เช—เซเชฐเชนเชฟเชค เชนเซ‹เชตเชพ เชœเซ‹เชˆเช. เช† เชฎเชพเชŸเซ‡, เชธเชฐเซเชตเชฟเชธ เชŸเซ‡เชฌเชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. log_query

CREATE TABLE log_query
(
   id SERIAL ,
   queryid bigint ,
   query_md5hash text not null ,
   database_id integer not null ,  
   timepoint timestamp without time zone not null,
   duration double precision not null ,
   query text not null ,
   explained_plan text[],
   plan_md5hash text  , 
   explained_plan_wo_costs text[],
   plan_hash_value text  ,
   baseline_id integer ,
   ip text ,
   port text 
);
ALTER TABLE log_query ADD PRIMARY KEY (id);
ALTER TABLE log_query ADD CONSTRAINT queryid_timepoint_unique_key UNIQUE (queryid, timepoint );
ALTER TABLE log_query ADD CONSTRAINT query_md5hash_timepoint_unique_key UNIQUE (query_md5hash, timepoint );

CREATE INDEX log_query_timepoint_idx ON log_query (timepoint);
CREATE INDEX log_query_queryid_idx ON log_query (queryid);
ALTER TABLE log_query ADD CONSTRAINT database_id_fk FOREIGN KEY (database_id) REFERENCES database (id) ON DELETE CASCADE ;

เชตเชฟเชถเซเชฒเซ‡เชทเชฟเชค เชตเชฟเชจเช‚เชคเซ€ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ plpgsql เช•เชพเชฐเซเชฏเซ‹ "log_queryยป.
log_query.sql

--log_query.sql
--verison HABR
CREATE OR REPLACE FUNCTION log_query( ip_port text ,log_database_id integer , log_date text , log_time text , duration text , sql_line text   ) RETURNS boolean AS $$
DECLARE
  result boolean ;
  log_timepoint timestamp without time zone ;
  log_duration double precision ; 
  pos integer ;
  log_query text ;
  activity_string text ;
  log_md5hash text ;
  log_explain_plan text[] ;
  
  log_planhash text ;
  log_plan_wo_costs text[] ; 
  
  database_rec record ;
  
  pg_stat_query text ; 
  test_log_query text ;
  log_query_rec record;
  found_flag boolean;
  
  pg_stat_history_rec record ;
  port_start integer ;
  port_end integer ;
  client_ip text ;
  client_port text ;
  log_queryid bigint ;
  log_query_text text ;
  pg_stat_query_text text ; 
BEGIN
  result = TRUE ;

  RAISE NOTICE '***log_query';
  
  port_start = position('(' in ip_port);
  port_end = position(')' in ip_port);
  client_ip = substring( ip_port from 1 for port_start-1 );
  client_port = substring( ip_port from port_start+1 for port_end-port_start-1 );

  SELECT e.host , d.name , d.owner_pwd 
  INTO database_rec
  FROM database d JOIN endpoint e ON e.id = d.endpoint_id
  WHERE d.id = log_database_id ;
  
  log_timepoint = to_timestamp(log_date||' '||log_time,'YYYY-MM-DD HH24-MI-SS');
  log_duration = duration:: double precision; 

  
  pos = position ('SELECT' in UPPER(sql_line) );
  log_query = substring( sql_line from pos for LENGTH(sql_line));
  log_query = regexp_replace(log_query,' +',' ','g');
  log_query = regexp_replace(log_query,';+','','g');
  log_query = trim(trailing ' ' from log_query);
 

  log_md5hash = md5( log_query::text );
  
  --Explain execution plan--
  EXECUTE 'SELECT dblink_connect(''LINK1'',''host='||database_rec.host||' dbname='||database_rec.name||' user=DATABASE password='||database_rec.owner_pwd||' '')'; 
  
  log_explain_plan = ARRAY ( SELECT * FROM dblink('LINK1', 'EXPLAIN '||log_query ) AS t (plan text) );
  log_plan_wo_costs = ARRAY ( SELECT * FROM dblink('LINK1', 'EXPLAIN ( COSTS FALSE ) '||log_query ) AS t (plan text) );
    
  PERFORM dblink_disconnect('LINK1');
  --------------------------
  BEGIN
	INSERT INTO log_query
	(
		query_md5hash ,
		database_id , 
		timepoint ,
		duration ,
		query ,
		explained_plan ,
		plan_md5hash , 
		explained_plan_wo_costs , 
		plan_hash_value , 
		ip , 
		port
	) 
	VALUES 
	(
		log_md5hash ,
		log_database_id , 
		log_timepoint , 
		log_duration , 
		log_query ,
		log_explain_plan , 
		md5(log_explain_plan::text) ,
		log_plan_wo_costs , 
		md5(log_plan_wo_costs::text),
		client_ip , 
		client_port		
	);
	activity_string = 	'New query has logged '||
						' database_id = '|| log_database_id ||
						' query_md5hash='||log_md5hash||
						' , timepoint = '||to_char(log_timepoint,'YYYYMMDD HH24:MI:SS');
					
	RAISE NOTICE '%',activity_string;					
					 
	PERFORM pg_log( log_database_id , 'log_query' , activity_string);  

	EXCEPTION
	  WHEN unique_violation THEN
		RAISE NOTICE '*** unique_violation *** query already has logged';
	END;

	SELECT 	queryid
	INTO   	log_queryid
	FROM 	log_query 
	WHERE 	query_md5hash = log_md5hash AND
			timepoint = log_timepoint;

	IF log_queryid IS NOT NULL 
	THEN 
	  RAISE NOTICE 'log_query with query_md5hash = % and timepoint = % has already has a QUERYID = %',log_md5hash,log_timepoint , log_queryid ;
	  RETURN result;
	END IF;
	
	------------------------------------------------
	RAISE NOTICE 'Update queryid';	
	
	SELECT * 
	INTO log_query_rec
	FROM log_query
	WHERE query_md5hash = log_md5hash AND timepoint = log_timepoint ; 
	
	log_query_rec.query=regexp_replace(log_query_rec.query,';+','','g');
	
	FOR pg_stat_history_rec IN
	 SELECT 
         queryid ,
	  query 
	 FROM 
         pg_stat_db_queries 
     WHERE  
      database_id = log_database_id AND
       queryid is not null 
	LOOP
	  pg_stat_query = pg_stat_history_rec.query ; 
	  pg_stat_query=regexp_replace(pg_stat_query,'n+',' ','g');
	  pg_stat_query=regexp_replace(pg_stat_query,'t+',' ','g');
	  pg_stat_query=regexp_replace(pg_stat_query,' +',' ','g');
	  pg_stat_query=regexp_replace(pg_stat_query,'$.','%','g');
	
	  log_query_text = trim(trailing ' ' from log_query_rec.query);
	  pg_stat_query_text = pg_stat_query; 
	
	  
	  --SELECT log_query_rec.query like pg_stat_query INTO found_flag ; 
	  IF (log_query_text LIKE pg_stat_query_text) THEN
		found_flag = TRUE ;
	  ELSE
		found_flag = FALSE ;
	  END IF;	  
	  
	  
	  IF found_flag THEN
	    
		UPDATE log_query SET queryid = pg_stat_history_rec.queryid WHERE query_md5hash = log_md5hash AND timepoint = log_timepoint ;
		activity_string = 	' updated queryid = '||pg_stat_history_rec.queryid||
		                    ' for log_query with id = '||log_query_rec.id               
		   				    ;						
	    RAISE NOTICE '%',activity_string;	
		EXIT ;
	  END IF ;
	  
	END LOOP ;
	
  RETURN result ;
END
$$ LANGUAGE plpgsql;

เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡, เชธเซ‡เชตเชพ เช•เซ‹เชทเซเชŸเช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฅเชพเชฏ เช›เซ‡ pg_stat_db_queriesA เช•เซ‡ เชœเซ‡เชฎเชพเช‚ เช•เซ‹เชทเซเชŸเช•เชฎเชพเช‚เชฅเซ€ เชตเชฐเซเชคเชฎเชพเชจ เชชเซเชฐเชถเซเชจเซ‹เชจเซ‹ เชธเซเชจเซ‡เชชเชถเซ‹เชŸ เช›เซ‡ pg_stat_history (เช•เซ‹เชทเซเชŸเช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช…เชนเซ€เช‚ เชตเชฐเซเชฃเชตเซ‡เชฒ เช›เซ‡ - PostgreSQL เช•เซเชตเซ‡เชฐเซ€เชเชจเซเช‚ เชชเซเชฐเชฆเชฐเซเชถเชจ เชฎเซ‹เชจเชฟเชŸเชฐเชฟเช‚เช—. เชญเชพเช— 1 - เชฐเชฟเชชเซ‹เชฐเซเชŸเชฟเช‚เช—)

TABLE pg_stat_db_queries
(
   database_id integer,  
   queryid bigint ,  
   query text , 
   max_time double precision 
);

TABLE pg_stat_history 
(
โ€ฆ
database_id integer ,
โ€ฆ
queryid bigint ,
โ€ฆ
max_time double precision	 , 	
โ€ฆ
);

เชซเช‚เช•เซเชถเชจ เชคเชฎเชจเซ‡ เชฒเซ‹เช— เชซเชพเช‡เชฒเชฎเชพเช‚เชฅเซ€ เชตเชฟเชจเช‚เชคเซ€เช“ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเช‚เช–เซเชฏเชพเชฌเช‚เชง เช‰เชชเชฏเซ‹เช—เซ€ เชธเซเชตเชฟเชงเชพเช“ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡. เชœเซ‡เชฎ เช•เซ‡:

เชคเช• #1 - เช•เซเชตเซ‡เชฐเซ€ เชเช•เซเชเชฟเช•เซเชฏเซเชถเชจ เช‡เชคเชฟเชนเชพเชธ

เชชเซเชฐเชฆเชฐเซเชถเชจเชจเซ€ เช˜เชŸเชจเชพ เชถเชฐเซ‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช–เซ‚เชฌ เชœ เช‰เชชเชฏเซ‹เช—เซ€. เชชเซเชฐเชฅเชฎ, เช‡เชคเชฟเชนเชพเชธเชฅเซ€ เชชเชฐเชฟเชšเชฟเชค เชฅเชพเช“ - เช…เชจเซ‡ เชฎเช‚เชฆเซ€ เช•เซเชฏเชพเชฐเซ‡ เชถเชฐเซ‚ เชฅเชˆ?
เชชเช›เซ€, เช•เซเชฒเชพเชธเชฟเช• เช…เชจเซเชธเชพเชฐ, เชฌเชพเชนเซเชฏ เช•เชพเชฐเชฃเซ‹ เชฎเชพเชŸเซ‡ เชœเซเช“. เชเชตเซเช‚ เชฌเชจเซ€ เชถเช•เซ‡ เช›เซ‡ เช•เซ‡ เชกเซ‡เชŸเชพเชฌเซ‡เช เชฒเซ‹เชก เชจเชพเชŸเช•เซ€เชฏ เชฐเซ€เชคเซ‡ เชตเชงเซ€ เช—เชฏเซ‹ เช›เซ‡ เช…เชจเซ‡ เชšเซ‹เช•เซเช•เชธ เชตเชฟเชจเช‚เชคเซ€เชจเซ‡ เชคเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เช•เซ‹เชˆ เชฒเซ‡เชตเชพเชฆเซ‡เชตเชพ เชจเชฅเซ€.
log_query เช•เซ‹เชทเซเชŸเช•เชฎเชพเช‚ เชจเชตเซ€ เชเชจเซเชŸเซเชฐเซ€ เช‰เชฎเซ‡เชฐเซ‹

  port_start = position('(' in ip_port);
  port_end = position(')' in ip_port);
  client_ip = substring( ip_port from 1 for port_start-1 );
  client_port = substring( ip_port from port_start+1 for port_end-port_start-1 );

  SELECT e.host , d.name , d.owner_pwd 
  INTO database_rec
  FROM database d JOIN endpoint e ON e.id = d.endpoint_id
  WHERE d.id = log_database_id ;
  
  log_timepoint = to_timestamp(log_date||' '||log_time,'YYYY-MM-DD HH24-MI-SS');
  log_duration = to_number(duration,'99999999999999999999D9999999999'); 

  
  pos = position ('SELECT' in UPPER(sql_line) );
  log_query = substring( sql_line from pos for LENGTH(sql_line));
  log_query = regexp_replace(log_query,' +',' ','g');
  log_query = regexp_replace(log_query,';+','','g');
  log_query = trim(trailing ' ' from log_query);
 
  RAISE NOTICE 'log_query=%',log_query ;   

  log_md5hash = md5( log_query::text );
  
  --Explain execution plan--
  EXECUTE 'SELECT dblink_connect(''LINK1'',''host='||database_rec.host||' dbname='||database_rec.name||' user=DATABASE password='||database_rec.owner_pwd||' '')'; 
  
  log_explain_plan = ARRAY ( SELECT * FROM dblink('LINK1', 'EXPLAIN '||log_query ) AS t (plan text) );
  log_plan_wo_costs = ARRAY ( SELECT * FROM dblink('LINK1', 'EXPLAIN ( COSTS FALSE ) '||log_query ) AS t (plan text) );
    
  PERFORM dblink_disconnect('LINK1');
  --------------------------
  BEGIN
	INSERT INTO log_query
	(
		query_md5hash ,
		database_id , 
		timepoint ,
		duration ,
		query ,
		explained_plan ,
		plan_md5hash , 
		explained_plan_wo_costs , 
		plan_hash_value , 
		ip , 
		port
	) 
	VALUES 
	(
		log_md5hash ,
		log_database_id , 
		log_timepoint , 
		log_duration , 
		log_query ,
		log_explain_plan , 
		md5(log_explain_plan::text) ,
		log_plan_wo_costs , 
		md5(log_plan_wo_costs::text),
		client_ip , 
		client_port		
	);

เชฒเช•เซเชทเชฃ #2 - เช•เซเชตเซ‡เชฐเซ€ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจ เชชเซเชฒเชพเชจ เชธเชพเชšเชตเซ‹

เช† เชฌเชฟเช‚เชฆเซเช, เชตเชพเช‚เชงเซ‹-เชธเซเชชเชทเซเชŸเชคเชพ-เชŸเชฟเชชเซเชชเชฃเซ€ เชŠเชญเซ€ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡: โ€œเชชเชฐเช‚เชคเซ เชคเซเชฏเชพเช‚ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชธเซเชตเชคเชƒ เชธเชฎเชœเซ‚เชคเซ€ เช›เซ‡" เชนเชพ, เชคเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชœเซ‹ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจ เชชเซเชฒเชพเชจ เช เชœ เชฒเซ‹เช— เชซเชพเช‡เชฒเชฎเชพเช‚ เชธเช‚เช—เซเชฐเชนเชฟเชค เชนเซ‹เชฏ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชตเชงเซ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชฎเชพเชŸเซ‡ เชธเชพเชšเชตเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชฒเซ‹เช— เชซเชพเช‡เชฒเชจเซ‡ เชชเชพเชฐเซเชธ เช•เชฐเชตเซ€ เชชเชกเชถเซ‡ เชคเซ‹ เชถเซเช‚ เชซเชพเชฏเชฆเซ‹?

เชœเซ‹ เช•เซ‡, เชฎเชจเซ‡ เชœเชฐเซ‚เชฐ เช›เซ‡:
เชชเซเชฐเชฅเชฎ: เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจ เชชเซเชฒเชพเชจเชจเซ‡ เชฎเซ‹เชจเชฟเชŸเชฐเชฟเช‚เช— เชกเซ‡เชŸเชพเชฌเซ‡เชเชจเชพ เชธเชฐเซเชตเชฟเชธ เชŸเซ‡เชฌเชฒเชฎเชพเช‚ เชธเซเชŸเซ‹เชฐ เช•เชฐเซ‹;
เชฌเซ€เชœเซเช‚: เช•เซเชตเซ‡เชฐเซ€ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจ เชชเซเชฒเชพเชจ เชฌเชฆเชฒเชพเชˆ เช—เชฏเซ‹ เช›เซ‡ เชคเซ‡ เชคเชฐเชค เชœ เชœเซ‹เชตเชพ เชฎเชพเชŸเซ‡ เชเช•เชฌเซ€เชœเชพ เชธเชพเชฅเซ‡ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจ เชชเซเชฒเชพเชจเชจเซ€ เชธเชฐเช–เชพเชฎเชฃเซ€ เช•เชฐเชตเชพเชฎเชพเช‚ เชธเชฎเชฐเซเชฅ เชฅเชตเชพ เชฎเชพเชŸเซ‡.

เชšเซ‹เช•เซเช•เชธ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจ เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชธเชพเชฅเซ‡เชจเซ€ เชตเชฟเชจเช‚เชคเซ€ เช‰เชชเชฒเชฌเซเชง เช›เซ‡. EXPLAIN เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชคเซ‡เชจเซ€ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชฏเซ‹เชœเชจเชพ เชฎเซ‡เชณเชตเชตเซ€ เช…เชจเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเซ€ เช เชชเซเชฐเชพเชฅเชฎเชฟเช• เช•เชพเชฐเซเชฏ เช›เซ‡.
เชตเชงเซเชฎเชพเช‚, EXPLAIN (COSTS FALSE) เช…เชญเชฟเชตเซเชฏเช•เซเชคเชฟเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, เชคเชฎเซ‡ เชฏเซ‹เชœเชจเชพเชจเซเช‚ เชฎเชพเชณเช–เซเช‚ เชฎเซ‡เชณเชตเซ€ เชถเช•เซ‹ เช›เซ‹, เชœเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฏเซ‹เชœเชจเชพเชจเซ€ เชนเซ‡เชถ เชฎเซ‚เชฒเซเชฏ เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡, เชœเซ‡ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชฏเซ‹เชœเชจเชพเชจเชพ เชซเซ‡เชฐเชซเชพเชฐ เช‡เชคเชฟเชนเชพเชธเชจเชพ เช…เชจเซเช—เชพเชฎเซ€ เชตเชฟเชถเซเชฒเซ‡เชทเชฃเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเชถเซ‡.
เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจ เชชเซเชฒเชพเชจ เชŸเซ‡เชฎเซเชชเชฒเซ‡เชŸ เชฎเซ‡เชณเชตเซ‹

  --Explain execution plan--
  EXECUTE 'SELECT dblink_connect(''LINK1'',''host='||database_rec.host||' dbname='||database_rec.name||' user=DATABASE password='||database_rec.owner_pwd||' '')'; 
  
  log_explain_plan = ARRAY ( SELECT * FROM dblink('LINK1', 'EXPLAIN '||log_query ) AS t (plan text) );
  log_plan_wo_costs = ARRAY ( SELECT * FROM dblink('LINK1', 'EXPLAIN ( COSTS FALSE ) '||log_query ) AS t (plan text) );
    
  PERFORM dblink_disconnect('LINK1');

เชคเช• #3 - เชฎเซ‹เชจเซ€เชŸเชฐเซ€เช‚เช— เชฎเชพเชŸเซ‡ เช•เซเชตเซ‡เชฐเซ€ เชฒเซ‹เช—เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹

เชชเชฐเซเชซเซ‹เชฐเซเชฎเชจเซเชธ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธ เชตเชฟเชจเช‚เชคเซ€เชจเชพ เชŸเซ‡เช•เซเชธเซเชŸ เชฎเชพเชŸเซ‡ เชจเชนเซ€เช‚, เชชเชฐเช‚เชคเซ เชคเซ‡เชจเชพ ID เชฎเชพเชŸเซ‡ เช—เซ‹เช เชตเซ‡เชฒ เชนเซ‹เชตเชพเชฅเซ€, เชคเชฎเชพเชฐเซ‡ เชฒเซ‹เช— เชซเชพเช‡เชฒเชฎเชพเช‚เชฅเซ€ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซ‡ เชเชตเซ€ เชตเชฟเชจเช‚เชคเซ€เช“ เชธเชพเชฅเซ‡ เชธเชพเช‚เช•เชณเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช•เซ‡ เชœเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เชชเซเชฐเชฆเชฐเซเชถเชจ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธ เช—เซ‹เช เชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เช›เซ‡.
เชธเชพเชฐเซเช‚, เช“เช›เชพเชฎเชพเช‚ เช“เช›เซเช‚ เชชเซเชฐเชฆเชฐเซเชถเชจเชจเซ€ เช˜เชŸเชจเชพเชจเซ€ เช˜เชŸเชจเชพเชจเซ‹ เชšเซ‹เช•เซเช•เชธ เชธเชฎเชฏ เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡.

เช†เชฎ, เชœเซเชฏเชพเชฐเซ‡ เชตเชฟเชจเช‚เชคเชฟ ID เชฎเชพเชŸเซ‡ เช•เซ‹เชˆ เช•เชพเชฎเช—เซ€เชฐเซ€เชจเซ€ เช˜เชŸเชจเชพ เชฌเชจเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชšเซ‹เช•เซเช•เชธ เชชเชฐเชฟเชฎเชพเชฃ เชฎเซ‚เชฒเซเชฏเซ‹ เช…เชจเซ‡ เชตเชฟเชจเช‚เชคเซ€เชจเซ‹ เชšเซ‹เช•เซเช•เชธ เช…เชฎเชฒ เชธเชฎเชฏ เช…เชจเซ‡ เช…เชตเชงเชฟ เชธเชพเชฅเซ‡เชจเซ€ เชšเซ‹เช•เซเช•เชธ เชตเชฟเชจเช‚เชคเซ€เชจเซ‹ เชธเช‚เชฆเชฐเซเชญ เชนเชถเซ‡. เชฎเชพเชคเซเชฐ เชฆเซƒเชถเซเชฏเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช†เชชเซ‡เชฒ เชฎเชพเชนเชฟเชคเซ€ เชฎเซ‡เชณเชตเซ‹ pg_stat_statements - เชคเซ‡ เชชเซเชฐเชคเชฟเชฌเช‚เชงเชฟเชค เช›เซ‡.
เช•เซเชตเซ‡เชฐเซ€เชจเซ‹ เช•เซเชตเซ‡เชฐเซ€เช†เชˆเชกเซ€ เชถเซ‹เชงเซ‹ เช…เชจเซ‡ เชฒเซ‹เช—_เช•เซเชตเซ‡เชฐเซ€ เช•เซ‹เชทเซเชŸเช•เชฎเชพเช‚ เชเชจเซเชŸเซเชฐเซ€ เช…เชชเชกเซ‡เชŸ เช•เชฐเซ‹

SELECT * 
	INTO log_query_rec
	FROM log_query
	WHERE query_md5hash = log_md5hash AND timepoint = log_timepoint ; 
	
	log_query_rec.query=regexp_replace(log_query_rec.query,';+','','g');
	
	FOR pg_stat_history_rec IN
	 SELECT 
      queryid ,
	  query 
	 FROM 
       pg_stat_db_queries 
     WHERE  
	   database_id = log_database_id AND
       queryid is not null 
	LOOP
	  pg_stat_query = pg_stat_history_rec.query ; 
	  pg_stat_query=regexp_replace(pg_stat_query,'n+',' ','g');
	  pg_stat_query=regexp_replace(pg_stat_query,'t+',' ','g');
	  pg_stat_query=regexp_replace(pg_stat_query,' +',' ','g');
	  pg_stat_query=regexp_replace(pg_stat_query,'$.','%','g');
	
	  log_query_text = trim(trailing ' ' from log_query_rec.query);
	  pg_stat_query_text = pg_stat_query; 
	  
	  --SELECT log_query_rec.query like pg_stat_query INTO found_flag ; 
	  IF (log_query_text LIKE pg_stat_query_text) THEN
		found_flag = TRUE ;
	  ELSE
		found_flag = FALSE ;
	  END IF;	  
	  
	  
	  IF found_flag THEN
	    
		UPDATE log_query SET queryid = pg_stat_history_rec.queryid WHERE query_md5hash = log_md5hash AND timepoint = log_timepoint ;
		activity_string = 	' updated queryid = '||pg_stat_history_rec.queryid||
		                    ' for log_query with id = '||log_query_rec.id		                    
		   				    ;						
					
	    RAISE NOTICE '%',activity_string;	
		EXIT ;
	  END IF ;
	  
	END LOOP ;

เช‰เชšเซเชšเชพเชฐเชฃ

เชชเชฐเชฟเชฃเชพเชฎเซ‡, เชตเชฐเซเชฃเชตเซ‡เชฒ เชชเชฆเซเชงเชคเชฟเชจเซ‡ เชคเซ‡เชจเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฎเชณเซ€ เช›เซ‡ PostgreSQL เช•เซเชตเซ‡เชฐเซ€เชเชจเชพ เชชเซเชฐเชฆเชฐเซเชถเชจเชจเซ‡ เชฎเซ‹เชจเชฟเชŸเชฐ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชตเชฟเช•เชธเชฟเชค เชธเชฟเชธเซเชŸเชฎ, เช‰เชญเชฐเชคเซ€ เช•เซเชตเซ‡เชฐเซ€ เช•เชพเชฎเช—เซ€เชฐเซ€เชจเซ€ เช˜เชŸเชจเชพเช“เชจเซ‡ เช‰เช•เซ‡เชฒเชคเซ€ เชตเช–เชคเซ‡ เชคเชฎเชจเซ‡ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชฎเชพเชŸเซ‡ เชตเชงเซ เชฎเชพเชนเชฟเชคเซ€ เชฎเซ‡เชณเชตเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡.

เชœเซ‹เช•เซ‡, เช…เชฒเชฌเชคเซเชค, เชฎเชพเชฐเชพ เช…เช‚เช—เชค เช…เชญเชฟเชชเซเชฐเชพเชฏเชฎเชพเช‚, เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซ‡เชฒ เชญเชพเช—เชจเชพ เช•เชฆเชจเซ‡ เชชเชธเช‚เชฆ เช•เชฐเชตเชพ เช…เชจเซ‡ เชฌเชฆเชฒเชตเชพ เชฎเชพเชŸเซ‡ เชเชฒเซเช—เซ‹เชฐเชฟเชงเชฎ เชชเชฐ เช•เชพเชฎ เช•เชฐเชตเซเช‚ เชนเชœเซ€ เชชเชฃ เชœเชฐเซ‚เชฐเซ€ เชฐเชนเซ‡เชถเซ‡. เชธเชพเชฎเชพเชจเซเชฏ เช•เซ‡เชธเชฎเชพเช‚ เชนเชœเซ เชธเซเชงเซ€ เชธเชฎเชธเซเชฏเชพเชจเซเช‚ เชจเชฟเชฐเชพเช•เชฐเชฃ เช†เชตเซเชฏเซเช‚ เชจเชฅเซ€. เชคเซ‡ เช•เชฆเชพเชš เชฐเชธเชชเซเชฐเชฆ เชฐเชนเซ‡เชถเซ‡.

เชชเชฐเช‚เชคเซ เชคเซ‡ เชเช• เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เช…เชฒเช— เชตเชพเชฐเซเชคเชพ เช›เซ‡ ...

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹