Π₯ΠΎΡΡ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ Ρ Π²Π°ΠΌΠΈ ΠΌΠΎΠΈΠΌ ΠΏΠ΅ΡΠ²ΡΠΌ ΡΡΠΏΠ΅ΡΠ½ΡΠΌ ΠΎΠΏΡΡΠΎΠΌ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΏΠΎΠ»Π½ΠΎΠΉ ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ Postgres. Π‘ Π‘Π£ΠΠ Postgres Ρ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΠ»ΡΡ ΠΏΠΎΠ» Π³ΠΎΠ΄Π° Π½Π°Π·Π°Π΄, Π΄ΠΎ ΡΡΠΎΠ³ΠΎ ΠΎΠΏΡΡΠ° Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π±Π°Π· Π΄Π°Π½Π½ΡΡ Ρ ΠΌΠ΅Π½Ρ Π½Π΅ Π±ΡΠ»ΠΎ ΡΠΎΠ²ΡΠ΅ΠΌ.
Π― ΡΠ°Π±ΠΎΡΠ°Ρ ΠΏΠΎΠ»Ρ-DevOps ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠΎΠΌ Π² ΠΊΡΡΠΏΠ½ΠΎΠΉ IT-ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ. ΠΠ°ΡΠ° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ Π·Π°Π½ΠΈΠΌΠ°Π΅ΡΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ Π²ΡΡΠΎΠΊΠΎΠ½Π°Π³ΡΡΠΆΠ΅Π½Π½ΡΡ
ΡΠ΅ΡΠ²ΠΈΡΠΎΠ², Ρ ΠΆΠ΅ ΠΎΡΠ²Π΅ΡΠ°Ρ Π·Π° ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ, ΡΠΎΠΏΡΠΎΠ²ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΉ. ΠΠ΅ΡΠ΅Π΄ΠΎ ΠΌΠ½ΠΎΠΉ ΠΏΠΎΡΡΠ°Π²ΠΈΠ»ΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ Π·Π°Π΄Π°ΡΡ: ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ΅. ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Π½Π° Django, Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ (ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡΡΡΠΊΡΡΡΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
), ΠΈ ΠΏΠ΅ΡΠ΅Π΄ ΡΡΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ ΠΌΡ ΡΠ½ΠΈΠΌΠ°Π΅ΠΌ ΠΏΠΎΠ»Π½ΡΠΉ Π΄Π°ΠΌΠΏ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
ΡΠ΅ΡΠ΅Π· ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ pg_dump Π½Π° Π²ΡΡΠΊΠΈΠΉ ΡΠ»ΡΡΠ°ΠΉ.
ΠΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ½ΡΡΠΈΡ Π΄Π°ΠΌΠΏΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° Π½Π΅ΠΏΡΠ΅Π΄Π²ΠΈΠ΄Π΅Π½Π½Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ° (Π²Π΅ΡΡΠΈΡ Postgres β 9.5):
pg_dump: Oumping the contents of table βws_log_smevlogβ failed: PQgetResult() failed.
pg_dump: Error message from server: ERROR: invalid page in block 4123007 of relatton base/16490/21396989
pg_dump: The command was: COPY public.ws_log_smevlog [...]
pg_dunp: [parallel archtver] a worker process dled unexpectedly
ΠΡΠΈΠ±ΠΊΠ° Β«invalid page in blockΒ» Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°Ρ
Π½Π° ΡΡΠΎΠ²Π½Π΅ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ, ΡΡΠΎ ΠΎΡΠ΅Π½Ρ Π½Π΅Ρ
ΠΎΡΠΎΡΠΎ. ΠΠ° ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
ΡΠΎΡΡΠΌΠ°Ρ
ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π»ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ FULL VACUUM Ρ ΠΎΠΏΡΠΈΠ΅ΠΉ zero_damaged_pages Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. Π§ΡΠΎ ΠΆΠ΅, ΠΏΠΎΠΏΡΡΠΎΠ±Π΅ΡΠΌβ¦
ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° ΠΊ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ
ΠΠΠΠΠΠΠΠ! ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΠΉΡΠ΅ ΡΠ΅Π·Π΅ΡΠ²Π½ΡΡ ΠΊΠΎΠΏΠΈΡ Postgres ΠΏΠ΅ΡΠ΅Π΄ Π»ΡΠ±ΠΎΠΉ ΠΏΠΎΠΏΡΡΠΊΠΎΠΉ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
. ΠΡΠ»ΠΈ Ρ Π²Π°Ρ Π²ΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΠΌΠ°ΡΠΈΠ½Π°, ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
ΠΈ ΡΠ΄Π΅Π»Π°ΠΉΡΠ΅ ΡΠ½Π΅ΠΏΡΠΎΡ. ΠΡΠ»ΠΈ Π½Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ½Π΅ΠΏΡΠΎΡ, ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Π±Π°Π·Ρ ΠΈ ΡΠΊΠΎΠΏΠΈΡΡΠΉΡΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° Postgres (Π²ΠΊΠ»ΡΡΠ°Ρ wal-ΡΠ°ΠΉΠ»Ρ) Π² Π½Π°Π΄ΡΠΆΠ½ΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ. ΠΠ»Π°Π²Π½ΠΎΠ΅ Π² Π½Π°ΡΠ΅ΠΌ Π΄Π΅Π»Π΅ β Π½Π΅ ΡΠ΄Π΅Π»Π°ΡΡ Ρ
ΡΠΆΠ΅. ΠΡΠΎΡΡΠΈΡΠ΅
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² ΡΠ΅Π»ΠΎΠΌ Π±Π°Π·Π° Ρ ΠΌΠ΅Π½Ρ ΡΠ°Π±ΠΎΡΠ°Π»Π°, Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ»ΡΡ ΠΎΠ±ΡΡΠ½ΡΠΌ Π΄Π°ΠΌΠΏΠΎΠΌ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ , Π½ΠΎ ΠΈΡΠΊΠ»ΡΡΠΈΠ» ΡΠ°Π±Π»ΠΈΡΡ Ρ ΠΏΠΎΠ²ΡΠ΅ΠΆΠ΄ΡΠ½Π½ΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ (ΠΎΠΏΡΠΈΡ -T, —exclude-table=TABLE Π² pg_dump).
Π‘Π΅ΡΠ²Π΅Ρ Π±ΡΠ» ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈΠΌ, ΡΠ½ΡΡΡ ΡΠ½Π΅ΠΏΡΠΎΡ Π±ΡΠ»ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. ΠΠ΅ΠΊΠ°ΠΏ ΡΠ½ΡΡ, Π΄Π²ΠΈΠ³Π°Π΅ΠΌΡΡ Π΄Π°Π»ΡΡΠ΅.
ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ
ΠΠ΅ΡΠ΅Π΄ ΠΏΠΎΠΏΡΡΠΊΠΎΠΉ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ Ρ Π½Π°Ρ Π²ΡΡ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅ Ρ ΡΠ°ΠΌΠΎΠΉ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ. Π Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΈΠ±ΠΎΠΊ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΠΈΡ , ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΡΠΆΠ΅.
Π ΠΌΠΎΡΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ° Ρ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½ΡΡ Π±ΡΠ»Π° ΠΏΡΠΈΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½Π° Π² Β«/srvΒ» ΠΈ ΡΠΈΠΏ Π±ΡΠ» ext4.
ΠΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
: systemctl stop [email protected] ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΡΡΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ° Π½ΠΈΠΊΠ΅ΠΌ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΈ Π΅Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ lsof:
lsof +D /srv
ΠΠ½Π΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π΅ΡΡ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ redis, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½Π° ΡΠΎΠΆΠ΅ ΠΈΡΠΏΠΎΠ»Π·ΠΎΠ²Π°Π»Π° «/srv». ΠΠ°Π»Π΅Π΅ Ρ ΠΎΡΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π» /srv (umount).
ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ Π±ΡΠ»Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΈΠ»ΠΈΡΡ e2fsck Ρ ΠΊΠ»ΡΡΠΈΠΊΠΎΠΌ -f (Force checking even if filesystem is marked clean):
ΠΠ°Π»Π΅Π΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΈΠ»ΠΈΡΡ dumpe2fs (sudo dumpe2fs /dev/mapper/gu2—sys-srv | grep checked) ΠΌΠΎΠΆΠ½ΠΎ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±ΡΠ»Π° ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π°:
e2fsck Π³ΠΎΠ²ΠΎΡΠΈΡ, ΡΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ ext4 Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ, Π° ΡΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ ΠΏΠΎΠΏΡΡΠΊΠΈ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
, Π° ΡΠΎΡΠ½Π΅Π΅ Π²Π΅ΡΠ½ΡΡΡΡΡ ΠΊ vacuum full (ΡΠ°ΠΌΠΎ ΡΠΎΠ±ΠΎΠΉ, Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠΈΠΌΠΎΠ½ΡΠΈΡΠ²ΠΎΠ°ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
).
ΠΡΠ»ΠΈ Ρ Π²Π°Ρ ΡΠ΅ΡΠ²Π΅Ρ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈΠΉ, ΡΠΎ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π΄ΠΈΡΠΊΠΎΠ² (ΡΠ΅ΡΠ΅Π· smartctl -a /dev/XXX) Π»ΠΈΠ±ΠΎ RAID-ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°, ΡΡΠΎΠ±Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π½Π΅ Π½Π° Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅. Π ΠΌΠΎΡΠΌ ΡΠ»ΡΡΠ°Π΅ RAID ΠΎΠΊΠ°Π·Π°Π»ΡΡ Β«ΠΆΠ΅Π»Π΅Π·Π½ΡΠΉΒ», ΠΏΠΎΡΡΠΎΠΌΡ Ρ ΠΏΠΎΠΏΡΠΎΡΠΈΠ» ΠΌΠ΅ΡΡΠ½ΠΎΠ³ΠΎ Π°Π΄ΠΌΠΈΠ½Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ RAID (ΡΠ΅ΡΠ²Π΅Ρ Π±ΡΠ» Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠΎΡΠ½ΡΡ ΠΊΠΈΠ»ΠΎΠΌΠ΅ΡΡΠΎΠ² ΠΎΡ ΠΌΠ΅Π½Ρ). ΠΠ½ ΡΠΊΠ°Π·Π°Π», ΡΡΠΎ ΠΎΡΠΈΠ±ΠΎΠΊ Π½Π΅Ρ, Π° ΡΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ ΠΌΡ ΡΠΎΡΠ½ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΡΠ°ΡΡ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅.
ΠΠΎΠΏΡΡΠΊΠ° 1: zero_damaged_pages
ΠΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌΡΡ ΠΊ Π±Π°Π·Π΅ ΡΠ΅ΡΠ΅Π· psql Π°ΠΊΠΊΠ°ΡΠ½ΡΠΎΠΌ, ΠΎΠ±Π»Π°Π΄Π°ΡΡΠΈΠΌ ΠΏΡΠ°Π²Π°ΠΌΠΈ ΡΡΠΏΠ΅ΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. ΠΠ°ΠΌ Π½ΡΠΆΠ΅Π½ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΠΏΠ΅ΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Ρ.ΠΊ. ΠΎΠΏΡΠΈΡ zero_damaged_pages ΠΌΠΎΠΆΠ΅Ρ ΠΌΠ΅Π½ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ½. Π ΠΌΠΎΡΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ postgres:
psql -h 127.0.0.1 -U postgres -s [database_name]
ΠΠΏΡΠΈΡ zero_damaged_pages Π½ΡΠΆΠ½Π° Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ (Ρ ΡΠ°ΠΉΡΠ° postgrespro):
ΠΡΠΈ Π²ΡΡΠ²Π»Π΅Π½ΠΈΠΈ ΠΏΠΎΠ²ΡΠ΅ΠΆΠ΄ΡΠ½Π½ΠΎΠ³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΡΡΡΠ°Π½ΠΈΡΡ Postgres Pro ΠΎΠ±ΡΡΠ½ΠΎ ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ ΠΈ ΠΏΡΠ΅ΡΡΠ²Π°Π΅Ρ ΡΠ΅ΠΊΡΡΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ. ΠΡΠ»ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ zero_damaged_pages Π²ΠΊΠ»ΡΡΡΠ½, Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ° Π²ΡΠ΄Π°ΡΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, ΠΎΠ±Π½ΡΠ»ΡΠ΅Ρ ΠΏΠΎΠ²ΡΠ΅ΠΆΠ΄ΡΠ½Π½ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ ΠΈ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ. ΠΡΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠ°Π·ΡΡΡΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Π²ΡΠ΅ ΡΡΡΠΎΠΊΠΈ Π² ΠΏΠΎΠ²ΡΠ΅ΠΆΠ΄ΡΠ½Π½ΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΠ΅.
ΠΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΎΠΏΡΠΈΡ ΠΈ ΠΏΡΠΎΠ±ΡΠ΅ΠΌ Π΄Π΅Π»Π°ΡΡ full vacuum ΡΠ°Π±Π»ΠΈΡΡ:
VACUUM FULL VERBOSE
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π½Π΅ΡΠ΄Π°ΡΠ°.
ΠΡ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΠΈΡΡ Ρ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ:
INFO: vacuuming "βpublic.ws_log_smevlogβ
WARNING: invalid page in block 4123007 of relation base/16400/21396989; zeroing out page
ERROR: unexpected chunk number 573 (expected 565) for toast value 21648541 in pg_toast_106070
ΠΠΎΠΏΡΡΠΊΠ° 2: reindex
ΠΠ΅ΡΠ²ΡΠΉ ΡΠΎΠ²Π΅Ρ ΠΈΠ· Π³ΡΠ³Π»Π° Π½Π΅ ΠΏΠΎΠΌΠΎΠ³. ΠΠΎΡΠ»Π΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΌΠΈΠ½ΡΡ ΠΏΠΎΠΈΡΠΊΠ° Ρ Π½Π°ΡΡΠ» Π²ΡΠΎΡΠΎΠΉ ΡΠΎΠ²Π΅Ρ β ΡΠ΄Π΅Π»Π°ΡΡ reindex ΠΏΠΎΠ²ΡΠ΅ΠΆΠ΄ΡΠ½Π½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ. ΠΡΠΎΡ ΡΠΎΠ²Π΅Ρ Ρ Π²ΡΡΡΠ΅ΡΠ°Π» Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ ΠΌΠ΅ΡΡΠ°Ρ , Π½ΠΎ ΠΎΠ½ Π½Π΅ Π²Π½ΡΡΠ°Π» Π΄ΠΎΠ²Π΅ΡΠΈΡ. Π‘Π΄Π΅Π»Π°Π΅ΠΌ reindex:
reindex table ws_log_smevlog
reindex Π·Π°Π²Π΅ΡΡΠΈΠ»ΡΡ Π±Π΅Π· ΠΏΡΠΎΠ±Π»Π΅ΠΌ.
ΠΠ΄Π½Π°ΠΊΠΎ ΡΡΠΎ Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ, VACUUM FULL Π°Π²Π°ΡΠΈΠΉΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠ°Π»ΡΡ Ρ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Ρ ΠΏΡΠΈΠ²ΡΠΊ ΠΊ Π½Π΅ΡΠ΄Π°ΡΠ°ΠΌ, Ρ ΡΡΠ°Π» ΠΈΡΠΊΠ°ΡΡ ΡΠΎΠ²Π΅ΡΠΎΠ² Π² ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΠ΅ Π΄Π°Π»ΡΡΠ΅ ΠΈ Π½Π°ΡΠΊΠ½ΡΠ»ΡΡ Π½Π° Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ
ΠΠΎΠΏΡΡΠΊΠ° 3: SELECT, LIMIT, OFFSET
Π ΡΡΠ°ΡΡΠ΅ Π²ΡΡΠ΅ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π»ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠ°Π±Π»ΠΈΡΡ ΠΏΠΎΡΡΡΠΎΡΠ½ΠΎ ΠΈ ΡΠ΄Π°Π»ΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅. ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π±ΡΠ»ΠΎ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π²ΡΠ΅ ΡΡΡΠΎΠΊΠΈ:
for ((i=0; i<"Number_of_rows_in_nodes"; i++ )); do psql -U "Username" "Database Name" -c "SELECT * FROM nodes LIMIT 1 offset $i" >/dev/null || echo $i; done
Π ΠΌΠΎΡΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ°Π±Π»ΠΈΡΠ° ΡΠΎΠ΄Π΅ΡΠΆΠ°Π»Π° 1 628 991 ΡΡΡΠΎΠΊ! ΠΠΎ-Ρ
ΠΎΡΠΎΡΠ΅ΠΌΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π±ΡΠ»ΠΎ ΠΏΠΎΠ·Π°Π±ΠΎΡΠΈΡΡΡΡ ΠΎ
for ((i=0; i<1628991; i++ )); do psql -U my_user -d my_database -c "SELECT * FROM ws_log_smevlog LIMIT 1 offset $i" >/dev/null || echo $i; done
Π ΡΡΡΡ Ρ ΡΠ΅ΡΠΈΠ» ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠΎΡΡ Π΄Π΅Π»Π°. Π ΠΌΠΎΠ΅ΠΌΡ ΡΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΡ, Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ», ΡΡΠΎ Π·Π° 20 ΡΠ°ΡΠΎΠ² Π±ΡΠ»ΠΎ ΠΏΡΠΎΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ 2% Π΄Π°Π½Π½ΡΡ ! ΠΠ΄Π°ΡΡ 50 Π΄Π½Π΅ΠΉ Ρ Π½Π΅ Ρ ΠΎΡΠ΅Π». ΠΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΉ ΠΏΠΎΠ»Π½ΡΠΉ ΠΏΡΠΎΠ²Π°Π».
ΠΠΎ Ρ Π½Π΅ ΡΡΠ°Π» ΡΠ΄Π°Π²Π°ΡΡΡΡ. ΠΠ½Π΅ ΡΡΠ°Π»ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ, ΠΏΠΎΡΠ΅ΠΌΡ ΠΆΠ΅ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ»ΠΎ ΡΠ°ΠΊ Π΄ΠΎΠ»Π³ΠΎ. ΠΠ· Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ (ΠΎΠΏΡΡΡ Π½Π° postgrespro) Ρ ΡΠ·Π½Π°Π»:
OFFSET ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΏΡΠΎΠΏΡΡΡΠΈΡΡ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΡΡΡΠΎΠΊ, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ Π½Π°ΡΠ°ΡΡ Π²ΡΠ΄Π°Π²Π°ΡΡ ΡΡΡΠΎΠΊΠΈ.
ΠΡΠ»ΠΈ ΡΠΊΠ°Π·Π°Π½ΠΎ ΠΈ OFFSET, ΠΈ LIMIT, ΡΠ½Π°ΡΠ°Π»Π° ΡΠΈΡΡΠ΅ΠΌΠ° ΠΏΡΠΎΠΏΡΡΠΊΠ°Π΅Ρ OFFSET ΡΡΡΠΎΠΊ, Π° Π·Π°ΡΠ΅ΠΌ Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΠΏΠΎΠ΄ΡΡΠΈΡΡΠ²Π°ΡΡ ΡΡΡΠΎΠΊΠΈ Π΄Π»Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ LIMIT.ΠΡΠΈΠΌΠ΅Π½ΡΡ LIMIT, Π²Π°ΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ORDER BY, ΡΡΠΎΠ±Ρ ΡΡΡΠΎΠΊΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° Π²ΡΠ΄Π°Π²Π°Π»ΠΈΡΡ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅. ΠΠ½Π°ΡΠ΅ Π±ΡΠ΄ΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΡΡ Π½Π΅ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΡΠ΅ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΡΡΡΠΎΠΊ.
ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π²ΡΡΠ΅Π½Π°ΠΏΠΈΡΠ°Π½Π½Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π±ΡΠ»Π° ΠΎΡΠΈΠ±ΠΎΡΠ½ΠΎΠΉ: Π²ΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , Π½Π΅ Π±ΡΠ»ΠΎ order by, ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΌΠΎΠ³ ΠΏΠΎΠ»ΡΡΠΈΡΡΡΡ ΠΎΡΠΈΠ±ΠΎΡΠ½ΡΠΌ. ΠΠΎ-Π²ΡΠΎΡΡΡ , Postgres ΡΠ½Π°ΡΠ°Π»Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΠ» ΠΏΡΠΎΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°ΡΡ ΠΈ ΠΏΡΠΎΠΏΡΡΡΠΈΡΡ OFFSET-ΡΡΡΠΎΠΊ, ΠΈ Ρ Π²ΠΎΠ·ΡΠ°ΡΡΠ°Π½ΠΈΠ΅ΠΌ OFFSET ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΠ½ΠΈΠΆΠ°Π»Π°ΡΡ Π±Ρ Π΅ΡΡ ΡΠΈΠ»ΡΠ½Π΅Π΅.
ΠΠΎΠΏΡΡΠΊΠ° 4: ΡΠ½ΡΡΡ Π΄Π°ΠΌΠΏ Π² ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠΌ Π²ΠΈΠ΄Π΅
ΠΠ°Π»Π΅Π΅ ΠΌΠ½Π΅ Π² Π³ΠΎΠ»ΠΎΠ²Ρ ΠΏΡΠΈΡΠ»Π°, ΠΊΠ°Π·Π°Π»ΠΎΡΡ Π±Ρ, Π³Π΅Π½ΠΈΠ°Π»ΡΠ½Π°Ρ ΠΈΠ΄Π΅Ρ: ΡΠ½ΡΡΡ Π΄Π°ΠΌΠΏ Π² ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΈ ΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ Π·Π°ΠΏΠΈΡΠ°Π½Π½ΡΡ ΡΡΡΠΎΠΊΡ.
ΠΠΎ Π΄Π»Ρ Π½Π°ΡΠ°Π»Π°, ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΠΌΡΡ ΡΠΎ ΡΡΡΡΠΊΡΡΡΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ ws_log_smevlog:
Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΡΠΎΠ»Π±Π΅Ρ Β«idΒ», ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠ°Π» ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ (ΡΡΡΡΡΠΈΠΊ) ΡΡΡΠΎΠΊΠΈ. ΠΠ»Π°Π½ Π±ΡΠ» ΡΠ°ΠΊΠΎΠΉ:
- ΠΠ°ΡΠΈΠ½Π°Π΅ΠΌ ΡΠ½ΠΈΠΌΠ°ΡΡ Π΄Π°ΠΌΠΏ Π² ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠΌ Π²ΠΈΠ΄Π΅ (Π² Π²ΠΈΠ΄Π΅ sql-ΠΊΠΎΠΌΠ°Π½Π΄)
- Π ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠ½ΡΡΠΈΡ Π΄Π°ΠΌΠΏΠ° Π±Ρ ΠΏΡΠ΅ΡΠ²Π°Π»ΠΎΡΡ ΠΈΠ·-Π·Π° ΠΎΡΠΈΠ±ΠΊΠΈ, Π½ΠΎ ΡΠ΅ΠΊΡΠΎΠ²ΡΠΉ ΡΠ°ΠΉΠ» Π²ΡΡ ΡΠ°Π²Π½ΠΎ ΡΠΎΡ ΡΠ°Π½ΠΈΠ»ΡΡ Π±Ρ Π½Π° Π΄ΠΈΡΠΊΠ΅
- Π‘ΠΌΠΎΡΡΠΈΠΌ ΠΊΠΎΠ½Π΅Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°, ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΠΌΡ Π½Π°Ρ ΠΎΠ΄ΠΈΠΌ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ (id) ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ ΡΡΡΠΎΠΊΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ½ΡΠ»Π°ΡΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ
Π― Π½Π°ΡΠ°Π» ΡΠ½ΠΈΠΌΠ°ΡΡ Π΄Π°ΠΌΠΏ Π² ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠΌ Π²ΠΈΠ΄Π΅:
pg_dump -U my_user -d my_database -F p -t ws_log_smevlog -f ./my_dump.dump
Π‘Π½ΡΡΠΈΡ Π΄Π°ΠΌΠΏΠ°, ΠΊΠ°ΠΊ ΠΈ ΠΎΠΆΠΈΠ΄Π°Π»ΠΎΡΡ, ΠΏΡΠ΅ΡΠ²Π°Π»ΡΡ Ρ ΡΠΎΠΉ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ:
pg_dump: Error message from server: ERROR: invalid page in block 4123007 of relatton base/16490/21396989
ΠΠ°Π»Π΅Π΅ ΡΠ΅ΡΠ΅Π· tail Ρ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅Π» ΠΊΠΎΠ½Π΅Ρ Π΄Π°ΠΌΠΏΠ° (tail -5 ./my_dump.dump) ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ», ΡΡΠΎ Π΄Π°ΠΌΠΏ ΠΏΡΠ΅ΡΠ²Π°Π»ΡΡ Π½Π° ΡΡΡΠΎΠΊΠ΅ Ρ id 186 525. Β«ΠΠ½Π°ΡΠΈΡ, ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΡΡΠΎΠΊΠ΅ Ρ id 186 526, ΠΎΠ½Π° Π±ΠΈΡΠ°Ρ, Π΅Ρ ΠΈ Π½Π°Π΄ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ!Β» β ΠΏΠΎΠ΄ΡΠΌΠ°Π» Ρ. ΠΠΎ, ΡΠ΄Π΅Π»Π°Π² Π·Π°ΠΏΡΠΎΡ Π² Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
:
Β«select * from ws_log_smevlog where id=186529Β» ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ»ΠΎΡΡ, ΡΡΠΎ Ρ ΡΡΠΎΠΉ ΡΡΡΠΎΠΊΠΎΠΉ Π²ΡΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎβ¦ Π‘ΡΡΠΎΠΊΠΈ Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΠΌΠΈ 186 530 β 186 540 ΡΠΎΠΆΠ΅ ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ Π±Π΅Π· ΠΏΡΠΎΠ±Π»Π΅ΠΌ. ΠΡΠ΅ΡΠ΅Π΄Π½Π°Ρ Β«Π³Π΅Π½ΠΈΠ°Π»ΡΠ½Π°Ρ ΠΈΠ΄Π΅ΡΒ» ΠΏΡΠΎΠ²Π°Π»ΠΈΠ»Π°ΡΡ. ΠΠΎΠ·ΠΆΠ΅ Ρ ΠΏΠΎΠ½ΡΠ», ΠΏΠΎΡΠ΅ΠΌΡ ΡΠ°ΠΊ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ: ΠΏΡΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΈΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½ΡΡ
ΠΈΠ· ΡΠ°Π±Π»ΠΈΡΡ ΠΎΠ½ΠΈ Π½Π΅ ΡΠ΄Π°Π»ΡΡΡΡΡ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈ, Π° ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡΡΡ ΠΊΠ°ΠΊ Β«ΠΌΡΡΡΠ²ΡΠ΅ ΠΊΠΎΡΡΠ΅ΠΆΠΈΒ», Π΄Π°Π»Π΅Π΅ ΠΏΡΠΈΡ
ΠΎΠ΄ΠΈΡ autovacuum ΠΈ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ ΡΡΠΈ ΡΡΡΠΎΠΊΠΈ ΡΠ΄Π°Π»ΡΠ½Π½ΡΠΌΠΈ ΠΈ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΈ ΡΡΡΠΎΠΊΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ. ΠΠ»Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ, Π΅ΡΠ»ΠΈ Π΄Π°Π½Π½ΡΠ΅ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΌΠ΅Π½ΡΡΡΡΡ ΠΈ Π²ΠΊΠ»ΡΡΡΠ½ autovacuum, ΡΠΎ ΠΎΠ½ΠΈ Π½Π΅ Ρ
ΡΠ°Π½ΡΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ.
ΠΠΎΠΏΡΡΠΊΠ° 5: SELECT, FROM, WHERE id=
ΠΠ΅ΡΠ΄Π°ΡΠΈ Π΄Π΅Π»Π°ΡΡ Π½Π°Ρ ΡΠΈΠ»ΡΠ½Π΅Π΅. ΠΠ΅ ΡΡΠΎΠΈΡ Π½ΠΈΠΊΠΎΠ³Π΄Π° ΡΠ΄Π°Π²Π°ΡΡΡΡ, Π½ΡΠΆΠ½ΠΎ ΠΈΠ΄ΡΠΈ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° ΠΈ Π²Π΅ΡΠΈΡΡ Π² ΡΠ΅Π±Ρ ΠΈ ΡΠ²ΠΎΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ. ΠΠΎΡΡΠΎΠΌΡ Ρ ΡΠ΅ΡΠΈΠ» ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ Π΅ΡΡ ΠΎΠ΄ΠΈΠ½ Π²Π°ΡΠΈΠ°Π½Ρ: ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π²ΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ. ΠΠ½Π°Ρ ΡΡΡΡΠΊΡΡΡΡ ΠΌΠΎΠ΅ΠΉ ΡΠ°Π±Π»ΠΈΡΡ (ΡΠΌ. Π²ΡΡΠ΅), Ρ Π½Π°Ρ Π΅ΡΡΡ ΠΏΠΎΠ»Π΅ id, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΌ (ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΡΠΌ ΠΊΠ»ΡΡΠΎΠΌ). Π ΡΠ°Π±Π»ΠΈΡΠ΅ Ρ Π½Π°Ρ 1 628 991 ΡΡΡΠΎΠΊ ΠΈ id ΠΈΠ΄ΡΡ ΠΏΠΎ ΠΏΠΎΡΡΠ΄ΠΊΡ, Π° ΡΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅ΡΠ±ΡΠ°ΡΡ ΠΈΡ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ:
for ((i=1; i<1628991; i=$((i+1)) )); do psql -U my_user -d my_database -c "SELECT * FROM ws_log_smevlog where id=$i" >/dev/null || echo $i; done
ΠΡΠ»ΠΈ ΠΊΡΠΎ Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ, ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ: ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ ΠΏΠΎΡΡΡΠΎΡΠ½ΠΎ ΡΠ°Π±Π»ΠΈΡΡ ΠΈ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ stdout Π² /dev/null, Π½ΠΎ Π΅ΡΠ»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° SELECT ΠΏΡΠΎΠ²Π°Π»ΠΈΠ²Π°Π΅ΡΡΡ, ΡΠΎ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΡΠ΅ΠΊΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ (stderr ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π² ΠΊΠΎΠ½ΡΠΎΠ»Ρ) ΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΡΡΡΠΎΠΊΠ°, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ°Ρ ΠΎΡΠΈΠ±ΠΊΡ (Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ||, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Ρ select Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ (ΠΊΠΎΠ΄ Π²ΠΎΠ·Π²ΡΠ°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π½Π΅ 0)).
ΠΠ½Π΅ ΠΏΠΎΠ²Π΅Π·Π»ΠΎ, Ρ ΠΌΠ΅Π½Ρ Π±ΡΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π½Ρ ΠΈΠ½Π΄Π΅ΠΊΡΡ ΠΏΠΎ ΠΏΠΎΠ»Ρ id:
Π ΡΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ Π½Π°Ρ
ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ Ρ Π½ΡΠΆΠ½ΡΠΌ id Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π½ΠΈΠΌΠ°ΡΡ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. Π ΡΠ΅ΠΎΡΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΡΠ°Π±ΠΎΡΠ°ΡΡ. Π§ΡΠΎ ΠΆΠ΅, Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π² tmux ΠΈ ΠΈΠ΄ΡΠΌ ΡΠΏΠ°ΡΡ.
Π ΡΡΡΡ Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ», ΡΡΠΎ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅Π½ΠΎ ΠΎΠΊΠΎΠ»ΠΎ 90 000 Π·Π°ΠΏΠΈΡΠ΅ΠΉ, ΡΡΠΎ ΡΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΡΡΡ Π±ΠΎΠ»Π΅Π΅ 5%. ΠΡΠ»ΠΈΡΠ½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ, Π΅ΡΠ»ΠΈ ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡ Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ (2%)! ΠΠΎ ΠΆΠ΄Π°ΡΡ 20 Π΄Π½Π΅ΠΉ Π½Π΅ Ρ ΠΎΡΠ΅Π»ΠΎΡΡβ¦
ΠΠΎΠΏΡΡΠΊΠ° 6: SELECT, FROM, WHERE id >= and id <
Π£ Π·Π°ΠΊΠ°Π·ΡΠΈΠΊΠ° ΠΏΠΎΠ΄ ΠΠ Π±ΡΠ» Π²ΡΠ΄Π΅Π»Π΅Π½ ΠΎΡΠ»ΠΈΡΠ½ΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ: Π΄Π²ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΡΠΉ Intel Xeon E5-2697 v2, Π² Π½Π°ΡΠ΅ΠΌ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π±ΡΠ»ΠΎ ΡΠ΅Π»ΡΡ 48 ΠΏΠΎΡΠΎΠΊΠΎΠ²! ΠΠ°Π³ΡΡΠ·ΠΊΠ° Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ Π±ΡΠ»Π° ΡΡΠ΅Π΄Π½ΡΡ, ΠΌΡ Π±Π΅Π· ΠΎΡΠΎΠ±ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΌΠΎΠ³Π»ΠΈ Π·Π°Π±ΡΠ°ΡΡ ΠΎΠΊΠΎΠ»ΠΎ 20-ΡΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ ΡΠΎΠΆΠ΅ Π±ΡΠ»ΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ: Π°ΠΆ 384 Π³ΠΈΠ³Π°Π±Π°ΠΉΡ!
ΠΠΎΡΡΠΎΠΌΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΡΠ°ΡΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΠΈΡΡ:
for ((i=1; i<1628991; i=$((i+1)) )); do psql -U my_user -d my_database -c "SELECT * FROM ws_log_smevlog where id=$i" >/dev/null || echo $i; done
Π’ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΊΡΠ°ΡΠΈΠ²ΡΠΉ ΠΈ ΡΠ»Π΅Π³Π°Π½ΡΠ½ΡΠΉ ΡΠΊΡΠΈΠΏΡ, Π½ΠΎ Ρ Π²ΡΠ±ΡΠ°Π» Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π±ΡΡΡΡΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠ°ΡΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΠΈΠ²Π°Π½ΠΈΡ: ΡΠ°Π·Π±ΠΈΡΡ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ 0-1628991 Π²ΡΡΡΠ½ΡΡ Π½Π° ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Ρ ΠΏΠΎ 100 000 Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ 16 ΠΊΠΎΠΌΠ°Π½Π΄ Π²ΠΈΠ΄Π°:
for ((i=N; i<M; i=$((i+1)) )); do psql -U my_user -d my_database -c "SELECT * FROM ws_log_smevlog where id=$i" >/dev/null || echo $i; done
ΠΠΎ ΡΡΠΎ Π½Π΅ Π²ΡΡ. ΠΠΎ ΠΈΠ΄Π΅Π΅, ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ ΡΠΎΠΆΠ΅ ΠΎΡΠ½ΠΈΠΌΠ°Π΅Ρ ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ ΡΠ΅ΡΡΡΡΡ. ΠΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡ 1 628 991 Π±ΡΠ»ΠΎ Π½Π΅ ΠΎΡΠ΅Π½Ρ ΡΠ°Π·ΡΠΌΠ½ΠΎ, ΡΠΎΠ³Π»Π°ΡΠΈΡΠ΅ΡΡ. ΠΠΎΡΡΠΎΠΌΡ Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΡΠΈ ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡΡ 1000 ΡΡΡΠΎΠΊ Π²ΠΌΠ΅ΡΡΠΎ ΠΎΠ΄Π½ΠΎΠΉ. Π ΠΈΡΠΎΠ³Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΈΠ»ΠΎΠ°ΡΡ Π² ΡΡΠΎ:
for ((i=N; i<M; i=$((i+1000)) )); do psql -U my_user -d my_database -c "SELECT * FROM ws_log_smevlog where id>=$i and id<$((i+1000))" >/dev/null || echo $i; done
ΠΡΠΊΡΡΠ²Π°Π΅ΠΌ 16 ΠΎΠΊΠΎΠ½ Π² ΡΠ΅ΡΡΠΈΠΈ tmux ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
1) for ((i=0; i<100000; i=$((i+1000)) )); do psql -U my_user -d my_database -c "SELECT * FROM ws_log_smevlog where id>=$i and id<$((i+1000))" >/dev/null || echo $i; done 2) for ((i=100000; i<200000; i=$((i+1000)) )); do psql -U my_user -d my_database -c "SELECT * FROM ws_log_smevlog where id>=$i and id<$((i+1000))" >/dev/null || echo $i; done β¦ 15) for ((i=1400000; i<1500000; i=$((i+1000)) )); do psql -U my_user -d my_database -c "SELECT * FROM ws_log_smevlog where id>=$i and id<$((i+1000))" >/dev/null || echo $i; done 16) for ((i=1500000; i<1628991; i=$((i+1000)) )); do psql -U my_user -d my_database -c "SELECT * FROM ws_log_smevlog where id>=$i and id<$((i+1000))" >/dev/null || echo $i; done
Π§Π΅ΡΠ΅Π· Π΄Π΅Π½Ρ Ρ ΠΏΠΎΠ»ΡΡΠΈΠ» ΠΏΠ΅ΡΠ²ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ! Π ΠΈΠΌΠ΅Π½Π½ΠΎ (Π·Π½Π°ΡΠ΅Π½ΠΈΡ XXX ΠΈ ZZZ ΡΠΆΠ΅ Π½Π΅ ΡΠΎΡ ΡΠ°Π½ΠΈΠ»ΠΈΡΡ):
ERROR: missing chunk number 0 for toast value 37837571 in pg_toast_106070
829000
ERROR: missing chunk number 0 for toast value XXX in pg_toast_106070
829000
ERROR: missing chunk number 0 for toast value ZZZ in pg_toast_106070
146000
ΠΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ Ρ Π½Π°Ρ ΡΡΠΈ ΡΡΡΠΎΠΊΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ ΠΎΡΠΈΠ±ΠΊΡ. id ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΈ Π²ΡΠΎΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ Π½Π°Ρ ΠΎΠ΄ΠΈΠ»ΠΈΡΡ ΠΌΠ΅ΠΆΠ΄Ρ 829 000 ΠΈ 830 000, id ΡΡΠ΅ΡΡΠ΅ΠΉ β ΠΌΠ΅ΠΆΠ΄Ρ 146 000 ΠΈ 147 000. ΠΠ°Π»Π΅Π΅ Π½Π°ΠΌ ΠΏΡΠ΅Π΄ΡΡΠΎΡΠ»ΠΎ ΠΏΡΠΎΡΡΠΎ Π½Π°ΠΉΡΠΈ ΡΠΎΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ id ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌ Π½Π°Ρ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΡΠΌΠΈ Π·Π°ΠΏΠΈΡΡΠΌΠΈ Ρ ΡΠ°Π³ΠΎΠΌ 1 ΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΡΠ΅ΠΌ id:
for ((i=829000; i<830000; i=$((i+1)) )); do psql -U my_user -d my_database -c "SELECT * FROM ws_log_smevlog where id=$i" >/dev/null || echo $i; done 829417 ERROR: unexpected chunk number 2 (expected 0) for toast value 37837843 in pg_toast_106070 829449 for ((i=146000; i<147000; i=$((i+1)) )); do psql -U my_user -d my_database -c "SELECT * FROM ws_log_smevlog where id=$i" >/dev/null || echo $i; done 829417 ERROR: unexpected chunk number ZZZ (expected 0) for toast value XXX in pg_toast_106070 146911
Π‘ΡΠ°ΡΡΠ»ΠΈΠ²ΡΠΉ ΡΠΈΠ½Π°Π»
ΠΡ Π½Π°ΡΠ»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ. ΠΠ°Ρ ΠΎΠ΄ΠΈΠΌ Π² Π±Π°Π·Ρ ΡΠ΅ΡΠ΅Π· psql ΠΈ ΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΠΈΡ ΡΠ΄Π°Π»ΠΈΡΡ:
my_database=# delete from ws_log_smevlog where id=829417;
DELETE 1
my_database=# delete from ws_log_smevlog where id=829449;
DELETE 1
my_database=# delete from ws_log_smevlog where id=146911;
DELETE 1
Π ΠΌΠΎΠ΅ΠΌΡ ΡΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΡ, Π·Π°ΠΏΠΈΡΠΈ ΡΠ΄Π°Π»ΠΈΠ»ΠΈΡΡ Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π΄Π°ΠΆΠ΅ Π±Π΅Π· ΠΎΠΏΡΠΈΠΈ zero_damaged_pages.
ΠΠ°ΡΠ΅ΠΌ Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ»ΡΡ ΠΊ Π±Π°Π·Π΅, ΡΠ΄Π΅Π»Π°Π» VACUUM FULL (Π΄ΡΠΌΠ°Ρ Π΄Π΅Π»Π°ΡΡ Π±ΡΠ»ΠΎ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ), ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ, ΡΡΠΏΠ΅ΡΠ½ΠΎ ΡΠ½ΡΠ» Π±Π΅ΠΊΠ°ΠΏ Ρ ΠΏΠΎΠΌΠΎΡΡΡ pg_dump. ΠΠ°ΠΌΠΏ ΡΠ½ΡΠ»ΡΡ Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ Π»ΠΈΠ±ΠΎ ΠΎΡΠΈΠ±ΠΎΠΊ! ΠΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠ΄Π°Π»ΠΎΡΡ ΡΠ΅ΡΠΈΡΡ ΡΠ°ΠΊΠΈΠΌ Π²ΠΎΡ ΡΡΠΏΠ΅ΠΉΡΠΈΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ. Π Π°Π΄ΠΎΡΡΠΈ Π½Π΅ Π±ΡΠ»ΠΎ ΠΏΡΠ΅Π΄Π΅Π»Π°, ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ»ΡΠΊΠΈΡ Π½Π΅ΡΠ΄Π°Ρ ΡΠ΄Π°Π»ΠΎΡΡ Π½Π°ΠΉΡΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅!
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΠ½ΠΎΡΡΠΈ ΠΈ Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΠΎΡ ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ»ΡΡΠΈΠ»ΡΡ ΠΌΠΎΠΉ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΎΠΏΡΡ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΠ΅Π°Π»ΡΠ½ΠΎΠΉ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ Postgres. ΠΡΠΎΡ ΠΎΠΏΡΡ Ρ Π·Π°ΠΏΠΎΠΌΠ½Ρ Π½Π°Π΄ΠΎΠ»Π³ΠΎ.
ΠΡ ΠΈ Π½Π°ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠΊ, Ρ
ΠΎΡΠ΅Π» Π±Ρ ΡΠΊΠ°Π·Π°ΡΡ ΡΠΏΠ°ΡΠΈΠ±ΠΎ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ PostgresPro Π·Π° ΠΏΠ΅ΡΠ΅Π²Π΅Π΄ΡΠ½Π½ΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π½Π° ΡΡΡΡΠΊΠΈΠΉ ΡΠ·ΡΠΊ ΠΈ Π·Π°
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com