Server Disk 100% Puno (0 Bytes Libre): Pagbawi sa usa ka Nahagsa nga Database Kanus-a rm ug apt Napakyas tungod sa Kakulang sa Inodes/Space¶
Ang mga numero sa emerhensya lahi sa nasud. Kini nga panid naggamit sa 911, ang numero para sa Estados Unidos ug Canada. Daghang ubang mga nasod ang naggamit ug 112, 999, o laing numero. Pangitaa ang numero alang sa imong nasud.
Ang pagkadiskobre nga ang usa ka produksiyon sa Linux server naigo 100% paggamit sa disk (0 bytes free) o 100% paggamit sa inode (df -i) samtang nagdagan sa usa ka aktibo nga PostgreSQL, MySQL/InnoDB, MariaDB, o SQLite database mao ang usa sa labing delikado nga paagi sa kapakyasan sa mga sistema sa administrasyon. Sa zero bytes o zero free inodes, ang krisis paspas nga mosaka: ang operating system kernel dili na makahimo og Unix domain sockets sa /tmp o /var/run, bash napakyas sa pagkompleto sa tab tungod kay dili kini makasulat sa temporaryo nga mga tubo sa kabhang, apt o dnf dili makadagan aron limpyohan ang mga pakete tungod kay ang mga manager sa package nanginahanglan temporaryo nga mga file sa kandado, ug ang imong makina sa database nahagsa sa tunga sa usa ka Write-Ahead Log (WAL) checkpoint o nagdumili sa pagsira sa limpyo tungod kay dili kini makagahin ug usa ka 4 kilobyte (0.004 megabyte) block para sa .pid o lock file. Ang mas grabe pa, ang mga natarantar nga mga administrador kanunay nga modagan rm -rf /var/log/*.log sa multi-gigabyte log files ug tan-awa sa kalisang ingon df -h report gihapon 100% Use% (0 Avail), o makamatay sila nga nagtangtang pg_wal (pg_xlog) o ib_logfile0 sa pagpahawa sa wanang, permanente nga makadaot sa database lapas sa pagbawi sa transaksyon. Kung wala ka tuyoa nga natangtang ang mga kritikal nga file sa database sa panahon sa pagsulay sa paglimpyo, hunong dayon ug ibalhin sa aksidenteng rm -rf o Shift-Delete read-only remount ug inode carving; kung ang imong nagpahiping hardware sa pagtipig naghulog sa mga sayup sa I / O o nag-lock sa kaugalingon batok sa mga pagsulat, konsultaha SSD ug NVMe kalit nga read-only mode ug TRIM disable rescue o dunot nga Pulong, Excel, PDF, ug database file recovery. Kung kini nga outage makaapekto sa mga sistema sa kaluwasan sa kinabuhi sa ospital, pagpadala sa emerhensya, o kritikal nga mga gamit sa publiko, tawagan ang imong lokal nga numero sa emerhensya (911 sa Estados Unidos ug Canada, 112 sa tibuok European Union, 999 sa United Kingdom) o konsultaha ang among global nga direktoryo sa emergency nga mga numero.
Buhata kini karon¶
- AYAW i-delete
pg_wal/,pg_xlog/,pg_multixact/,ib_logfile*,undo_*, o-wal/-shmmga file aron maghimog luna: Ang pagtangtang sa Write-Ahead Log o InnoDB redo/undo log files samtang ang database nahagsa o wala ma-checkpoint makaguba sa bugtong rekord sa wala pasalig ug in-flight nga mga panid. Ang usa ka database nga adunay usa ka bug-os nga disk 100 porsyento nga mabawi sa higayon nga mapagawas ang luna; usa ka database kansang WAL nga mga file gitangtang sa mano-manormmag-antos sa dili mabalik nga B-tree ug tapok nga korapsyon. - ** Pag-diagnose sa 5 segundo kung wala ka sa mga bloke sa disk (
df -h), gikan sa filesystem inodes (df -i), o pagkupot sa bukas nga wala masumpay nga mga file (lsof +L1)**: - Dagan
df -hsa pagsusi block kapasidad ugdf -iaron masusi ang kapasidad sa inode. Ang usa ka server nga adunay 50 gigabytes (53.6 bilyon nga bytes) nga libre nga espasyo sa disk molabay gihaponNo space left on device (ENOSPC)kondf -inagpakitaIUse% = 100%(kasagaran tungod sa minilyon nga gamay nga session, cache, o mail spool files). - Kung
df -hnagpakita100%gigamit (0 Avail) bisan pag nakadagan karmsa dako nga log files, runsudo lsof +L1. Bisan unsang file nga natangtang gamit angrmsamtangnginx,rsyslog,docker,postgres, omysqldsa gihapon naghupot sa usa ka bukas nga file descriptor nagpadayon sa paggamit sa 100 porsyento sa iyang mga bloke sa disk hangtud nga ang proseso magsugod pag-usab o imong putlon ang descriptor direkta. - Libre nga gigabytes nga wanang sa 1 segundo nga wala i-restart ang mga daemon pinaagi sa pagputol sa bukas nga mga file sa lugar (
: > /path/to/logfileo: > /proc/<pid>/fd/<n>): - Imbes nga
rm /var/log/syslog(nga nagbilin sa mga bloke nga gi-lock sa running logger), i-zero ang file sa lugar gamit ang shell null redirect:sudo sh -c ': > /var/log/syslog'osudo truncate -s 0 /var/log/syslog. - Kung nidagan ka
rmsa usa ka dako nga log file ugdf -hwala nahulog, pangitaa ang proseso nga ID (PID) ug file descriptor (FD) sasudo lsof +L1ug putla kini diretso pinaagi sa kernel procfs interface:sudo sh -c ': > /proc/<PID>/fd/<FD>'. Ang wanang mobalik sadf -hdiha-diha dayon. - ** I-unlock dayon ang emergency room sa pagginhawa
ext4/ext3pinaagi sa pagpaubos sa gireserba nga root block nga porsyento (tune2fs -m 1)**: Pinaagi sa default,ext4adunay 5 porsyento sa tibuok partisyon (25 gigabytessa a500 gigabytedisk) alang lamang saUID 0(root), nagpasabut nga dili gamut nga mga serbisyo sama sapostgres(UID 109),mysql, ugwww-datanaigoNo space left on devicesa 95 porsyento nga paggamit. Ibalik ang 80 porsyento sa kana nga reserba online sa 1 segundo nga adunay zero downtime pinaagi sa pagdagansudo tune2fs -m 1 /dev/sda1(o ang imong root block device gikan safindmnt /). - Hawan
systemd-journaldbinary logs ug daan nga package caches nga luwas: Runsudo journalctl --vacuum-size=50M(nga luwas nga nagtuyok ug naglimpyo sa binary/var/log/journalmga archive hangtod sa 50 megabytes) ugsudo apt-get clean(osudo dnf clean all), nga nagtangtang sa na-download.deb/.rpmmga archive sa/var/cache/apt/archives/nga dili kinahanglan nga magsulat sa dpkg database. - ** Sa higayon nga libre na ang labing menos 1 gigabyte ngadto sa 5 gigabytes (1.07 bilyon ngadto sa 5.36 bilyong bytes) nga luna, dad-a ang database sa single-user o recovery mode aron makompleto ang WAL checkpoint niini sa dili pa tugotan ang trapiko sa kliyente**: Tugoti ang PostgreSQL, MySQL/InnoDB, o SQLite nga i-replay ang Write-Ahead Log (
WAL), i-flush ang hugaw nga mga panid ngadto sa nag-unang mga file sa datos, ug i-recycle ang nabuak nga mga bahin sa WAL nga limpyo sa dili pa ablihan pag-usab ang imong firewall sa aplikasyon o web server.
Danger
Ayaw pagdagan pg_resetwal (o pg_resetxlog) sa PostgreSQL o innodb_force_recovery = 6 sa MySQL tungod lang kay napuno ang disk: Nagdagan pg_resetwal Gipahiran ang mga pointer sa log sa transaksyon ug gipugos ang PostgreSQL nga magsugod sa tunga nga sinulat nga mga panid sa datos, paggarantiya sa hilom nga pagkawala sa linya, pagdoble sa panguna nga mga yawe, ug nabuak nga langyaw nga yawe nga B-kahoy. Sa 99.9 porsyento sa disk-full database crashes, yano nga nagpagawas sa 2 gigabytes ngadto sa 10 gigabytes (2.1 bilyon ngadto sa 10.7 bilyong bytes) nga luna sa partition ug pagsugod sa database daemon kasagaran nagtugot sa awtomatikong pag-ayo sa crash (REDO phase) aron mahuman nga limpyo nga walay pagkawala sa datos.
Desisyon tree: zero-space server ug nahagsa nga database triage¶
Gamita kini nga punoan sa desisyon aron mahibal-an kung ngano nga nagreport ang operating system ENOSPC (No space left on device) ug pilia ang eksakto nga dili makadaot nga agianan sa pagbawi:
flowchart TD
Start["Server o Database Throwing: Wala’y nahabilin nga wanang sa aparato (ENOSPC)"] --> CheckDF["Dagan: df -h UG df -i"]
CheckDF --> DiagType{"Unsa ang Gi-report sa df?"}
DiagType -->|"df -h Nagpakita 100% Paggamit (0 Avail) UG df -i < 95%"| BlockFull["Block Exhaustion: Susihon kung du -shx / Match sa df -h"]
DiagType -->|"Ang df -h Nagpakita ug Libre nga GB PERO ang df -i Nagpakita sa 100% IUse"| InodeFull["Inode Exhaustion: Minilyon nga Gagmay nga 0-to-4KB nga mga File"]
DiagType -->|"Parehong df -h ug df -i Ipakita <90% Gigamit"| RamOrQuota["Natago nga Limitasyon: Susiha ang df -h /tmp (puno ang tmpfs RAM), Docker Overlay2, o XFS/ext4 Disk Quotas"]
BlockFull --> GhostCheck{"Nakadagan na ba ka sa rm sa Daghang mga File nga Wala’y Pag-drop sa df?"}
GhostCheck -->|"Oo: ang du Mas Gamay Kay sa df"| UnlinkedFD["Run: sudo lsof +L1 -> Truncate Ghost File pinaagi sa : > /proc/PID/fd/FD"]
GhostCheck -->|"Dili: Ang Tinuod nga mga File Nagpuno sa Disk"| EmergencySpace["Paghimo Diha-diha nga Lugar sa Pagginhawa (1 GB hangtod 5 GB)"]
EmergencySpace --> Ext4Check{"Ang Filesystem ext4 / ext3 ba?"}
Ext4Check -->|"Oo"| Tune2fs["Pagdalagan: sudo tune2fs -m 1 /dev/root_dev (Gipagawas dayon ang 4% sa Disk alang sa Non-Root DB User)"]
Ext4Check -->|"Dili (XFS / Btrfs / ZFS)"| TruncLogs["Pagputol sa mga Log In-Place (: > /var/log/syslog) ug Run journalctl --vacuum-size=50M"]
InodeFull --> InodeClean["Pangitaa ang Direktoryo nga adunay Minilyon nga mga File Gamit ang find / -xdev -printf '%h\n' | matang | uniq -c | matang -k 1 -r | ulo -20 -> Pagtangtang gamit ang pagpangita -pagtangtang"]
UnlinkedFD --> DBRecover["Padayon sa Database Engine WAL & B-Tree Recovery"]
Tune2fs --> DBRecover
TruncLogs --> DBRecover
InodeClean --> DBRecover
RamOrQuota --> DBRecover
DBRecover --> WhichDB{"Unsang Database Engine ang Na-crash?"}
WhichDB -->|"PostgreSQL"| PGFlow["Ipadayon ang pg_wal Intact -> Start Postgres to Replay WAL -> Run CHECKPOINT; -> Ihulog ang Stale Replication Slots"]
WhichDB -->|"MySQL / MariaDB (InnoDB)"| MyFlow["Ipadayon ang ib_logfile* Intact -> Start mysqld -> Purge Binary Logs pinaagi sa PURGE BINARY LOGS -> Optimize Tables"]
WhichDB -->|"SQLite3"| SqFlow["I-back Up .db + .db-wal + .db-shm -> Run PRAGMA wal_checkpoint(TRUNCATE) o sqlite3 broken.db '.recover'"]
Phase 1: Nganong standard commands (rm, apt, tab-completion) napakyas sa 0 bytes nga libre¶
Kung ang partisyon sa Linux naigo sa 100 porsyento nga block o kakapoy sa inode, ang mga standard remediation commands mapakyas sa wala damha nga mga paagi:
- Pagpindot Tab sa bash paglabay cannot create temp file for here-document: No space left on device: Moderno bash-completion Ang mga script naghimo og temporaryo nga mga file sa /tmp. Kung /tmp nagpuyo sa gamut / partisyon imbes nga a tmpfs RAM mount, pagkompleto sa kabhang ug heredocs (<<EOF) mapakyas. Ayuha dayon kini pinaagi sa pagtudlo TMPDIR sa shared memory RAM:
apt-get autoremove o dpkg --configure -a napakyas sa No space left on device: Kanus-a /boot o / 100 porsyento nga puno, apt dili makatangtang sa daan nga mga kernel tungod kay dpkg kinahanglan una nga isulat ang mga update sa status sa /var/lib/dpkg/updates/. Hinuon, dagan sudo apt-get clean (nga nag-unlink sa naka-cache .deb mga archive sa /var/cache/apt/archives/ direkta), o putla ang usa ka wala magamit nga imahe sa kernel /boot (sudo sh -c ': > /boot/initrd.img-<old-unused-version>') sa paghatag dpkg ang 50 megabytes (52.4 million bytes) nga gikinahanglan niini sa pagdagan sudo dpkg --purge linux-image-<old-unused-version>.
- rm /path/to/dir/* napakyas sa Argument list too long: Kanus-a df -i anaa sa 100 porsyento tungod kay ang usa ka direktoryo sama sa /var/lib/php/sessions adunay minilyon nga gagmay nga mga file, wildcard globbing (*) nag-awas sa kernel ARG_MAX buffer (2 megabytes) kaniadto rm nagsugod. Paggamit find uban sa -delete hinuon:
Ang 5 ka lahi nga hinungdan sa No space left on device (ENOSPC)¶
Sa dili pa mohikap sa bisan unsang mga file sa database, itandi kining lima ka mga senaryo aron makumpirma kung unsa nga kapanguhaan ang tinuod nga nahurot:
| Diagnostic Command | Naobserbahan ang Sintomas | Root Hinungdan | Diha-diha nga 10-ikaduha nga Pag-ayo |
|---|---|---|---|
df -h vs sudo du -shx / |
df -h nagpakita 100% gigamit (0 Avail), apan du -shx / nagadugang lamang 60% sa gidak-on sa disk. |
Open Unlinked Files ("Ghost Files"): Adunay midagan rm sa usa ka dako nga log o temp file samtang usa ka proseso (nginx, java, postgres, docker) gibuksan pa kini. |
Dagan sudo lsof +L1, pangitaa ang PID ug FD sa (deleted) file, ug run sudo sh -c ': > /proc/<PID>/fd/<FD>'. |
df -h nagpakita 95% gigamit, 0 Avail |
Used + Avail dili managsama Size; root makasulat ug mga file, apan postgres o mysql nakuha ENOSPC. |
ext4 Gireserba nga Root Blocks (5% default): ext4 gipugngan ang 5 porsyento sa mga bloke gikan sa dili mga tiggamit nga gamut (UID > 0) aron malikayan ang mga root lockout ug pagkabahin. |
Dagan sudo tune2fs -m 1 /dev/<partition> nga ihulog ang reserba gikan sa 5 porsyento ngadto sa 1 porsyento diha-diha dayon online. |
df -i |
df -h nagpakita gigabytes sa libre nga luna, apan df -i nagpakita IUse% = 100% (IFree = 0). |
Inode Exhaustion: ext4 adunay usa ka piho nga gidaghanon sa mga inode nga gihimo sa mkfs panahon; minilyon ka gagmay nga mga file ang mikonsumo sa matag inode slot. |
Pangitaa ang culprit folder (sudo find / -xdev -printf '%h\n' \ | matang \ | uniq -c \ | matang -k 1 -r \ | ulo - 10) and run sudo pangitaa /culprit/dir -type f -delete. |
sudo mount \ | grep /path |
du -sh /var/log gamay pa, / adunay 40 gigabytes nga nawala nga luna. |
Natago nga mga File Ubos sa usa ka Punto sa Bukid: Usa ka proseso ang misulat ug 40 ka gigabytes /mnt/backup samtang ang eksternal nga drive wala ma-mount, ug sa ulahi adunay usa nga nag-mount sa usa ka disk * sa ibabaw * sa /mnt/backup, pagtago sa mga nagpahiping mga file gikan sa du. |
Ibugkos-mount ang gamut filesystem sa usa ka temporaryo nga pagtan-aw (sudo mkdir /dev/shm/rootview && sudo mount --bind / /dev/shm/rootview), susiha du -sh /dev/shm/rootview/mnt/*, ug kuhaa ang mga tinago nga mga file. |
btrfs filesystem df / |
df -h nagpakita sa 20 gigabytes nga libre sa a Btrfs gidaghanon, apan ang pagsulat napakyas sa ENOSPC. |
Btrfs Metadata Chunk Exhaustion: Btrfs naggahin og luna ngadto sa bulag nga Data ug Metadata chunks; kung ang tanan nga wala gigahin nga hilaw nga wanang ma-lock sa mga tipik nga Data chunks, Metadata chunks moigo sa 100 porsyento. |
Temporaryo nga pagdugang og 2 gigabyte nga RAM file loop device (dd if=/dev/zero of=/dev/shm/btrfs_ram bs=1M count=2048 && sudo btrfs device add -f /dev/shm/btrfs_ram /), dagan sudo btrfs balance start -dusage=10 /, unya sudo btrfs device remove /dev/shm/btrfs_ram /. |
Phase 2: Pagbawi sa disk space nga luwas sa ubos sa 60 segundos¶
Sunda kining eksakto nga mga lakang aron mabawi ang taliwala sa 500 megabytes ug 50 gigabytes (0.53 bilyon hangtod 53.6 bilyon nga byte) sa wanang nga dili makadaot sa mga aktibo nga proseso:
Lakang 1: Pagputol sa bukas nga natangtang ("ghost") nga mga file pinaagi sa /proc/<pid>/fd/¶
Kung ikaw o ang usa ka automated logrotate nga script natangtang na ang dagkong mga file apan wala mabalik ang espasyo sa disk, susiha ang wala masumpay nga open file table sa kernel:
Tan-awa angSIZE/OFF kolum (gisukod sa bytes). Kung makakita kag entry sama sa:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NLINK NODE NAME
mysqld 1942 mysql 6u REG 259,1 34896609280 0 918273 /tmp/ibXz91aB (deleted)
rsyslogd 612 syslog 7w REG 259,1 18253611008 0 131092 /var/log/syslog.1 (deleted)
rsyslogd (PID 612, file descriptor 7w -> 7) naggunit ug 18.2 gigabyte nga natangtang nga log file nga bukas. ayaw kill -9 mga proseso sa database (mysqld o postgres) nga libre /tmp mga file kung mahimo nimo nga mabakante una ang lugar sa ubang lugar. Hinuon, i-zero ang log file descriptor (PID 612, FD 7) direkta sa kernel memory:
Dagan df -h diha-diha dayon: ang tanan nga 18.2 gigabytes gibuhian sa lugar nga wala mag-restart sa usa ka serbisyo.
Lakang 2: I-reclaim ext4 gitagana nga mga bloke online uban sa tune2fs¶
Sa bisan unsa ext4 o ext3 filesystem, susiha ang kasamtangang gireserba nga block count:
postgres), MySQL (mysql), Redis (redis), ug SQLite web apps (www-data, node) modagan ingon nga walay pribilehiyo nga dili gamut nga tiggamit, ang Linux kernel nagpugong kanila sa paggamit sa katapusang 5 porsyento sa disk. Pagpaubos sa gitagana block ratio gikan sa 5% sa 1% (o 0% sa panahon sa usa ka aktibo nga emerhensya) mo-epekto dayon sa usa ka live mount filesystem:
Sa usa ka 1 terabyte (1,000 ka gigabyte) nga gidaghanon sa database, kining usa ka command naghatag dayon og 40 gigabytes (42.9 bilyon nga bytes) nga masulat nga luna ngadto sa imong database engine aron kini makahuman sa WAL checkpoint niini. Kung masulbad na ang krisis ug malimpyohan ang daan nga datos, ibalik ang reserba sa 2% o 5% (sudo tune2fs -m 2 /dev/nvme0n1p1).
Lakang 3: Putol ang aktibo nga mga log sa teksto sa lugar ug i-vacuum journald¶
Pangitaa ang pinakadako nga mga file sa root filesystem (nagpabilin sa parehas nga filesystem nga adunay -xdev aron dili ka mag-usik ug oras sa pag-scan /proc o eksternal nga mga mount):
/var/log/nginx/access.log, /var/log/syslog, /var/log/postgresql/*.log, Docker *-json.log):
Ayaw gayud pagdagan rm sa usa ka aktibo nga log file. Putol kini ngadto sa zero bytes sa lugar aron ang deskriptor sa file sa daemon magpabilin nga balido ug limpyo nga ma-reset ang mga pointer:
sudo truncate -s 0 /var/log/nginx/error.log
sudo truncate -s 0 /var/lib/docker/containers/*/*-json.log
systemd-journald binary logs (/var/log/journal/)**:
Phase 3: Pagbawi sa PostgreSQL human sa 100% nga disk-full crash (pg_wal bloat)¶
Kung ang usa ka PostgreSQL server nahutdan sa disk space, kini nag-log PANIC: could not write to file "pg_wal/xlogtemp.1234": No space left on device, gi-abort dayon ang mga proseso sa bata sa postmaster, ug nagdumili sa pagsugod.
Ngano pg_wal (pg_xlog sa PostgreSQL 9.6 ug mas tigulang) nagpuno sa tibuok disk¶
Sa normal nga operasyon, gisulat sa PostgreSQL ang matag pagbag-o sa 16 megabyte (16.7 milyon nga byte) nga mga file sa bahin sa sulod. $PGDATA/pg_wal/ ug i-recycle kini human sa matag usa CHECKPOINT sa higayon nga ang milapas max_wal_size. Bisan pa, ang PostgreSQL gidili sa pagtangtang o pag-recycle sa daan pg_wal file ubos sa tulo ka kondisyon:
1. Usa ka ilo o nalangan nga Pisikal/Lohikal nga Replikasyon Slot: Usa ka replica server (standby), Debezium/Kafka connector, o pg_receivewal ang kliyente nadiskonekta mga adlaw na ang milabay, apan ang replication slot niini (pg_replication_slots) mao gihapon active = false sa panguna, nagmando sa PostgreSQL nga ipadayon ang matag bahin sa WAL nga nahimo sukad sa pagkadiskonekta.
2. ** Usa ka kapakyasan archive_command**: archive_mode = on gi-enable sa postgresql.conf, ug ang backup nga script (pgBackRest, WAL-G, Barman, o aws s3 cp) mao ang pagbalik sa usa ka non-zero exit code (pananglitan, usa ka expired nga S3 key o dili maabot nga backup host). Gitago sa PostgreSQL ang matag wala na-archive nga bahin sa WAL pg_wal/ hangtod archive_command mibalik 0.
3. Usa ka bug-os nga disk nga deadlock: pg_wal mitubo hangtod 0 bytes nagpabilin sa /var/lib/postgresql, ug karon ang PostgreSQL dili gani makasugod sa paghulog sa replication slot o pagkompleto sa usa ka checkpoint tungod kay ang startup recovery mismo nagkinahanglan ug pipila ka megabytes nga libre nga disk space aron masulat ang temporaryo nga state files.
Step-by-step nga PostgreSQL zero-space rescue (Zero Data Loss)¶
- Paghimo 1 gigabyte hangtod 5 gigabytes (1.07 bilyon hangtod 5.36 bilyon nga byte) nga temporaryo nga wanang sa gawas
pg_wal/: - Unang paggamit
sudo tune2fs -m 0 /dev/<partition>ug truncate system/PostgreSQL text logs (sudo truncate -s 0 /var/lib/postgresql/*/main/log/*.logo/var/log/postgresql/*.log). - ** Unsa kaha kung ang database adunay kaugalingon nga gipahinungod nga partisyon nga adunay mga zero text log ug XFS (so
tune2fsdili magamit)?** Ibalhin ang 10 ngadto sa 20 sa labing karaan.readyo dili aktibo nga mga file gikan sa dili-WAL nga direktoryo, o ibalhin angpg_waltemporaryo nga direktoryo sa lain nga partisyon nga adunay libre nga wanang gamit ang simbolikong link:# ONLY while PostgreSQL is completely stopped (verify with: ps aux | grep postgres) sudo mkdir -p /mnt/extra_space/pg_wal_rescue sudo chown -R postgres:postgres /mnt/extra_space/pg_wal_rescue sudo mv /var/lib/postgresql/16/main/pg_wal/* /mnt/extra_space/pg_wal_rescue/ sudo rmdir /var/lib/postgresql/16/main/pg_wal sudo ln -s /mnt/extra_space/pg_wal_rescue /var/lib/postgresql/16/main/pg_wal sudo chown -h postgres:postgres /var/lib/postgresql/16/main/pg_wal - ** Kung
archive_commandnapakyas ug gibabagan ang pag-recycle sa WAL, temporaryo nga laktawan kinipostgresql.conf**: Kung ang imong S3/backup nga target ubos ugpg_wal/archive_status/naglangkob sa liboan sa.readyfile, editpostgresql.conf(archive_command = '/bin/true') ingon lang usa ka last-resort nga lakang sa emerhensya aron mapahunong ang pagkapatay sa disk, kay nahibal-an nga kinahanglan ka magkuha og bag-opg_basebackupdiha-diha dayon human sa pagkaayo tungod kay ang WAL archive chain adunay gintang. - Sugdi ang PostgreSQL ug susiha dayon ang mga slot sa replikasyon:
Pagsugod sa PostgreSQL (
sudo systemctl start postgresql) ug magkonektar pinaagi sasudo -u postgres psql: - Ihulog ang bisan unsang patay/dili aktibo nga slot sa replikasyon nga nagtago sa gigabytes sa WAL:
Kung makakita ka og dili aktibo nga slot (
active = f) nga nagkupot ug 80 gigabytes saretained_wal: - ** Pagpugos dayon
CHECKPOINTsa pag-recycle sa nabuakpg_walmga bahin**: Ang higayonCHECKPOINT;mahuman human ihulog ang patay nga slot, ang PostgreSQL awtomatik nga mag-unlink o mag-recycle sa mga gigabyte sa daan nga 16 megabyte nga mga file nga bahin sapg_wal/, ibalik ang imong paggamit sa disk sa normal. - Pugngi ang umaabot nga replication slot disk death: Set
max_slot_wal_keep_sizesapostgresql.conf(anaa sa PostgreSQL 13+) sa usa ka luwas nga cap (sama samax_slot_wal_keep_size = 20GB) mao nga gi-invalidate sa PostgreSQL ang slot sa patay nga kopya kay sa pag-crash sa nag-unang database sa 0 bytes nga libre.
Phase 4: Pagbawi sa MySQL / MariaDB (InnoDB) sa 0 bytes nga libre¶
Kung ang MySQL o MariaDB naigo 100% paggamit sa disk (/var/lib/mysql), Ang InnoDB stalls tanan nagsulat o nag-crash sa [ERROR] [MY-012640] [InnoDB] Error number 28 means 'No space left on device'.
Pag-ila kung unsa ang napuno /var/lib/mysql¶
Dagan sudo du -sh /var/lib/mysql/* | sort -hr | head -n 15 aron makita kung kinsa niining upat ka mga sad-an ang mikonsumo sa disk:
1. ** Walay kinutuban nga Binary Logs (binlog.000001, mysql-bin.000042): Pinaagi sa default sa MySQL 8.0+, ang binary logging gipagana nga adunay 30 ka adlaw nga pagpabilin (binlog_expire_logs_seconds = 2592000), nga daling makamugna og gatusan ka gigabytes sa row nga mga panghitabo atol sa dinaghan nga pag-import.
2. Usa ka runaway nga pangutana nga nagsulat sa higanteng temporaryo nga mga lamesa (#sql* o ibtmp1): Usa ka dako GROUP BY o ORDER BY napuno ang pangutana ibtmp1 o /tmp/#sql_* hangtod ang disk naigo sa 0 bytes.
3. ** Monolithic ibdata1 system tablespace bloat: Kung innodb_file_per_table na-disable o ang dugay nang mga transaksyon nakapugong sa listahan sa kasaysayan sa InnoDB (undo logs inside ibdata1 o undo_001) gikan sa pagpurga.
4. Ang MySQL hinay nga query log o error log (/var/log/mysql/mysql-slow.log).
Step-by-step nga MySQL / MariaDB zero-space rescue¶
- ** AYAW pag delete
ibdata1,ib_logfile0,ib_logfile1,#innodb_redo/*, oundo_001uban sarm**: Ang pagtangtang sa bisan hain niini nga mga file makahimo sa matag.ibdtable file sa imong database dili mabasa. - Libre nga pasiunang luna sa pagsugod (500 megabytes ngadto sa 2 gigabytes):
- Pagputol
/var/log/mysql/error.logugmysql-slow.logpinaagi sasudo truncate -s 0 /var/log/mysql/*.log. - Sa
ext4, dagansudo tune2fs -m 1 /dev/<partition>. - Kung
mysqldgihunong karon ug/var/lib/mysql/ibtmp1(ang non-compressed temporary tablespace tablespace) dako kaayo,ibtmp1awtomatik nga gimugna pag-usab sa pagsugod, o mahimo nimong ibalhin ang labing karaan nga duha o tulo binary logs (binlog.000001,binlog.000002- dili ang pinakataas nga numero nga aktibo nga binlog) sa/dev/shmtemporaryo ngamysqldmaka-boot. - ** Sugdi ang MySQL ug limpyohan ang binary log nga luwas gamit ang SQL (
PURGE BINARY LOGS)**: Ngano nga kinahanglan nimo gamiton ang SQL imbes ngarm /var/lib/mysql/binlog.*? Tungod kay ang MySQL nagsubay sa matag binary log filename sabinlog.index. Kung imong tangtangon ang binary log nga adunayrmwalay updatebinlog.index, MySQL modumili sa pagsugod o replikasyon maguba. Kausamysqldmagsugod, log in (sudo mysql) ug run: (O limpyohan ang tanan hangtod sa karon nga aktibo nga log file nga gipakita sa ilawom saSHOW BINARY LOGS;naggamitPURGE BINARY LOGS TO 'binlog.000085';) - Pagbutang ug permanenteng binary log size ug retention cap in
/etc/mysql/mysql.conf.d/mysqld.cnf:Pagtabon[mysqld] binlog_expire_logs_seconds = 259200 # Keep only 3 days (259,200 seconds) max_binlog_size = 256M innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:5Gibtmp1samax:5Gnagsiguro nga ang usa ka rogue dili ma-indexJOINoORDER BYnapakyas ang pangutana sa atable is fullsayop kay sa pagpalapadibtmp1hangtod ang tibuok server sa Linux mamatay sa 0 bytes nga libre.
Phase 5: Pagbawi sa usa ka dunot nga SQLite3 database (database or disk is full / SQLITE_FULL / malformed)¶
Gi-embed nga mga aplikasyon, mga sudlanan sa Docker (Nextcloud, Vaultwarden, Home Assistant, Plex, Grafana, Gitea), ug ang mga serbisyo sa mobile/desktop nagsalig sa SQLite3. Kung ang usa ka disk naigo sa 0 bytes nga libre samtang ang SQLite naa sa tunga sa usa ka rollback sa journal o usa ka Write-Ahead Log (-wal) checkpoint, makasugat kag usa sa duha ka emerhensya:
1. Daghan .db-wal file bloat (ang .db-wal file mitubo ngadto sa 10 gigabytes samtang ang .db Ang file 200 megabytes lamang, tungod kay ang dugay nang mga magbabasa nagpugong sa usa ka passive WAL checkpoint, ug karon ang disk 100 porsyento nga puno).
2. RuntimeError: database disk image is malformed (SQLITE_CORRUPT) tungod sa guba nga hardware fsync(), usa ka sudlanan nga nakapatay sa tunga-tunga sa rollback sa 0 bytes nga libre, o adunay nagtangtang sa -wal o -journal file pinaagi sa kamot.
Warning
Ayaw gayud ibalhin, ilisan ang ngalan, o kopyaha a .db file sa iyang kaugalingon samtang gibiyaan ang .db-wal (Write-Ahead Log) o .db-journal (Rollback Journal) file sa luyo: Kung app.db-wal o app.db-journal anaa kauban app.db, kana nga kauban nga file adunay mga nahimo nga mga transaksyon ug orihinal nga mga panid sa B-tree nga kinahanglan buhaton app.db structurally consistent. Kanunay kopyaha ang tanan nga tulo ka mga file (app.db, app.db-wal, app.db-shm) dungan sa dili pa magpadagan sa bisan unsang sugo.
Lakang 1: Pagkunhod sa usa ka bloated .db-wal file ug pag-vacuum sa SQLite kung ang espasyo sa disk hapit sa zero¶
- Hunonga ang sudlanan sa aplikasyon o serbisyo nga nagkupot sa database sa SQLite nga bukas (
sudo systemctl stop appodocker stop container_name). - Kopyaha
app.db,app.db-wal, ugapp.db-shmsa partition o external drive nga adunay daghang libre nga wanang (o libre nga 2x ang gidak-on saapp.dbsa lokal nga disk una). - Ablihi ang database gamit ang
sqlite3CLI ug pugson ang pagputol sa WAL checkpoint, nga mopilo sa tanang nahimo nga mga frame gikan saapp.db-walngadto saapp.dbug mokunhodapp.db-walngadto sa 0 bytes: - I-verify ang B-tree ug freelist nga integridad sa istruktura:
Kung kini nag-imprinta
ok, ang imong database 100 porsyento nga himsog. - **Unsaon
VACUUMusa ka dako nga database sa SQLite kung ang lokal nga disk wala’y igo nga libre nga wanang **: EstandardVACUUM;nanginahanglan hangtod 2x ang gidak-on sa database sa libre nga espasyo sa disk sa parehas nga partisyon ug/var/tmp. Hinunoa, gamitaVACUUM INTO(gipaila sa SQLite 3.27.0) aron magsulat og bag-ong gi-compact, defragmented nga kopya direkta sa usa ka bulag nga gitaod nga disk o bahin sa network:
Lakang 2: Pagluwas sa usa ka dunot nga B-tree (database disk image is malformed) uban sa .recover¶
Kung PRAGMA integrity_check; mga taho row 412 missing from index, btreeInitPage() returns error code 11, o database disk image is malformed:
- Una nga pagsulay sa pagtukod pag-usab sa guba nga mga sekondaryang indeks (
REINDEX): Kasagaran ang aktwal nga datos sa lamesa (table B-trees) 100 porsyento nga wala'y labot ug usa lamang ka ikaduha nga indeks nga B-tree ang nadaot sa dihang napuno ang disk. Dagan:Kungsqlite3 /mnt/external_usb/copy_of_app.db "REINDEX;" sqlite3 /mnt/external_usb/copy_of_app.db "PRAGMA integrity_check;"PRAGMA integrity_check;karon mibalikok, nabawi nimo ang 100 porsyento sa imong database nga adunay zero nawala nga mga laray. - ** Kung
REINDEXnapakyas, padagana ang forensic B-tree scanner (.recover)**: Dili sama sa mas tigulang.dumpcommand (nga mohunong sa pag-eksport sa usa ka lamesa sa higayon nga kini makaigo sa usa ka dunot nga B-tree pointer),.recover(gitukod sasqlite3version 3.29.0+) mo-bypass sa dunot nga interior nga B-tree pointer sa hingpit, mo-scan sa matag hilaw nga 4 kilobyte nga dahon nga panid sa file nga sunud-sunod gikan sa byte 0 ngadto sa EOF, magtukod pag-usab sa matag mabasa nga row, ug ibutang ang bisan unsang nailo nga mga rekord ngadto sa usa kalost_and_foundlamesa: - I-verify ang bag-ong gitukod pag-usab nga database:
Susiha kon a
lost_and_foundgihimo ang lamesa (sqlite3 /mnt/external_usb/repaired_app.db ".tables") sa pagsusi sa bisan unsang mga ilo nga mga laray nga nakuha gikan sa wala masumpay nga mga panid sa dahon. Para sa mga naka-encrypt nga database sa SQLCipher (sama sa mga backup sa Signal o WhatsApp), tan-awa ang among gipahinungod nga giya sa naka-encrypt nga SQLite, Signal, ug WhatsApp chat backup corruption ug local key extraction.
Phase 6: Emergency "Tripwire Ballast File" ug pagmonitor sa checklist sa paglikay¶
Kung ang imong server ug database nakabalik na sa online, ipatuman dayon kining upat ka mga panalipod aron dili ka na ma-trap sa 0 bytes nga libre pag-usab:
- Paghimo og 1 gigabyte (
1,073,741,824byte) Emergency Ballast File sa matag database partition: Runsudo fallocate -l 1G /var/lib/EMERGENCY_DELETE_ME.ballast. Kung naigo ang server100%puno ang disk, nagdagansudo rm /var/lib/EMERGENCY_DELETE_ME.ballastnagpagawas sa 1 gigabyte sa magkadugtong nga mga bloke sa 1 millisecond. - Kap
systemd-journaldug Permanente nga mga log sa sudlanan sa Docker: ItakdaSystemMaxUse=200Msa/etc/systemd/journald.confug i-configure/etc/docker/daemon.jsonuban sa"log-opts": {"max-size": "20m", "max-file": "3"}. - Ilain
/var/log,/tmp, ug/var/lib/postgresqlngadto sa bulag nga LVM volume: Pagtipig/var/logug/tmpAng bulag sa mga volume sa database nagsiguro nga ang usa ka runaway nga web log dili maka-crash sa database o maka-lock sa mga login sa SSH. - Alerto sa DUHA
df -h(> 80%) UGdf -i(> 80%) dugangpg_replication_slotslag: I-configure ang pagmonitor (node_filesystem_avail_bytesugnode_filesystem_files_free) nga alerto sa dili pa molapas sa 85 porsyento ang paggamit.
Mga numero sa emerhensya sa rehiyon ug mga protocol sa ahensya¶
Samtang ang usa ka bug-os nga disk sa server kasagaran usa ka internal nga operasyon sa IT nga emerhensya, usa ka outage nga nakaapekto sa healthcare Electronic Health Record (EHR) databases, emergency nga pagpadala (CAD), municipal water/power telemetry, o statutory personal data availability mahimong magkinahanglan og pormal nga emergency escalation:
- Estados Unidos ug Canada: Dial
911kung ang pagkahagsa sa server nagpugong sa klinikal nga pagmonitor o pagpadala, ug gi-aktibo ang mga pamaagi sa downtime. I-report ang kritikal nga imprastraktura nga resource-exhaustion o ransomware attacks sa CISA (1-844-Say-CISA/cisa.gov/report) o ang Canadian Center for Cyber Security (1-833-CYBER-88). - United Kingdom: Dial
999alang sa mga hulga sa kinabuhi o kritikal nga mga sistema sa NHS. Ubos sa UK GDPR ug NIS Regulations, susiha kung ang permanente nga pagkawala sa pagkaanaa sa database nanginahanglan pagpahibalo sa ICO (0303 123 1113) sulod sa 72 ka oras. - European Union: Dial
112sa tanan nga estado nga miyembro sa EU. Kinahanglang ipahibalo sa mga importanteng entidad ubos sa NIS2 Directive ang ilang nasudnong CSIRT sulod sa 24 ka oras sa usa ka mahinungdanong outage, ug ang permanente nga pagkawala sa personal nga data nga walay backup recovery magpahinabog GDPR Article 33 nga pagtaho sulod sa 72 ka oras. - Australia ug New Zealand: Dial
000sa Australia o111sa New Zealand; kontaka ang ACSC (1300 CYBER1) para sa mga insidente sa imprastraktura. - India ug Asia-Pacific: Dial
112alang sa emerhensya nga tubag; i-report ang cyber-induced outages ngadto sa CERT-In (incident@cert-in.org.in) sulod sa mandatory 6-hour window.
Kanunay nga gipangutana nga mga pangutana¶
Ngano ni df -h magpabilin sa 100% (0 Avail) bisan human nako gitangtang ang usa ka 50 GB nga log file nga adunay rm?¶
Sa Linux filesystems, rm mga tawag lang unlink(), pagtangtang sa filename gikan sa direktoryo samtang ang kernel nagpugong sa mga bloke sa disk nga gigahin hangtod nga ang matag proseso nga nagbukas sa file magsira sa file descriptor niini (i_count == 0). Dagan sudo lsof +L1 para pangitaon ang Process ID (PID) ug File Descriptor (FD) sa (gitangtang) file, dayon run sudo sh -c ': > /proc/PID/fd/FD' sa pag-zero sa mga bloke diha-diha dayon nga dili i-restart ang serbisyo.
Unsa kaha kung dili ko ma-SSH sa server tungod kay /tmp o /var/run 100% puno ug sshd nagdumili sa paggahin ug sesyon?¶
Sulayi una ang pagpatuman sa usa ka dili-PTY nga direkta nga mando sa SSH nga wala mag-alokar sa usa ka interactive nga pseudo-terminal: ssh -T gamut @ server "sh -c ': > /var/log/syslog'". Kung gamut gi-disable ang pag-login, gamita ang out-of-band serial console sa imong cloud provider (AWS EC2 Serial Console, DigitalOcean Console, Linode Lish, o Proxmox/VMware VNC) aron maka-log in direkta sa ttyS0 o boot ngadto sa single-user recovery mode.
Adunay usa nga nagtangtang sa mga file sa sulod sa PostgreSQL's pg_wal direktoryo sa wala pa basahon kini nga giya, ug karon PostgreSQL nagdumili sa pagsugod sa PANIC: could not locate a valid checkpoint record. Nawala ba ang tanan nga datos?¶
Dili, kadaghanan sa mga laray sa lamesa anaa gihapon sa sulod $PGDATA/base/, bisan tuod ang mga transaksyon sa in-flight sulod sa mga natangtang nga WAL files nawala ug ang pipila ka mga panid mahimong magisi. Paghimo una og kompletong kopya sa tibuok $PGDATA direktoryo (cp -a /var/lib/postgresql/16/main /mnt/backup/pgdata_raw). Unya dagan sudo -u postgres /usr/lib/postgresql/16/bin/pg_resetwal -f /var/lib/postgresql/16/main, sugdi ang PostgreSQL sa single-user mode, ug pagdagan dayon pg_dumpall ngadto sa bag-ong gisugdan (initdb) cluster; ayaw ipadayon ang pagpadagan sa trapiko sa produksiyon sa usa ka cluster pagkahuman pg_resetwal.
Unsaon nako pagtangtang ang minilyon nga gagmay nga mga file kung rm -rf nagbitay o napakyas sa usa ka inode-ubos (df -i 100%) server?¶
Kung ang usa ka direktoryo adunay minilyon nga gagmay nga sesyon o mga file sa cache, ang indeks sa direktoryo niini (htree) motubo nga dako, hinungdan ls ug rm -rf aron mahunong ang pag-sort sa mga filename sa RAM. Hinuon, dagan sudo pagpangita /path/to/million_files -mindepth 1 -delete, o paghimo og walay sulod nga direktoryo sa RAM (mkdir /dev/shm/walay sulod) ug dagan sudo rsync -a --delete /dev/shm/empty/ /path/to/million_files/ aron ma-unlink dayon ang mga inode.
Ngano nga gipuno ni Docker ang akong tibuuk nga disk sa server kung gamay ra ang akong mga sudlanan, ug giunsa nako paglimpyo /var/lib/docker luwas?¶
Ang Docker nagtigum sa wanang sa disk sa wala gipunting nga JSON stdout logs (/var/lib/docker/containers/*/*-json.log), nagbitay sapaw2 mga layer sa imahe, ug buildkit cache. Dili man sa manual rm -rf mga folder sa sulod /var/lib/docker/overlay2/. Una putlon ang mga log sa JSON (sudo truncate -s 0 /var/lib/docker/containers/*/*-json.log) mao nga ang daemon adunay lawak sa pagginhawa, unya dagan sudo docker system prune -a -f (wala --mga tomo busa ang mga volume sa database nagpabilin nga wala matandog).
Mahimo ba nako nga mapalapad ang usa ka panganod nga EBS / padayon nga gidaghanon sa disk nga live samtang ang server naa sa 100% nga paggamit sa disk?¶
Oo, ang pagpalapad sa volume sa online molihok nga wala mag-reboot, nga adunay usa ka kuha: ang script sa katabang growpart /dev/nvme0n1 1 naningkamot sa paghimo sa usa ka temporaryo nga file sa /tmp naggamit mktemp ug napakyas sa 0 bytes nga libre. Likayi kana nga kapakyasan pinaagi sa pagdagan sudo TMPDIR=/dev/shm growpart/dev/nvme0n1 1 (gamit ang gipaluyohan sa RAM /dev/shm bukid) gisundan sa sudo resize2fs /dev/nvme0n1p1 (ext4) o sudo xfs_growfs / (XFS).
May kalabotan nga mga giya¶
- Aksidente nga
rm -rfoShift+Deletesa Linux, macOS, o Windows: diha-diha nga read-only remount - Naka-encrypt nga SQLite, Signal, ug WhatsApp chat backup corruption ug local key extraction
- Nadaot nga Pulong, Excel, PDF, ug database file ug wala maluwas nga dokumento pagbawi
- SSD ug NVMe kalit nga read-only mode, 0% ekstrang blocks, ug TRIM disable rescue
- Ang krisis sa pag-host sa web, paglalin, ug pagpahiuli sa backup
- Mga numero sa emerhensya sa nasud
Mga tinubdan ug opisyal nga giya¶
- PostgreSQL Global Development Group: PostgreSQL 16 Opisyal nga Dokumentasyon - Kapitulo 30: Kasaligan ug ang Write-Ahead Log (WAL Configuration, Replication Slots, ug Recovery From Disk Full Failures).
- SQLite Consortium (
sqlite.org): Unsaon Pagdaot sa SQLite Database File (File Locking, Unlinked Journal/WAL Files, ug ang.recoverCLI Extension). - Oracle Corporation / MySQL Documentation & MariaDB Foundation: InnoDB Crash Recovery, Binary Log Purge Procedures (
PURGE BINARY LOGS), ug Temporary Tablespace (ibtmp1) Pagdumala. - Ang Linux Kernel Organization (
kernel.org): Ext4 Filesystem Administration (tune2fsGireserba nga mga Block, Inode Tables, ug/proc/<pid>/fd/File Descriptor Truncation). - National Institute of Standards and Technology (
NIST) (Estados Unidos): Espesyal nga Publikasyon 800-123: Giya sa General Server Security ug Availability Management.