AWS āĻ•ā§āϞāĻžāωāĻĄ āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻŋ PostgreSQL āϞāĻ— āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇

āĻ…āĻĨāĻŦāĻž āĻāĻ•āϟ⧁ āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰāĻž āĻŸā§‡āĻŸā§āϰāĻŋāϏ⧋āϞāϜāĻŋāĨ¤
āύāϤ⧁āύ āϏāĻŦāĻ•āĻŋāϛ⧁ āĻĒ⧁āϰāĻžāύ⧋ āĻ­āĻžāϞ⧋āĻ­āĻžāĻŦ⧇ āϭ⧁āϞ⧇ āϗ⧇āϛ⧇āĨ¤
āĻāĻĒāĻŋāĻ—ā§āϰāĻžāĻĢāĨ¤
AWS āĻ•ā§āϞāĻžāωāĻĄ āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻŋ PostgreSQL āϞāĻ— āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇

āϏāĻŽāĻ¸ā§āϝāĻž āĻ—āĻ āύ

āĻĒāĻ°ā§āϝāĻžāϝāĻŧāĻ•ā§āϰāĻŽā§‡ AWS āĻ•ā§āϞāĻžāωāĻĄ āĻĨ⧇āϕ⧇ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ āĻŦāĻ°ā§āϤāĻŽāĻžāύ PostgreSQL āϞāĻ— āĻĢāĻžāχāϞāϟāĻŋ āĻĄāĻžāωāύāϞ⧋āĻĄ āĻ•āϰāĻž āĻĒā§āϰāϝāĻŧā§‹āϜāύāĨ¤ Linux āĻšā§‹āĻ¸ā§āϟāĨ¤ āϰāĻŋāϝāĻŧ⧇āϞ āϟāĻžāχāĻŽā§‡ āύāϝāĻŧ, āĻŦāϰāĻ‚, āϧāϰāĻž āϝāĻžāĻ•, āϏāĻžāĻŽāĻžāĻ¨ā§āϝ āĻĻ⧇āϰāĻŋāϤ⧇āĨ¤
āϞāĻ— āĻĢāĻžāχāϞ āφāĻĒāĻĄā§‡āϟ āĻĄāĻžāωāύāϞ⧋āĻĄā§‡āϰ āϏāĻŽāϝāĻŧāĻ•āĻžāϞ 5 āĻŽāĻŋāύāĻŋāϟāĨ¤
AWS-āĻ āϞāĻ— āĻĢāĻžāχāϞāϟāĻŋ āĻĒā§āϰāϤāĻŋ āϘāĻ¨ā§āϟāĻžāϝāĻŧ āĻ˜ā§‹āϰāĻžāύ⧋ āĻšāϝāĻŧāĨ¤

āĻŦā§āϝāĻŦāĻšā§ƒāϤ āϏāϰāĻžā§āϜāĻžāĻŽ

āĻšā§‹āĻ¸ā§āĻŸā§‡ āϞāĻ— āĻĢāĻžāχāϞ āĻĄāĻžāωāύāϞ⧋āĻĄ āĻ•āϰāϤ⧇, āĻāĻ•āϟāĻŋ āĻŦā§āϝāĻžāĻļ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧ āϝāĻž AWS API āĻ•āϞ āĻ•āϰ⧇ "aws rds āĻĄāĻžāωāύāϞ⧋āĻĄ-āĻĄāĻŋāĻŦāĻŋ-āϞāĻ—-āĻĢāĻžāχāϞ-āĻ…āĻ‚āĻļÂģ.

āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ:

  • —db-āχāύāĻ¸ā§āĻŸā§āϝāĻžāĻ¨ā§āϏ-āφāχāĻĄā§‡āĻ¨ā§āϟāĻŋāĻĢāĻžāϝāĻŧāĻžāϰ: AWS āχāύāĻ¸ā§āĻŸā§āϝāĻžāĻ¨ā§āϏ āύāĻžāĻŽ;
  • --log-file-name: āĻŦāĻ°ā§āϤāĻŽāĻžāύ⧇ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āϞāĻ— āĻĢāĻžāχāϞ⧇āϰ āύāĻžāĻŽ
  • --max-item: āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āφāωāϟāĻĒ⧁āĻŸā§‡ āĻĢāĻŋāϰ⧇ āφāϏāĻž āφāχāĻŸā§‡āĻŽā§‡āϰ āĻŽā§‹āϟ āϏāĻ‚āĻ–ā§āϝāĻžāĨ¤āĻĄāĻžāωāύāϞ⧋āĻĄ āĻ•āϰāĻž āĻĢāĻžāχāϞ⧇āϰ āĻ…āĻ‚āĻļ⧇āϰ āφāĻ•āĻžāϰāĨ¤
  • --āĻ¸ā§āϟāĻžāĻ°ā§āϟāĻŋāĻ‚-āĻŸā§‹āϕ⧇āύ: āĻ¸ā§āϟāĻžāĻ°ā§āϟāĻŋāĻ‚ āĻŸā§‹āϕ⧇āύ

āĻāχ āĻŦāĻŋāĻļ⧇āώ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇, āĻ•āĻžāĻœā§‡āϰ āϏāĻŽāϝāĻŧ āϞāĻ— āϞ⧋āĻĄ āĻ•āϰāĻžāϰ āĻ•āĻžāϜāϟāĻŋ āĻĻ⧇āĻ–āĻž āĻĻ⧇āϝāĻŧ PostgreSQL āĻ•ā§āϝ⧋āϝāĻŧāĻžāϰ⧀ āĻ•āĻ°ā§āĻŽāĻ•ā§āώāĻŽāϤāĻž āύāĻŋāϰ⧀āĻ•ā§āώāĻŖāĨ¤

āĻāĻŦāĻ‚ āĻāϟāĻŋ āϏāĻšāϜ - āĻ•āĻžāĻœā§‡āϰ āϏāĻŽāϝāĻŧ āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāĻŖ āĻāĻŦāĻ‚ āĻŦ⧈āϚāĻŋāĻ¤ā§āĻ°ā§āϝ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āφāĻ•āĻ°ā§āώāĻŖā§€āϝāĻŧ āĻ•āĻžāϜāĨ¤
āφāĻŽāĻŋ āϧāϰ⧇ āύ⧇āĻŦ āϝ⧇ āĻĻ⧈āύāĻ¨ā§āĻĻāĻŋāύ āĻœā§€āĻŦāύ⧇āϰ āĻ•āĻžāϰāϪ⧇ āϏāĻŽāĻ¸ā§āϝāĻžāϟāĻŋ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇ āϏāĻŽāĻžāϧāĻžāύ āĻšāϝāĻŧ⧇ āϗ⧇āϛ⧇āĨ¤ āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻāĻ•āϟāĻŋ āĻĻā§āϰ⧁āϤ Google āϕ⧋āύ⧋ āϏāĻŽāĻžāϧāĻžāύ āĻĒā§āϰāĻ¸ā§āϤāĻžāĻŦ āĻ•āϰ⧇āύāĻŋ, āĻāĻŦāĻ‚ āφāĻŽāĻžāϰ āφāϰāĻ“ āĻ—āĻ­ā§€āϰ⧇ āĻ…āύ⧁āϏāĻ¨ā§āϧāĻžāύ āĻ•āϰāĻžāϰ āϖ⧁āĻŦ āĻŦ⧇āĻļāĻŋ āχāĻšā§āĻ›āĻž āĻ›āĻŋāϞ āύāĻžāĨ¤ āϝ⧇āĻ­āĻžāĻŦ⧇āχ āĻšā§‹āĻ•, āĻāϟāĻž āĻāĻ•āϟāĻž āĻ­āĻžāϞ⧋ āĻ“āϝāĻŧāĻžāĻ°ā§āĻ•āφāωāϟāĨ¤

āĻ•āĻžāĻœā§‡āϰ āφāύ⧁āĻˇā§āĻ āĻžāύāĻŋāϕ⧀āĻ•āϰāĻŖ

āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āϤ āϞāĻ— āĻĢāĻžāχāϞ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύāĻļā§€āϞ āĻĻ⧈āĻ°ā§āĻ˜ā§āϝ⧇āϰ āĻ…āύ⧇āĻ• āϞāĻžāχāύ āĻĨāĻžāϕ⧇āĨ¤ āĻ—ā§āϰāĻžāĻĢāĻŋāĻ•āĻ­āĻžāĻŦ⧇, āϞāĻ— āĻĢāĻžāχāϞāϟāĻŋ āĻāϰāĻ•āĻŽ āĻ•āĻŋāϛ⧁ āωāĻĒāĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇:
AWS āĻ•ā§āϞāĻžāωāĻĄ āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻŋ PostgreSQL āϞāĻ— āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇

āĻāϟāĻž āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇ āĻ•āĻŋāϛ⧁ āĻŽāύ⧇ āĻ•āϰāĻŋāϝāĻŧ⧇ āĻĻ⧇āϝāĻŧ? āĻŸā§‡āĻŸā§āϰāĻŋāϏ āĻāϰ āϏāĻžāĻĨ⧇ āĻ•āĻŋ āĻ•āϰāĻžāϰ āφāϛ⧇? āĻāĻŦāĻ‚ āĻāĻ–āĻžāύ⧇ āĻāϟāĻž āĻ•āĻŋ āĻāϟāĻž āϏāĻ™ā§āϗ⧇ āĻ•āĻŋ āφāϛ⧇.
āφāĻŽāϰāĻž āϝāĻĻāĻŋ āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āĻĢāĻžāχāϞāϟāĻŋ āĻ—ā§āϰāĻžāĻĢāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āϞ⧋āĻĄ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āωāĻĻā§āĻ­ā§‚āϤ āϏāĻŽā§āĻ­āĻžāĻŦā§āϝ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāϗ⧁āϞāĻŋ āĻ•āĻ˛ā§āĻĒāύāĻž āĻ•āϰāĻŋ (āϏāϰāϞāϤāĻžāϰ āϜāĻ¨ā§āϝ, āĻāχ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇, āϞāĻžāχāύāϗ⧁āϞāĻŋāϰ āĻĻ⧈āĻ°ā§āĻ˜ā§āϝ āĻāĻ•āχ āĻĨāĻžāϕ⧁āĻ•), āφāĻŽāϰāĻž āĻĒāĻžāχ āĻ¸ā§āĻŸā§āϝāĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ āĻŸā§‡āĻŸā§āϰāĻŋāϏ āϟ⧁āĻ•āϰāĻž:

1) āĻĢāĻžāχāϞāϟāĻŋ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖāϰ⧂āĻĒ⧇ āĻĄāĻžāωāύāϞ⧋āĻĄ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ āĻāĻŦāĻ‚ āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āϤāĨ¤ āĻ…āĻ‚āĻļ⧇āϰ āφāĻ•āĻžāϰ āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āϤ āĻĢāĻžāχāϞ⧇āϰ āφāĻ•āĻžāϰ⧇āϰ āĻšā§‡āϝāĻŧ⧇ āĻŦāĻĄāĻŧ:
AWS āĻ•ā§āϞāĻžāωāĻĄ āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻŋ PostgreSQL āϞāĻ— āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇

2) āĻĢāĻžāχāϞ āϚāϞāϤ⧇ āĻĨāĻžāϕ⧇āĨ¤ āĻ–āĻŖā§āĻĄā§‡āϰ āφāĻ•āĻžāϰ āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āϤ āĻĢāĻžāχāϞ⧇āϰ āφāĻ•āĻžāϰ⧇āϰ āĻšā§‡āϝāĻŧ⧇ āϛ⧋āϟ:
AWS āĻ•ā§āϞāĻžāωāĻĄ āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻŋ PostgreSQL āϞāĻ— āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇

3) āĻĢāĻžāχāϞāϟāĻŋ āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āĻĢāĻžāχāϞ⧇āϰ āĻāĻ•āϟāĻŋ āϧāĻžāϰāĻžāĻŦāĻžāĻšāĻŋāĻ•āϤāĻž āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ āϧāĻžāϰāĻžāĻŦāĻžāĻšāĻŋāĻ•āϤāĻž āϰāϝāĻŧ⧇āϛ⧇āĨ¤ āĻ–āĻŖā§āĻĄā§‡āϰ āφāĻ•āĻžāϰ āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āϤ āĻĢāĻžāχāϞ⧇āϰ āĻ…āĻŦāĻļāĻŋāĻˇā§āϟ āφāĻ•āĻžāϰ⧇āϰ āĻšā§‡āϝāĻŧ⧇ āϛ⧋āϟ:
AWS āĻ•ā§āϞāĻžāωāĻĄ āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻŋ PostgreSQL āϞāĻ— āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇

4) āĻĢāĻžāχāϞāϟāĻŋ āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āĻĢāĻžāχāϞ⧇āϰ āĻāĻ•āϟāĻŋ āϧāĻžāϰāĻžāĻŦāĻžāĻšāĻŋāĻ•āϤāĻž āĻāĻŦāĻ‚ āĻāϟāĻŋ āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āϤāĨ¤ āĻ–āĻŖā§āĻĄā§‡āϰ āφāĻ•āĻžāϰ āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āϤ āĻĢāĻžāχāϞ⧇āϰ āĻ…āĻŦāĻļāĻŋāĻˇā§āϟ āφāĻ•āĻžāϰ⧇āϰ āĻšā§‡āϝāĻŧ⧇ āĻŦāĻĄāĻŧ:
AWS āĻ•ā§āϞāĻžāωāĻĄ āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻŋ PostgreSQL āϞāĻ— āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇

āϟāĻžāĻ¸ā§āĻ• āĻāĻ•āϟāĻŋ āφāϝāĻŧāϤāĻ•ā§āώ⧇āĻ¤ā§āϰ āĻāĻ•āĻ¤ā§āϰāĻŋāϤ āĻ•āϰāĻž āĻŦāĻž āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻ¸ā§āϤāϰ⧇ Tetris āϖ⧇āϞāĻž āĻšāϝāĻŧ.
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- ŅĐŧĐŋĐ¸Ņ€Đ¸Ņ‡ĐĩҁĐēиĐŧ ĐŋŅƒŅ‚ĐĩĐŧ, ĐŋĐžĐ´ĐžĐąŅ€Đ°ĐŊĐŊŅ‹Đš ĐŊĐ°Ņ‡Đ°ĐģҌĐŊŅ‹Đš Ņ€Đ°ĐˇĐŧĐĩŅ€ ĐŋĐžŅ€Ņ†Đ¸Đ¸.

āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āĻĒāĻžāĻ ā§āϝ

āĻĄāĻžāωāύāϞ⧋āĻĄ_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

āĻāĻ–āύ āφāĻĒāύāĻŋ āϞāĻ— āĻĢāĻžāχāϞ āĻĨ⧇āϕ⧇ āύāĻŋāĻ°ā§āĻŦāĻžāϚāĻŋāϤ āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

āĻāĻŦāĻ‚ āĻŦ⧇āĻļ āĻ•āĻŋāϛ⧁ āĻĻāϰāĻ•āĻžāϰ⧀ āϏ⧁āϝ⧋āĻ— āωāĻ¨ā§āĻŽā§āĻ•ā§āϤāĨ¤

āĻĒāĻžāĻ°ā§āϏ āĻ•āϰāĻž āĻĒā§āϰāĻļā§āύ āϕ⧋āĻĨāĻžāĻ“ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻž āĻĒā§āϰāϝāĻŧā§‹āϜāύ. āĻāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻĒāϰāĻŋāώ⧇āĻŦāĻž āĻŸā§‡āĻŦāĻŋāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧ 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_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 - āĻāϟāĻž āύāĻŋāώāĻŋāĻĻā§āϧ.
āĻ…āύ⧁āϰ⧋āϧ⧇āϰ 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

DDoS āϏ⧁āϰāĻ•ā§āώāĻž, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏāĻš āϏāĻžāχāϟāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ đŸ”Ĩ DDoS āϏ⧁āϰāĻ•ā§āώāĻž āϏāĻš āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ | ProHoster