Postgres ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ์ฒด ๊ธฐ๋ฅ์ผ๋ก ๋ณต์ํ ์ฒซ ๋ฒ์งธ ์ฑ๊ณต์ ์ธ ๊ฒฝํ์ ์ฌ๋ฌ๋ถ๊ณผ ๊ณต์ ํ๊ณ ์ถ์ต๋๋ค. ์ ๋ ๋ฐ๋ ์ ์ Postgres DBMS๋ฅผ ์๊ฒ ๋์์ง๋ง ๊ทธ ์ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ์ ๋ํ ๊ฒฝํ์ด ์ ํ ์์์ต๋๋ค.
์ ๋ ๋๊ท๋ชจ IT ํ์ฌ์์ ์ค DevOps ์์ง๋์ด๋ก ์ผํ๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ ํ์ฌ๋ ๊ณ ๋ถํ ์๋น์ค์ฉ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ๊ณ ์์ผ๋ฉฐ, ์ฑ๋ฅ, ์ ์ง ๊ด๋ฆฌ, ๋ฐฐํฌ๋ฅผ ๋ด๋นํ๊ณ ์์ต๋๋ค. ๋๋ ํ๋์ ์๋ฒ์์ ์ ํ๋ฆฌ์ผ์ด์
์ ์
๋ฐ์ดํธํ๋ ํ์ค ์์
์ ๋ฐ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ 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
๊ณค์ถฉ "๋ธ๋ก์ ์๋ชป๋ ํ์ด์ง" ํ์ผ ์์คํ
์์ค์ ๋ฌธ์ ๋ฅผ ๋งํ๋๋ฐ ์ด๋ ๋งค์ฐ ๋์ฉ๋๋ค. ๋ค์ํ ํฌ๋ผ์์ ๋ค์์ ์ ์ํ์ต๋๋ค. ์์ ์ง๊ณต ์ต์
ํฌํจ zero_damaged_pages ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด. ์, ํ๋ฒ ํด๋ณด์...
ํ๋ณต ์ค๋น
์ฃผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณต์์ ์๋ํ๊ธฐ ์ ์ Postgres ๋ฐฑ์
์ ์ํํ์ญ์์ค. ๊ฐ์ ๋จธ์ ์ด ์๋ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ค์งํ๊ณ ์ค๋
์ท์ ์ฐ์ต๋๋ค. ์ค๋
์ท์ ์ฐ์ ์ ์๋ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ค์งํ๊ณ Postgres ๋๋ ํฐ๋ฆฌ์ ๋ด์ฉ(wal ํ์ผ ํฌํจ)์ ์์ ํ ์ฅ์์ ๋ณต์ฌํ์ธ์. ์ฐ๋ฆฌ ์ฌ์
์์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ํฉ์ ์
ํ์ํค์ง ์๋ ๊ฒ์
๋๋ค. ์ฝ๋ค
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ผ๋ฐ์ ์ผ๋ก ๋์๊ฒ ์ ํฉํ๊ธฐ ๋๋ฌธ์ ์ ๊ธฐ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋คํ๋ก ์ ํํ๊ณ ๋ฐ์ดํฐ๊ฐ ์์๋ ํ ์ด๋ธ์ ์ ์ธํ์ต๋๋ค(์ต์ -T, --exclude-ํ ์ด๋ธ=ํ ์ด๋ธ pg_dump์์).
์๋ฒ๊ฐ ๋ฌผ๋ฆฌ์ ์ด์ด์ ์ค๋ ์ท์ ์ฐ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ์ต๋๋ค. ๋ฐฑ์ ์ด ์ ๊ฑฐ๋์์ต๋๋ค. ๊ณ์ ์งํํ๊ฒ ์ต๋๋ค.
ํ์ผ ์์คํ ํ์ธ
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ณต์ํ๊ธฐ ์ ์ ํ์ผ ์์คํ ์์ฒด์ ๋ชจ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ์ง ํ์ธํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์๊ฐ ์์ผ๋ฉด ๋ฐ๋ก์ก์ผ์ธ์. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ํฉ์ ๋ ์ ํ์ํฌ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ด ๊ฒฝ์ฐ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋ ํ์ผ ์์คํ ์ด ๋ง์ดํธ๋์์ต๋๋ค. "/srv" ์ ํ์ ext4์์ต๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์ง: systemctl ์ค์ง [์ด๋ฉ์ผ ๋ณดํธ] ํ์ผ ์์คํ
์ ๋ค๋ฅธ ์ฌ๋์ด ์ฌ์ฉํ๊ณ ์์ง ์๊ณ ๋ค์ ๋ช
๋ น์ ์ฌ์ฉํ์ฌ ๋ง์ดํธ ํด์ ํ ์ ์๋์ง ํ์ธํ์ธ์. ์ด์ํ:
lsof +D /srv
๋ํ Redis ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ฌ์ฉํ๊ณ ์์๊ธฐ ๋๋ฌธ์ Redis ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ค์งํด์ผ ํ์ต๋๋ค. "/srv". ๋ค์์ผ๋ก ๋ง์ดํธ๋ฅผ ํด์ ํ์ต๋๋ค. / srv (๋ง์ดํธ).
์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ ์์คํ ์ ํ์ธํ์ต๋๋ค. e2fsck ์ค์์น -f (ํ์ผ ์์คํ ์ด ๊นจ๋ํ ๊ฒ์ผ๋ก ํ์๋ ๊ฒฝ์ฐ์๋ ๊ฐ์ ๊ฒ์ฌ):
๋ค์์ผ๋ก ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋คํ 2fs (sudo dumpe2fs /dev/mapper/gu2โsys-srv | grep ํ์ธ๋จ) ๊ฒ์ฌ๊ฐ ์ค์ ๋ก ์ํ๋์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
e2fsck ext4 ํ์ผ ์์คํ
์์ค์์ ๋ฌธ์ ๊ฐ ๋ฐ๊ฒฌ๋์ง ์์์์ ์๋ฏธํฉ๋๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณต์์ ๊ณ์ ์๋ํ๊ฑฐ๋ ์คํ๋ ค extXNUMX ํ์ผ ์์คํ
์์ค์ผ๋ก ๋์๊ฐ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์ง๊ณต์ฒญ์๊ธฐ ๊ฐ๋ (๋ฌผ๋ก ํ์ผ ์์คํ
์ ๋ค์ ๋ง์ดํธํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ํด์ผ ํฉ๋๋ค).
๋ฌผ๋ฆฌ์ ์๋ฒ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฐ๋์ ๋์คํฌ ์ํ๋ฅผ ํ์ธํ์ญ์์ค(๋ค์์ ํตํด). smartctl -a /dev/XXX) ๋๋ RAID ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๊ฐ ํ๋์จ์ด ์์ค์ ์์ง ์์์ง ํ์ธํ์ญ์์ค. ์ ๊ฒฝ์ฐ์๋ RAID๊ฐ 'ํ๋์จ์ด'์ธ ๊ฒ์ผ๋ก ํ๋ช ๋์ด ๋ก์ปฌ ๊ด๋ฆฌ์์๊ฒ RAID ์ํ๋ฅผ ํ์ธํด๋ฌ๋ผ๊ณ ์์ฒญํ์ต๋๋ค(์๋ฒ๋ ์ ์๊ฒ์ ์๋ฐฑ ํฌ๋ก๋ฏธํฐ ๋จ์ด์ ธ ์์์ต๋๋ค). ๊ทธ๋ ์ค๋ฅ๊ฐ ์๋ค๊ณ ๋งํ์ต๋๋ค. ์ด๋ ํ์คํ ๋ณต์์ ์์ํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
์๋ 1: zero_damaged_pages
์ํผ์ ์ ๊ถํ์ด ์๋ ๊ณ์ ์ผ๋ก psql์ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํฉ๋๋ค. ์ํผ์ ์ ๊ฐ ํ์ํ ์ด์ ๋... ์ต์ zero_damaged_pages ์ค์ง ๊ทธ ์ฌ๋๋ง์ด ๋ณํ ์ ์๋ค. ์ ๊ฒฝ์ฐ์๋ ํฌ์คํธ๊ทธ๋ ์ค์ ๋๋ค.
psql -h 127.0.0.1 -U postgres -s [๋ฐ์ดํฐ๋ฒ ์ด์ค_์ด๋ฆ]
์ต์ zero_damaged_pages ์ฝ๊ธฐ ์ค๋ฅ๋ฅผ ๋ฌด์ํ๋ ค๋ฉด ํ์ํฉ๋๋ค(postgrespro ์น์ฌ์ดํธ์์):
PostgreSQL์ ์์๋ ํ์ด์ง ํค๋๋ฅผ ๊ฐ์งํ๋ฉด ์ผ๋ฐ์ ์ผ๋ก ์ค๋ฅ๋ฅผ ๋ณด๊ณ ํ๊ณ ํ์ฌ ํธ๋์ญ์ ์ ์ค๋จํฉ๋๋ค. zero_damaged_pages๊ฐ ํ์ฑํ๋๋ฉด ์์คํ ์ ๋์ ๊ฒฝ๊ณ ๋ฅผ ๋ฐํํ๊ณ ๋ฉ๋ชจ๋ฆฌ์ ์์๋ ํ์ด์ง๋ฅผ XNUMX์ผ๋ก ๋ง๋ ๋ค์ ์ฒ๋ฆฌ๋ฅผ ๊ณ์ํฉ๋๋ค. ์ด ๋์์ ๋ฐ์ดํฐ, ์ฆ ์์๋ ํ์ด์ง์ ๋ชจ๋ ํ์ ํ๊ดดํฉ๋๋ค.
์ต์ ์ ํ์ฑํํ๊ณ ํ ์ด๋ธ์ ์์ ํ ๋น์ฐ๋ ค๊ณ ํฉ๋๋ค.
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: ์ฌ์์ธ
Google์ ์ฒซ ๋ฒ์งธ ์กฐ์ธ์ ๋์์ด ๋์ง ์์์ต๋๋ค. ๋ช ๋ถ ๋์ ๊ฒ์ํ ๋์ ๋ ๋ฒ์งธ ํ์ ์ฐพ์์ต๋๋ค. ์ฌ์ ์ธ ์์๋ ํ ์ด๋ธ. ๋๋ ์ด ์กฐ์ธ์ ์ฌ๋ฌ ๊ณณ์์ ๋ณด์์ง๋ง ์์ ๊ฐ์ ์ป์ง ๋ชปํ์ต๋๋ค. ๋ค์ ์์ธ์ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
reindex table ws_log_smevlog
์ฌ์ ์ธ ๋ฌธ์ ์์ด ์๋ฃ๋์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ ๋์์ด ๋์ง ์์์ผ๋ฉฐ, ์ง๊ณต์ด ๊ฐ๋ ์ฐธ ๋น์ทํ ์ค๋ฅ๋ก ์ธํด ์ถฉ๋์ด ๋ฐ์ํ์ต๋๋ค. ๋๋ ์คํจ์ ์ต์ํ๊ธฐ ๋๋ฌธ์ ์ธํฐ๋ท์์ ์กฐ์ธ์ ๋ ์ฐพ๊ธฐ ์์ํ๊ณ ๋ค์ ํฅ๋ฏธ๋ก์ด ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
์๋ 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 ์ ๋ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์์ธกํ ์ ์๋ ํ ํ์ ์งํฉ์ด ๋ฐํ๋ฉ๋๋ค.
๋ถ๋ช ํ ์์ ๋ช ๋ น์ ์๋ชป๋์์ต๋๋ค. ์ฒซ์งธ, ์ฃผ๋ฌธ, ๊ฒฐ๊ณผ๊ฐ ์๋ชป๋ ์ ์์ต๋๋ค. ๋์งธ, Postgres๋ ๋จผ์ OFFSET ํ์ ์ค์บํ๊ณ ๊ฑด๋๋ฐ์ด์ผ ํ์ต๋๋ค. OFFSET ์์ฐ์ฑ์ ๋์ฑ ๋จ์ด์ง๊ฒ ๋ฉ๋๋ค.
์๋ 4: ํ ์คํธ ํ์์ผ๋ก ๋คํ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
๊ทธ๋ฌ๋ค๊ฐ ๊ฒ๋ณด๊ธฐ์๋ ํ๋ฅญํด ๋ณด์ด๋ ์์ด๋์ด๊ฐ ๋ ์ฌ๋์ต๋๋ค. ํ ์คํธ ํ์์ผ๋ก ๋คํ๋ฅผ ๊ฐ์ ธ์์ ๋ง์ง๋ง์ผ๋ก ๋ น์๋ ์ค์ ๋ถ์ํ๋ ๊ฒ์ ๋๋ค.
ํ์ง๋ง ๋จผ์ ํ ์ด๋ธ์ ๊ตฌ์กฐ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ws_log_smevlog:
์ฐ๋ฆฌ์ ๊ฒฝ์ฐ์๋ ์ด์ด ์์ต๋๋ค. "์ ๋ถ์ฆ", ํ์ ๊ณ ์ ์๋ณ์(์นด์ดํฐ)๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ๊ณํ์ ์ด๋ฌ์ต๋๋ค.
- ํ ์คํธ ํ์(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
๋ ๋์๊ฐ ๊ผฌ๋ฆฌ ๋คํ์ ๋๋ถ๋ถ์ ๋ณด๋ (๊ผฌ๋ฆฌ -5 ./my_dump.dump) id๊ฐ ์๋ ๋ผ์ธ์์ ๋คํ๊ฐ ์ค๋จ๋์์์ ๋ฐ๊ฒฌํ์ต๋๋ค. 186 525. โ๊ทธ๋์ ๋ฌธ์ ๋ ID 186 526์ ์๋ ์ค์ ์๊ณ , ๊นจ์ ธ์ ์ญ์ ํด์ผ ํฉ๋๋ค!โ โ ๋๋ ์๊ฐํ๋ค. ๊ทธ๋ฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฟผ๋ฆฌ๋ฅผ ์ํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ยซID=186529์ธ ws_log_smevlog์์ *๋ฅผ ์ ํํ์ธ์."์ด ์ค์์๋ ๋ชจ๋ ๊ฒ์ด ๊ด์ฐฎ๋ค๋ ๊ฒ์ด ๋ฐํ์ก์ต๋๋ค... ์ธ๋ฑ์ค๊ฐ 186 - 530์ธ ํ๋ ๋ฌธ์ ์์ด ์๋ํ์ต๋๋ค. ๋ ๋ค๋ฅธ "ํ๋ฅญํ ์์ด๋์ด"๋ ์คํจํ์ต๋๋ค. ๋์ค์ ๋๋ ์ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ๋์ง ์ดํดํ์ต๋๋ค. ํ
์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๊ณ ๋ณ๊ฒฝํ ๋ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ญ์ ๋์ง ์๊ณ "๋ฐ๋ ํํ"๋ก ํ์๋ฉ๋๋ค. ์๋ ์ง๊ณตํ ์ด ์ค์ ์ญ์ ๋ ๊ฒ์ผ๋ก ํ์ํ๊ณ ์ด ์ค์ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ํ์ฉํฉ๋๋ค. ์ดํดํ์๋ฉด, ํ
์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๊ณ autovacuum์ด ํ์ฑํ๋๋ฉด ์์ฐจ์ ์ผ๋ก ์ ์ฅ๋์ง ์์ต๋๋ค.
์๋ 5: SELECT, FROM, WHERE id=
์คํจ๋ ์ฐ๋ฆฌ๋ฅผ ๋์ฑ ๊ฐํ๊ฒ ๋ง๋ญ๋๋ค. ๊ฒฐ์ฝ ํฌ๊ธฐํด์๋ ์ ๋๋ฉฐ, ๋๊น์ง ๋์๊ฐ ์์ ๊ณผ ์์ ์ ๋ฅ๋ ฅ์ ๋ฏฟ์ด์ผ ํฉ๋๋ค. ๊ทธ๋์ ๋๋ ๋ค๋ฅธ ์ต์ ์ ์๋ํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ํ๋์ฉ ์ดํด๋ณด๋ ๊ฒ์ ๋๋ค. ๋ด ํ ์ด๋ธ์ ๊ตฌ์กฐ(์ ์ฐธ์กฐ)๋ฅผ ์๋ฉด ๊ณ ์ ํ(๊ธฐ๋ณธ ํค) 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์ด ์ฝ์๋ก ์ ์ก๋จ) ์ค๋ฅ๊ฐ ํฌํจ๋ ์ค์ด ์ธ์๋ฉ๋๋ค(|| ๋๋ถ์ ์ ํ์ ๋ฌธ์ ๊ฐ ์์์ ์๋ฏธํฉ๋๋ค(๋ช ๋ น์ ๋ฐํ ์ฝ๋). 0))์ด ์๋๋๋ค.
์ด์ด ์ข์์ต๋๋ค. ํ๋์ ์ธ๋ฑ์ค๊ฐ ์์ฑ๋์์ต๋๋ค. id:
์ด๋ ์ํ๋ ID๊ฐ ์๋ ๋ผ์ธ์ ์ฐพ๋ ๋ฐ ๋ง์ ์๊ฐ์ด ๊ฑธ๋ฆฌ์ง ์์์ ์๋ฏธํฉ๋๋ค. ์ด๋ก ์ ์ผ๋ก๋ ์๋ํด์ผ ํฉ๋๋ค. ์, ๋ค์์์ ๋ช
๋ น์ ์คํํด ๋ณด๊ฒ ์ต๋๋ค. tmux ๊ทธ๋ฆฌ๊ณ ์๋ฌ ๊ฐ์.
์์นจ๊น์ง ๋๋ ์ฝ 90๊ฐ์ ํญ๋ชฉ์ ์กฐํํ ๊ฒ์ ๋ฐ๊ฒฌํ๋๋ฐ, ์ด๋ 000%๊ฐ ์กฐ๊ธ ๋๋ ์์น์ ๋๋ค. ๊ธฐ์กด ๋ฐฉ๋ฒ(5%)๊ณผ ๋น๊ตํ์ ๋ ํ์ํ ๊ฒฐ๊ณผ! ํ์ง๋ง 2์ผ์ ๊ธฐ๋ค๋ฆฌ๊ธฐ ์ซ์์ด์...
์๋ 6: SELECT, FROM, WHERE id >= ๋ฐ id
๊ณ ๊ฐ์ ์ฐ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฉ ์๋ฒ๋ฅผ ๋ณด์ ํ๊ณ ์์์ต๋๋ค. ๋์ผ ํ๋ก์ธ์ ์ธํ ์ ์จ E5-2697 v2, ์ฐ๋ฆฌ ์์น์๋ ๋ฌด๋ ค 48๊ฐ์ ์ค๋ ๋๊ฐ ์์์ต๋๋ค! ์๋ฒ์ ๋ก๋๋ ํ๊ท ์์ค์ด์๊ณ ์ฝ 20๊ฐ์ ์ค๋ ๋๋ฅผ ๋ฌธ์ ์์ด ๋ค์ด๋ก๋ํ ์ ์์์ต๋๋ค. RAM๋ ์ถฉ๋ถํ์ต๋๋ค. ์ต๋ 384GB!
๋ฐ๋ผ์ ๋ช ๋ น์ ๋ณ๋ ฌํํด์ผ ํฉ๋๋ค.
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
tmux ์ธ์ ์์ 16๊ฐ์ ์ฐฝ์ ์ด๊ณ ๋ค์ ๋ช ๋ น์ ์คํํฉ๋๋ค.
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, ์ธ ๋ฒ์งธ ๋ฌธ์ ๋ ์ฝ๋์ id๋ 830~000 ์ฌ์ด์์ผ๋ฉฐ, ๋ค์์ผ๋ก ๋ฌธ์ ๋ ์ฝ๋์ ์ ํํ id ๊ฐ์ ์ฐพ์์ผ ํ์ต๋๋ค. ์ด๋ฅผ ์ํด ๋ฌธ์ ๊ฐ ์๋ ๊ธฐ๋ก์ด ์๋ ๋ฒ์๋ฅผ 146๋จ๊ณ๋ก ์กฐ์ฌํ๊ณ 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.
๊ทธ๋ฐ ๋ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ์ฌ ์ง๊ณต์ด ๊ฐ๋ ์ฐธ (์ด๋ ๊ฒ ํ ํ์๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค) ๋ง์ง๋ง์ผ๋ก ๋ค์์ ์ฌ์ฉํ์ฌ ๋ฐฑ์ ์ ์ฑ๊ณต์ ์ผ๋ก ์ ๊ฑฐํ์ต๋๋ค. pg_dump. ๋คํ๋ ์ค๋ฅ ์์ด ์ดฌ์๋์์ต๋๋ค! ๋ฌธ์ ๋ ์ด๋ ๊ฒ ๋ฉ์ฒญํ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐ๋์์ต๋๋ค. ๊ธฐ์จ์ ๋์ด ์์์ต๋๋ค. ์๋ง์ ์คํจ ๋์ ์ฐ๋ฆฌ๋ ํด๊ฒฐ์ฑ ์ ์ฐพ์์ต๋๋ค!
๊ฐ์ฌ์ ๋ง์๊ณผ ๊ฒฐ๋ก
์ด๊ฒ์ด ์ค์ Postgres ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ณต์ํ ์ฒซ ๊ฒฝํ์ ๊ฒฐ๊ณผ์์ต๋๋ค. ๋๋ ์ด ๊ฒฝํ์ ์ค๋ซ๋์ ๊ธฐ์ตํ ๊ฒ์ด๋ค.
๋ง์ง๋ง์ผ๋ก ๋ฌธ์๋ฅผ ๋ฌ์์์ด๋ก ๋ฒ์ญํด ์ค PostgresPro์๊ฒ ๊ฐ์ฌ ์ธ์ฌ๋ฅผ ์ ํ๊ณ ์ถ์ต๋๋ค.
์ถ์ฒ : habr.com