AWS рдХреНрд▓рд╛рдЙрдбрд╡рд░реВрди PostgreSQL рд▓реЙрдЧ рдЕрдкрд▓реЛрдб рдХрд░рдд рдЖрд╣реЗ

рдХрд┐рдВрд╡рд╛ рдереЛрдбреЗрд╕реЗ рдЙрдкрдпреЛрдЬрд┐рдд рдЯреЗрдЯреНрд░рд┐рд╕реЛрд▓реЙрдЬреА.
рдирд╡реАрди рд╕рд░реНрд╡ рдХрд╛рд╣реА рдЬреБрдиреЗ рд╡рд┐рд╕рд░рд▓реЗ рдЬрд╛рддреЗ.
рдПрдкрд┐рдЧреНрд░рд╛рдлреНрд╕.
AWS рдХреНрд▓рд╛рдЙрдбрд╡рд░реВрди PostgreSQL рд▓реЙрдЧ рдЕрдкрд▓реЛрдб рдХрд░рдд рдЖрд╣реЗ

рд╕рдорд╕реНрдпреЗрдЪреА рдирд┐рд░реНрдорд┐рддреА

AWS рдХреНрд▓рд╛рдКрдбрд╡рд░реВрди рд╕рдзреНрдпрд╛рдЪреА PostgreSQL рд▓реЙрдЧ рдлрд╛рдИрд▓ рд╡реЗрд│реЛрд╡реЗрд│реА рд╕реНрдерд╛рдирд┐рдХ рдард┐рдХрд╛рдгреА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. Linux рд╣реЛрд╕реНрдЯ. рд░рд┐рдЕрд▓ рдЯрд╛рдЗрдордордзреНрдпреЗ рдирд╛рд╣реА, рдкрдг, рдЕрд╕рдВ рдореНрд╣рдгреВрдпрд╛ рдХреА, рдереЛрдбреНрдпрд╛ рд╡рд┐рд▓рдВрдмрд╛рдиреЗ.
рд▓реЙрдЧ рдлрд╛рдЗрд▓ рдЕрдкрдбреЗрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд╛рд▓рд╛рд╡рдзреА рел рдорд┐рдирд┐рдЯреЗ рдЖрд╣реЗ.
AWS рдордзреАрд▓ рд▓реЙрдЧ рдлрд╛рдЗрд▓ рджрд░ рддрд╛рд╕рд╛рд▓рд╛ рдлрд┐рд░рд╡рд▓реА рдЬрд╛рддреЗ.

рд╡рд╛рдкрд░рд▓реЗрд▓реА рд╕рд╛рдзрдиреЗ

рд╣реЛрд╕реНрдЯрд╡рд░ рд▓реЙрдЧ рдлрд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдПрдХ рдмреЕрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд╛рдкрд░рд▓реА рдЬрд╛рддреЗ рдЬреА AWS API рд▓рд╛ рдХреЙрд▓ рдХрд░рддреЗ "aws rds рдбрд╛рдЙрдирд▓реЛрдб-db-рд▓реЙрдЧ-рдлрд╛рдЗрд▓-рднрд╛рдЧ┬╗.

рдорд╛рдкрджрдВрдб:

  • --db-рдЗрдВрд╕реНрдЯрдиреНрд╕-рдЖрдпрдбреЗрдВрдЯрд┐рдлрд╛рдпрд░: AWS рдЗрдВрд╕реНрдЯрдиреНрд╕ рдирд╛рд╡;
  • --log-file-name: рд╕рдзреНрдпрд╛ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд▓реЙрдЧ рдлрд╛рдЗрд▓рдЪреЗ рдирд╛рд╡
  • --max-item: рдХрдорд╛рдВрдб рдЖрдЙрдЯрдкреБрдЯрдордзреНрдпреЗ рдкрд░рдд рдЖрд▓реЗрд▓реНрдпрд╛ рдЖрдпрдЯрдордЪреА рдПрдХреВрдг рд╕рдВрдЦреНрдпрд╛.рдбрд╛рдЙрдирд▓реЛрдб рдХреЗрд▓реНрдпрд╛ рдЬрд╛рдгрд╛рд▒реНрдпрд╛ рдлрд╛рдИрд▓рдЪрд╛ рднрд╛рдЧ рдЖрдХрд╛рд░.
  • --рд╕реНрдЯрд╛рд░реНрдЯрд┐рдВрдЧ-рдЯреЛрдХрди: рд╕реБрд░реБрд╡рд╛рддреАрдЪрд╛ рднрд╛рдЧ рдЯреЛрдХрди

рдпрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд░рдгрд╛рдд, рдХрд╛рдорд╛рдЪреНрдпрд╛ рджрд░рдореНрдпрд╛рди рд▓реЙрдЧ рд▓реЛрдб рдХрд░рдгреНрдпрд╛рдЪреЗ рдХрд╛рдо рдЙрджреНрднрд╡рд▓реЗ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдПрд╕рдХреНрдпреВрдПрд▓ рдХреНрд╡реЗрд░реА рдХрд╛рдордЧрд┐рд░реА рджреЗрдЦрд░реЗрдЦ.

рдЖрдгрд┐ рдХрд╛рдорд╛рдЪреНрдпрд╛ рд╡реЗрд│реЗрдд рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЖрдгрд┐ рд╡рд┐рд╡рд┐рдзрддреЗрд╕рд╛рдареА рд╣реЗ рдлрдХреНрдд рдПрдХ рдордиреЛрд░рдВрдЬрдХ рдХрд╛рдо рдЖрд╣реЗ.
рдореА рдЧреГрд╣реАрдд рдзрд░рддреЛ рдХреА рд╣реА рд╕рдорд╕реНрдпрд╛ рдЖрдзреАрдЪ рд╕реЛрдбрд╡рд▓реА рдЧреЗрд▓реА рдЖрд╣реЗ, рдХрд╛рд░рдг рддреА рдХреНрд╖реБрд▓реНрд▓рдХ рдЖрд╣реЗ. рдкрдг рдЧреБрдЧрд▓рд╡рд░ рдПрдХ рджреНрд░реБрдд рд╢реЛрдз рдШреЗрддрд▓реНрдпрд╛рд╡рд░рд╣реА рдХреЛрдгрддреЗрд╣реА рдЙрдкрд╛рдп рд╕рд╛рдкрдбрд▓реЗ рдирд╛рд╣реАрдд рдЖрдгрд┐ рдорд▓рд╛ рдЦреЛрд▓рд╡рд░ рдЬрд╛рдгреНрдпрд╛рдЪреА рд╡рд┐рд╢реЗрд╖ рдЗрдЪреНрдЫрд╛ рдирд╡реНрд╣рддреА. рдХрд╛рд╣реАрд╣реА рдЕрд╕реЛ, рддреА рдПрдХ рдЪрд╛рдВрдЧрд▓реА рдХрд╕рд░рдд рд╣реЛрддреА.

рдХрд╛рд░реНрдпрд╛рдЪреЗ рдФрдкрдЪрд╛рд░рд┐рдХрд░рдг

рдкрд░рд┐рдгрд╛рдореА рд▓реЙрдЧ рдлрд╛рдЗрд▓ рд╣реА рдЪрд▓ рд▓рд╛рдВрдмреАрдЪреНрдпрд╛ рдУрд│реАрдВрдЪрд╛ рд╕рдВрдЪ рдЖрд╣реЗ. рдЧреНрд░рд╛рдлрд┐рдХрд▓реА, рд▓реЙрдЧ рдлрд╛рдЗрд▓ рдЕрд╕реЗ рджрд░реНрд╢рд╡рд┐рд▓реА рдЬрд╛рдК рд╢рдХрддреЗ:
AWS рдХреНрд▓рд╛рдЙрдбрд╡рд░реВрди PostgreSQL рд▓реЙрдЧ рдЕрдкрд▓реЛрдб рдХрд░рдд рдЖрд╣реЗ

рд╣реЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рд╣реА рдЖрдард╡рдг рдХрд░реВрди рджреЗрддреЗ рдХрд╛? рдЯреЗрдЯреНрд░рд┐рд╕рдЪрд╛ рдпрд╛рдд рдХрд╛рдп рд╕рдВрдмрдВрдз? рдмрд░рдВ, рддреНрдпрд╛рдЪрд╛ рддреНрдпрд╛рдЪреНрдпрд╛рд╢реА рдХрд╛рдп рд╕рдВрдмрдВрдз рдЖрд╣реЗ рддреЗ рдпреЗрдереЗ рдЖрд╣реЗ.
рдЬрд░ рдЖрдкрдг рдкреБрдвреАрд▓ рдлрд╛рдЗрд▓ рдЧреНрд░рд╛рдлрд┐рдХрд▓реА рд▓реЛрдб рдХрд░рддрд╛рдирд╛ рдЙрджреНрднрд╡рдгрд╛рд▒реНрдпрд╛ рд╕рдВрднрд╛рд╡реНрдп рдкрд░реНрдпрд╛рдпрд╛рдВрдЪреА рдХрд▓реНрдкрдирд╛ рдХреЗрд▓реА (рд╕рд╛рдзреЗрдкрдгрд╛рд╕рд╛рдареА, рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рдУрд│реАрдВрдЪреА рд▓рд╛рдВрдмреА рд╕рдорд╛рди рдЕрд╕реВ рджреНрдпрд╛), рддрд░ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдорд┐рд│реЗрд▓ рдорд╛рдирдХ рдЯреЗрдЯреНрд░рд┐рд╕ рддреБрдХрдбреЗ:

1) рд╣реА рдлрд╛рдЗрд▓ рдкреВрд░реНрдгрдкрдгреЗ рдбрд╛рдЙрдирд▓реЛрдб рдЭрд╛рд▓реА рдЖрд╣реЗ рдЖрдгрд┐ рддреА рдЕрдВрддрд┐рдо рдлрд╛рдЗрд▓ рдЖрд╣реЗ. рднрд╛рдЧрд╛рдЪрд╛ рдЖрдХрд╛рд░ рдЕрдВрддрд┐рдо рдлрд╛рдЗрд▓ рдЖрдХрд╛рд░рд╛рдкреЗрдХреНрд╖рд╛ рдореЛрдард╛ рдЖрд╣реЗ:
AWS рдХреНрд▓рд╛рдЙрдбрд╡рд░реВрди PostgreSQL рд▓реЙрдЧ рдЕрдкрд▓реЛрдб рдХрд░рдд рдЖрд╣реЗ

2) рдлрд╛рдЗрд▓рдордзреНрдпреЗ рдПрдХ рд╕рд╛рддрддреНрдп рдЖрд╣реЗ. рднрд╛рдЧрд╛рдЪрд╛ рдЖрдХрд╛рд░ рдЕрдВрддрд┐рдо рдлрд╛рдЗрд▓ рдЖрдХрд╛рд░рд╛рдкреЗрдХреНрд╖рд╛ рд▓рд╣рд╛рди рдЖрд╣реЗ:
AWS рдХреНрд▓рд╛рдЙрдбрд╡рд░реВрди PostgreSQL рд▓реЙрдЧ рдЕрдкрд▓реЛрдб рдХрд░рдд рдЖрд╣реЗ

3) рд╣реА рдлрд╛рдЗрд▓ рдорд╛рдЧреАрд▓ рдлрд╛рдЗрд▓рдЪреАрдЪ рдПрдХ рд╕реБрд░реБрд╡рд╛рдд рдЖрд╣реЗ рдЖрдгрд┐ рддреНрдпрд╛рдд рдПрдХ рд╕реБрд░реБрд╡рд╛рдд рдЖрд╣реЗ. рд╢реЗрд╡рдЯрдЪреНрдпрд╛ рдлрд╛рдЗрд▓рдЪреНрдпрд╛ рдЙрд░реНрд╡рд░рд┐рдд рднрд╛рдЧрд╛рдкреЗрдХреНрд╖рд╛ рднрд╛рдЧрд╛рдЪрд╛ рдЖрдХрд╛рд░ рд▓рд╣рд╛рди рдЖрд╣реЗ:
AWS рдХреНрд▓рд╛рдЙрдбрд╡рд░реВрди PostgreSQL рд▓реЙрдЧ рдЕрдкрд▓реЛрдб рдХрд░рдд рдЖрд╣реЗ

рек) рд╣реА рдлрд╛рдЗрд▓ рдорд╛рдЧреАрд▓ рдлрд╛рдИрд▓рдЪреАрдЪ рдПрдХ рд╕реБрд░реБрд╡рд╛рдд рдЖрд╣реЗ рдЖрдгрд┐ рддреА рдЕрдВрддрд┐рдо рдлрд╛рдИрд▓ рдЖрд╣реЗ. рдЪрдВрдХрдЪрд╛ рдЖрдХрд╛рд░ рдЕрдВрддрд┐рдо рдлрд╛рдИрд▓рдЪреНрдпрд╛ рдЙрд░реНрд╡рд░рд┐рдд рднрд╛рдЧрд╛рдЪреНрдпрд╛ рдЖрдХрд╛рд░рд╛рдкреЗрдХреНрд╖рд╛ рдореЛрдард╛ рдЖрд╣реЗ:
AWS рдХреНрд▓рд╛рдЙрдбрд╡рд░реВрди PostgreSQL рд▓реЙрдЧ рдЕрдкрд▓реЛрдб рдХрд░рдд рдЖрд╣реЗ

рдХрд╛рдо рдореНрд╣рдгрдЬреЗ рдЖрдпрдд рдПрдХрддреНрд░ рдХрд░рдгреЗ рдХрд┐рдВрд╡рд╛ рдирд╡реАрди рд╕реНрддрд░рд╛рд╡рд░ рдЯреЗрдЯреНрд░рд┐рд╕ рдЦреЗрд│рдгреЗ.
AWS рдХреНрд▓рд╛рдЙрдбрд╡рд░реВрди PostgreSQL рд▓реЙрдЧ рдЕрдкрд▓реЛрдб рдХрд░рдд рдЖрд╣реЗ

рд╕рдорд╕реНрдпреЗрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рддрд╛рдирд╛ рдЙрджреНрднрд╡рдгрд╛рд▒реНрдпрд╛ рд╕рдорд╕реНрдпрд╛

рез) реи рднрд╛рдЧрд╛рдВрдЪреА рдУрд│ рдЪрд┐рдХрдЯрд╡рд╛.

AWS рдХреНрд▓рд╛рдЙрдбрд╡рд░реВрди PostgreSQL рд▓реЙрдЧ рдЕрдкрд▓реЛрдб рдХрд░рдд рдЖрд╣реЗ
рдПрдХрдВрджрд░реАрдд, рдХреЛрдгрддреНрдпрд╛рд╣реА рд╡рд┐рд╢реЗрд╖ рд╕рдорд╕реНрдпрд╛ рдирд╡реНрд╣рддреНрдпрд╛. рдмреЗрд╕рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЛрд░реНрд╕рдордзреАрд▓ рдПрдХ рдорд╛рдирдХ рд╕рдорд╕реНрдпрд╛.

рдЗрд╖реНрдЯрддрдо рд╕рд░реНрд╡реНрд╣рд┐рдВрдЧ рдЖрдХрд╛рд░

рдкрдг рд╣реЗ рдереЛрдбреЗ рдЕрдзрд┐рдХ рдордиреЛрд░рдВрдЬрдХ рдЖрд╣реЗ.
рджреБрд░реНрджреИрд╡рд╛рдиреЗ, рд╕реБрд░реБрд╡рд╛рддреАрдЪреНрдпрд╛ рднрд╛рдЧрд╛рдЪреНрдпрд╛ рд▓реЗрдмрд▓рдирдВрддрд░ рдСрдлрд╕реЗрдЯ рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪрд╛ рдХреЛрдгрддрд╛рд╣реА рдорд╛рд░реНрдЧ рдирд╛рд╣реА:

рддреБрдореНрд╣рд╛рд▓рд╛ рдЖрдзреАрдЪ рдорд╛рд╣рд┐рддреА рдЖрд╣реЗ рдХреА тАФstarting-token рд╣рд╛ рдкрд░реНрдпрд╛рдп рдкреЗрдЬрд┐рдиреЗрдЯ рдХрд░рдгреЗ рдХреБрдареВрди рд╕реБрд░реВ рдХрд░рд╛рдпрдЪреЗ рд╣реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рддреЛ. рд╣рд╛ рдкрд░реНрдпрд╛рдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡реНрд╣реЕрд▓реНрдпреВрдЬ рдШреЗрддреЛ рдпрд╛рдЪрд╛ рдЕрд░реНрде рдЕрд╕рд╛ рдХреА рдЬрд░ рддреБрдореНрд╣реА рдиреЗрдХреНрд╕реНрдЯ рдЯреЛрдХрди рд╕реНрдЯреНрд░рд┐рдВрдЧрд╕рдореЛрд░ рдСрдлрд╕реЗрдЯ рд╡реНрд╣реЕрд▓реНрдпреВ рдЬреЛрдбрдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХреЗрд▓рд╛ рддрд░ рддреЛ рдкрд░реНрдпрд╛рдп рдСрдлрд╕реЗрдЯ рдореНрд╣рдгреВрди рд╡рд┐рдЪрд╛рд░рд╛рдд рдШреЗрддрд▓рд╛ рдЬрд╛рдгрд╛рд░ рдирд╛рд╣реА.

рдЖрдгрд┐ рдореНрд╣рдгреВрдирдЪ, рддреБрдореНрд╣рд╛рд▓рд╛ рддреБрдХрдбреНрдпрд╛рдВрдордзреНрдпреЗ рдЖрдгрд┐ рднрд╛рдЧрд╛рдВрдордзреНрдпреЗ рд╡рд╛рдЪрд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓.
рдЬрд░ рддреБрдореНрд╣реА рдореЛрдареНрдпрд╛ рднрд╛рдЧрд╛рдд рд╡рд╛рдЪрд▓реЗ рддрд░ рд╡рд╛рдЪрдирд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рдХрдореА рдЕрд╕реЗрд▓, рдкрд░рдВрддреБ рдЖрд╡рд╛рдЬ рдЬрд╛рд╕реНрддреАрдд рдЬрд╛рд╕реНрдд рдЕрд╕реЗрд▓.
рдЬрд░ рддреБрдореНрд╣реА рд▓рд╣рд╛рди рднрд╛рдЧрд╛рдВрдордзреНрдпреЗ рд╡рд╛рдЪрд▓реЗ рддрд░, рдЙрд▓рдЯ, рд╡рд╛рдЪрдирд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рдЬрд╛рд╕реНрддреАрдд рдЬрд╛рд╕реНрдд рдЕрд╕реЗрд▓, рдкрд░рдВрддреБ рдЖрд╡рд╛рдЬ рдХрдореАрдд рдХрдореА рдЕрд╕реЗрд▓.
рдореНрд╣рдгреВрди, рд░рд╣рджрд╛рд░реА рдХрдореА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╕реЛрд▓реНрдпреВрд╢рдирдЪреНрдпрд╛ рдПрдХреВрдг рд╕реМрдВрджрд░реНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣рд╛рд▓рд╛ рдЕрд╕рд╛ рдЙрдкрд╛рдп рд╢реЛрдзрд╛рд╡рд╛ рд▓рд╛рдЧрд▓рд╛ рдЬреЛ рджреБрд░реНрджреИрд╡рд╛рдиреЗ рдереЛрдбрд╛рд╕рд╛ рдЖрдзрд╛рд░рд╕реНрддрдВрднрд╛рд╕рд╛рд░рдЦрд╛ рджрд┐рд╕рдд рд╣реЛрддрд╛.

рд╕реНрдкрд╖реНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рд▓реЙрдЧ рдлрд╛рдЗрд▓ рд▓реЛрдбрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪреНрдпрд╛ рджреЛрди рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рд╕рд░рд▓реАрдХреГрдд рдЖрд╡реГрддреНрддреНрдпрд╛рдВрдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдпрд╛. рджреЛрдиреНрд╣реА рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ рд╡рд╛рдЪрдирд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рднрд╛рдЧрд╛рдЪреНрдпрд╛ рдЖрдХрд╛рд░рд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЗ.

рез) рд▓рд╣рд╛рди рднрд╛рдЧрд╛рдВрдордзреНрдпреЗ рднрд░рд╛:
AWS рдХреНрд▓рд╛рдЙрдбрд╡рд░реВрди PostgreSQL рд▓реЙрдЧ рдЕрдкрд▓реЛрдб рдХрд░рдд рдЖрд╣реЗ

реи) рдореЛрдареНрдпрд╛ рднрд╛рдЧрд╛рдВрдордзреНрдпреЗ рднрд░рд╛:
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
  • рдбреЗрдЯрд╛рдмреЗрд╕ рдЖрдпрдбреА: рдбреЗрдЯрд╛рдмреЗрд╕_рдЖрдпрдбреА =$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

рдкреБрдвреЗ рдХрд╛рдп?

рддрд░, рдкрд╣рд┐рд▓реЗ рдордзрд▓реЗ рдХрд╛рдо - рдХреНрд▓рд╛рдЙрдбрд╡рд░реВрди рд▓реЙрдЧ рдлрд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдгреЗ - рдкреВрд░реНрдг рдЭрд╛рд▓реЗ рдЖрд╣реЗ. рдбрд╛рдЙрдирд▓реЛрдб рдХреЗрд▓реЗрд▓реНрдпрд╛ рд▓реЙрдЧрдЪреЗ рдХрд╛рдп рдХрд░рд╛рдпрдЪреЗ?
рдкреНрд░рдердо, рддреБрдореНрд╣рд╛рд▓рд╛ рд▓реЙрдЧ рдлрд╛рдЗрд▓ рдкрд╛рд░реНрд╕ рдХрд░рд╛рд╡реА рд▓рд╛рдЧреЗрд▓ рдЖрдгрд┐ рддреНрдпрд╛рддреВрди рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд┐рдирдВрддреНрдпрд╛ рдХрд╛рдврд╛рд╡реНрдпрд╛ рд▓рд╛рдЧрддреАрд▓.
рд╣реЗ рдХрд╛рдо рдлрд╛рд░ рдХрдареАрдг рдирд╛рд╣реАрдпреЗ. рдПрдХ рд╕рд╛рдзреА рдмреЕрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реЗ рдХрд╛рдо рдХрд░реЗрд▓.
рдЕрдкрд▓реЛрдб_рд▓реЙрдЧ_рдХреНрд╡реЗрд░реА.рд╢

#!/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
--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 рдкреНрд░рд╢реНрдирд╛рдВрдЪреЗ рдХрд╛рд░реНрдпрдкреНрд░рджрд░реНрд╢рди рдирд┐рд░реАрдХреНрд╖рдг. рднрд╛рдЧ рез - рдЕрд╣рд╡рд╛рд▓ рджреЗрдгреЗ)

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	 , 	
тАж
);

рд╣реЗ рдлрдВрдХреНрд╢рди рд▓реЙрдЧ рдлрд╛рдЗрд▓ рдХреНрд╡реЗрд░реАрдЬрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрдиреЗрдХ рдЙрдкрдпреБрдХреНрдд рдХреНрд╖рдорддрд╛ рд╕рдХреНрд╖рдо рдХрд░рддреЗ. рд╡рд┐рд╢реЗрд╖рддрдГ:

рд╡реИрд╢рд┐рд╖реНрдЯреНрдп #рез - рдХреНрд╡реЗрд░реА рдПрдХреНрдЭрд┐рдХреНрдпреБрд╢рди рдЗрддрд┐рд╣рд╛рд╕

рдХрд╛рдордЧрд┐рд░реАрдЪреНрдпрд╛ рд╕рдорд╕реНрдпреЗрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рд╕ рд╕реБрд░реБрд╡рд╛рдд рдХрд░рдгреЗ рдЦреВрдк рдЙрдкрдпреБрдХреНрдд рдЖрд╣реЗ. рдкреНрд░рдердо, рдЗрддрд┐рд╣рд╛рд╕ рдкрд╣рд╛ - рдордВрджреА рдХрдзреА рд╕реБрд░реВ рдЭрд╛рд▓реА?
рдордЧ, рдиреЗрд╣рдореАрдкреНрд░рдорд╛рдгреЗ, рдмрд╛рд╣реНрдп рдХрд╛рд░рдгреЗ рд╢реЛрдзрд╛. рдХрджрд╛рдЪрд┐рдд рдбреЗрдЯрд╛рдмреЗрд╕рд╡рд░реАрд▓ рднрд╛рд░ рдЭрдкрд╛рдЯреНрдпрд╛рдиреЗ рд╡рд╛рдврд▓рд╛ рдЕрд╕реЗрд▓ рдЖрдгрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреНрд╡реЗрд░реАрдЪрд╛ рд╕рдВрдмрдВрдз рдирд╛рд╣реА.
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		
	);

рд╡реИрд╢рд┐рд╖реНрдЯреНрдп #реи - рдХреНрд╡реЗрд░реА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдпреЛрдЬрдирд╛ рдЬрддрди рдХрд░рд╛

рдпрд╛ рдЯрдкреНрдкреНрдпрд╛рд╡рд░, рдПрдХ рдЖрдХреНрд╖реЗрдк-рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг-рдЯрд┐рдкреНрдкрдгреА рдЙрджреНрднрд╡реВ рд╢рдХрддреЗ: тАЬрдкрдг рдЖрдзреАрдЪ рдСрдЯреЛрдПрдХреНрд╕рдкреНрд▓реЗрди рдЖрд╣реЗ"рд╣реЛ, рддреЗ рдЖрд╣реЗ, рдкрдг рдЬрд░ рдПрдХреНрдЭрд┐рдХреНрдпреБрд╢рди рдкреНрд▓реЕрди рддреНрдпрд╛рдЪ рд▓реЙрдЧ рдлрд╛рдЗрд▓рдордзреНрдпреЗ рд╕рд╛рдард╡рд▓рд╛ рдЧреЗрд▓рд╛ рдЖрдгрд┐ рдкреБрдвреАрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рд╕рд╛рдареА рддреЛ рд╕реЗрд╡реНрд╣ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рд▓реЙрдЧ рдлрд╛рдЗрд▓ рдкрд╛рд░реНрд╕ рдХрд░рд╛рд╡реА рд▓рд╛рдЧрд▓реА рддрд░ рдХрд╛рдп рдЕрд░реНрде рдЖрд╣реЗ?"

рддрдерд╛рдкрд┐, рдорд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддреЗ:
рдкреНрд░рдердо: рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдпреЛрдЬрдирд╛ рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рдбреЗрдЯрд╛рдмреЗрд╕рдЪреНрдпрд╛ рд╕реЗрд╡рд╛ рд╕рд╛рд░рдгреАрдордзреНрдпреЗ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рд╛;
рджреБрд╕рд░реЗ рдореНрд╣рдгрдЬреЗ: рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдпреЛрдЬрдирд╛рдВрдЪреА рдПрдХрдореЗрдХрд╛рдВрд╢реА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рдпреЗрдгреЗ, рдЬреЗрдгреЗрдХрд░реВрди рддреБрдореНрд╣рд╛рд▓рд╛ рдХреНрд╡реЗрд░реА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдпреЛрдЬрдирд╛ рдмрджрд▓рд▓реА рдЖрд╣реЗ рдХреА рдирд╛рд╣реА рд╣реЗ рд▓рдЧреЗрдЪ рдкрд╛рд╣рддрд╛ рдпреЗрдИрд▓.

рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрдХреНрдЭрд┐рдХреНрдпреБрд╢рди рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдЕрд╕рд▓реЗрд▓реА рдПрдХ рдХреНрд╡реЗрд░реА рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗ. 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');

рдкрд░реНрдпрд╛рдп #рей тАУ рджреЗрдЦрд░реЗрдЦреАрд╕рд╛рдареА рдХреНрд╡реЗрд░реА рд▓реЙрдЧ рд╡рд╛рдкрд░рдгреЗ

рдХрд╛рд░реНрдпрдкреНрд░рджрд░реНрд╢рди рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд╡рд┐рдирдВрддреА рдордЬрдХреБрд░рд╛рд╡рд░ рдирд╡реНрд╣реЗ рддрд░ рддреНрдпрд╛рдЪреНрдпрд╛ рдЖрдпрдбреАрд╡рд░ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗрд▓реЗ рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рддреБрдореНрд╣рд╛рд▓рд╛ рд▓реЙрдЧ рдлрд╛рдЗрд▓рдордзреАрд▓ рд╡рд┐рдирдВрддреНрдпрд╛ рдЬреНрдпрд╛ рд╡рд┐рдирдВрддреНрдпрд╛рдВрд╕рд╛рдареА рдХрд╛рд░реНрдпрдкреНрд░рджрд░реНрд╢рди рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗ рдЖрд╣реЗрдд рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╢реА рдЬреЛрдбрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
рдмрд░рдВ, рдХрд┐рдорд╛рди рдХрд╛рдордЧрд┐рд░реАрдЪреНрдпрд╛ рдШрдЯрдиреЗрдЪреА рдиреЗрдордХреА рд╡реЗрд│ рдЬрд╛рдгреВрди рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА рддрд░реА.

рдЕрд╢рд╛рдкреНрд░рдХрд╛рд░реЗ, рдЬрд░ рдПрдЦрд╛рджреНрдпрд╛ рд╡рд┐рдирдВрддреА рдЖрдпрдбреАрд╕рд╛рдареА рдХрд╛рдордЧрд┐рд░реАрдЪреА рдШрдЯрдирд╛ рдШрдбрд▓реА, рддрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреЕрд░рд╛рдореАрдЯрд░ рдореВрд▓реНрдпрд╛рдВрд╕рд╣ рдЖрдгрд┐ рд╡рд┐рдирдВрддреАрдЪрд╛ рдЕрдЪреВрдХ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рд╡реЗрд│ рдЖрдгрд┐ рдХрд╛рд▓рд╛рд╡рдзреА рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдирдВрддреАрдЪреА рд▓рд┐рдВрдХ рдЕрд╕реЗрд▓. рд╣реА рдорд╛рд╣рд┐рддреА рдлрдХреНрдд рджреГрд╢реНрдп рд╡рд╛рдкрд░реВрди рдорд┐рд│рд╡рддрд╛ рдпреЗрддреЗ. 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 ;

рдирдВрддрд░рдЪрд╛ рд╢рдмреНрдж

рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рддрдВрддреНрд░рд╛рдЪрд╛ рдЕрдЦреЗрд░ рдЙрдкрдпреЛрдЧ рдЭрд╛рд▓рд╛ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдПрд╕рдХреНрдпреВрдПрд▓ рдХреНрд╡реЗрд░реА рдкрд░рдлреЙрд░реНрдордиреНрд╕ рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдд рдЖрд╣реЗ, рдЙрджреНрднрд╡рдгрд╛рд▒реНрдпрд╛ рдХреНрд╡реЗрд░реА рдХрд╛рдордЧрд┐рд░реАрдЪреНрдпрд╛ рдШрдЯрдирд╛рдВрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рддрд╛рдирд╛ рдЕрдзрд┐рдХ рдорд╛рд╣рд┐рддреАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ.

рдЬрд░реА, рдЕрд░реНрдерд╛рддрдЪ, рдорд╛рдЭреНрдпрд╛ рд╡реИрдпрдХреНрддрд┐рдХ рдорддреЗ, рдбрд╛рдЙрдирд▓реЛрдб рдХреЗрд▓реЗрд▓реНрдпрд╛ рднрд╛рдЧрд╛рдЪрд╛ рдЖрдХрд╛рд░ рдирд┐рд╡рдбрдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рдмрджрд▓рдгреНрдпрд╛рд╕рд╛рдареА рдЕрд▓реНрдЧреЛрд░рд┐рдердорд╡рд░ рдЕрдЬреВрдирд╣реА рдХрд╛рд╣реА рдХрд╛рдо рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓. рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдмрддреАрдд рд╣реА рд╕рдорд╕реНрдпрд╛ рдЕрджреНрдпрд╛рдк рд╕реЛрдбрд╡рд▓реА рдЧреЗрд▓реЗрд▓реА рдирд╛рд╣реА. рддреЗ рдХрджрд╛рдЪрд┐рдд рдордиреЛрд░рдВрдЬрдХ рдЕрд╕реЗрд▓.

рдкрдг рддреА рдкреВрд░реНрдгрдкрдгреЗ рд╡реЗрдЧрд│реА рдЧреЛрд╖реНрдЯ рдЖрд╣реЗ...

рд╕реНрддреНрд░реЛрдд: www.habr.com

DDoS рд╕рдВрд░рдХреНрд╖рдг, VPS VDS рд╕рд░реНрд╡реНрд╣рд░ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕рд╛рдЗрдЯрд╕рд╛рдареА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдЦрд░реЗрджреА рдХрд░рд╛ ЁЯФе рдбреАрдбреЙрд╕ рд╕рдВрд░рдХреНрд╖рдгрд╛рд╕рд╣ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ, рд╡реНрд╣реАрдкреАрдПрд╕ (VPS) рд╡реНрд╣реАрдбреАрдПрд╕ (VDS) рд╕рд░реНрд╡реНрд╣рд░реНрд╕ рдЦрд░реЗрджреА рдХрд░рд╛ | ProHoster