AWS เจ•เจฒเจพเจ‰เจก เจคเฉ‹เจ‚ เจ‡เฉฑเจ• PostgreSQL เจฒเฉŒเจ— เจ…เฉฑเจชเจฒเฉ‹เจก เจ•เจฐเจจเจพ

เจœเจพเจ‚ เจฅเฉ‹เฉœเจพ เจœเจฟเจนเจพ เจฒเจพเจ—เฉ‚ เจŸเฉˆเจŸเฉเจฐเจฟเจธเฉ‹เจฒเฉ‹เจœเฉ€.
เจนเจฐ เจจเจตเฉ€เจ‚ เจšเฉ€เจœเจผ เจชเฉเจฐเจพเจฃเฉ€ เจญเฉเฉฑเจฒ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค
เจเจชเฉ€เจ—เฉเจฐเจพเจซเจธ.
AWS เจ•เจฒเจพเจ‰เจก เจคเฉ‹เจ‚ เจ‡เฉฑเจ• PostgreSQL เจฒเฉŒเจ— เจ…เฉฑเจชเจฒเฉ‹เจก เจ•เจฐเจจเจพ

เจธเจฎเฉฑเจธเจฟเจ† เจฆเจพ เจ—เจ เจจ

เจธเจฎเฉ‡เจ‚-เจธเจฎเฉ‡เจ‚ 'เจคเฉ‡ เจฎเฉŒเจœเฉ‚เจฆเจพ PostgreSQL เจฒเฉŒเจ— เจซเจพเจˆเจฒ เจจเฉ‚เฉฐ AWS เจ•เจฒเจพเจŠเจก เจคเฉ‹เจ‚ เจธเจฅเจพเจจเจ• เจฒเฉ€เจจเจ•เจธ เจนเฉ‹เจธเจŸ เจฒเจˆ เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เจฐเจจเจพ เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเฉˆเฅค เจ…เจธเจฒ เจธเจฎเฉ‡เจ‚ เจตเจฟเฉฑเจš เจจเจนเฉ€เจ‚, เจชเจฐ, เจ•เฉ€ เจ…เจธเฉ€เจ‚ เจฅเฉ‹เฉœเฉ€ เจฆเฉ‡เจฐเฉ€ เจจเจพเจฒ เจ•เจนเจพเจ‚เจ—เฉ‡เฅค
เจฒเฉŒเจ— เจซเจพเจˆเจฒ เจ…เฉฑเจชเจกเฉ‡เจŸ เจกเจพเจŠเจจเจฒเฉ‹เจก เจฆเฉ€ เจฎเจฟเจ†เจฆ 5 เจฎเจฟเฉฐเจŸ เจนเฉˆเฅค
เจฒเฉŒเจ— เจซเจพเจˆเจฒ, AWS เจตเจฟเฉฑเจš, เจนเจฐ เจ˜เฉฐเจŸเฉ‡ เจ˜เฉเฉฐเจฎเจพเจˆ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค

เจตเจฐเจคเฉ‡ เจ—เจ เจธเฉฐเจฆ

เจฒเฉŒเจ— เจซเจพเจˆเจฒ เจจเฉ‚เฉฐ เจนเฉ‹เจธเจŸ เจ‰เฉฑเจคเฉ‡ เจ…เจชเจฒเฉ‹เจก เจ•เจฐเจจ เจฒเจˆ, เจ‡เฉฑเจ• bash เจธเจ•เฉเจฐเจฟเจชเจŸ เจตเจฐเจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ เจœเฉ‹ AWS API เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐเจฆเฉ€ เจนเฉˆ "aws rds เจกเจพเจ‰เจจเจฒเฉ‹เจก-db-เจฒเฉŒเจ—-เจซเจพเจ‡เจฒ-เจญเจพเจ—".

เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ:

  • --db-instance-identifier: 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 - เจ‡เจน เจฎเจจเฉเจนเจพ เจนเฉˆ.
เจชเฉเฉฑเจ›เจ—เจฟเฉฑเจ› เจฆเจพ queryid เจฒเฉฑเจญเฉ‹ เจ…เจคเฉ‡ log_query เจธเจพเจฐเจฃเฉ€ เจตเจฟเฉฑเจš เจเจ‚เจŸเจฐเฉ€ เจจเฉ‚เฉฐ เจ…เฉฑเจชเจกเฉ‡เจŸ เจ•เจฐเฉ‹

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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹