AWS เด•เตเดฒเต—เดกเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเต PostgreSQL เดฒเต‹เด—เต เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด…เดฒเตเดชเด‚ เด…เดชเตเดฒเตˆเดกเต เดŸเต†เดŸเตเดฐเดฟเดธเต‹เดณเดœเดฟ.
เดชเตเดคเดฟเดฏเดคเต†เดฒเตเดฒเดพเด‚ เดชเดดเดฏเดคเต เดจเดจเตเดจเดพเดฏเดฟ เดฎเดฑเดจเตเดจเต.
เดŽเดชเตเดชเดฟเด—เตเดฐเดพเดซเตเด•เตพ.
AWS เด•เตเดฒเต—เดกเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเต PostgreSQL เดฒเต‹เด—เต เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เดชเตเดฐเดถเตเดจ เดชเตเดฐเดธเตเดคเดพเดตเดจ

เดจเดฟเดฒเดตเดฟเดฒเต† PostgreSQL เดฒเต‹เด—เต เดซเดฏเตฝ AWS เด•เตเดฒเต—เดกเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฟเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเดพเดฆเต‡เดถเดฟเด• เดฒเดฟเดจเด•เตเดธเต เดนเต‹เดธเตเดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต เด‡เดŸเดฏเตเด•เตเด•เดฟเดŸเต† เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เดคเดคเตเดธเดฎเดฏเด‚ เด…เดฒเตเดฒ, เดชเด•เตเดทเต‡, เด’เดฐเต เดšเต†เดฑเดฟเดฏ เด•เดพเดฒเดคเดพเดฎเดธเดคเตเดคเต‹เดŸเต† เดชเดฑเดฏเดพเด‚.
เดฒเต‹เด—เต เดซเดฏเตฝ เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเต เดกเต—เตบเดฒเต‹เดกเต เด•เดพเดฒเดฏเดณเดตเต 5 เดฎเดฟเดจเดฟเดฑเตเดฑเดพเดฃเต.
AWS-เดฒเต† เดฒเต‹เด—เต เดซเดฏเตฝ เด“เดฐเต‹ เดฎเดฃเดฟเด•เตเด•เต‚เดฑเดฟเดฒเตเด‚ เดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เด‰เดชเดฏเต‹เด—เดฟเดšเตเดš เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ

เดฒเต‹เด—เต เดซเดฏเตฝ เดนเต‹เดธเตเดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, AWS API "เดŽเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดฌเดพเดทเต เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต.aws rds download-db-log-file-portion".

เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ:

  • -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 เดฒเต‹เด—เต เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต
เดชเตŠเดคเตเดตเต‡, เดชเตเดฐเดคเตเดฏเต‡เด• เดชเตเดฐเดถเตเดจเด™เตเด™เดณเตŠเดจเตเดจเตเด‚ เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเดฟเดฒเตเดฒ. เด’เดฐเต เดชเตเดฐเดพเดฐเด‚เดญ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต เด•เต‹เดดเตเดธเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เด’เดฐเต เดธเดพเดงเดพเดฐเดฃ เดชเตเดฐเดถเตเดจเด‚.

เด’เดชเตเดฑเตเดฑเดฟเดฎเตฝ เดธเต†เตผเดตเดฟเด‚เด—เต เดธเตˆเดธเต

เดŽเดจเตเดจเดพเตฝ เด‡เดคเต เด•เตเดฑเดšเตเดšเตเด•เต‚เดŸเดฟ เดฐเดธเด•เดฐเดฎเดพเดฃเต.
เดจเดฟเตผเดญเดพเด—เตเดฏเดตเดถเดพเตฝ, เด†เดฐเด‚เดญ เดญเดพเด—เด‚ เดฒเต‡เดฌเดฒเดฟเดจเต เดถเต‡เดทเด‚ เด’เดฐเต เด“เดซเตโ€Œเดธเต†เดฑเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เด’เดฐเต เดฎเดพเตผเด—เดตเตเดฎเดฟเดฒเตเดฒ:

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดคเดฟเดจเด•เด‚ เด“เดชเตโ€Œเดทเตป เด…เดฑเดฟเดฏเดพเดตเตเดจเตเดจเดคเต เดชเต‹เดฒเต†, เดชเต‡เดœเต เดšเต†เดฏเตเดฏเตฝ เดŽเดตเดฟเดŸเต† เดคเตเดŸเด™เตเด™เดฃเดฎเต†เดจเตเดจเต เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดพเตป เดธเตเดฑเตเดฑเดพเตผเดŸเตเดŸเดฟเด‚เด—เต-เดŸเต‹เด•เตเด•เตบ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. เดˆ เด“เดชเตโ€Œเดทเตป เดธเตเดŸเตเดฐเดฟเด‚เด—เต เดฎเต‚เดฒเตเดฏเด™เตเด™เตพ เดŽเดŸเตเด•เตเด•เตเดจเตเดจเต, เด…เดคเดฟเดจเตผเดคเตเดฅเด‚ เดจเดฟเด™เตเด™เตพ เด…เดŸเตเดคเตเดค เดŸเต‹เด•เตเด•เตบ เดธเตเดŸเตเดฐเดฟเด‚เด—เดฟเดจเต เดฎเตเดจเตเดจเดฟเตฝ เด’เดฐเต เด“เดซเตโ€Œเดธเต†เดฑเตเดฑเต เดฎเต‚เดฒเตเดฏเด‚ เดšเต‡เตผเด•เตเด•เดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เด“เดชเตเดทเตป เด“เดซเตโ€Œเดธเต†เดฑเตเดฑเดพเดฏเดฟ เดชเดฐเดฟเด—เดฃเดฟเด•เตเด•เดฟเดฒเตเดฒ เดŽเดจเตเดจเดพเดฃเต.

เด…เดคเดฟเดจเดพเตฝ, เดจเดฟเด™เตเด™เตพ เด‡เดคเต เด•เดทเดฃเด™เตเด™เดณเดพเดฏเดฟ เดตเดพเดฏเดฟเด•เตเด•เดฃเด‚.
เดจเดฟเด™เตเด™เตพ เดตเดฒเดฟเดฏ เดญเดพเด—เด™เตเด™เดณเดฟเตฝ เดตเดพเดฏเดฟเด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดตเดพเดฏเดจเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚ เด•เตเดฑเดตเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚, เดŽเดจเตเดจเดพเตฝ เดตเต‹เดณเดฟเดฏเด‚ เดชเดฐเดฎเดพเดตเดงเดฟ เด†เดฏเดฟเดฐเดฟเด•เตเด•เตเด‚.
เดจเดฟเด™เตเด™เตพ เดšเต†เดฑเดฟเดฏ เดญเดพเด—เด™เตเด™เดณเดฟเตฝ เดตเดพเดฏเดฟเด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดจเต‡เดฐเต†เดฎเดฑเดฟเดšเตเดšเต, เดตเดพเดฏเดจเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚ เดชเดฐเดฎเดพเดตเดงเดฟ เด†เดฏเดฟเดฐเดฟเด•เตเด•เตเด‚, เดชเด•เตเดทเต‡ เดตเต‹เดณเดฟเดฏเด‚ เดตเดณเดฐเต† เด•เตเดฑเดตเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚.
เด…เดคเดฟเดจเดพเตฝ, เดŸเตเดฐเดพเดซเดฟเด•เต เด•เตเดฑเดฏเตเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เดชเดฐเดฟเดนเดพเดฐเดคเตเดคเดฟเดจเตเดฑเต† เดฎเตŠเดคเตเดคเดคเตเดคเดฟเดฒเตเดณเตเดณ เดธเต—เดจเตเดฆเดฐเตเดฏเดคเตเดคเดฟเดจเตเด‚, เดŽเดจเดฟเด•เตเด•เต เด’เดฐเต เดชเดฐเดฟเดนเดพเดฐเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเต‡เดฃเตเดŸเดฟเดตเดจเตเดจเต, เด…เดคเต เดจเดฟเตผเดญเดพเด—เตเดฏเดตเดถเดพเตฝ, เด’เดฐเต เดŠเดจเตเดจเตเดตเดŸเดฟ เดชเต‹เดฒเต†เดฏเดพเดฃเต.

เดšเดฟเดคเตเดฐเต€เด•เดฐเดฃเดคเตเดคเดฟเดจเดพเดฏเดฟ, เดตเดณเดฐเต† เดฒเดณเดฟเดคเดฎเดพเด•เตเด•เดฟเดฏ 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- ัะผะฟะธั€ะธั‡ะตัะบะธะผ ะฟัƒั‚ะตะผ, ะฟะพะดะพะฑั€ะฐะฝะฝั‹ะน ะฝะฐั‡ะฐะปัŒะฝั‹ะน ั€ะฐะทะผะตั€ ะฟะพั€ั†ะธะธ.

เดชเต‚เตผเดฃเตเดฃ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดŸเต†เด•เตเดธเตเดฑเตเดฑเต

download_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
  • เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดเดกเดฟ: 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

เด‡เดชเตเดชเต‹เตพ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฒเต‹เด—เต เดซเดฏเดฒเดฟเตฝ เดจเดฟเดจเตเดจเต เดคเดฟเดฐเดžเตเดžเต†เดŸเตเดคเตเดค เด…เดญเตเดฏเตผเดคเตเดฅเดจเดฏเตเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚.

เด•เต‚เดŸเดพเดคเต† เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเดฏ เดจเดฟเดฐเดตเดงเดฟ เด…เดตเดธเดฐเด™เตเด™เตพ เดคเตเดฑเด•เตเด•เตเดจเตเดจเต.

เดชเดพเดดเตโ€Œเดธเต เดšเต†เดฏเตโ€Œเดค เดšเต‹เดฆเตเดฏเด™เตเด™เตพ เดŽเดตเดฟเดŸเต†เดฏเต†เด™เตเด•เดฟเดฒเตเด‚ เดธเต‚เด•เตเดทเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เด‡เดคเดฟเดจเดพเดฏเดฟ เด’เดฐเต เดธเต‡เดตเดจ เดชเดŸเตเดŸเดฟเด• เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต เดฒเต‹เด—เต_เด•เตเดตเดฑเดฟ

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.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_queries, เดชเดŸเตเดŸเดฟเด•เดฏเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดจเดฟเดฒเดตเดฟเดฒเต† เด…เดจเตเดตเต‡เดทเดฃเด™เตเด™เดณเตเดŸเต† เด’เดฐเต เดธเตเดจเดพเดชเตเดชเตเดทเต‹เดŸเตเดŸเต เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต 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 - เดจเดฟเดฐเต€เด•เตเดทเดฃเดคเตเดคเดฟเดจเดพเดฏเดฟ เด…เดจเตเดตเต‡เดทเดฃ เดฒเต‹เด—เต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต

เดชเตเดฐเด•เดŸเดจ เดฎเต†เดŸเตเดฐเดฟเด•เตโ€Œเดธเต เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตโ€Œเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดตเดพเดšเด•เดคเตเดคเดฟเดฒเดฒเตเดฒ, เดฎเดฑเดฟเดšเตเดšเต เด…เดคเดฟเดจเตเดฑเต† เดเดกเดฟเดฏเดฟเดฒเดพเดฏเดคเดฟเดจเดพเตฝ, เดชเตเดฐเด•เดŸเดจ เดฎเต†เดŸเตเดฐเดฟเด•เตโ€Œเดธเต เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตโ€Œเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เดณเตเดฎเดพเดฏเดฟ เดฒเต‹เด—เต เดซเดฏเดฒเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เดจเดฟเด™เตเด™เตพ เดฌเดจเตเดงเดชเตเดชเต†เดŸเตเดคเตเดคเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต.
เดถเดฐเดฟ, เด•เตเดฑเดžเตเดžเดคเต เด’เดฐเต เดชเตเดฐเด•เดŸเดจ เดธเด‚เดญเดตเดคเตเดคเดฟเดจเตเดฑเต† เด•เตƒเดคเตเดฏเดฎเดพเดฏ เดธเดฎเดฏเด‚ เดฒเดญเดฟเด•เตเด•เดพเตป.

เดˆ เดฐเต€เดคเดฟเดฏเดฟเตฝ, เด’เดฐเต เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดเดกเดฟเด•เตเด•เดพเดฏเดฟ เด’เดฐเต เดชเตเดฐเด•เดŸเดจ เดธเด‚เดญเดตเด‚ เดธเด‚เดญเดตเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเตผ เดฎเต‚เดฒเตเดฏเด™เตเด™เดณเตเด‚ เด…เดญเตเดฏเตผเดคเตเดฅเดจเดฏเตเดŸเต† เด•เตƒเดคเตเดฏเดฎเดพเดฏ เดจเดฟเตผเดตเตเดตเดนเดฃ เดธเดฎเดฏเดตเตเด‚ เดฆเตˆเตผเด˜เตเดฏเดตเตเด‚ เด‰เดณเตเดณ เด’เดฐเต เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เด…เดญเตเดฏเตผเดคเตเดฅเดจเดฏเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เดฒเดฟเด™เตเด•เต เด‰เดฃเตเดŸเดพเด•เตเด‚. เด•เดพเดดเตเดš เดฎเดพเดคเตเดฐเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดˆ เดตเดฟเดตเดฐเด™เตเด™เตพ เดจเต‡เดŸเตเด• pg_stat_statements - เด…เดคเต เดจเดฟเดฐเต‹เดงเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.
เด…เดญเตเดฏเตผเดคเตเดฅเดจเดฏเตเดŸเต† เดšเต‹เดฆเตเดฏเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเดฟ 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 ;

Afterword

เดตเดฟเดตเดฐเดฟเดšเตเดš เดธเดพเด™เตเด•เต‡เดคเดฟเด•เดค เด’เดŸเตเดตเดฟเตฝ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด•เดฃเตเดŸเต†เดคเตเดคเดฟ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเดšเตเดš PostgreSQL เด…เดจเตเดตเต‡เดทเดฃ เดชเตเดฐเด•เดŸเดจ เดจเดฟเดฐเต€เด•เตเดทเดฃ เดธเด‚เดตเดฟเดงเดพเดจเด‚, เด‰เดฏเตผเดจเตเดจเตเดตเดฐเตเดจเตเดจ เด…เดจเตเดตเต‡เดทเดฃ เดชเตเดฐเด•เดŸเดจ เดธเด‚เดญเดตเด™เตเด™เตพ เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดตเดฟเดถเด•เดฒเดจเด‚ เดšเต†เดฏเตเดฏเดพเตป เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดตเดฐเด™เตเด™เตพ เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต.

เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เดŽเดจเตเดฑเต† เดตเตเดฏเด•เตเดคเดฟเดชเดฐเดฎเดพเดฏ เด…เดญเดฟเดชเตเดฐเดพเดฏเดคเตเดคเดฟเตฝ, เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดค เดญเดพเด—เดคเตเดคเดฟเดจเตเดฑเต† เดตเดฒเตเดชเตเดชเด‚ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เดฎเดพเดฑเตเดฑเตเดจเตเดจเดคเดฟเดจเตเดฎเดพเดฏเดฟ เด…เตฝเด—เต‹เดฐเดฟเดคเดคเตเดคเดฟเตฝ เด•เต‚เดŸเตเดคเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเต เด†เดตเดถเตเดฏเดฎเดพเดฃเต. เดชเตŠเดคเตเดตเดพเดฏ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ เดชเตเดฐเดถเตเดจเด‚ เด‡เดคเตเดตเดฐเต† เดชเดฐเดฟเดนเดฐเดฟเดšเตเดšเดฟเดŸเตเดŸเดฟเดฒเตเดฒ. เด…เดคเต เด’เดฐเตเดชเด•เตเดทเต‡ เดฐเดธเด•เดฐเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚.

เดŽเดจเตเดจเดพเตฝ เด‡เดคเต เดคเดฟเด•เดšเตเดšเตเด‚ เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฏ เด•เดฅเดฏเดพเดฃเต ...

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•