ΠΠ½ΠΆΠ΅Π½Π΅Ρ β Π² ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π΅ Ρ Π»Π°ΡΡΠ½ΠΈ β Π²Π΄ΠΎΡ
Π½ΠΎΠ²Π΅Π½Π½ΡΠΉ.
ΠΠ½ΠΆΠ΅Π½Π΅Ρ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΡ. (Ρ) Π .ΠΠΈΠ·Π΅Π»Ρ.
ΠΠΏΠΈΠ³ΡΠ°ΡΡ.
ΠΠ»ΠΈ ΠΈΡΡΠΎΡΠΈΡ ΠΎ ΡΠΎΠΌ, Π·Π°ΡΠ΅ΠΌ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΡ Π±Π°Π· Π΄Π°Π½Π½ΡΡ
Π²ΡΠΏΠΎΠΌΠΈΠ½Π°ΡΡ ΡΠ²ΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡΠΊΠΎΠ΅ ΠΏΡΠΎΡΠ»ΠΎΠ΅.
ΠΡΠ΅Π΄ΠΈΡΠ»ΠΎΠ²ΠΈΠ΅
ΠΡΠ΅ ΠΈΠΌΠ΅Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ. Π‘ΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΡ ΡΠ»ΡΡΠ°ΠΉΠ½Ρ. ΠΠ°ΡΠ΅ΡΠΈΠ°Π» ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π»ΠΈΡΠ½ΠΎΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅ Π°Π²ΡΠΎΡΠ°.
Disclaimer of warranties: Π² ΠΏΠ»Π°Π½ΠΈΡΡΠ΅ΠΌΠΎΠΌ ΡΠΈΠΊΠ»Π΅ ΡΡΠ°ΡΠ΅ΠΉ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΈ ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΠ°Π±Π»ΠΈΡ ΠΈ ΡΠΊΡΠΈΠΏΡΠΎΠ². ΠΠ°ΡΠ΅ΡΠΈΠ°Π»Ρ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ ΡΡΠ°Π·Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Β«AS ISΒ».
ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , ΠΏΠΎ ΠΏΡΠΈΡΠΈΠ½Π΅ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΌΠ° ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π°,
Π²ΠΎ-Π²ΡΠΎΡΡΡ ΠΏΠΎ ΠΏΡΠΈΡΠΈΠ½Π΅ Π·Π°ΡΠΎΡΠ΅Π½Π½ΠΎΡΡΠΈ Ρ ΠΏΡΠΎΠ΄Π°ΠΊΡΠ½ Π±Π°Π·ΠΎΠΉ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π·Π°ΠΊΠ°Π·ΡΠΈΠΊΠ°.
ΠΠΎΡΡΠΎΠΌΡ Π² ΡΡΠ°ΡΡΡΡ Π±ΡΠ΄ΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ΄Π΅ΠΈ ΠΈ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ Π² ΡΠ°ΠΌΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΌ Π²ΠΈΠ΄Π΅.
ΠΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ ΡΠΈΡΡΠ΅ΠΌΠ° Π΄ΠΎΡΠ°ΡΡΠ΅Ρ Π΄ΠΎ ΡΡΠΎΠ²Π½Ρ Π²ΡΠΊΠ»Π°Π΄ΡΠ²Π°Π½ΠΈΡ Π½Π° GitHub, Π° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈ Π½Π΅Ρ. ΠΡΠ΅ΠΌΡ β ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ.
ΠΠ°ΡΠ°Π»ΠΎ ΠΈΡΡΠΎΡΠΈΠΈ- Β«
Π§ΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅, Π² ΡΠ°ΠΌΡΡ
ΠΎΠ±ΡΠΈΡ
ΡΠ΅ΡΡΠ°Ρ
- Β«
ΠΠ°ΡΠ΅ΠΌ Π²ΡΡ ΡΡΠΎ ΠΌΠ½Π΅?
ΠΡ, Π²ΠΎ-ΠΏΠ΅ΡΠ²ΡΡ
, ΡΡΠΎΠ±Ρ ΡΠ°ΠΌΠΎΠΌΡ Π½Π΅ Π·Π°Π±ΡΡΡ, Π²ΡΠΏΠΎΠΌΠΈΠ½Π°Ρ Π½Π° ΠΏΠ΅Π½ΡΠΈΠΈ ΡΠ»Π°Π²Π½ΡΠ΅ Π΄Π΅Π½Π΅ΡΠΊΠΈ.
ΠΠΎ-Π²ΡΠΎΡΡΡ
, ΡΡΠΎΠ±Ρ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π½Π°ΠΏΠΈΡΠ°Π½Π½ΠΎΠ΅. ΠΠ±ΠΎ ΡΠΆΠ΅ ΡΠ°ΠΌ, ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°ΡΠΈΠ½Π°Ρ ΠΏΡΡΠ°ΡΡΡΡ ΠΈ Π·Π°Π±ΡΠ²Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΠ°ΡΡΠΈ.
ΠΡ ΠΈ ΡΠ°ΠΌΠΎΠ΅ Π³Π»Π°Π²Π½ΠΎΠ΅ β Π²Π΄ΡΡΠ³ ΠΌΠΎΠΆΠ΅Ρ ΠΊΠΎΠΌΡ-ΡΠΎ ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΡΡΡ ΠΈ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π½Π΅ ΠΈΠ·ΠΎΠ±ΡΠ΅ΡΠ°ΡΡ Π²Π΅Π»ΠΎΡΠΈΠΏΠ΅Π΄ ΠΈ Π½Π΅ ΡΠΎΠ±ΠΈΡΠ°ΡΡ Π³ΡΠ°Π±Π»ΠΈ. ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΡΠ»ΡΡΡΠΈΡΡ ΡΠ²ΠΎΡ ΠΊΠ°ΡΠΌΡ (Π½Π΅ Ρ Π°Π±ΡΠΎΠ²ΡΠΊΡΡ). ΠΠ±ΠΎ, ΡΠ°ΠΌΠΎΠ΅ ΡΠ΅Π½Π½ΠΎΠ΅ Π² ΡΡΠΎΠΌ ΠΌΠΈΡΠ΅ ΡΡΠΎ ΠΈΠ΄Π΅ΠΈ. ΠΠ»Π°Π²Π½ΠΎΠ΅ Π½Π°ΠΉΡΠΈ ΠΈΠ΄Π΅Ρ. Π ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ΄Π΅Ρ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΡΡΡ ΡΡΠΎ ΡΠΆΠ΅ Π²ΠΎΠΏΡΠΎΡ ΡΠΈΡΡΠΎ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈΠΉ.
ΠΡΠ°ΠΊ, Π½Π°ΡΠ½Π΅ΠΌ, ΠΏΠΎΡΠΈΡ ΠΎΠ½ΡΠΊΡβ¦
ΠΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°ΡΠΈ.
ΠΠΌΠ΅Π΅ΡΡΡ:
ΠΠ°Π·Π° Π΄Π°Π½Π½ΡΡ
PostgreSQL(10.5), ΡΠΌΠ΅ΡΠ°Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π½Π°Π³ΡΡΠ·ΠΊΠΈ (OLTP+DSS), ΡΡΠ΅Π΄Π½Π΅ΠΉ-ΠΌΠ°Π»ΠΎΠΉ Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΠΎΡΡΠΈ, ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ Π² ΠΎΠ±Π»Π°ΠΊΠ΅ AWS.
ΠΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ, ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ Π² Π²ΠΈΠ΄Π΅ ΡΡΠ°ΡΠ½ΡΠ΅ ΡΡΠ΅Π΄ΡΡΠ²Π° AWS Π² ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ.
Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ:
ΠΠΎΠ½ΠΈΡΠΎΡΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
, Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡ ΠΈ ΠΈΠΌΠ΅ΡΡ Π½Π°ΡΠ°Π»ΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π΄Π»Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠΆΠ΅Π»ΡΡ
Π·Π°ΠΏΡΠΎΡΡ ΠΊ ΠΠ.
ΠΡΠ°ΡΠΊΠΎΠ΅ ΠΏΡΠ΅Π΄ΠΈΡΠ»ΠΎΠ²ΠΈΠ΅ ΠΈΠ»ΠΈ Π°Π½Π°Π»ΠΈΠ· Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² ΡΠ΅ΡΠ΅Π½ΠΈΡ
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡ Π²Π°ΡΠΈΠ°Π½ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π°ΡΠΈ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΡΡΠ°Π²Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° Π²ΡΠ³ΠΎΠ΄ ΠΈ Π½Π΅ΠΏΡΠΈΡΡΠ½ΠΎΡΡΠ΅ΠΉ Π΄Π»Ρ ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠ°, Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠΉ ΠΈ ΡΠ±ΡΡΠΊΠ°ΠΌΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠΌΠ΅Π½ΡΠ° ΠΏΡΡΡΡ Π·Π°Π½ΠΈΠΌΠ°ΡΡΡΡ ΡΠ΅, ΠΊΠΎΠΌΡ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΎ ΠΏΠΎ ΡΡΠ°ΡΠ½ΠΎΠΌΡ ΡΠ°ΡΠΏΠΈΡΠ°Π½ΠΈΡ.
ΠΠ°ΡΠΈΠ°Π½Ρ 1- Β«Working on demandΒ»
ΠΡΡΠ°Π²Π»ΡΠ΅ΠΌ Π²ΡΠ΅ ΠΊΠ°ΠΊ Π΅ΡΡΡ. ΠΡΠ»ΠΈ Π·Π°ΠΊΠ°Π·ΡΠΈΠΊΠ° Π½Π΅ ΡΡΡΡΠ°ΠΈΠ²Π°Π΅Ρ ΡΡΠΎ-ΡΠΎ Π² ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ, ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
ΠΈΠ»ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΎΠ½ ΠΈΠ·Π²Π΅ΡΡΠΈΡ ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠΎΠ² DBA ΠΏΠΎ e-mail ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π² ΠΈΠ½ΡΠΈΠ΄Π΅Π½Ρ Π² ΡΠΈΠΊΠ΅ΡΠ½ΠΈΡΠ΅.
ΠΠ½ΠΆΠ΅Π½Π΅Ρ, ΠΏΠΎΠ»ΡΡΠΈΠ² ΠΎΠΏΠΎΠ²Π΅ΡΠ΅Π½ΠΈΠ΅, ΡΠ°Π·Π±Π΅ΡΠ΅ΡΡΡ Π² ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ΅, ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΡ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΎΡΠ»ΠΎΠΆΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π² Π΄ΠΎΠ»Π³ΠΈΠΉ ΡΡΠΈΠΊ, Π½Π°Π΄Π΅ΡΡΡ, ΡΡΠΎ Π²ΡΠ΅ ΡΠ°ΠΌΠΎ ΡΠΎΠ±ΠΎΠΉ ΡΠ°ΡΡΠΎΡΠ΅ΡΡΡ, Π΄Π° ΠΈ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ, ΡΠΊΠΎΡΠΎ Π²ΡΡ Π·Π°Π±ΡΠ΄Π΅ΡΡΡ.
ΠΡΡΠ½ΠΈΠΊΠΈ ΠΈ ΠΏΡΡΠΊΠΈ , ΡΠΈΠ½ΡΠΊΠΈ ΠΈ ΡΠΈΡΠΊΠΈΠΡΡΠ½ΠΈΠΊΠΈ ΠΈ ΠΏΡΡΠΊΠΈ:
1. ΠΠΈΡΠ΅Π³ΠΎ Π»ΠΈΡΠ½Π΅Π³ΠΎ Π΄Π΅Π»Π°ΡΡ Π½Π΅ Π½Π°Π΄ΠΎ
2. ΠΡΠ΅Π³Π΄Π° Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΡΠΌΠ°Π·Π°ΡΡΡΡ ΠΈ ΡΠ°ΡΠΊΠ°Π½ΡΡΡ.
3. ΠΡΡΠ° Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡΠ°ΡΠΈΡΡ ΠΏΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΌΡ ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΡ.
Π‘ΠΈΠ½ΡΠΊΠΈ ΠΈ ΡΠΈΡΠΊΠΈ:
1. Π Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ Π·Π°ΠΊΠ°Π·ΡΠΈΠΊ Π·Π°Π΄ΡΠΌΠ°Π΅ΡΡΡ ΠΎ ΡΡΡΠ½ΠΎΡΡΠΈ Π±ΡΡΠΈΡ ΠΈ Π²ΡΠ΅Π»Π΅Π½ΡΠΊΠΎΠΉ ΡΠΏΡΠ°Π²Π΅Π΄Π»ΠΈΠ²ΠΎΡΡΠΈ Π² ΡΡΠΎΠΌ ΠΌΠΈΡΠ΅ ΠΈ Π² ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΉ ΡΠ°Π· Π·Π°Π΄Π°ΡΡ ΡΠ΅Π±Π΅ Π²ΠΎΠΏΡΠΎΡ β Π·Π°, ΡΡΠΎ Ρ ΠΈΠΌ ΠΏΠ»Π°ΡΡ ΡΠ²ΠΎΠΈ Π΄Π΅Π½ΡΠ³ΠΈ? ΠΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅ Π²ΡΠ΅Π³Π΄Π° ΠΎΠ΄Π½ΠΎ β Π²ΠΎΠΏΡΠΎΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΊΠ°Π·ΡΠΈΠΊ ΠΏΠΎΡΠΊΡΡΠ½Π΅Π΅Ρ ΠΈ ΠΌΠ°Ρ
Π½Π΅Ρ ΡΡΠΊΠΎΠΉ Π½Π° ΠΏΡΠΎΡΠ°Π½ΡΠ΅. Π ΠΊΠΎΡΠΌΡΡΠΊΠ° ΠΎΠΏΡΡΡΠ΅Π΅Ρ. ΠΡΠΎ ΠΏΠ΅ΡΠ°Π»ΡΠ½ΠΎ.
2. Π Π°Π·Π²ΠΈΡΠΈΠ΅ ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠ° β Π½ΠΎΠ»Ρ.
3. Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ ΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠΈ
ΠΠ°ΡΠΈΠ°Π½Ρ 2- Β«Π’Π°Π½ΡΡΠ΅ΠΌ Ρ Π±ΡΠ±Π½Π°ΠΌΠΈ, Π²ΠΏΠ°ΡΠΈΠ²Π°Π΅ΠΌ ΠΈ ΠΎΠ±ΡΠ²Π°Π΅ΠΌΒ»
ΠΡΠ½ΠΊΡ1-ΠΠ°ΡΠ΅ΠΌ Π½Π°ΠΌ ΡΠΈΡΡΠ΅ΠΌΠ° ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π°, ΠΌΡ Π±ΡΠ΄Π΅ΠΌ Π²ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π·Π°ΠΏΡΠΎΡΠ°ΠΌΠΈ. ΠΠ°ΠΏΡΡΠΊΠ°ΠΌ ΠΊΡΡΡ Π²ΡΡΠΊΠΈΡ
Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΊ ΡΠ»ΠΎΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΡ
ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡΠΌ, Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ Π²ΡΡΠΊΠΈΠ΅ ΡΡΠ΅ΡΡΠΈΠΊΠΈ, ΡΠ²ΠΎΠ΄ΠΈΠΌ Π²ΡΠ΅ Π² ΡΠ°Π±Π»ΠΈΡΡ, ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ ΠΊΠ°ΠΊ-Π±Ρ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΡΠΏΠΈΡΠΊΠΈ ΠΈ ΡΠ°Π±Π»ΠΈΡΡ. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΈΠΌΠ΅Π΅ΠΌ ΠΊΡΠ°ΡΠΈΠ²ΡΠ΅ ΠΈΠ»ΠΈ Π½Π΅ ΠΎΡΠ΅Π½Ρ Π³ΡΠ°ΡΠΈΠΊΠΈ, ΡΠ°Π±Π»ΠΈΡΡ, ΠΎΡΡΠ΅ΡΡ. ΠΠ»Π°Π²Π½ΠΎΠ΅ β ΡΡΠΎ Π±Ρ ΠΏΠΎΠ±ΠΎΠ»ΡΡΠ΅, ΠΏΠΎΠ±ΠΎΠ»ΡΡΠ΅.
ΠΡΠ½ΠΊΡ2-ΠΠ΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ-Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π°Π½Π°Π»ΠΈΠ· Π²ΡΠ΅Π³ΠΎ ΡΡΠΎΠ³ΠΎ.
ΠΡΠ½ΠΊΡ3-ΠΠΎΡΠΎΠ²ΠΈΠΌ Π½Π΅ΠΊΠΈΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ, Π½Π°Π·ΡΠ²Π°Π΅ΠΌ ΡΠ΅ΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ, ΠΏΡΠΎΡΡΠΎ β Β«ΠΊΠ°ΠΊ Π½Π°ΠΌ ΠΎΠ±ΡΡΡΡΠΎΠΈΡΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
Β».
ΠΡΠ½ΠΊΡ4-ΠΠ°ΠΊΠ°Π·ΡΠΈΠΊ, Π²ΠΈΠ΄Ρ Π²ΡΠ΅ ΡΡΠΎ Π²Π΅Π»ΠΈΠΊΠΎΠ»Π΅ΠΏΠΈΠ΅ Π³ΡΠ°ΡΠΈΠΊΠΎΠ² ΠΈ ΡΠΈΡΡ ΠΏΡΠ΅Π±ΡΠ²Π°Π΅Ρ Π² Π΄Π΅ΡΡΠΊΠΎΠΉ Π½Π°ΠΈΠ²Π½ΠΎΠΉ ΡΠ²Π΅ΡΠ΅Π½Π½ΠΎΡΡΠΈ β Π²ΠΎΡ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠΎ Ρ Π½Π°Ρ Π²ΡΠ΅ Π·Π°ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΡΠΊΠΎΡΠΎ. Π, Π»Π΅Π³ΠΊΠΎ ΠΈ Π±Π΅Π·Π±ΠΎΠ»Π΅Π·Π½Π΅Π½Π½ΠΎ ΡΠ°ΡΡΡΠ°Π΅ΡΡΡ ΡΠΎ ΡΠ²ΠΎΠΈΠΌΠΈ Π΄Π΅Π½Π΅ΠΆΠ½ΡΠΌΠΈ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ. ΠΠ΅Π½Π΅Π΄ΠΆΠΌΠ΅Π½Ρ ΡΠ°ΠΊΠΆΠ΅ ΡΠ²Π΅ΡΠ΅Π½ β ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΡ Ρ Π½Π°Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΎΠ³ΠΎ-Π³ΠΎ. ΠΠ°Π³ΡΡΠ·ΠΊΠ° Π½Π° ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌΠ΅.
ΠΡΠ½ΠΊΡ5-Π Π΅Π³ΡΠ»ΡΡΠ½ΠΎ ΠΏΠΎΠ²ΡΠΎΡΠΈΡΡ ΠΡΠ½ΠΊΡ 1.
ΠΡΡΠ½ΠΈΠΊΠΈ ΠΈ ΠΏΡΡΠΊΠΈ , ΡΠΈΠ½ΡΠΊΠΈ ΠΈ ΡΠΈΡΠΊΠΈΠΡΡΠ½ΠΈΠΊΠΈ ΠΈ ΠΏΡΡΠΊΠΈ:
1. ΠΠΈΠ·Π½Ρ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠΎΠ² ΠΈ ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠΎΠ² β ΠΏΡΠΎΡΡΠ°, ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΠ° ΠΈ Π½Π°ΠΏΠΎΠ»Π½Π΅Π½Π° Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΡΡ. ΠΡΡ ΠΆΡΠΆΠΆΠΈΡ, Π²ΡΠ΅ Π·Π°Π½ΡΡΡ.
2. ΠΠΈΠ·Π½Ρ Π·Π°ΠΊΠ°Π·ΡΠΈΠΊΠ° ΡΠΎΠΆΠ΅ Π½Π΅ΠΏΠ»ΠΎΡ
Π° β ΠΎΠ½ Π²ΡΠ΅Π³Π΄Π° ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ Π²ΠΎΡ ΡΡΡΡ-ΡΡΡΡ ΠΏΠΎΡΠ΅ΡΠΏΠ΅ΡΡ ΠΈ Π²ΡΡ Π½Π°Π»Π°Π΄ΠΈΡΡΡ. ΠΠ΅ Π½Π°Π»Π°ΠΆΠΈΠ²Π°Π΅ΡΡΡ, Π½Ρ, ΡΡΠΎ ΠΆ β ΡΡΠΎ ΠΌΠΈΡ Π½Π΅ΡΠΏΡΠ°Π²Π΅Π΄Π»ΠΈΠ², Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΆΠΈΠ·Π½ΠΈ β ΠΏΠΎΠ²Π΅Π·Π΅Ρ.
Π‘ΠΈΠ½ΡΠΊΠΈ ΠΈ ΡΠΈΡΠΊΠΈ:
1. Π Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ, Π½ΠΎ Π½Π°ΠΉΠ΄Π΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΡΡΡΡΡΠΉ ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎΠΉ ΡΡΠ»ΡΠ³ΠΈ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ Π΄Π΅Π»Π°ΡΡ ΡΠΎΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, Π½ΠΎ ΡΡΡΡ Π΄Π΅ΡΠ΅Π²Π»Π΅. Π Π΅ΡΠ»ΠΈ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠΎΡ ΠΆΠ΅ ΡΠ°ΠΌΡΠΉ, Π·Π°ΡΠ΅ΠΌ ΠΏΠ»Π°ΡΠΈΡΡ Π±ΠΎΠ»ΡΡΠ΅. Π§ΡΠΎ ΠΎΠΏΡΡΡ-ΡΠ°ΠΊΠΈ ΠΏΡΠΈΠ²Π΅Π΄Π΅Ρ ΠΊ ΠΈΡΡΠ΅Π·Π½ΠΎΠ²Π΅Π½ΠΈΡ ΠΊΠΎΡΠΌΡΡΠΊΠΈ.
2. ΠΡΠΎ ΡΠΊΡΡΠ½ΠΎ. ΠΠ°ΠΊ ΡΠΊΡΡΠ½Π° Π»ΡΠ±Π°Ρ ΠΌΠ°Π»ΠΎΠΎΡΠΌΡΡΠ»Π΅Π½Π½Π°Ρ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ.
3. ΠΠ°ΠΊ ΠΈ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠ΅ β ΡΠ°Π·Π²ΠΈΡΠΈΡ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ. ΠΠΎ Π΄Π»Ρ ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠ° ΠΌΠΈΠ½ΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π² ΠΎΡΠ»ΠΈΡΠΈΠΈ ΠΎΡ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠ° ΡΡΡ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΠΠ. Π ΡΡΠΎ ΠΎΡΠ½ΠΈΠΌΠ°Π΅Ρ Π²ΡΠ΅ΠΌΡ. ΠΠΎΡΠΎΡΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡΠ°ΡΠΈΡΡ Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠΉ Π΄Π»Ρ ΡΠ΅Π±Ρ Π»ΡΠ±ΠΈΠΌΠΎΠ³ΠΎ. ΠΠ±ΠΎ ΡΠ°ΠΌ ΠΎ ΡΠ΅Π±Π΅ Π½Π΅ ΠΏΠΎΠ·Π°Π±ΠΎΡΠΈΡΡΡΡ, Π²ΡΠ΅ΠΌ Π½Π° ΡΠ΅Π±Ρ ΠΏΠΎ Π±Π°ΡΠ°Π±Π°Π½Ρ.
ΠΠ°ΡΠΈΠ°Π½Ρ 3-ΠΠ΅ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΈΠ΄ΡΠΌΡΠ²Π°ΡΡ Π²Π΅Π»ΠΎΡΠΈΠΏΠ΅Π΄, Π½ΡΠΆΠ½ΠΎ Π΅Π³ΠΎ ΠΊΡΠΏΠΈΡ ΠΈ ΠΊΠ°ΡΠ°ΡΡΡΡ.
ΠΠ½ΠΆΠ΅Π½Π΅ΡΡ Π΄ΡΡΠ³ΠΈΡ
ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ Π½Π΅ Π·ΡΡ Π΅Π΄ΡΡ ΠΏΠΈΡΡΡ Π·Π°ΠΏΠΈΠ²Π°Ρ ΠΏΠΈΠ²ΠΎΠΌ (ΡΡ
, ΡΠ»Π°Π²Π½ΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½Π° ΠΠΈΡΠ΅Ρ 90-Ρ
). ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ΠΎΠ²ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ΄Π΅Π»Π°Π½Ρ, ΠΎΡΠ»Π°ΠΆΠ΅Π½Ρ ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ, ΠΈ ΠΏΡΠΈΠ½ΠΎΡΡΡ Π²ΠΎΠΎΠ±ΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ ΠΏΠΎΠ»ΡΠ·Ρ (Π½Ρ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ ΠΈΡ
ΡΠΎΠ·Π΄Π°ΡΠ΅Π»ΡΠΌ).
ΠΡΡΠ½ΠΈΠΊΠΈ ΠΈ ΠΏΡΡΠΊΠΈ , ΡΠΈΠ½ΡΠΊΠΈ ΠΈ ΡΠΈΡΠΊΠΈΠΡΡΠ½ΠΈΠΊΠΈ ΠΈ ΠΏΡΡΠΊΠΈ:
1. ΠΠ΅ Π½ΡΠΆΠ½ΠΎ ΡΡΠ°ΡΠΈΡΡ Π²ΡΠ΅ΠΌΡ Π½Π° ΠΏΡΠΈΠ΄ΡΠΌΡΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΈ ΡΠ°ΠΊ ΠΏΡΠΈΠ΄ΡΠΌΠ°Π½ΠΎ. ΠΠ΅ΡΠΈ ΠΈ ΠΏΠΎΠ»ΡΠ·ΡΠΉΡΡ.
2. Π‘ΠΈΡΡΠ΅ΠΌΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΠΏΠΈΡΡΡ Π½Π΅ Π΄ΡΡΠ°ΠΊΠΈ ΠΈ ΠΎΠ½ΠΈ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΠΆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ.
3. Π Π°Π±ΠΎΡΠ°ΡΡΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ Π΄Π°ΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΡ ΠΎΡΡΠΈΠ»ΡΡΡΠΎΠ²Π°Π½Π½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ.
Π‘ΠΈΠ½ΡΠΊΠΈ ΠΈ ΡΠΈΡΠΊΠΈ:
1. ΠΠ½ΠΆΠ΅Π½Π΅Ρ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π΅ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ, Π° Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΡΠΆΠΎΠ³ΠΎ ΠΏΡΠΎΠ΄ΡΠΊΡΠ°.ΠΠ»ΠΈ ΡΠ·Π΅Ρ.
2. ΠΠ°ΠΊΠ°Π·ΡΠΈΠΊΠ° Π½Π°Π΄ΠΎ ΡΠ±Π΅Π΄ΠΈΡΡ Π² Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΊΡΠΏΠΈΡΡ ΡΡΠΎ-ΡΠΎ Π² ΡΠ΅ΠΌ ΠΎΠ½ ΡΠ°Π·Π±ΠΈΡΠ°ΡΡΡΡ Π²ΠΎΠΎΠ±ΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ Π½Π΅ Ρ
ΠΎΡΠ΅Ρ, Π΄Π° ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈ Π²ΠΎΠΎΠ±ΡΠ΅ Π±ΡΠ΄ΠΆΠ΅Ρ Π½Π° Π³ΠΎΠ΄ ΡΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ ΠΈ ΠΌΠ΅Π½ΡΡΡΡΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ. ΠΠΎΡΠΎΠΌ Π½ΡΠΆΠ½ΠΎ Π²ΡΠ΄Π΅Π»ΠΈΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠ΅ΡΡΡΡ, Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ. Π’.Π΅. ΡΠ½Π°ΡΠ°Π»Π° Π½ΡΠΆΠ½ΠΎ ΠΏΠ»Π°ΡΠΈΡ, ΠΏΠ»Π°ΡΠΈΡΡ ΠΈ Π΅ΡΠ΅ ΡΠ°Π· Π·Π°ΠΏΠ»Π°ΡΠΈΡΡ. Π Π·Π°ΠΊΠ°Π·ΡΠΈΠΊ ΡΠΊΡΠΏ. ΠΡΠΎ Π½ΠΎΡΠΌΠ° ΡΡΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ.
Π§ΡΠΎ ΠΆΠ΅ Π΄Π΅Π»Π°ΡΡ- Π§Π΅ΡΠ½ΡΡΠ΅Π²ΡΠΊΠΈΠΉ? Π’Π²ΠΎΠΉ Π²ΠΎΠΏΡΠΎΡ Π²Π΅ΡΡΠΌΠ° ΡΠΌΠ΅ΡΡΠ΅Π½. (Ρ)
Π Π΄Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈ ΡΠ»ΠΎΠΆΠΈΠ²ΡΠ΅ΠΉΡΡ ΡΠΈΡΡΠ°ΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡΡΠΏΠΈΡΡ ΡΡΡΡ-ΡΡΡΡ ΠΏΠΎ-Π΄ΡΡΠ³ΠΎΠΌΡ β Π° Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΡΠ²ΠΎΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π°.
ΠΡ Π½Π΅ ΡΠΈΡΡΠ΅ΠΌΡ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π² ΠΏΠΎΠ»Π½ΠΎΠΌ ΡΠΌΡΡΠ»Π΅ ΡΠ»ΠΎΠ²Π°, ΡΡΠΎ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π³ΡΠΎΠΌΠΊΠΎ ΡΠΊΠ°Π·Π°Π½ΠΎ ΠΈ ΡΠ°ΠΌΠΎΠ½Π°Π΄Π΅ΡΠ½Π½ΠΎ, Π½ΠΎ Ρ
ΠΎΡΡ ΠΊΠ°ΠΊ-ΡΠΎ ΠΎΠ±Π»Π΅Π³ΡΠΈΡΡ ΡΠ΅Π±Π΅ Π·Π°Π΄Π°ΡΡ ΠΈ ΡΠΎΠ±ΡΠ°ΡΡ ΠΏΠΎΠ±ΠΎΠ»ΡΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΈΠ½ΡΠΈΠ΄Π΅Π½ΡΠΎΠ² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ. Π§ΡΠΎΠ±Ρ Π½Π΅ ΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ Π² ΡΠΈΡΡΠ°ΡΠΈΠΈ β Β«ΠΏΠΎΠΉΠ΄ΠΈ ΡΡΠ΄Π° Π½Π΅ Π·Π½Π°Ρ ΠΊΡΠ΄Π°, Π½Π°ΠΉΠ΄ΠΈ ΡΠΎ, Π½Π΅ Π·Π½Π°Ρ ΡΡΠΎΒ».
ΠΠ°ΠΊΠΈΠ΅ ΠΆΠ΅ ΠΏΠ»ΡΡΡ ΠΈ ΠΌΠΈΠ½ΡΡΡ ΡΡΠΎΠ³ΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠ°:
ΠΠ»ΡΡΡ:
1. ΠΡΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ. ΠΡ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π΅Π΅, ΡΠ΅ΠΌ ΠΏΠΎΡΡΠΎΡΠ½Π½ΡΠ΅ Β«shrink datafile, alter tablespace, etc.Β»
2. ΠΡΠΎ Π½ΠΎΠ²ΡΠ΅ ΡΠΊΠΈΠ»Ρ ΠΈ Π½ΠΎΠ²ΠΎΠ΅ ΡΠ°Π·Π²ΠΈΡΠΈΠ΅. Π§ΡΠΎ Π² ΠΏΠ΅ΡΡΠΏΠ΅ΠΊΡΠΈΠ²Π΅ ΡΠ°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ Π΄Π°ΡΡ Π·Π°ΡΠ»ΡΠΆΠ΅Π½Π½ΡΠ΅ ΠΏΡΡΠ½ΠΈΠΊΠΈ ΠΈ ΠΏΡΡΠΊΠΈ.
ΠΠΈΠ½ΡΡΡ:
1. ΠΡΠΈΠ΄Π΅ΡΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ. Π Π°Π±ΠΎΡΠ°ΡΡ ΠΌΠ½ΠΎΠ³ΠΎ.
2. ΠΡΠΈΠ΄Π΅ΡΡΡ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎ ΠΎΠ±ΡΡΡΠ½ΡΡΡ ΡΠΌΡΡΠ» ΠΈ ΠΏΠ΅ΡΡΠΏΠ΅ΠΊΡΠΈΠ²Ρ Π²ΡΠ΅ΠΉ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ.
3. Π§Π΅ΠΌ-ΡΠΎ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΏΠΎΠΆΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ, ΠΈΠ±ΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ Π΄ΠΎΡΡΡΠΏΠ½ΡΠΉ ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΡ ΡΠ΅ΡΡΡΡ-Π²ΡΠ΅ΠΌΡ β ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ ΠΡΠ΅Π»Π΅Π½Π½ΠΎΠΉ.
4. Π‘Π°ΠΌΠΎΠ΅ ΡΡΡΠ°ΡΠ½ΠΎΠ΅ ΠΈ ΡΠ°ΠΌΠΎΠ΅ Π½Π΅ΠΏΡΠΈΡΡΠ½ΠΎΠ΅ β Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ ΡΠΈΠ³Π½Ρ ΡΠΈΠΏΠ° Β«ΠΠ΅ ΠΌΡΡΠΎΠ½ΠΎΠΊ, Π½Π΅ Π»ΡΠ³ΡΡΠΊΠ°, Π° Π½Π΅Π²Π΅Π΄ΠΎΠΌΠ° Π·Π²Π΅ΡΡΡΠΊΠ°Β».
ΠΡΠΎ Π½Π΅ ΡΠΈΡΠΊΡΠ΅Ρ-ΡΠΎ Π½Π΅ ΠΏΡΠ΅Ρ ΡΠ°ΠΌΠΏΠ°Π½ΡΠΊΠΎΠ΅.
ΠΡΠ°ΠΊ β Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ ΡΠ°ΠΌΠΎΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠ΅.
ΠΠ±ΡΠ°Ρ ΠΈΠ΄Π΅Ρ β ΡΡ Π΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ
(ΠΠ»Π»ΡΡΡΡΠ°ΡΠΈΡ Π²Π·ΡΡΠ° ΠΈΠ· ΡΡΠ°ΡΡΠΈ Β«
ΠΠΎΡΡΠ½Π΅Π½ΠΈΠ΅:
- Π ΡΠ΅Π»Π΅Π²ΠΎΠΉ Π±Π°Π·Π΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ PostgreSQL β βpg_stat_statementsβ.
- Π Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π½Π°Π±ΠΎΡ ΡΠ΅ΡΠ²ΠΈΡΠ½ΡΡ ΡΠ°Π±Π»ΠΈΡ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΈΡΡΠΎΡΠΈΠΈ pg_stat_statements Π½Π° Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠΌ ΡΡΠ°ΠΏΠ΅ ΠΈ Π΄Π»Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΌΠ΅ΡΡΠΈΠΊ ΠΈ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ
- ΠΠ° Ρ ΠΎΡΡΠ΅ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π½Π°Π±ΠΎΡ bash-ΡΠΊΡΠΈΠΏΡΠΎΠ², Π² ΡΠΎΠΌ, ΡΠΈΡΠ»Π΅ Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΈΠ½ΡΠΈΠ΄Π΅Π½ΡΠΎΠ² Π² ΡΠΈΠΊΠ΅ΡΠ½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅.
Π‘Π΅ΡΠ²ΠΈΡΠ½ΡΠ΅ ΡΠ°Π±Π»ΠΈΡΡ
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° ΡΡ
Π΅ΠΌΠ°ΡΠΈΡΠ½ΠΎ-ΡΠΏΡΠΎΡΠ΅Π½Π½Π°Ρ ERD, ΡΡΠΎ ΠΆΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ Π² ΠΈΡΠΎΠ³Π΅:
ΠΡΠ°ΡΠΊΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΈΡendpoint β Ρ
ΠΎΡΡ, ΡΠΎΡΠΊΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊ ΠΈΠ½ΡΡΠ°Π½ΡΡ
database β ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
pg_stat_history β ΠΈΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ°Π±Π»ΠΈΡΠ° Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
ΡΠ½ΠΈΠΌΠΊΠΎΠ² ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ pg_stat_statements ΡΠ΅Π»Π΅Π²ΠΎΠΉ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
metric_glossary β ΡΠ»ΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΡΠΈΠΊ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ
metric_config β ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ
ΠΌΠ΅ΡΡΠΈΠΊ
metric β ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π°Ρ ΠΌΠ΅ΡΡΠΈΠΊΠ° Π΄Π»Ρ Π·Π°ΠΏΡΠΎΡΠ° ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΡΡΡ
metric_alert_history β ΠΈΡΡΠΎΡΠΈΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ
log_query β ΡΠ»ΡΠΆΠ΅Π±Π½Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ° Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ°Π·ΠΎΠ±ΡΠ°Π½Π½ΡΡ
Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΠΈΠ· log ΡΠ°ΠΉΠ»Π° PostgreSQL Π·Π°Π³ΡΡΠΆΠ°Π΅ΠΌΠΌΠΎΠ³ΠΎ Ρ AWS
baseline β ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠΈΠΎΠ΄Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ
checkpoint β ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΌΠ΅ΡΡΠΈΠΊ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
checkpoint_alert_history β ΠΈΡΡΠΎΡΠΈΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΌΠ΅ΡΡΠΈΠΊ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
pg_stat_db_queries β ΡΠ»ΡΠΆΠ΅Π±Π½Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ° Π°ΠΊΡΠΈΠ²Π½ΡΡ
Π·Π°ΠΏΡΠΎΡΠΎΠ²
activity_log β ΡΠ»ΡΠΆΠ΅Π±Π½Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ° ΠΆΡΡΠ½Π°Π»Π° Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ
trap_oid β ΡΠ»ΡΠΆΠ΅Π±Π½Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ trap
ΠΡΠ°ΠΏ 1 β ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌ ΡΡΠ°ΡΠΈΡΡΠΈΡΠ΅ΡΠΊΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΎΡΡΠ΅ΡΡ
ΠΠ»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ ΡΡΠ°ΡΠΈΡΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΡΠ»ΡΠΆΠΈΡ ΡΠ°Π±Π»ΠΈΡΠ° pg_stat_history
Π‘ΡΡΡΠΊΡΡΡΠ° ΡΠ°Π±Π»ΠΈΡΡ pg_stat_history
Table "public.pg_stat_history" Column | Type | Modifiers ---------------------+-----------------------------+------------------------------------------- id | integer | not null default nextval('pg_stat_history_id_seq'::regclass) snapshot_timestamp | timestamp without time zone | database_id | integer | dbid | oid | userid | oid | queryid | bigint | query | text | calls | bigint | total_time | double precision | min_time | double precision | max_time | double precision | mean_time | double precision | stddev_time | double precision | rows | bigint | shared_blks_hit | bigint | shared_blks_read | bigint | shared_blks_dirtied | bigint | shared_blks_written | bigint | local_blks_hit | bigint | local_blks_read | bigint | local_blks_dirtied | bigint | local_blks_written | bigint | temp_blks_read | bigint | temp_blks_written | bigint | blk_read_time | double precision | blk_write_time | double precision | baseline_id | integer | Indexes: "pg_stat_history_pkey" PRIMARY KEY, btree (id) "database_idx" btree (database_id) "queryid_idx" btree (queryid) "snapshot_timestamp_idx" btree (snapshot_timestamp) Foreign-key constraints: "database_id_fk" FOREIGN KEY (database_id) REFERENCES database(id) ON DELETE CASCADE
ΠΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ, ΡΠ°Π±Π»ΠΈΡΠ° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ ΠΊΡΠΌΡΠ»ΡΡΠΈΠ²Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ pg_stat_statements Π² ΡΠ΅Π»Π΅Π²ΠΎΠΉ Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ .
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎΠ΅
pg_stat_history Π±ΡΠ΄Π΅Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΡΠΎΠ±ΠΎΠΉ Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½ΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² Π·Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Ρ. Π Π½Π°ΡΠ°Π»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ°ΡΠ°, ΠΏΠΎΡΠ»Π΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ°Π±Π»ΠΈΡΡ, ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ° pg_stat_statements ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ pg_stat_statements_reset().
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: cΡΠ°ΡΠΈΡΡΠΈΠΊΠ° ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΡΡ Π΄Π»Ρ Π·Π°ΠΏΡΠΎΡΠΎΠ², Ρ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π±ΠΎΠ»Π΅Π΅ 1 ΡΠ΅ΠΊΡΠ½Π΄Ρ.
ΠΠ°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΈΡΡ pg_stat_history
--pg_stat_history.sql
CREATE OR REPLACE FUNCTION pg_stat_history( ) RETURNS boolean AS $$
DECLARE
endpoint_rec record ;
database_rec record ;
pg_stat_snapshot record ;
current_snapshot_timestamp timestamp without time zone;
BEGIN
current_snapshot_timestamp = date_trunc('minute',now());
FOR endpoint_rec IN SELECT * FROM endpoint
LOOP
FOR database_rec IN SELECT * FROM database WHERE endpoint_id = endpoint_rec.id
LOOP
RAISE NOTICE 'NEW SHAPSHOT IS CREATING';
--Connect to the target DB
EXECUTE 'SELECT dblink_connect(''LINK1'',''host='||endpoint_rec.host||' dbname='||database_rec.name||' user=USER password=PASSWORD '')';
RAISE NOTICE 'host % and dbname % ',endpoint_rec.host,database_rec.name;
RAISE NOTICE 'Creating snapshot of pg_stat_statements for database %',database_rec.name;
SELECT
*
INTO
pg_stat_snapshot
FROM dblink('LINK1',
'SELECT
dbid , SUM(calls),SUM(total_time),SUM(rows) ,SUM(shared_blks_hit) ,SUM(shared_blks_read) ,SUM(shared_blks_dirtied) ,SUM(shared_blks_written) ,
SUM(local_blks_hit) , SUM(local_blks_read) , SUM(local_blks_dirtied) , SUM(local_blks_written) , SUM(temp_blks_read) , SUM(temp_blks_written) , SUM(blk_read_time) , SUM(blk_write_time)
FROM pg_stat_statements WHERE dbid=(SELECT oid from pg_database where datname=current_database() )
GROUP BY dbid
'
)
AS t
( dbid oid , calls bigint ,
total_time double precision ,
rows bigint , shared_blks_hit bigint , shared_blks_read bigint ,shared_blks_dirtied bigint ,shared_blks_written bigint ,
local_blks_hit bigint ,local_blks_read bigint , local_blks_dirtied bigint ,local_blks_written bigint ,
temp_blks_read bigint ,temp_blks_written bigint ,
blk_read_time double precision , blk_write_time double precision
);
INSERT INTO pg_stat_history
(
snapshot_timestamp ,database_id ,
dbid , calls ,total_time ,
rows ,shared_blks_hit ,shared_blks_read ,shared_blks_dirtied ,shared_blks_written ,local_blks_hit ,
local_blks_read,local_blks_dirtied,local_blks_written,temp_blks_read,temp_blks_written,
blk_read_time, blk_write_time
)
VALUES
(
current_snapshot_timestamp ,
database_rec.id ,
pg_stat_snapshot.dbid ,pg_stat_snapshot.calls,
pg_stat_snapshot.total_time,
pg_stat_snapshot.rows ,pg_stat_snapshot.shared_blks_hit ,pg_stat_snapshot.shared_blks_read ,pg_stat_snapshot.shared_blks_dirtied ,pg_stat_snapshot.shared_blks_written ,
pg_stat_snapshot.local_blks_hit , pg_stat_snapshot.local_blks_read , pg_stat_snapshot.local_blks_dirtied , pg_stat_snapshot.local_blks_written ,
pg_stat_snapshot.temp_blks_read , pg_stat_snapshot.temp_blks_written , pg_stat_snapshot.blk_read_time , pg_stat_snapshot.blk_write_time
);
RAISE NOTICE 'Creating snapshot of pg_stat_statements for queries with min_time more than 1000ms';
FOR pg_stat_snapshot IN
--All queries with max_time greater than 1000 ms
SELECT
*
FROM dblink('LINK1',
'SELECT
dbid , userid ,queryid,query,calls,total_time,min_time ,max_time,mean_time, stddev_time ,rows ,shared_blks_hit ,
shared_blks_read ,shared_blks_dirtied ,shared_blks_written ,
local_blks_hit , local_blks_read , local_blks_dirtied ,
local_blks_written , temp_blks_read , temp_blks_written , blk_read_time ,
blk_write_time
FROM pg_stat_statements
WHERE dbid=(SELECT oid from pg_database where datname=current_database() AND min_time >= 1000 )
'
)
AS t
( dbid oid , userid oid , queryid bigint ,query text , calls bigint ,
total_time double precision ,min_time double precision ,max_time double precision , mean_time double precision , stddev_time double precision ,
rows bigint , shared_blks_hit bigint , shared_blks_read bigint ,shared_blks_dirtied bigint ,shared_blks_written bigint ,
local_blks_hit bigint ,local_blks_read bigint , local_blks_dirtied bigint ,local_blks_written bigint ,
temp_blks_read bigint ,temp_blks_written bigint ,
blk_read_time double precision , blk_write_time double precision
)
LOOP
INSERT INTO pg_stat_history
(
snapshot_timestamp ,database_id ,
dbid ,userid , queryid , query , calls ,total_time ,min_time ,max_time ,mean_time ,stddev_time ,
rows ,shared_blks_hit ,shared_blks_read ,shared_blks_dirtied ,shared_blks_written ,local_blks_hit ,
local_blks_read,local_blks_dirtied,local_blks_written,temp_blks_read,temp_blks_written,
blk_read_time, blk_write_time
)
VALUES
(
current_snapshot_timestamp ,
database_rec.id ,
pg_stat_snapshot.dbid ,pg_stat_snapshot.userid ,pg_stat_snapshot.queryid,pg_stat_snapshot.query,pg_stat_snapshot.calls,
pg_stat_snapshot.total_time,pg_stat_snapshot.min_time ,pg_stat_snapshot.max_time,pg_stat_snapshot.mean_time, pg_stat_snapshot.stddev_time ,
pg_stat_snapshot.rows ,pg_stat_snapshot.shared_blks_hit ,pg_stat_snapshot.shared_blks_read ,pg_stat_snapshot.shared_blks_dirtied ,pg_stat_snapshot.shared_blks_written ,
pg_stat_snapshot.local_blks_hit , pg_stat_snapshot.local_blks_read , pg_stat_snapshot.local_blks_dirtied , pg_stat_snapshot.local_blks_written ,
pg_stat_snapshot.temp_blks_read , pg_stat_snapshot.temp_blks_written , pg_stat_snapshot.blk_read_time , pg_stat_snapshot.blk_write_time
);
END LOOP;
PERFORM dblink_disconnect('LINK1');
END LOOP ;--FOR database_rec IN SELECT * FROM database WHERE endpoint_id = endpoint_rec.id
END LOOP;
RETURN TRUE;
END
$$ LANGUAGE plpgsql;
Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅, ΠΏΠΎΡΠ»Π΅ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΏΠ΅ΡΠΈΠΎΠ΄Π° Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ pg_stat_history Ρ Π½Π°Ρ Π±ΡΠ΄Π΅Ρ Π½Π°Π±ΠΎΡ ΡΠ½ΠΈΠΌΠΊΠΎΠ² ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ΡΠ°Π±Π»ΠΈΡΡ pg_stat_statements ΡΠ΅Π»Π΅Π²ΠΎΠΉ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ .
Π‘ΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠ΅ΠΏΠΎΡΡΠΈΠ½Π³
ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΡΠΎΡΡΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π²ΠΏΠΎΠ»Π½Π΅ ΡΠ΅Π±Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΡΠ΅ ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠ΅ ΠΎΡΡΠ΅ΡΡ.
ΠΠ³ΡΠ΅Π³ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π·Π° Π·Π°Π΄Π°Π½Π½ΡΠΉ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΠΊ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ
ΠΠ°ΠΏΡΠΎΡ
SELECT
database_id ,
SUM(calls) AS calls ,SUM(total_time) AS total_time ,
SUM(rows) AS rows , SUM(shared_blks_hit) AS shared_blks_hit,
SUM(shared_blks_read) AS shared_blks_read ,
SUM(shared_blks_dirtied) AS shared_blks_dirtied,
SUM(shared_blks_written) AS shared_blks_written ,
SUM(local_blks_hit) AS local_blks_hit ,
SUM(local_blks_read) AS local_blks_read ,
SUM(local_blks_dirtied) AS local_blks_dirtied ,
SUM(local_blks_written) AS local_blks_written,
SUM(temp_blks_read) AS temp_blks_read,
SUM(temp_blks_written) temp_blks_written ,
SUM(blk_read_time) AS blk_read_time ,
SUM(blk_write_time) AS blk_write_time
FROM
pg_stat_history
WHERE
queryid IS NULL AND
database_id = DATABASE_ID AND
snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
GROUP BY database_id ;
DB Time
to_char(interval ‘1 millisecond’ * pg_total_stat_history_rec.total_time, ‘HH24:MI:SS.MS’)
I/O Time
to_char(interval ‘1 millisecond’ * ( pg_total_stat_history_rec.blk_read_time + pg_total_stat_history_rec.blk_write_time ), ‘HH24:MI:SS.MS’)
TOP10 SQL by total_time
ΠΠ°ΠΏΡΠΎΡ
SELECT
queryid ,
SUM(calls) AS calls ,
SUM(total_time) AS total_time
FROM
pg_stat_history
WHERE
queryid IS NOT NULL AND
database_id = DATABASE_ID AND
snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
GROUP BY queryid
ORDER BY 3 DESC
LIMIT 10
------------------------------------------------------------------------------------- | TOP10 SQL BY TOTAL EXECUTION TIME | #| queryid| calls| calls %| total_time (ms) | dbtime % +----+-----------+-----------+-----------+--------------------------------+---------- | 1| 821760255| 2| .00001|00:03:23.141( 203141.681 ms.)| 5.42 | 2| 4152624390| 2| .00001|00:03:13.929( 193929.215 ms.)| 5.17 | 3| 1484454471| 4| .00001|00:02:09.129( 129129.057 ms.)| 3.44 | 4| 655729273| 1| .00000|00:02:01.869( 121869.981 ms.)| 3.25 | 5| 2460318461| 1| .00000|00:01:33.113( 93113.835 ms.)| 2.48 | 6| 2194493487| 4| .00001|00:00:17.377( 17377.868 ms.)| .46 | 7| 1053044345| 1| .00000|00:00:06.156( 6156.352 ms.)| .16 | 8| 3644780286| 1| .00000|00:00:01.063( 1063.830 ms.)| .03
TOP10 SQL by total I/O time
ΠΠ°ΠΏΡΠΎΡ
SELECT
queryid ,
SUM(calls) AS calls ,
SUM(blk_read_time + blk_write_time) AS io_time
FROM
pg_stat_history
WHERE
queryid IS NOT NULL AND
database_id = DATABASE_ID AND
snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
GROUP BY queryid
ORDER BY 3 DESC
LIMIT 10
---------------------------------------------------------------------------------------- | TOP10 SQL BY TOTAL I/O TIME | #| queryid| calls| calls %| I/O time (ms)|db I/O time % +----+-----------+-----------+-----------+--------------------------------+------------- | 1| 4152624390| 2| .00001|00:08:31.616( 511616.592 ms.)| 31.06 | 2| 821760255| 2| .00001|00:08:27.099( 507099.036 ms.)| 30.78 | 3| 655729273| 1| .00000|00:05:02.209( 302209.137 ms.)| 18.35 | 4| 2460318461| 1| .00000|00:04:05.981( 245981.117 ms.)| 14.93 | 5| 1484454471| 4| .00001|00:00:39.144( 39144.221 ms.)| 2.38 | 6| 2194493487| 4| .00001|00:00:18.182( 18182.816 ms.)| 1.10 | 7| 1053044345| 1| .00000|00:00:16.611( 16611.722 ms.)| 1.01 | 8| 3644780286| 1| .00000|00:00:00.436( 436.205 ms.)| .03
TOP10 SQL by max time of execution
ΠΠ°ΠΏΡΠΎΡ
SELECT
id AS snapshotid ,
queryid ,
snapshot_timestamp ,
max_time
FROM
pg_stat_history
WHERE
queryid IS NOT NULL AND
database_id = DATABASE_ID AND
snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
ORDER BY 4 DESC
LIMIT 10
----------------------------------------------------------------------------------------- | TOP10 SQL BY MAX EXECUTION TIME | #| snapshot| snapshotID| queryid| max_time (ms) +----+------------------+-----------+-----------+---------------------------------------- | 1| 05.04.2019 01:03| 4169| 655729273| 00:02:01.869( 121869.981 ms.) | 2| 04.04.2019 17:00| 4153| 821760255| 00:01:41.570( 101570.841 ms.) | 3| 04.04.2019 16:00| 4146| 821760255| 00:01:41.570( 101570.841 ms.) | 4| 04.04.2019 16:00| 4144| 4152624390| 00:01:36.964( 96964.607 ms.) | 5| 04.04.2019 17:00| 4151| 4152624390| 00:01:36.964( 96964.607 ms.) | 6| 05.04.2019 10:00| 4188| 1484454471| 00:01:33.452( 93452.150 ms.) | 7| 04.04.2019 17:00| 4150| 2460318461| 00:01:33.113( 93113.835 ms.) | 8| 04.04.2019 15:00| 4140| 1484454471| 00:00:11.892( 11892.302 ms.) | 9| 04.04.2019 16:00| 4145| 1484454471| 00:00:11.892( 11892.302 ms.) | 10| 04.04.2019 17:00| 4152| 1484454471| 00:00:11.892( 11892.302 ms.)
TOP10 SQL by SHARED buffer read/write
ΠΠ°ΠΏΡΠΎΡ
SELECT
id AS snapshotid ,
queryid ,
snapshot_timestamp ,
shared_blks_read ,
shared_blks_written
FROM
pg_stat_history
WHERE
queryid IS NOT NULL AND
database_id = DATABASE_ID AND
snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT AND
( shared_blks_read > 0 OR shared_blks_written > 0 )
ORDER BY 4 DESC , 5 DESC
LIMIT 10
-------------------------------------------------------------------------------------------- | TOP10 SQL BY SHARED BUFFER READ/WRITE | #| snapshot| snapshotID| queryid| shared blocks read| shared blocks write +----+------------------+-----------+-----------+---------------------+--------------------- | 1| 04.04.2019 17:00| 4153| 821760255| 797308| 0 | 2| 04.04.2019 16:00| 4146| 821760255| 797308| 0 | 3| 05.04.2019 01:03| 4169| 655729273| 797158| 0 | 4| 04.04.2019 16:00| 4144| 4152624390| 756514| 0 | 5| 04.04.2019 17:00| 4151| 4152624390| 756514| 0 | 6| 04.04.2019 17:00| 4150| 2460318461| 734117| 0 | 7| 04.04.2019 17:00| 4155| 3644780286| 52973| 0 | 8| 05.04.2019 01:03| 4168| 1053044345| 52818| 0 | 9| 04.04.2019 15:00| 4141| 2194493487| 52813| 0 | 10| 04.04.2019 16:00| 4147| 2194493487| 52813| 0 --------------------------------------------------------------------------------------------
ΠΠΈΡΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΏΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΌΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ
ΠΠ°ΠΏΡΠΎΡΡ
SELECT
MIN(max_time) AS hist_min ,
MAX(max_time) AS hist_max ,
(( MAX(max_time) - MIN(min_time) ) / hist_columns ) as hist_width
FROM
pg_stat_history
WHERE
queryid IS NOT NULL AND
database_id = DATABASE_ID AND
snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT ;
SELECT
SUM(calls) AS calls
FROM
pg_stat_history
WHERE
queryid IS NOT NULL AND
database_id =DATABASE_ID AND
snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT AND
( max_time >= hist_current_min AND max_time < hist_current_max ) ;
|----------------------------------------------------------------------------------------------- | MAX_TIME HISTOGRAM | TOTAL CALLS : 33851920 | MIN TIME : 00:00:01.063 | MAX TIME : 00:02:01.869 --------------------------------------------------------------------------------- | min duration| max duration| calls +----------------------------------+----------------------------------+---------- | 00:00:01.063( 1063.830 ms.) | 00:00:13.144( 13144.445 ms.) | 9 | 00:00:13.144( 13144.445 ms.) | 00:00:25.225( 25225.060 ms.) | 0 | 00:00:25.225( 25225.060 ms.) | 00:00:37.305( 37305.675 ms.) | 0 | 00:00:37.305( 37305.675 ms.) | 00:00:49.386( 49386.290 ms.) | 0 | 00:00:49.386( 49386.290 ms.) | 00:01:01.466( 61466.906 ms.) | 0 | 00:01:01.466( 61466.906 ms.) | 00:01:13.547( 73547.521 ms.) | 0 | 00:01:13.547( 73547.521 ms.) | 00:01:25.628( 85628.136 ms.) | 0 | 00:01:25.628( 85628.136 ms.) | 00:01:37.708( 97708.751 ms.) | 4 | 00:01:37.708( 97708.751 ms.) | 00:01:49.789( 109789.366 ms.) | 2 | 00:01:49.789( 109789.366 ms.) | 00:02:01.869( 121869.981 ms.) | 0
TOP10 Snapshots by Query per Second
ΠΠ°ΠΏΡΠΎΡΡ
--pg_qps.sql
--Calculate Query Per Second
CREATE OR REPLACE FUNCTION pg_qps( pg_stat_history_id integer ) RETURNS double precision AS $$
DECLARE
pg_stat_history_rec record ;
prev_pg_stat_history_id integer ;
prev_pg_stat_history_rec record;
total_seconds double precision ;
result double precision;
BEGIN
result = 0 ;
SELECT *
INTO pg_stat_history_rec
FROM
pg_stat_history
WHERE id = pg_stat_history_id ;
IF pg_stat_history_rec.snapshot_timestamp IS NULL
THEN
RAISE EXCEPTION 'ERROR - Not found pg_stat_history for id = %',pg_stat_history_id;
END IF ;
--RAISE NOTICE 'pg_stat_history_id = % , snapshot_timestamp = %', pg_stat_history_id ,
pg_stat_history_rec.snapshot_timestamp ;
SELECT
MAX(id)
INTO
prev_pg_stat_history_id
FROM
pg_stat_history
WHERE
database_id = pg_stat_history_rec.database_id AND
queryid IS NULL AND
id < pg_stat_history_rec.id ;
IF prev_pg_stat_history_id IS NULL
THEN
RAISE NOTICE 'Not found previous pg_stat_history shapshot for id = %',pg_stat_history_id;
RETURN NULL ;
END IF;
SELECT *
INTO prev_pg_stat_history_rec
FROM
pg_stat_history
WHERE id = prev_pg_stat_history_id ;
--RAISE NOTICE 'prev_pg_stat_history_id = % , prev_snapshot_timestamp = %', prev_pg_stat_history_id , prev_pg_stat_history_rec.snapshot_timestamp ;
total_seconds = extract(epoch from ( pg_stat_history_rec.snapshot_timestamp - prev_pg_stat_history_rec.snapshot_timestamp ));
--RAISE NOTICE 'total_seconds = % ', total_seconds ;
--RAISE NOTICE 'calls = % ', pg_stat_history_rec.calls ;
IF total_seconds > 0
THEN
result = pg_stat_history_rec.calls / total_seconds ;
ELSE
result = 0 ;
END IF;
RETURN result ;
END
$$ LANGUAGE plpgsql;
SELECT
id ,
snapshot_timestamp ,
calls ,
total_time ,
( select pg_qps( id )) AS QPS ,
blk_read_time ,
blk_write_time
FROM
pg_stat_history
WHERE
queryid IS NULL AND
database_id = DATABASE_ID AND
snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT AND
( select pg_qps( id )) IS NOT NULL
ORDER BY 5 DESC
LIMIT 10
|----------------------------------------------------------------------------------------------- | TOP10 Snapshots ordered by QueryPerSeconds numbers ----------------------------------------------------------------------------------------------------------------------------------------------- | #| snapshot| snapshotID| calls| total dbtime| QPS| I/O time| I/O time % +-----+------------------+-----------+-----------+----------------------------------+-----------+----------------------------------+----------- | 1| 04.04.2019 20:04| 4161| 5758631| 00:06:30.513( 390513.926 ms.)| 1573.396| 00:00:01.470( 1470.110 ms.)| .376 | 2| 04.04.2019 17:00| 4149| 3529197| 00:11:48.830( 708830.618 ms.)| 980.332| 00:12:47.834( 767834.052 ms.)| 108.324 | 3| 04.04.2019 16:00| 4143| 3525360| 00:10:13.492( 613492.351 ms.)| 979.267| 00:08:41.396( 521396.555 ms.)| 84.988 | 4| 04.04.2019 21:03| 4163| 2781536| 00:03:06.470( 186470.979 ms.)| 785.745| 00:00:00.249( 249.865 ms.)| .134 | 5| 04.04.2019 19:03| 4159| 2890362| 00:03:16.784( 196784.755 ms.)| 776.979| 00:00:01.441( 1441.386 ms.)| .732 | 6| 04.04.2019 14:00| 4137| 2397326| 00:04:43.033( 283033.854 ms.)| 665.924| 00:00:00.024( 24.505 ms.)| .009 | 7| 04.04.2019 15:00| 4139| 2394416| 00:04:51.435( 291435.010 ms.)| 665.116| 00:00:12.025( 12025.895 ms.)| 4.126 | 8| 04.04.2019 13:00| 4135| 2373043| 00:04:26.791( 266791.988 ms.)| 659.179| 00:00:00.064( 64.261 ms.)| .024 | 9| 05.04.2019 01:03| 4167| 4387191| 00:06:51.380( 411380.293 ms.)| 609.332| 00:05:18.847( 318847.407 ms.)| 77.507 | 10| 04.04.2019 18:01| 4157| 1145596| 00:01:19.217( 79217.372 ms.)| 313.004| 00:00:01.319( 1319.676 ms.)| 1.666
Hourly Execution History with QueryPerSeconds and I/O Time
ΠΠ°ΠΏΡΠΎΡ
SELECT
id ,
snapshot_timestamp ,
calls ,
total_time ,
( select pg_qps( id )) AS QPS ,
blk_read_time ,
blk_write_time
FROM
pg_stat_history
WHERE
queryid IS NULL AND
database_id = DATABASE_ID AND
snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
ORDER BY 2
|----------------------------------------------------------------------------------------------- | HOURLY EXECUTION HISTORY WITH QueryPerSeconds and I/O Time ----------------------------------------------------------------------------------------------------------------------------------------------- | QUERY PER SECOND HISTORY | #| snapshot| snapshotID| calls| total dbtime| QPS| I/O time| I/O time % +-----+------------------+-----------+-----------+----------------------------------+-----------+----------------------------------+----------- | 1| 04.04.2019 11:00| 4131| 3747| 00:00:00.835( 835.374 ms.)| 1.041| 00:00:00.000( .000 ms.)| .000 | 2| 04.04.2019 12:00| 4133| 1002722| 00:01:52.419( 112419.376 ms.)| 278.534| 00:00:00.149( 149.105 ms.)| .133 | 3| 04.04.2019 13:00| 4135| 2373043| 00:04:26.791( 266791.988 ms.)| 659.179| 00:00:00.064( 64.261 ms.)| .024 | 4| 04.04.2019 14:00| 4137| 2397326| 00:04:43.033( 283033.854 ms.)| 665.924| 00:00:00.024( 24.505 ms.)| .009 | 5| 04.04.2019 15:00| 4139| 2394416| 00:04:51.435( 291435.010 ms.)| 665.116| 00:00:12.025( 12025.895 ms.)| 4.126 | 6| 04.04.2019 16:00| 4143| 3525360| 00:10:13.492( 613492.351 ms.)| 979.267| 00:08:41.396( 521396.555 ms.)| 84.988 | 7| 04.04.2019 17:00| 4149| 3529197| 00:11:48.830( 708830.618 ms.)| 980.332| 00:12:47.834( 767834.052 ms.)| 108.324 | 8| 04.04.2019 18:01| 4157| 1145596| 00:01:19.217( 79217.372 ms.)| 313.004| 00:00:01.319( 1319.676 ms.)| 1.666 | 9| 04.04.2019 19:03| 4159| 2890362| 00:03:16.784( 196784.755 ms.)| 776.979| 00:00:01.441( 1441.386 ms.)| .732 | 10| 04.04.2019 20:04| 4161| 5758631| 00:06:30.513( 390513.926 ms.)| 1573.396| 00:00:01.470( 1470.110 ms.)| .376 | 11| 04.04.2019 21:03| 4163| 2781536| 00:03:06.470( 186470.979 ms.)| 785.745| 00:00:00.249( 249.865 ms.)| .134 | 12| 04.04.2019 23:03| 4165| 1443155| 00:01:34.467( 94467.539 ms.)| 200.438| 00:00:00.015( 15.287 ms.)| .016 | 13| 05.04.2019 01:03| 4167| 4387191| 00:06:51.380( 411380.293 ms.)| 609.332| 00:05:18.847( 318847.407 ms.)| 77.507 | 14| 05.04.2019 02:03| 4171| 189852| 00:00:10.989( 10989.899 ms.)| 52.737| 00:00:00.539( 539.110 ms.)| 4.906 | 15| 05.04.2019 03:01| 4173| 3627| 00:00:00.103( 103.000 ms.)| 1.042| 00:00:00.004( 4.131 ms.)| 4.010 | 16| 05.04.2019 04:00| 4175| 3627| 00:00:00.085( 85.235 ms.)| 1.025| 00:00:00.003( 3.811 ms.)| 4.471 | 17| 05.04.2019 05:00| 4177| 3747| 00:00:00.849( 849.454 ms.)| 1.041| 00:00:00.006( 6.124 ms.)| .721 | 18| 05.04.2019 06:00| 4179| 3747| 00:00:00.849( 849.561 ms.)| 1.041| 00:00:00.000( .051 ms.)| .006 | 19| 05.04.2019 07:00| 4181| 3747| 00:00:00.839( 839.416 ms.)| 1.041| 00:00:00.000( .062 ms.)| .007 | 20| 05.04.2019 08:00| 4183| 3747| 00:00:00.846( 846.382 ms.)| 1.041| 00:00:00.000( .007 ms.)| .001 | 21| 05.04.2019 09:00| 4185| 3747| 00:00:00.855( 855.426 ms.)| 1.041| 00:00:00.000( .065 ms.)| .008 | 22| 05.04.2019 10:00| 4187| 3797| 00:01:40.150( 100150.165 ms.)| 1.055| 00:00:21.845( 21845.217 ms.)| 21.812
Text of all SQL-selects
ΠΠ°ΠΏΡΠΎΡ
SELECT
queryid ,
query
FROM
pg_stat_history
WHERE
queryid IS NOT NULL AND
database_id = DATABASE_ID AND
snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
GROUP BY queryid , query
ΠΡΠΎΠ³
ΠΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ, Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΡΠΌΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΠΎΡΡΠΈ ΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ Π±Π°Π·Ρ.
ΠΡΠΈΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅:ΠΡΠ»ΠΈ Π² Π·Π°ΠΏΡΠΎΡΠ°Ρ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°ΡΡ queryid ΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΈΡΡΠΎΡΠΈΡ ΠΏΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌΡ Π·Π°ΠΏΡΠΎΡΡ(Ρ ΡΠ΅Π»ΡΡ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΠΈ ΠΌΠ΅ΡΡΠ° ΠΎΡΡΠ΅ΡΡ ΠΏΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌΡ Π·Π°ΠΏΡΠΎΡΡ ΠΎΠΏΡΡΠ΅Π½Ρ).
ΠΡΠ°ΠΊ, ΡΡΠ°ΡΠΈΡΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π·Π°ΠΏΡΠΎΡΠΎΠ² β ΠΈΠΌΠ΅ΡΡΡΡ ΠΈ ΡΠΎΠ±ΠΈΡΠ°ΡΡΡΡ.
ΠΠ΅ΡΠ²ΡΠΉ ΡΡΠ°ΠΏ Β«ΡΠ±ΠΎΡ ΡΡΠ°ΡΠΈΡΡΠΈΡΠ΅ΡΠΊΠΈΡ
Π΄Π°Π½Π½ΡΡ
Β» β Π·Π°Π²Π΅ΡΡΠ΅Π½.
ΠΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΡΡ ΠΊΠΎ Π²ΡΠΎΡΠΎΠΌΡ ΡΡΠ°ΠΏΡ-Β«Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΠΌΠ΅ΡΡΠΈΠΊ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈΒ».
ΠΠΎ ΡΡΠΎ ΡΠΆΠ΅ ΡΠΎΠ²ΡΠ΅ΠΌ Π΄ΡΡΠ³Π°Ρ ΠΈΡΡΠΎΡΠΈΡ.
ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡΠ΅Ρβ¦
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com