ื”ื ื™ืกื™ื•ืŸ ื”ืจืืฉื•ืŸ ืฉืœื™ ื‘ืฉื—ื–ื•ืจ ืžืกื“ ื ืชื•ื ื™ื Postgres ืœืื—ืจ ื›ืฉืœ (ื“ืฃ ืœื ื—ื•ืงื™ ื‘ื‘ืœื•ืง 4123007 ืฉืœ relatton base/16490)

ืื ื™ ืจื•ืฆื” ืœืฉืชืฃ ืืชื›ื ื‘ื—ื•ื•ื™ื” ื”ืžื•ืฆืœื—ืช ื”ืจืืฉื•ื ื” ืฉืœื™ ื‘ืฉื—ื–ื•ืจ ืžืกื“ ื ืชื•ื ื™ื Postgres ืœืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ืžืœืื”. ื”ื›ืจืชื™ ืืช Postgres DBMS ืœืคื ื™ ื—ืฆื™ ืฉื ื”, ืœืคื ื™ ื›ืŸ ืœื ื”ื™ื” ืœื™ ื ื™ืกื™ื•ืŸ ื‘ื ื™ื”ื•ืœ ืžืกื“ื™ ื ืชื•ื ื™ื ื›ืœืœ.

ื”ื ื™ืกื™ื•ืŸ ื”ืจืืฉื•ืŸ ืฉืœื™ ื‘ืฉื—ื–ื•ืจ ืžืกื“ ื ืชื•ื ื™ื Postgres ืœืื—ืจ ื›ืฉืœ (ื“ืฃ ืœื ื—ื•ืงื™ ื‘ื‘ืœื•ืง 4123007 ืฉืœ relatton base/16490)

ืื ื™ ืขื•ื‘ื“ ื›ืžื”ื ื“ืก DevOps ืœืžื—ืฆื” ื‘ื—ื‘ืจืช IT ื’ื“ื•ืœื”. ื”ื—ื‘ืจื” ืฉืœื ื• ืžืคืชื—ืช ืชื•ื›ื ื” ืœืฉื™ืจื•ืชื™ ืขื•ืžืก ื’ื‘ื•ื”, ื•ืื ื™ ืื—ืจืื™ ืขืœ ื‘ื™ืฆื•ืขื™ื, ืชื—ื–ื•ืงื” ื•ืคืจื™ืกื”. ืงื™ื‘ืœืชื™ ืžืฉื™ืžื” ืกื˜ื ื“ืจื˜ื™ืช: ืœืขื“ื›ืŸ ืืคืœื™ืงืฆื™ื” ื‘ืฉืจืช ืื—ื“. ื”ืืคืœื™ืงืฆื™ื” ื›ืชื•ื‘ื” ื‘-Django, ื‘ืžื”ืœืš ื”ืขื“ื›ื•ืŸ ืžืชื‘ืฆืขื•ืช ื”ืขื‘ืจื•ืช (ืฉื™ื ื•ื™ื™ื ื‘ืžื‘ื ื” ื‘ืกื™ืก ื”ื ืชื•ื ื™ื), ื•ืœืคื ื™ ืชื”ืœื™ืš ื–ื” ืื ื• ืœื•ืงื—ื™ื dump ื‘ืกื™ืก ื ืชื•ื ื™ื ืžืœื ื“ืจืš ืชื•ื›ื ืช pg_dump ื”ืจื’ื™ืœื”, ืœื™ืชืจ ื‘ื™ื˜ื—ื•ืŸ.

ืื™ืจืขื” ืฉื’ื™ืื” ื‘ืœืชื™ ืฆืคื•ื™ื” ื‘ืขืช ื‘ื™ืฆื•ืข 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

ื—ืจืง "ื“ืฃ ืœื ื—ื•ืงื™ ื‘ื‘ืœื•ืง" ืžื“ื‘ืจ ืขืœ ื‘ืขื™ื•ืช ื‘ืจืžืช ืžืขืจื›ืช ื”ืงื‘ืฆื™ื, ื•ื–ื” ืจืข ืžืื•ื“. ื‘ืคื•ืจื•ืžื™ื ืฉื•ื ื™ื ื”ื•ืฆืข ืœืขืฉื•ืช ื•ืืงื•ื ืžืœื ืขื ืืคืฉืจื•ืช ืืคืก_ื“ืคื™ื_ืคื’ื•ืžื™ื ืœืคืชื•ืจ ืืช ื”ื‘ืขื™ื” ื”ื–ืืช. ื•ื‘ื›ืŸ, ื‘ื•ืื• ื ื ืกื”...

ืžืชื›ื•ื ื ื™ื ืœื”ื—ืœืžื”

ืื–ื”ืจื”! ื”ืงืคื“ ืœืงื—ืช ื’ื™ื‘ื•ื™ Postgres ืœืคื ื™ ื›ืœ ื ื™ืกื™ื•ืŸ ืœืฉื—ื–ืจ ืืช ืžืกื“ ื”ื ืชื•ื ื™ื ืฉืœืš. ืื ื™ืฉ ืœืš ืžื›ื•ื ื” ื•ื™ืจื˜ื•ืืœื™ืช, ืขืฆื•ืจ ืืช ืžืกื“ ื”ื ืชื•ื ื™ื ื•ืฆืœื ืชืžื•ื ืช ืžืฆื‘. ืื ืœื ื ื™ืชืŸ ืœืฆืœื ืชืžื•ื ืช ืžืฆื‘, ืขืฆื•ืจ ืืช ืžืกื“ ื”ื ืชื•ื ื™ื ื•ื”ืขืชืง ืืช ื”ืชื•ื›ืŸ ืฉืœ ืกืคืจื™ื™ืช Postgres (ื›ื•ืœืœ ืงื‘ืฆื™ wal) ืœืžืงื•ื ื‘ื˜ื•ื—. ื”ืขื™ืงืจ ื‘ืขืกืง ืฉืœื ื• ื”ื•ื ืœื ืœื”ื—ืžื™ืจ ืืช ื”ืžืฆื‘. ืœืงืจื•ื ื–ื”.

ืžื›ื™ื•ื•ืŸ ืฉืžืกื“ ื”ื ืชื•ื ื™ื ื‘ื“ืจืš ื›ืœืœ ืขื‘ื“ ื‘ืฉื‘ื™ืœื™, ื”ื’ื‘ืœืชื™ ืืช ืขืฆืžื™ ืœ-dump ืจื’ื™ืœ ืฉืœ ืžืกื“ ื ืชื•ื ื™ื, ืืš ืœื ื›ืœืœืชื™ ืืช ื”ื˜ื‘ืœื” ืขื ื ืชื•ื ื™ื ืคื’ื•ืžื™ื (ืืคืฉืจื•ืช -T, --exclude-table=TABLE ื‘-pg_dump).

ื”ืฉืจืช ื”ื™ื” ืคื™ื–ื™, ืื™ ืืคืฉืจ ื”ื™ื” ืœืฆืœื ืชืžื•ื ืช ืžืฆื‘. ื”ื’ื™ื‘ื•ื™ ื”ื•ืกืจ, ื‘ื•ืื• ื ืžืฉื™ืš.

ื‘ื“ื™ืงืช ืžืขืจื›ืช ืงื‘ืฆื™ื

ืœืคื ื™ ืฉื ื ืกื” ืœืฉื—ื–ืจ ืืช ืžืกื“ ื”ื ืชื•ื ื™ื, ืขืœื™ื ื• ืœื•ื•ื“ื ืฉื”ื›ืœ ื‘ืกื“ืจ ืขื ืžืขืจื›ืช ื”ืงื‘ืฆื™ื ืขืฆืžื”. ื•ื‘ืžืงืจื” ืฉืœ ื˜ืขื•ื™ื•ืช, ืชืงืŸ ืื•ืชืŸ, ื›ื™ ืื—ืจืช ืืชื” ื™ื›ื•ืœ ืจืง ืœื”ื—ืžื™ืจ ืืช ื”ืžืฆื‘.

ื‘ืžืงืจื” ืฉืœื™, ืžืขืจื›ืช ื”ืงื‘ืฆื™ื ืขื ืžืกื“ ื”ื ืชื•ื ื™ื ื”ื™ื™ืชื” ืžื•ืจื›ื‘ืช "/srv" ื•ื”ืกื•ื’ ื”ื™ื” ext4.

ืขืฆื™ืจืช ืžืกื“ ื”ื ืชื•ื ื™ื: systemctl ืขืฆื•ืจ [ืžื•ื’ืŸ ื‘ื“ื•ื"ืœ] ื•ื‘ื“ื•ืง ืฉืžืขืจื›ืช ื”ืงื‘ืฆื™ื ืื™ื ื” ื‘ืฉื™ืžื•ืฉ ืขืœ ื™ื“ื™ ืืฃ ืื—ื“ ื•ื ื™ืชืŸ ืœื‘ื˜ืœ ืื•ืชื” ื‘ืืžืฆืขื•ืช ื”ืคืงื•ื“ื” ืœืกื•ืฃ:
lsof +D /srv

ื ืืœืฆืชื™ ื’ื ืœืขืฆื•ืจ ืืช ืžืกื“ ื”ื ืชื•ื ื™ื ืฉืœ redis, ืžื›ื™ื•ื•ืŸ ืฉื”ื•ื ื’ื ืžืฉืชืžืฉ "/srv". ื‘ืฉืœื‘ ื”ื‘ื ื”ืชื ืชืงืชื™ / srv (umount).

ืžืขืจื›ืช ื”ืงื‘ืฆื™ื ื ื‘ื“ืงื” ื‘ืืžืฆืขื•ืช ื›ืœื™ ื”ืฉื™ืจื•ืช e2fsck ืขื ื”ืžืชื’ -f (ื›ืคื” ื‘ื“ื™ืงื” ื’ื ืื ืžืขืจื›ืช ื”ืงื‘ืฆื™ื ืžืกื•ืžื ืช ื ืงื™ื™ื”):

ื”ื ื™ืกื™ื•ืŸ ื”ืจืืฉื•ืŸ ืฉืœื™ ื‘ืฉื—ื–ื•ืจ ืžืกื“ ื ืชื•ื ื™ื Postgres ืœืื—ืจ ื›ืฉืœ (ื“ืฃ ืœื ื—ื•ืงื™ ื‘ื‘ืœื•ืง 4123007 ืฉืœ relatton base/16490)

ืœืื—ืจ ืžื›ืŸ, ื‘ืืžืฆืขื•ืช ื›ืœื™ ื”ืฉื™ืจื•ืช dumpe2fs (sudo dumpe2fs /dev/mapper/gu2โ€”sys-srv | grep ื‘ื“ืง) ืชื•ื›ืœ ืœื•ื•ื“ื ืฉื”ื‘ื“ื™ืงื” ืื›ืŸ ื‘ื•ืฆืขื”:

ื”ื ื™ืกื™ื•ืŸ ื”ืจืืฉื•ืŸ ืฉืœื™ ื‘ืฉื—ื–ื•ืจ ืžืกื“ ื ืชื•ื ื™ื Postgres ืœืื—ืจ ื›ืฉืœ (ื“ืฃ ืœื ื—ื•ืงื™ ื‘ื‘ืœื•ืง 4123007 ืฉืœ relatton base/16490)

e2fsck ืื•ืžืจ ืฉืœื ื ืžืฆืื• ื‘ืขื™ื•ืช ื‘ืจืžืช ืžืขืจื›ืช ื”ืงื‘ืฆื™ื ext4, ืžื” ืฉืื•ืžืจ ืฉืืชื” ื™ื›ื•ืœ ืœื”ืžืฉื™ืš ืœื ืกื•ืช ืœืฉื—ื–ืจ ืืช ืžืกื“ ื”ื ืชื•ื ื™ื, ืื• ื™ื•ืชืจ ื ื›ื•ืŸ ืœื—ื–ื•ืจ ืืœ ื•ืืงื•ื ืžืœื (ื›ืžื•ื‘ืŸ, ืืชื” ืฆืจื™ืš ืœื”ืขืœื•ืช ืืช ืžืขืจื›ืช ื”ืงื‘ืฆื™ื ื‘ื—ื–ืจื” ื•ืœื”ืคืขื™ืœ ืืช ืžืกื“ ื”ื ืชื•ื ื™ื).

ืื ื™ืฉ ืœืš ืฉืจืช ืคื™ื–ื™, ื”ืงืคื“ ืœื‘ื“ื•ืง ืืช ืžืฆื‘ ื”ื“ื™ืกืงื™ื (via smartctl -a /dev/XXX) ืื• ื‘ืงืจ RAID ื›ื“ื™ ืœื•ื•ื“ื ืฉื”ื‘ืขื™ื” ืื™ื ื” ื‘ืจืžืช ื”ื—ื•ืžืจื”. ื‘ืžืงืจื” ืฉืœื™, ื”-RAID ื”ืชื‘ืจืจ ื›"ื—ื•ืžืจื”", ืื– ื‘ื™ืงืฉืชื™ ืžื”ืžื ื”ืœ ื”ืžืงื•ืžื™ ืœื‘ื“ื•ืง ืืช ืžืฆื‘ ื”-RAID (ื”ืฉืจืช ื”ื™ื” ื‘ืžืจื—ืง ื›ืžื” ืžืื•ืช ืงื™ืœื•ืžื˜ืจื™ื ืžืžื ื™). ื”ื•ื ืืžืจ ืฉืœื ื”ื™ื• ืฉื’ื™ืื•ืช, ืžื” ืฉืื•ืžืจ ืฉืื ื—ื ื• ื‘ื”ื—ืœื˜ ื™ื›ื•ืœื™ื ืœื”ืชื—ื™ืœ ื‘ืฉื™ืงื•ื.

ื ื™ืกื™ื•ืŸ 1: ืืคืก_ื“ืคื™ื_ืคื’ื•ืžื™ื

ืื ื• ืžืชื—ื‘ืจื™ื ืœืžืกื“ ื”ื ืชื•ื ื™ื ื‘ืืžืฆืขื•ืช psql ืขื ื—ืฉื‘ื•ืŸ ื‘ืขืœ ื–ื›ื•ื™ื•ืช ืžืฉืชืžืฉ-ืขืœ. ืื ื—ื ื• ืฆืจื™ื›ื™ื ืžืฉืชืžืฉ-ืขืœ, ื›ื™... ืื•ึนืคึผึฐืฆึดื™ึธื” ืืคืก_ื“ืคื™ื_ืคื’ื•ืžื™ื ืจืง ื”ื•ื ื™ื›ื•ืœ ืœืฉื ื•ืช. ื‘ืžืงืจื” ืฉืœื™ ื–ื” postgres:

psql -h 127.0.0.1 -U postgres -s [ืฉื_ื‘ืกื™ืก ื”ื ืชื•ื ื™ื]

ืืคืฉืจื•ืช ืืคืก_ื“ืคื™ื_ืคื’ื•ืžื™ื ื ื“ืจืฉ ืขืœ ืžื ืช ืœื”ืชืขืœื ืžืฉื’ื™ืื•ืช ืงืจื™ืื” (ืžืืชืจ postgrespro):

ื›ืืฉืจ PostgreSQL ืžื–ื”ื” ื›ื•ืชืจืช ืขืžื•ื“ ืคื’ื•ืžื”, ื”ื•ื ื‘ื“ืจืš ื›ืœืœ ืžื“ื•ื•ื— ืขืœ ืฉื’ื™ืื” ื•ืžื‘ื˜ืœ ืืช ื”ืขืกืงื” ื”ื ื•ื›ื—ื™ืช. ืื zero_damaged_pages ืžื•ืคืขืœ, ื”ืžืขืจื›ืช ื‘ืžืงื•ื ื–ืืช ืžื•ืฆื™ืื” ืื–ื”ืจื”, ืžืืคืกืช ืืช ื”ื“ืฃ ื”ืคื’ื•ื ื‘ื–ื™ื›ืจื•ืŸ ื•ืžืžืฉื™ื›ื” ื‘ืขื™ื‘ื•ื“. ืื•ืคืŸ ืคืขื•ืœื” ื–ื” ื”ื•ืจืก ื ืชื•ื ื™ื, ื›ืœื•ืžืจ ืืช ื›ืœ ื”ืฉื•ืจื•ืช ื‘ื“ืฃ ื”ืคื’ื•ื.

ืื ื• ืžืืคืฉืจื™ื ืืช ื”ืืคืฉืจื•ืช ื•ืžื ืกื™ื ืœื‘ืฆืข ื•ืืงื•ื ืžืœื ืฉืœ ื”ืฉื•ืœื—ื ื•ืช:

VACUUM FULL VERBOSE

ื”ื ื™ืกื™ื•ืŸ ื”ืจืืฉื•ืŸ ืฉืœื™ ื‘ืฉื—ื–ื•ืจ ืžืกื“ ื ืชื•ื ื™ื Postgres ืœืื—ืจ ื›ืฉืœ (ื“ืฃ ืœื ื—ื•ืงื™ ื‘ื‘ืœื•ืง 4123007 ืฉืœ relatton base/16490)
ืœืžืจื‘ื” ื”ืฆืขืจ, ืžื–ืœ ืจืข.

ื ืชืงืœื ื• ื‘ืฉื’ื™ืื” ื“ื•ืžื”:

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

pg_toast โ€“ ืžื ื’ื ื•ืŸ ืœืื—ืกื•ืŸ "ื ืชื•ื ื™ื ืืจื•ื›ื™ื" ื‘-Poetgres ืื ื”ื•ื ืœื ืžืชืื™ื ืœืขืžื•ื“ ืื—ื“ (8kb ื›ื‘ืจื™ืจืช ืžื—ื“ืœ).

ื ื™ืกื™ื•ืŸ 2: ืื™ื ื“ืงืก ืžื—ื“ืฉ

ื”ืขืฆื” ื”ืจืืฉื•ื ื” ืžื’ื•ื’ืœ ืœื ืขื–ืจื”. ืื—ืจื™ ื›ืžื” ื“ืงื•ืช ืฉืœ ื—ื™ืคื•ืฉ ืžืฆืืชื™ ืืช ื”ื˜ื™ืค ื”ืฉื ื™ - ืœื”ื›ื™ืŸ ืจื ื“ืงืก ืฉื•ืœื—ืŸ ืคื’ื•ื. ืจืื™ืชื™ ืืช ื”ืขืฆื” ื”ื–ื• ื‘ืžืงื•ืžื•ืช ืจื‘ื™ื, ืื‘ืœ ื”ื™ื ืœื ืขื•ืจืจื” ืืžื•ืŸ. ื‘ื•ื ื ืขืฉื” ืื™ื ื“ืงืก ืžื—ื“ืฉ:

reindex table ws_log_smevlog

ื”ื ื™ืกื™ื•ืŸ ื”ืจืืฉื•ืŸ ืฉืœื™ ื‘ืฉื—ื–ื•ืจ ืžืกื“ ื ืชื•ื ื™ื Postgres ืœืื—ืจ ื›ืฉืœ (ื“ืฃ ืœื ื—ื•ืงื™ ื‘ื‘ืœื•ืง 4123007 ืฉืœ relatton base/16490)

ืจื ื“ืงืก ื”ื•ืฉืœื ืœืœื ื‘ืขื™ื•ืช.

ืื‘ืœ ื–ื” ืœื ืขื–ืจ, ื•ืืงื•ื ืžืœื ืงืจืก ืขื ืฉื’ื™ืื” ื“ื•ืžื”. ืžื›ื™ื•ื•ืŸ ืฉืื ื™ ืจื’ื™ืœ ืœื›ื™ืฉืœื•ื ื•ืช, ื”ืชื—ืœืชื™ ืœื—ืคืฉ ืขื•ื“ ืขืฆื•ืช ื‘ืื™ื ื˜ืจื ื˜ ื•ื ืชืงืœืชื™ ื‘ืžืฉื”ื• ืžืขื ื™ื™ืŸ ืœืžื“ื™ ืžืืžืจ.

ื ื™ืกื™ื•ืŸ 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 ืฉื•ืจื•ืช! ื”ื™ื” ืฆื•ืจืš ืœื˜ืคืœ ื”ื™ื˜ื‘ ื—ืœื•ืงืช ื ืชื•ื ื™ื, ืื‘ืœ ื–ื” ื ื•ืฉื ืœื“ื™ื•ืŸ ื ืคืจื“. ื–ื” ื”ื™ื” ืฉื‘ืช, ื”ืจืฆืชื™ ืืช ื”ืคืงื•ื“ื” ื”ื–ื• ื‘-tmux ื•ื”ืœื›ืชื™ ืœื™ืฉื•ืŸ:

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 ื›ืš ืฉืฉื•ืจื•ืช ื”ืชื•ืฆืื” ื™ื•ื—ื–ืจื• ื‘ืกื“ืจ ืžืกื•ื™ื. ืื—ืจืช, ืชืช-ืงื‘ื•ืฆื•ืช ื‘ืœืชื™ ืฆืคื•ื™ื•ืช ืฉืœ ืฉื•ืจื•ืช ื™ื•ื—ื–ืจื•.

ื‘ืจื•ืจ ืฉื”ืคืงื•ื“ื” ืœืขื™ืœ ื”ื™ื™ืชื” ืฉื’ื•ื™ื”: ืจืืฉื™ืช, ืœื ื”ื™ื” ืกื“ืจ ืœืคื™, ื”ืชื•ืฆืื” ืขืœื•ืœื” ืœื”ื™ื•ืช ืฉื’ื•ื™ื”. ืฉื ื™ืช, Postgres ืชื—ื™ืœื” ื”ื™ื” ืฆืจื™ืš ืœืกืจื•ืง ื•ืœื“ืœื’ ืขืœ ืฉื•ืจื•ืช OFFSET, ื•ืขื ื”ื’ื“ืœืช OFFSET ื”ืคืจื•ื“ื•ืงื˜ื™ื‘ื™ื•ืช ืชืจื“ ืขื•ื“ ื™ื•ืชืจ.

ื ื™ืกื™ื•ืŸ 4: ืงื— dump ื‘ืฆื•ืจืช ื˜ืงืกื˜

ื•ืื– ืขืœื” ื‘ืžื•ื—ื™ ืจืขื™ื•ืŸ ืžื‘ืจื™ืง ืœื›ืื•ืจื”: ืงื— dump ื‘ืฆื•ืจืช ื˜ืงืกื˜ ื•ื ืชื— ืืช ื”ืฉื•ืจื” ื”ืื—ืจื•ื ื” ืฉื”ื•ืงืœื˜ื”.

ืื‘ืœ ืจืืฉื™ืช, ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ืžื‘ื ื” ื”ื˜ื‘ืœื”. ws_log_smevlog:

ื”ื ื™ืกื™ื•ืŸ ื”ืจืืฉื•ืŸ ืฉืœื™ ื‘ืฉื—ื–ื•ืจ ืžืกื“ ื ืชื•ื ื™ื Postgres ืœืื—ืจ ื›ืฉืœ (ื“ืฃ ืœื ื—ื•ืงื™ ื‘ื‘ืœื•ืง 4123007 ืฉืœ relatton base/16490)

ื‘ืžืงืจื” ืฉืœื ื• ื™ืฉ ืœื ื• ื˜ื•ืจ "ืชึฐืขื•ึผื“ึทืช ื–ึถื”ื•ึผืช", ืฉื”ื›ื™ืœ ืืช ื”ืžื–ื”ื” (ื”ืžื•ื ื”) ื”ื™ื™ื—ื•ื“ื™ ืฉืœ ื”ืฉื•ืจื”. ื”ืชื•ื›ื ื™ืช ื”ื™ื™ืชื” ื›ื–ื•:

  1. ืื ื—ื ื• ืžืชื—ื™ืœื™ื ืœืงื—ืช dump ื‘ืฆื•ืจืช ื˜ืงืกื˜ (ื‘ืฆื•ืจื” ืฉืœ ืคืงื•ื“ื•ืช sql)
  2. ื‘ื ืงื•ื“ืช ื–ืžืŸ ืžืกื•ื™ืžืช, ื”-dump ื™ื•ืคืกืง ืขืงื‘ ืฉื’ื™ืื”, ืืš ืงื•ื‘ืฅ ื”ื˜ืงืกื˜ ืขื“ื™ื™ืŸ ื™ื™ืฉืžืจ ื‘ื“ื™ืกืง
  3. ืื ื• ืžืกืชื›ืœื™ื ื‘ืกื•ืฃ ืงื•ื‘ืฅ ื”ื˜ืงืกื˜, ื•ื‘ื›ืš ืื ื• ืžื•ืฆืื™ื ืืช ื”ืžื–ื”ื” (ืžื–ื”ื”) ืฉืœ ื”ืฉื•ืจื” ื”ืื—ืจื•ื ื” ืฉื”ื•ืกืจื” ื‘ื”ืฆืœื—ื”

ื”ืชื—ืœืชื™ ืœืงื—ืช dump ื‘ืฆื•ืจืช ื˜ืงืกื˜:

pg_dump -U my_user -d my_database -F p -t ws_log_smevlog -f ./my_dump.dump

ื”-dump, ื›ืฆืคื•ื™, ื”ื•ืคืกืง ืขื ืื•ืชื” ืฉื’ื™ืื”:

pg_dump: Error message from server: ERROR: invalid page in block 4123007 of relatton base/16490/21396989

ื‘ื”ืžืฉืš ื”ื“ืจืš ื–ื ื‘ ื”ืกืชื›ืœืชื™ ืขืœ ืงืฆื” ื”ืžื–ื‘ืœื” (ื–ื ื‘ -5 ./my_dump.dump) ื’ื™ืœื” ืฉื”ืžื–ื‘ืœื” ื ืงื˜ืขื” ื‘ืงื• ืขื id 186 525. "ืื– ื”ื‘ืขื™ื” ื”ื™ื ื‘ืงื ื” ืื—ื“ ืขื id 186 526, ื–ื” ืฉื‘ื•ืจ, ื•ืฆืจื™ืš ืœืžื—ื•ืง ืื•ืชื•!" - ื—ืฉื‘ืชื™. ืื‘ืœ, ื‘ื™ืฆื•ืข ืฉืื™ืœืชื” ืœืžืกื“ ื”ื ืชื•ื ื™ื:
ยซื‘ื—ืจ * ืžืชื•ืš ws_log_smevlog ืฉื‘ื• id=186529"ื”ืชื‘ืจืจ ืฉื”ื›ืœ ื‘ืกื“ืจ ืขื ื”ืงื• ื”ื–ื”... ื’ื ืฉื•ืจื•ืช ืขื ืžื“ื“ื™ื 186 - 530 ืขื‘ื“ื• ืœืœื ื‘ืขื™ื•ืช. ืขื•ื“ "ืจืขื™ื•ืŸ ืžื‘ืจื™ืง" ื ื›ืฉืœ. ืžืื•ื—ืจ ื™ื•ืชืจ ื”ื‘ื ืชื™ ืœืžื” ื–ื” ืงืจื”: ื›ืฉืžื•ื—ืงื™ื ื•ืžืฉื ื™ื ื ืชื•ื ื™ื ืžื˜ื‘ืœื”, ื”ื ืœื ื ืžื—ืงื™ื ืคื™ื–ื™ืช, ืืœื ืžืกื•ืžื ื™ื ื›"ื˜ื•ืคืœื™ื ืžืชื™ื", ื•ืื– ืžื’ื™ืข ื•ืืงื•ื ืื•ื˜ื•ืžื˜ื™ ื•ืžืกืžืŸ ืฉื•ืจื•ืช ืืœื• ื›ืžื—ื•ืงื•ืช ื•ืžืืคืฉืจ ืฉื™ืžื•ืฉ ื—ื•ื–ืจ ื‘ืฉื•ืจื•ืช ืืœื•. ื›ื“ื™ ืœื”ื‘ื™ืŸ, ืื ื”ื ืชื•ื ื™ื ื‘ื˜ื‘ืœื” ืžืฉืชื ื™ื ื•-autovacuum ืžื•ืคืขืœ, ืื– ื”ื ืœื ืžืื•ื—ืกื ื™ื ื‘ืจืฆืฃ.

ื ื™ืกื™ื•ืŸ 5: SELECT, FROM, WHERE id=

ื›ื™ืฉืœื•ื ื•ืช ืขื•ืฉื™ื ืื•ืชื ื• ื—ื–ืงื™ื ื™ื•ืชืจ. ืœืขื•ืœื ืืœ ืชื•ื•ืชืจ, ืืชื” ืฆืจื™ืš ืœืœื›ืช ืขื“ ื”ืกื•ืฃ ื•ืœื”ืืžื™ืŸ ื‘ืขืฆืžืš ื•ื‘ื™ื›ื•ืœื•ืช ืฉืœืš. ืื– ื”ื—ืœื˜ืชื™ ืœื ืกื•ืช ืืคืฉืจื•ืช ืื—ืจืช: ืคืฉื•ื˜ ืขื™ื™ืŸ ื‘ื›ืœ ื”ืจืฉื•ืžื•ืช ื‘ืžืกื“ ื”ื ืชื•ื ื™ื ืื—ื“ ืื—ื“. ื‘ื”ื›ืจืช ื”ืžื‘ื ื” ืฉืœ ื”ื˜ื‘ืœื” ืฉืœื™ (ืจืื” ืœืžืขืœื”), ื™ืฉ ืœื ื• ืฉื“ื” ืžื–ื”ื” ืฉื”ื•ื ื™ื™ื—ื•ื“ื™ (ืžืคืชื— ืจืืฉื™). ื™ืฉ ืœื ื• 1 ืฉื•ืจื•ืช ื‘ื˜ื‘ืœื” ื• 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:

ื”ื ื™ืกื™ื•ืŸ ื”ืจืืฉื•ืŸ ืฉืœื™ ื‘ืฉื—ื–ื•ืจ ืžืกื“ ื ืชื•ื ื™ื Postgres ืœืื—ืจ ื›ืฉืœ (ื“ืฃ ืœื ื—ื•ืงื™ ื‘ื‘ืœื•ืง 4123007 ืฉืœ relatton base/16490)

ื”ืžืฉืžืขื•ืช ื”ื™ื ืฉืžืฆื™ืืช ืงื• ืขื ื”ืžื–ื”ื” ื”ืจืฆื•ื™ ืœื ืืžื•ืจื” ืœืงื—ืช ื”ืจื‘ื” ื–ืžืŸ. ื‘ืชื™ืื•ืจื™ื” ื–ื” ืืžื•ืจ ืœืขื‘ื•ื“. ื•ื‘ื›ืŸ, ื‘ื•ื ื ืจื™ืฅ ืืช ื”ืคืงื•ื“ื” ืคื ื™ืžื” tmux ื•ื‘ื•ื ื ืœืš ืœื™ืฉื•ืŸ.

ืขื“ ื”ื‘ื•ืงืจ ื’ื™ืœื™ืชื™ ืฉื ืฆืคื• ื›-90 ืขืจื›ื™ื, ืฉื”ื ืงืฆืช ื™ื•ืชืจ ืž-000%. ืชื•ืฆืื” ืžืฆื•ื™ื ืช ื‘ื”ืฉื•ื•ืื” ืœืฉื™ื˜ื” ื”ืงื•ื“ืžืช (5%)! ืื‘ืœ ืœื ืจืฆื™ืชื™ ืœื—ื›ื•ืช 2 ื™ื•ื...

ื ื™ืกื™ื•ืŸ 6: SELECT, FROM, WHERE id >= ื•ืžื–ื”ื”

ืœืœืงื•ื— ื”ื™ื” ืฉืจืช ืžืฆื•ื™ืŸ ื”ืžื•ืงื“ืฉ ืœืžืกื“ ื”ื ืชื•ื ื™ื: ืžืขื‘ื“ ื›ืคื•ืœ Intel Xeon E5-2697 v2, ื”ื™ื• ืขื“ 48 ืฉืจืฉื•ืจื™ื ื‘ืžื™ืงื•ื ืฉืœื ื•! ื”ืขื•ืžืก ืขืœ ื”ืฉืจืช ื”ื™ื” ืžืžื•ืฆืข; ื™ื›ื•ืœื ื• ืœื”ื•ืจื™ื“ ื›-20 ืฉืจืฉื•ืจื™ื ืœืœื ื‘ืขื™ื•ืช. ื”ื™ื” ื’ื ืžืกืคื™ืง ื–ื™ื›ืจื•ืŸ RAM: ืขื“ 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 ืคืงื•ื“ื•ืช ืžื”ื˜ื•ืคืก:

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 ืฉื•ืจื•ืช ื‘ืžืงื•ื ื—ื™ื‘ื•ืจ ืื—ื“ ืขืœ ืื—ื“. ื›ืชื•ืฆืื” ืžื›ืš, ื”ืฆื•ื•ืช ื”ืคืš ืœื–ื”:

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

ื”ืžืฉืžืขื•ืช ื”ื™ื ืฉืฉืœื•ืฉ ืฉื•ืจื•ืช ืžื›ื™ืœื•ืช ืฉื’ื™ืื”. ื”ืžื–ื”ื™ื ืฉืœ ืจืฉื•ืžื•ืช ื”ื‘ืขื™ื” ื”ืจืืฉื•ื ื” ื•ื”ืฉื ื™ื™ื” ื”ื™ื• ื‘ื™ืŸ 829 ืœ-000, ื”ืžื–ื”ื™ื ืฉืœ ื”ืฉืœื™ืฉื™ ื”ื™ื• ื‘ื™ืŸ 830 ืœ-000. ืœืื—ืจ ืžื›ืŸ, ืคืฉื•ื˜ ื”ื™ื™ื ื• ืฆืจื™ื›ื™ื ืœืžืฆื•ื ืืช ืขืจืš ื”ืžื–ื”ื” ื”ืžื“ื•ื™ืง ืฉืœ ืจืฉื•ืžื•ืช ื”ื‘ืขื™ื”. ืœืฉื ื›ืš, ืื ื• ืžืกืชื›ืœื™ื ืขืœ ื”ื˜ื•ื•ื— ืฉืœื ื• ืขื ืจืฉื•ืžื•ืช ื‘ืขื™ื™ืชื™ื•ืช ืขื ืฉืœื‘ 146 ื•ืžื–ื”ื™ื ืืช ื”ืžื–ื”ื”:

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

ืœื”ืคืชืขืชื™, ื”ืขืจื›ื™ื ื ืžื—ืงื• ืœืœื ื‘ืขื™ื•ืช ื’ื ืœืœื ืืคืฉืจื•ืช ืืคืก_ื“ืคื™ื_ืคื’ื•ืžื™ื.

ื•ืื– ื”ืชื—ื‘ืจืชื™ ืœืžืกื“ ื”ื ืชื•ื ื™ื, ืขืฉื™ืชื™ ื•ืืงื•ื ืžืœื (ืื ื™ ื—ื•ืฉื‘ ืฉืœื ื”ื™ื” ืฆื•ืจืš ืœืขืฉื•ืช ื–ืืช), ื•ืœื‘ืกื•ืฃ ื”ืกืจืชื™ ื‘ื”ืฆืœื—ื” ืืช ื”ื’ื™ื‘ื•ื™ ื‘ืืžืฆืขื•ืช pg_dump. ื”ืžื–ื‘ืœื” ื ืœืงื—ื” ืœืœื ืฉื’ื™ืื•ืช! ื”ื‘ืขื™ื” ื ืคืชืจื” ื‘ืฆื•ืจื” ื›ืœ ื›ืš ืžื˜ื•ืคืฉืช. ื”ืฉืžื—ื” ืœื ื™ื“ืขื” ื’ื‘ื•ืœ, ืื—ืจื™ ื›ืœ ื›ืš ื”ืจื‘ื” ื›ื™ืฉืœื•ื ื•ืช ื”ืฆืœื—ื ื• ืœืžืฆื•ื ืคืชืจื•ืŸ!

ืชื•ื“ื•ืช ื•ืžืกืงื ื”

ื›ืš ื”ืชื‘ืจืจ ื”ื ื™ืกื™ื•ืŸ ื”ืจืืฉื•ืŸ ืฉืœื™ ื‘ืฉื—ื–ื•ืจ ืžืกื“ ื ืชื•ื ื™ื ืืžื™ืชื™ ืฉืœ Postgres. ืื ื™ ืื–ื›ื•ืจ ืืช ื”ื—ื•ื•ื™ื” ื”ื–ื• ืขื•ื“ ื”ืจื‘ื” ื–ืžืŸ.

ื•ืœื‘ืกื•ืฃ, ื‘ืจืฆื•ื ื™ ืœื•ืžืจ ืชื•ื“ื” ืœ-PostgresPro ืขืœ ืชืจื’ื•ื ื”ืชื™ืขื•ื“ ืœืจื•ืกื™ืช ื•ืขื‘ื•ืจ ืงื•ืจืกื™ื ืžืงื•ื•ื ื™ื ื‘ื—ื™ื ื ืœื—ืœื•ื˜ื™ืŸ, ืžื” ืฉืขื–ืจ ืžืื•ื“ ื‘ืžื”ืœืš ื ื™ืชื•ื— ื”ื‘ืขื™ื”.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”