Skip to content

Disk Server 100% Penuh (0 Byte Gratis): Ngawaliang Basis Data Sane Rusak Rikala rm miwah apt Gagal santukan kirangnyane inode/ruang

Nomor darurat matiosan manut panegara. Laman puniki nganggen 911, nomor sane kaanggen ring Amerika Serikat lan Kanada. Akeh panegara sane lianan nganggen 112, 999, utawi angka sane lianan. Rereh nomor negara Sametoné.

Manggihin indik server Linux produksi sampun keni 100% kawigunan disk (0 bytes free) utawi 100% kawigunan inode (df -i) ritatkala ngamargiang basis data PostgreSQL, MySQL/InnoDB, MariaDB, utawi SQLite sane aktif inggih punika silih sinunggil mode kegagalan sane pinih mabaya ring administrasi sistem. Ring nol byte utawi nol inode bebas, krisis punika gelis mamargi: kernel sistem operasi nenten malih prasida ngaryanin soket domain Unix ring /tmp utawi /var/run, bash gagal tab-lengkap santukan nenten prasida nyurat pipa cangkang sementara, apt utawi dnf nénten prasida mamargi anggén ngresikin paket santukan manajer paket merluang file kunci sementara, lan mesin basis data Sametoné ngadat ring tengahing Log Write-Ahead (WAL) pos pemeriksaan utawi nolak mati bersih santukan nenten prasida ngalokasiang blok 4 kilobyte (0,004 megabyte) tunggal antuk . .pid utawi ngunci berkas. Sane pinih kaon, administrator sane panik sering mamargi rm -rf /var/log/*.log ring file log multi-gigabyte lan nonton antuk rasa jejeh sakadi df -h kantun nglaporang 100% Use% (0 Avail), utawi ipun ngicalang pg_wal (pg_xlog) utawi ib_logfile0 mangda bebas genah, permanen ngrusak basis data sane nglintangin pemulihan transaksi. Yéning Sameton nénten sengaja ngicalang berkas basis data sané mabuat ritatkala jagi ngresikin, digelis mararian lan ngalih ka rm -rf sané nénten kasengaja utawi Shift-Icalang pasang malih sané wantah kawacén miwah ukiran inode; yéning piranti keras penyimpanan dasar Sametoné ngamedalang kaiwangan I/O utawi sampun ngunci raga nglawan nulis, konsultasiang SSD lan NVMe mode wantah kawacen nadak lan TRIM ngaonang penyelamatan utawi pemulihan berkas Word, Excel, PDF, miwah basis data sané rusak. Yéning matilar puniki ngranayang sistem keselamatan hidup rumah sakit, pengiriman darurat, utawi utilitas umum sané mabuat, hubungi nomer darurat lokal Sametoné (911 ring Amerika Serikat miwah Kanada, 112 ring sajebag Uni Eropa, 999 ring Inggris) utawi cingakin ring direktori global titiang saking nomer darurat.

Laksanayang niki mangkin

  1. Sampunang ngicalang pg_wal/, pg_xlog/, pg_multixact/, ib_logfile*, undo_*, utawi -wal / -shm file mangda ngawetuang ruang: Ngicalang file log Write-Ahead utawi InnoDB redo/undo ritatkala basis data kaon utawi nenten kacentang ngusak-asik wantah asiki rekaman halaman sane nenten komitmen lan ring penerbangan. Database sane madue disk sane jangkep 100 persen prasida kawaliang yening ruang sampun kabebasang; basis data sané berkas WALnyané kaicalang manual nganggén rm pacang keni B-tree sane nenten prasida kabalikang lan tumpukan korupsi.
  2. Diagnosis ring 5 detik napiké Sameton sampun metu saking blok disk (df -h), saking inode sistem berkas (df -i), utawi nahan berkas sané nénten mapaiketan (lsof +L1):
  3. Jalanang df -h mangda prasida nyelehin kapasitas blok miwah df -i mangda prasida nyelehin kapasitas inode. Server sane madue 50 gigabyte (53,6 miliar byte) ruang disk bebas tetep pacang ngentungang No space left on device (ENOSPC) lamun df -i nyinahang IUse% = 100% (ketahnyane kaawinang olih yutaan file sesi, cache, utawi spool mail sane alit).
  4. Yéning df -h nyinahang 100% lad manggo (0 Avail) yadiastun sesampun ragane malaib rm ring berkas log sané ageng, jalanang sudo lsof +L1. Berkas napi manten sané kaicalang nganggén rm sambilanga nginx, rsyslog, docker, postgres, utawi mysqld kari ngambel deskriptor file terbuka terus ngajeng 100 persen blok disk nyane ngantos proses restart utawi semeton ngetepang deskriptor langsung.
  5. Bebasang gigabyte ruang ring 1 detik tanpa ngawitin malih daemon antuk ngetepang file sane kabukak ring genahnyane (: > /path/to/logfile utawi : > /proc/<pid>/fd/<n>):
  6. Daripada rm /var/log/syslog (sane ngawinang blok kakunci olih logger sane mamargi), nol file ring genahnyane nganggen pengalihan nol cangkang: sudo sh -c ': > /var/log/syslog' utawi sudo truncate -s 0 /var/log/syslog.
  7. Yéning Sameton sampun malaib rm ring berkas log sané ageng miwah df -h nénten tedun, rereh ID prosesnyané (PID) miwah deskriptor berkas (FD) ring sudo lsof +L1 lan ngetepang langsung liwat antarmuka kernel procfs: sudo sh -c ': > /proc/<PID>/fd/<FD>'. Space pacang mawali ka df -h digelis.
  8. Bukak kunci ruang pernapasan darurat instan ring ext4 / ext3 antuk nedunang persentase blok akar sane kacadangan (tune2fs -m 1: Manut default, ext4 cadangan 5 persen saking makasami partisi (25 gigabytes ring 500 gigabyte disk) eksklusif anggén UID 0 (root), tegesnyane layanan non-root sakadi . postgres (UID 109), mysql, miwah www-data mukul No space left on device ring 95 persen pemanfaatannyane. Reklamasi 80 persen cadangan punika online ring 1 detik antuk nol downtime antuk ngamargiang sudo tune2fs -m 1 /dev/sda1 (utawi piranti blok akar Sametoné saking findmnt /).
  9. Pakum systemd-journald log biner lan tembolok paket sané sampun sue antuk aman: Jalanang sudo journalctl --vacuum-size=50M (sane aman maputaran lan ngresikin biner /var/log/journal arsip tedun ngantos 50 megabyte) miwah sudo apt-get clean (utawi sudo dnf clean all), sané ngicalang sané sampun kaunduh .deb / .rpm arsip ring /var/cache/apt/archives/ tanpa perlu nyurat ring database dpkg.
  10. Sampun paling kidik 1 gigabyte ngantos 5 gigabyte (1,07 miliar ngantos 5,36 miliar byte) ruang bebas, bakta basis data munggah ring mode pangguna tunggal utawi pemulihan mangda muputang pos pemeriksaan WAL-nyane sadurung ngicenin lalu lintas klien: Ngiring PostgreSQL, MySQL / InnoDB, utawi SQLtehead iplajahin malihWAL), siram halaman sane kotor ka file data utama, lan daur ulang segmen WAL sane kembungnyane mangda bersih sadurung mukak malih firewall aplikasi utawi server web ragane.

Danger

Sampunang naenin malaib pg_resetwal (utawi pg_resetxlog) ring PostgreSQL utawi innodb_force_recovery = 6 ring MySQL wantah santukan disk punika sampun madaging: Mamargi pg_resetwal ngusap pointer log transaksi lan maksa PostgreSQL ngawitin antuk halaman data sane kasurat setengah, nyamin ilang baris bisu, kunci utama duplikat, lan pohon B kunci asing sane pegat. Ring 99,9 persen basis data sane bek disk punika ngadat, wantah nglepasin 2 gigabyte ngantos 10 gigabyte (2,1 miliar ngantos 10,7 miliar byte) ruang ring partisi lan ngawitin daemon basis data biasane ngawinang pemulihan ngadat otomatis (REDO fase) mangda puput bersih antuk nol data sane ical.


Pohon kaputusan: server ruang nol miwah triage basis data sané runtuh

Anggén wit pamutus puniki anggén ngidentifikasi napi mawinan sistem operasi punika nglaporang ENOSPC (No space left on device) lan pilih jalur pemulihan sane nenten destruktif sane tepat:

flowchart TD
    Start["Server utawi Basis Data sané Kacabut: Nénten wénten genah sané kantun ring piranti (ENOSPC)"] --> CheckDF["Jalanang: df -h LAN df -i"]

    CheckDF --> DiagType{"Napi sané kalaporang olih df?"}

    DiagType -->|"df -h Nyihnayang 100% Kawigunan (0 Manfaat) LAN df -i < 95%"| BlockFull["Blok Kehabisan: Priksa yening du -shx / Cocok df -h"]
    DiagType -->|"df -h Nyihnayang GB Gratis NANGING df -i Nyihnayang 100% IUse"| InodeFull["Kehabisan Inode: Yutaan Berkas Alit 0-kantos-4KB"]
    DiagType -->|"Makakalih df -h miwah df -i Tampilang < 90% Kaanggén"| RamOrQuota["Wates sané kaengkebang: Priksa df -h / tmp (RAM tmpfs bek), Lapisan Docker2, utawi Kuota Disk XFS / ext4"]

    BlockFull --> GhostCheck{"Napike Sameton Sampun Ngamargiang rm ring File Ageng Tanpa df Dropping?"}
    GhostCheck -->|"Inggih: du punika Joh Lebih Alit Tekening df"| UnlinkedFD["Jalanang: sudo lsof +L1 -> Getep Berkas Hantu liwat : > /proc/PID/fd/FD"]
    GhostCheck -->|"Nénten: Berkas Asli Sedek Ngisi Disk"| EmergencySpace["Ngaryanin Ruang Pernapasan Langsung (1 GB ngantos 5 GB)"]

    EmergencySpace --> Ext4Check{"Napiké Sistem Berkas punika ext4 / ext3?"}
    Ext4Check -->|"Inggih"| Tune2fs["Jalankan: sudo tune2fs -m 1 /dev/akar_dev (Langsung Mebebaskan 4% Disk antuk Panganggen DB Non-Akar)"]
    Ext4Check -->|"Nénten (XFS / Btrfs / ZFS)"| TruncLogs["Getep Log ring Genah (: > /var/log/syslog) lan Jalanang jurnalctl --ukuran-vakum=50M"]

    InodeFull --> InodeClean["Rereh Direktori sane madaging Yutaan Berkas Nganggen rereh / -xdev -printf '%h\n' | nyorohang | unik -c | ngurutang -k 1 -r | sirah -20 -> Icalang antuk rereh -icalang"]

    UnlinkedFD --> DBRecover["Lanturang ka Mesin Basis Data WAL & Pemulihan Pohon B"]
    Tune2fs --> DBRecover
    TruncLogs --> DBRecover
    InodeClean --> DBRecover
    RamOrQuota --> DBRecover

    DBRecover --> WhichDB{"Mesin Database sané encen sané runtuh?"}
    WhichDB -->|"PascagrebSQL"| PGFlow["Tetep pg_wal Utuh -> Ngawitin Postgres antuk Muter Ulang WAL -> Jalanang TITIK PEMERIKSAAN; -> Tedunang Slot Replikasi Basi"]
    WhichDB -->|"SQL tiangé / MariaDB (InnoDB)"| MyFlow["Tetep ib_logfile* Utuh -> Ngawitin mysqld -> Bersihin Log Biner liwat BERSIHAN LOG BINER -> Optimalkan Tabel"]
    WhichDB -->|"SQLite3"| SqFlow["-> Jalanang PRAGMA pos_pemeriksaan wal (TRUNCATE) utawi sqlite3 rusak.db '.pulih'"]

Tahap 1: Napi mawinan komando standar (rm, apt, tab-completion) gagal ring 0 byte gratis

Ritatkala partisi Linux keni 100 persen blok utawi inode sane telas, komando remediasi standar gagal antuk cara sane nenten kajangka: - Néken Tab ring bash ngentungang cannot create temp file for here-document: No space left on device: Modéren bash-completion skrip ngaryanin berkas sementara ring /tmp. Lamun /tmp magenah ring akah / partisi gumanti tmpfs RAM mount, puput cangkang miwah heredocs (<<EOF) ten berasil. Gelis mecikang puniki antuk nunjuk TMPDIR ring RAM memori sané kaanggen sareng-sareng:

export TMPDIR=/dev/shm
- apt-get autoremove utawi dpkg --configure -a gagal sareng No space left on device: Pidan /boot utawi / sampun 100 persen bek, apt nénten prasida ngicalang kernel sané sampun sue santukan dpkg patut dumun nyurat status update ring /var/lib/dpkg/updates/. Tiosan punika, jalanang sudo apt-get clean (sané ngicalang paiketan cache .deb arsip ring /var/cache/apt/archives/ langsung), utawi ngetepang siki gambar kernel sané nénten kaanggén ring /boot (sudo sh -c ': > /boot/initrd.img-<old-unused-version>') anggén ngicénin dpkg megabyte (52,4 yuta byte) sane kabuatang mangda prasida mamargi sudo dpkg --purge linux-image-<old-unused-version>. - rm /path/to/dir/* gagal sareng Argument list too long: Pidan df -i punika ring 100 persen santukan direktori sakadi . /var/lib/php/sessions madaging yutaan berkas alit, globbing wildcard (*) nglimpahin kernel ARG_MAX penyangga (2 megabytes) sadurung rm kakawitin. Anggén find sareng -delete sebalikné:
sudo find /var/lib/php/sessions -type f -delete

sane mabinayan sane ngawinang No space left on device (ENOSPC)

Sadurung ngusud file basis data napi manten, bandingang limang skenario puniki mangda prasida mastikayang sumber daya napi sané sujatinnyané sampun telas:

Parintah Diagnostik Gejala sané kaselehin Akar Penyebab Gelis mecikang 10 Detik
df -h lawan sudo du -shx / df -h nyinahang 100% lad manggo (0 Avail), nanging du -shx / ngawewehin ngantos wantah 60% saking ukuran disk. Bukak Berkas sané nénten mapaiketan ("Berkas Hantu"): Wénten sané malaib rm ring log utawi file temp sané ageng rikala proses (nginx, java, postgres, docker) kari sampun mabuka. Jalanang sudo lsof +L1, rereh PID miwah FD saking (deleted) berkas, lan jalanang sudo sh -c ': > /proc/<PID>/fd/<FD>'.
df -h nyinahang 95% sampun kaanggén, 0 Avail Used + Avail nénten pateh Size; root prasida nyurat berkas, nanging postgres utawi mysql polih ENOSPC. ext4 Blok Akar sané sampun kacadangan (5% default): ext4 nahan 5 persen blok saking panganggé sané nénten root (UID > 0) mangda nenten wenten lockout akar lan fragmentasi. Jalanang sudo tune2fs -m 1 /dev/<partition> mangda cadangan punika tedun saking 5 persen dados 1 persen digelis online.
df -i df -h nyinahang genah kosong gigabyte, nanging df -i nyinahang IUse% = 100% (IFree = 0). Kecapetan Inode: ext4 madue jumlah inode sane tetep sane kakaryanin ring . mkfs dina; yutaan file sane alit sane kaajeng sabilang slot inode. Rereh folder sané iwang (sudo rereh / -xdev -printf '%h\n' \ | nyortir \ | unik -c \ | urutang -k 1 -r \ | sirah -10) and run sudo ngrereh /pelaku/dir -ketik f -hapus.
sudo gunung \ | grep /margi du -sh /var/log punika alit, durung / madue 40 gigabyte genah sane kirang. Berkas sane kaengkebang ring sor Titik Gunung: Proses sane nyurat 40 gigabyte dados /mnt/backup sedeng drive eksternal punika kapasang, lan salanturnyane wenten sane masang disk ring duur saking /mnt/backup, mengkeb berkas sané dados dasar saking du. Iket-pasang sistem berkas akar ka tampilan sementara (sudo mkdir /dev/shm/rootview && sudo mount --bind / /dev/shm/rootview), meriksa du -sh /dev/shm/rootview/mnt/*, lan ngicalang berkas sané kaengkebang.
btrfs filesystem df / df -h nyinahang 20 gigabyte gratis ring a Btrfs volume, durung nyurat gagal sareng ENOSPC. Btrfs Potongan Metadata sané sampun telas: Btrfs ngalokasiang genah dados potongan Data lan Metadata sane mabinayan; yening makasami ruang mentah sane nenten kaalokasiang kakunci dados potongan Data sane jarang, potongan Metadata keni 100 persen. Sementara nambahin piranti loop berkas RAM 2 gigabyte (dd if=/dev/zero of=/dev/shm/btrfs_ram bs=1M count=2048 && sudo btrfs device add -f /dev/shm/btrfs_ram /), melaib sudo btrfs balance start -dusage=10 /, terus sudo btrfs device remove /dev/shm/btrfs_ram /.

Fase 2: Ngambil malih genah disk antuk aman ring sor 60 detik

Sarengin pidabdab sané patut puniki mangda prasida ngambil malih pantaraning 500 megabyte miwah 50 gigabyte (0,53 miliar ngantos 53,6 miliar byte) ruang tanpa ngrusak proses aktif:

Langkah 1: Getep berkas sané sampun kaicalang ("hantu") saking /proc/<pid>/fd/

Yéning Sameton utawi skrip logrotate otomatis sampun ngicalang berkas ageng nanging genah disk nénten kawaliang, turéksain tabel berkas terbuka kernel sané nénten mapaiketan:

sudo lsof +L1
Cingakin ring SIZE/OFF kolom (kaukur antuk byte). Yéning Sameton nyingakin entri sakadi:
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)
Deriki, rsyslogd (PID 612, deskriptor berkas 7w -> 7) punika ngambel file log sane sampun kaicalang 18,2 gigabyte sane kabukak. Sampunang kill -9 proses basis data (mysqld utawi postgres) mangda bebas /tmp file yening prasida ngluputang genah ring genah tiosan dumun. Tiosan punika, nol deskriptor berkas log (PID 612, FD 7) langsung ring memori kernel:
sudo sh -c ': > /proc/612/fd/7'
Jalanang df -h digelis: samian 18,2 gigabyte kabebasang ring genah tanpa ngawitin malih layanan asiki.

Langkah 2: Reklamasi ext4 blok sané sampun kacadangan online nganggén tune2fs

Ring napi manten ext4 utawi ext3 sistem berkas, turéksain jumlah blok sané sampun kacadangan mangkin:

df -h /
sudo tune2fs -l /dev/nvme0n1p1 | grep -i "reserved block"
Santukan PostgreSQL (postgres),SQL Tiang (mysql), Redis (redis), miwah apl wéb SQLite (www-data, node) mamargi pinaka panganggen non-root sane nenten madue hak istimewa, kernel Linux ngablok ipun nganggen 5 persen sane kaping untat saking disk. Nedunang rasio blok sane kacadangan saking 5% ka 1% (utawi 0% rikala darurat aktif) mamargi langsung ring sistem berkas sané kapasang langsung:
sudo tune2fs -m 1 /dev/nvme0n1p1
Ring volume basis data 1 terabyte (1.000 gigabyte), komando tunggal puniki langsung nyerahang 40 gigabyte (42,9 miliar byte) ruang sane dados kasurat ring mesin basis data druene mawinan prasida muputang pos pemeriksaan WAL nyane. Sasampun krisis punika kapuputang lan data sane sampun sue kabersihin, waliang cadangan punika ka . 2% utawi 5% (sudo tune2fs -m 2 /dev/nvme0n1p1).

Langkah 3: Getep log teks aktif ring genah lan vakum journald

Rereh berkas sané pinih ageng ring sistem berkas root (tetep ring sistem berkas sané pateh sareng -xdev mangda semeton nenten nelasang galah scanning /proc utawi pasang ring jaba):

sudo find / -xdev -type f -size +100M -exec ls -lh {} + 2>/dev/null | sort -k 5 -hr | head -n 25
- Anggén berkas log teks biasa sané ageng (/var/log/nginx/access.log, /var/log/syslog, /var/log/postgresql/*.log, Doker *-json.log): Sampunang pisan malaib rm ring berkas log sané aktif. Getep dados nol byte ring genahnyané mangda deskriptor berkas daemon tetep valid lan penunjuk offset kaatur malih antuk bersih:
sudo truncate -s 0 /var/log/nginx/error.log
sudo truncate -s 0 /var/lib/docker/containers/*/*-json.log
- Untuk systemd-journald log biner (/var/log/journal/):
sudo journalctl --vacuum-size=50M


Fase 3: Ngawaliang PostgreSQL sesampun 100% disk sane bek (pg_wal kembung)

Ritatkala server PostgreSQL telas genah ring disk, ipun ngrekam PANIC: could not write to file "pg_wal/xlogtemp.1234": No space left on device, digelis ngutang proses anak posmaster, lan nolak ngawitin.

Napi mawinan pg_wal (pg_xlog ring PostgreSQL 9.6 miwah sané dumunan) nagingin makasami disk

Ring operasi normal, PostgreSQL nyurat sabilang perubahan dados 16 megabyte (16,7 yuta byte) file segmen ring jero . $PGDATA/pg_wal/ tur daur ulang ipun sesampun soang-soang . CHECKPOINT apisan nglintangin max_wal_size. Nanging, PostgreSQL kalarang ngicalang utawi daur ulang sane sampun sue pg_wal berkas ring sor tigang syarat: 1. Slot Replikasi Fisik/Logis sane yatim piatu utawi katinggalan: Server replika (standby), penghubung Debezium/Kafka, utawi pg_receivewal klien sampun putus sambungan makudang-kudang rahina sané sampun lintang, nanging slot replikasinyané (pg_replication_slots) kantun active = false ring utama, nuntun PostgreSQL mangda ngukuhang sabilang segmen WAL sane kapolihang ngawit saking putus sambungan. 2. Gagal archive_command: archive_mode = on sampun kaaktipang ring postgresql.conf, miwah skrip cadangan (pgBackRest, WAL-G, Barman, utawi aws s3 cp) inggih punika ngewaliang kode pemargi sane nenten nol (contonyane, kunci S3 sane sampun kadaluwarsa utawi host cadangan sane nenten prasida kajangkau). PostgreSQL nyimpen sabilang segmen WAL sane nenten kaarsip ring pg_wal/ ngantos archive_command ngawaliang 0. 3. Buntu sané bek ring disk: pg_wal tumbuh ngantos 0 bytes tetep ring /var/lib/postgresql, lan mangkin PostgreSQL taler nenten prasida ngawitin ngelepasin slot replikasi utawi muputang pos pemeriksaan santukan pemulihan startup punika ngamerluang makudang-kudang megabyte ruang disk bebas anggen nyurat file negara sementara.

Langkah-langkah Penyelamatan ruang nol PostgreSQL (Nol Kerugian Data)

  1. Ngaryanin 1 gigabyte ngantos 5 gigabyte (1,07 miliar ngantos 5,36 miliar byte) ruang sementara ring jaba pg_wal/:
  2. Kapertama kaanggén sudo tune2fs -m 0 /dev/<partition> miwah log teks sistem/PostgreSQL sane kagetep (sudo truncate -s 0 /var/lib/postgresql/*/main/log/*.log utawi /var/log/postgresql/*.log).
  3. Sapunapi yening database punika madue partisi khusus soang-soang antuk log teks nol lan XFS (dadosnyane tune2fs nénten wénten)? Pindahang 10 ka 20 saking sané pinih tua .ready utawi berkas sané nénten aktif saking direktori sané nénten WAL, utawi ngingsirang pg_wal direktori sementara ke partisi sane lianan antuk ruang kosong nganggen tautan simbolis:
    # 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
    
  4. Yéning archive_command sampun gagal lan ngablok daur ulang WAL, sementara ngelintangin punika ring postgresql.conf: Yening target S3/cadangan semetone tedun lan pg_wal/archive_status/ madaging panyiuan .ready berkas, édit postgresql.conf (archive_command = '/bin/true') wantah pinaka pidabdab darurat sane kaping untat mangda disk punika nenten padem, uning semeton pastika ngambil sane seger pg_basebackup digelis sesampun seger santukan rantai arsip WAL pacang madue celah.
  5. Ngawitin PostgreSQL lan langsung nureksain slot replikasi: Ngawitin PostgreSQL (sudo systemctl start postgresql) lan nyambungang liwat sudo -u postgres psql:
    SELECT slot_name, plugin, slot_type, active,
           pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) AS retained_wal
    FROM pg_replication_slots;
    
  6. Lempas slot replikasi mati/nenten aktif sane ngumpulang gigabyte WAL: Yéning Sameton nyingakin slot sané nénten aktif (active = f) sane ngambel 80 gigabyte saking . retained_wal:
    SELECT pg_drop_replication_slot('name_of_dead_slot');
    
  7. Paksa mangda gelis CHECKPOINT mangda prasida daur ulang sané kembung pg_wal segmen:
    CHECKPOINT;
    
    Momen punika CHECKPOINT; puput sesampun ngelepasin slot mati, PostgreSQL otomatis pacang ngicalang paiketan utawi daur ulang gigabyte file segmen 16 megabyte sane sampun sue ring warsa 2019. pg_wal/, ngawaliang panganggén disk Sametoné dados normal.
  8. Cegah mati disk slot replikasi ring masa sane jagi rauh: Atur max_slot_wal_keep_size ring postgresql.conf (wenten ring PostgreSQL 13+) ka topi sane aman (sakadi max_slot_wal_keep_size = 20GB) dadosnyane PostgreSQL ngaonang slot replika sane sampun padem bandingang ngaonang basis data utama ring 0 byte bebas.

Tahap 4: Ngawaliang MySQL / MariaDB (InnoDB) ring 0 byte gratis

Rikala MySQL utawi MariaDB keni 100% kawigunan disk (/var/lib/mysql), InnoDB warung samian nulis utawi ngadat antuk . [ERROR] [MY-012640] [InnoDB] Error number 28 means 'No space left on device'.

Nyelehin napi sané kadagingin /var/lib/mysql

Jalanang sudo du -sh /var/lib/mysql/* | sort -hr | head -n 15 mangda uning sira saking petang diri pelaku punika sane ngajeng piringan punika: 1. Log Biner sané nénten kawatesin (binlog.000001, mysql-bin.000042): Manut default ring MySQL 8.0+, pencatatan biner kaaktifang antuk retensi 30 rahina (binlog_expire_logs_seconds = 2592000), sane prasida dangan ngasilang ratusan gigabyte acara baris rikala impor massal. 2. Kuéri sané malaib nyurat tabel sementara raksasa (#sql* utawi ibtmp1): Sane masif GROUP BY utawi ORDER BY kuéri sampun kadagingin ibtmp1 utawi /tmp/#sql_* ngantos disk punika keni 0 byte. 3. Monolitik ibdata1 kembung ruang tabel sistem: Yéning innodb_file_per_table sampun nénten kaanggén utawi transaksi sané sampun sué mamargi ngawinang daftar riwayat InnoDB nénten kaanggén (undo log ring jero ibdata1 utawi undo_001) saking ngresikin. 4. Log kuéri alon utawi log kaiwangan MySQL (/var/log/mysql/mysql-slow.log).

Langkah-langkah penyelamatan ruang nol MySQL / MariaDB

  1. Sampunang pisan ngicalang ibdata1, ib_logfile0, ib_logfile1, #innodb_redo/*, utawi undo_001 sareng rm: Ngicalang file puniki ngawinang sabilang .ibd berkas tabel ring basis data Sametoné nénten prasida kawacén.
  2. Ruang pangawit sané gratis (500 megabyte ngantos 2 gigabyte):
  3. Getep /var/log/mysql/error.log miwah mysql-slow.log liwat sudo truncate -s 0 /var/log/mysql/*.log.
  4. Ring ext4, melaib sudo tune2fs -m 1 /dev/<partition>.
  5. Yéning mysqld sane mangkin sampun kagentosin lan /var/lib/mysql/ibtmp1 (ruang meja sementara tabel sane nenten kakompresi) punika ageng pisan, ibtmp1 otomatis kakaryanin malih ritatkala ngawitin, utawi Sameton prasida ngingsirang kalih utawi tiga log biner sané pinih tua (binlog.000001, binlog.000002 - nenten naenin binlog aktif sane nomornyane pinih tegeh) ka /dev/shm sementara punika mysqld prasida boot.
  6. Ngawitin MySQL lan ngresikin log biner antuk aman nganggen SQL (PURGE BINARY LOGS): Napi mawinan semeton patut nganggen SQL gumanti rm /var/lib/mysql/binlog.*? Santukan MySQL nglacak sabilang wastan berkas log biner ring binlog.index. Yéning Sameton ngicalang log biner nganggén rm tan nganyarang binlog.index, MySQL pacang nulak ngawitin utawi replikasi pacang pegat. Apisan mysqld ngawitin, ngranjing (sudo mysql) lan jalanang:
    SHOW BINARY LOGS;
    PURGE BINARY LOGS BEFORE NOW() - INTERVAL 1 DAY;
    
    (Utawi bersihin samian ngantos file log aktif sane mangkin kasinahang ring sor SHOW BINARY LOGS; nganggén PURGE BINARY LOGS TO 'binlog.000085';)
  7. Atur ukuran log biner permanen lan topi retensi ring /etc/mysql/mysql.conf.d/mysqld.cnf:
    [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:5G
    
    Caping ibtmp1 ring max:5G mastikayang yéning rogue nénten kaindeks JOIN utawi ORDER BY kuéri gagal nganggén table is full kaiwangan gumanti nglimbakang ibtmp1 ngantos makasami server Linux padem ring 0 byte bebas.

Tahap 5: Ngawaliang basis data SQLite3 sane rusak (database or disk is full / SQLITE_FULL / malformed)

Aplikasi sané tertanam, wadah Docker (Nextcloud, Vaultwarden, Home Assistant, Plex, Grafana, Gitea), miwah layanan seluler/desktop ngandelang SQLite3. Rikala disk neked ring 0 byte bebas rikala SQLite wenten ring tengahing rollback jurnal utawi Log Tulis-Ahead (-wal) pos pemeriksaan, ragane pacang matemu sareng silih sinunggil saking kalih darurat: 1. Masif .db-wal berkas kembung (sane .db-wal berkas sampun tumbuh dados 10 gigabyte sedengkan .db file punika wantah 200 megabyte, santukan pangwacen sane sampun sue ngalanglangin pos pemeriksaan WAL pasif, lan mangkin disk punika sampun 100 persen bek). 2. RuntimeError: database disk image is malformed (SQLITE_CORRUPT) kaawinang olih piranti keras sané rusak fsync(), wadah sané kapademang ring tengahing rollback ring 0 byte bebas, utawi wénten sané ngicalang -wal utawi -journal berkas antuk tangan.

Warning

Sampunang pisan ngingsirang, ganti wastan, utawi nyalin .db berkas antuk ragannyane sinambi ninggalin .db-wal (Log Tulis-Maju) utawi .db-journal (Jurnal Mundur) berkas ring ungkur: Yéning app.db-wal utawi app.db-journal wenten ring samping app.db, file pendamping punika madaging transaksi sane sampun kajanjiang lan halaman B-tree asli sane kabuatang anggen ngaryanin . app.db ring sajeroning struktur sane sampun ajeg. Setata salin tetiga berkas punika (app.db, app.db-wal, app.db-shm) sareng-sareng sadurung ngamargiang komando napi manten.

Langkah 1: Nyusut sane kembung .db-wal file lan ngevakum SQLite ritatkala ruang disk nampek ring nol

  1. Mararian wadah aplikasi utawi layanan sane nahan basis data SQLite kabukak (sudo systemctl stop app utawi docker stop container_name).
  2. Salin app.db, app.db-wal, miwah app.db-shm ka partisi utawi drive eksternal sane akeh madue genah kosong (utawi kosong 2x ukurannyane app.db ring disk lokal dumun).
  3. Bukak basis data nganggén sqlite3 CLI lan maksa pos pemeriksaan WAL sane memotong, sane ngelipet makasami bingkai sane komitmen saking app.db-wal ke tengah app.db miwah nyusut app.db-wal ka 0 bait:
    sqlite3 /path/to/app.db "PRAGMA wal_checkpoint(TRUNCATE);"
    
  4. Verifikasi integritas struktural pohon B miwah daftar bebas:
    sqlite3 /path/to/app.db "PRAGMA integrity_check;"
    
    Yéning sampun nyetak ok, basis data semetone sampun 100 persen seger.
  5. Cara VACUUM basis data SQLite sane ageng ritatkala disk lokal nenten madue ruang kosong sane cukup: Standar VACUUM; ngamerluang ngantos 2x ukuran basis data ring ruang disk bebas ring partisi sane pateh lan /var/tmp. Tiosan punika, anggén VACUUM INTO (kasobyahang ring SQLite 3.27.0) antuk nyurat salinan sane anyar sane sampun kapadat, defragmentasi langsung ring disk sane kapasang utawi saham jaringan sane mabinayan:
    sqlite3 /path/to/app.db "VACUUM INTO '/mnt/external_usb/app_compacted.db';"
    

Langkah 2: Nyelametang B-tree sane rusak (database disk image is malformed) sareng .recover

Yéning PRAGMA integrity_check; laporan row 412 missing from index, btreeInitPage() returns error code 11, utawi database disk image is malformed:

  1. Kapertama indayang ngwangun malih indeks sekunder sane rusak (REINDEX): Sering pisan data tabel sane sujati (table B-trees) sampun 100 persen utuh lan wantah indeks sekunder B-tree sane rusak ritatkala disk punika kadagingin. Melaib:
    sqlite3 /mnt/external_usb/copy_of_app.db "REINDEX;"
    sqlite3 /mnt/external_usb/copy_of_app.db "PRAGMA integrity_check;"
    
    Yéning PRAGMA integrity_check; mangkin mawali ok, Sameton sampun ngamolihang 100 persen basis data Sameton antuk baris sané ilang nol.
  2. Yéning REINDEX gagal, jalanang pemindai pohon B forensik (.recover): Nénten sakadi sané lingsiran .dump komando (sane ngreredang ngekspor tabel ritatkala ipun keni pointer B-tree sane rusak), .recover (kawangun dados sqlite3 versi 3.29.0+) ngelintangin penunjuk B-tree interior sane rusak makasami, memindai sabilang halaman daun mentah 4 kilobyte file manut urutan saking byte 0 ngantos EOF, marekonstruksi sabilang baris sane prasida kawacen, lan ngenahang rekaman yatim piatu napi manten dados lost_and_found meja:
    sqlite3 /mnt/external_usb/copy_of_app.db ".recover" | sqlite3 /mnt/external_usb/repaired_app.db
    
  3. Vérifikasi basis data sané anyar karekonstruksi:
    sqlite3 /mnt/external_usb/repaired_app.db "PRAGMA integrity_check;"
    
    Priksa yéning a lost_and_found tabel sampun kakaryanin (sqlite3 /mnt/external_usb/repaired_app.db ".tables") jagi nureksain barisan yatim piatu napi manten sane kapolihang saking halaman don sane nenten mapaiketan. Antuk basis data SQLCipher sane kaenkripsi (sakadi cadangan Signal utawi WhatsApp), cingakin panduan khusus titiang ring SQLite sane kaenkripsi, Sinyal, lan korupsi cadangan obrolan WhatsApp lan ekstraksi kunci lokal.

Tahap 6: Darurat "Berkas Balast Tripwire" & daftar periksa pencegahan monitoring

Sesampun server lan basis data semetone mawali online, laksanayang petang pengamanan puniki digelis mangda semeton nenten naenin terjebak ring 0 byte gratis malih:

  • Ngaryanin 1 gigabait (1,073,741,824 byte) Berkas Balast Darurat ring sabilang partisi basis data: Jalankan sudo fallocate -l 1G /var/lib/EMERGENCY_DELETE_ME.ballast. Yéning server punika naenin keni 100% disk bek, sedek mamargi sudo rm /var/lib/EMERGENCY_DELETE_ME.ballast nglepasin 1 gigabyte blok sane mapaiketan ring 1 milidetik.
  • Topi systemd-journald lan log wadah Docker permanen: Atur SystemMaxUse=200M ring /etc/systemd/journald.conf miwah ngatur /etc/docker/daemon.json sareng "log-opts": {"max-size": "20m", "max-file": "3"}.
  • Isolasi /var/log, /tmp, miwah /var/lib/postgresql ring volume LVM sané mabinayan: Nyimpen /var/log miwah /tmp mapasahan sareng volume basis data mastikayang log web sane lari nenten naenin ngaonang basis data utawi ngunci login SSH.
  • Painget ring KALIH df -h (> 80%) MIWAH df -i (> 80%) tambah pg_replication_slots lag: Konfigurasiang pengawasan (node_filesystem_avail_bytes miwah node_filesystem_files_free) mangda waspada sadurung pemanfaatan nglintangin 85 persen.

Nomor darurat daerah miwah protokol lembaga

Sedek disk server sane jangkep biasane darurat operasi IT internal, pemadaman sane mapangaruh ring perawatan kesehatan Catatan Kesehatan Elektronik (EHR) basis data, pengiriman darurat (CAD), telemetri toya/daya kota, utawi ketersediaan data pribadi sane manut hukum minab ngamerluang eskalasi darurat formal:

  • Amerika Serikat miwah Kanada: Telpon 911 yening wenten server sane ngadat ngaonang monitoring utawi pengiriman klinis, lan ngaktifang prosedur downtime. Laporang sumber daya infrastruktur kritis sane sampun telas utawi serangan ransomware ring CISA (1-844-Say-CISA / cisa.gov/report) utawi Pusat Keamanan Siber Kanada (1-833-CYBER-88).
  • Inggris Raya: Telpon 999 antuk ancaman ring kahuripan utawi sistem NHS sane kritis. Ring sor Peraturan GDPR lan NIS Inggris, ngukur napike ketersediaan basis data permanen sane ical ngamerluang pawarah-warah majeng ring ICO (0303 123 1113) ring sajeroning 72 jam.
  • Uni Eropa: Telpon 112 ring makasami negara anggota UE. Entitas esensial ring sor NIS2 Direktif mangda nguningayang ring CSIRT nasionalnyane ring 24 jam saking pemadaman sane signifikan, lan ilangnyane data pribadi permanen tanpa pemulihan cadangan memicu pelaporan GDPR Pasal 33 ring 72 jam.
  • Australia miwah Selandia Baru: Telpon 000 ring Australia utawi 111 ring Selandia Baru; hubungi ACSC (1300 CYBER1) antuk kejadian infrastruktur sane wenten.
  • India miwah Asia-Pasifik: Telpon 112 anggen tanggap darurat; nglaporang indik matilar saking siber ring CERT-In (incident@cert-in.org.in) ring jendela wajib 6 jam.

Pitakén sané sering katakénang

Napi mawinan df -h tetep ring 100% (0 Avail) yadiastun sampun tiang ngicalang file log 50 GB antuk . rm?

Ring sistem berkas Linux, rm wantah nelpon ngilangang tautan(), ngicalang wastan berkas saking direktori rikala kernel nyimpen blok disk sane kaalokasiang ngantos sabilang proses sane nahan berkas punika kabukak nutup deskriptor berkasnyane (tiang_ngitung == 0). Jalanang sudo lsof +L1. anggén ngrereh ID Proses (PID) miwah Deskriptor Berkas (FD) saking (kaicalang) berkas, raris jalanang sudo sh -c ': > /proc/pid/fd/fd' mangda nol blok ring genahnyane digelis tanpa ngawitin malih layanan.

Sapunapi yening tiang nenten prasida malah SSH ke server santukan . /tmp utawi /var/run sampun 100% jangkep miwah sshd nolak ngalokasiang sesi?

Kapertama indayang laksanayang komando langsung non-PTY ring SSH tanpa ngalokasiang pseudo-terminal interaktif: ssh -T akar@pelayanan "sh -c ': > /var/log/syslog'". Lamun akah login nénten kaanggén, anggén konsol serial ring jaba pita panyedia awan Sametoné (Konsol Serial AWS EC2, Konsol DigitalOcean, Linode Lish, utawi Proxmox/VMware VNC) anggén ngranjing langsung ring TtyS0 utawi boot ka mode pemulihan panganggé tunggal.

Wénten sané sampun ngicalang berkas ring jeroning PostgreSQL pg_wal direktori sadurung ngwacen panduan puniki, lan mangkin PostgreSQL nolak ngawitin antuk . PANIC: could not locate a valid checkpoint record. Napiké data makasami ical?

Nénten, akéhan baris tabel kantun wénten ring tengah $Data PG/dasar/, yadiastun transaksi ring penerbangan ring jero file WAL sane kaicalang ical lan makudang-kudang halaman minab sobek. Kapertama makarya salinan sane jangkep saking makasami . $DataPG direktori (cp -a / var / lib / pasca progresql / 16 / utama / mnt / cadangan / pgdata_mentah). Raris malaib sudo -u pascapangkesan /usr/lib/pascapangkesan/16/bin/pg_resetwal -f /var/lib/pascapengembangan/16/utama, ngawitin PostgreSQL ring mode panganggé tunggal, lan langsung jalanang pg_tembok dados inisialisasi sané anyar (initdb) klaster; sampunang naenin nglanturang ngamargiang lalu lintas produksi ring kluster sesampun pg_ngatur malih.

Sapunapi carane ngicalang yutaan berkas alit ritatkala rm -rf gantung utawi gagal ring inode-telas (df -i 100%) server?

Ritatkala direktori madaging yutaan file sesi utawi cache sané alit, indeks direktorinyané (hpohon) mentik ageng, ngawinang . ls miwah rm -rf mangda prasida ngrereh wastan berkas ring RAM. Tiosan punika, jalanang sudo rereh /jalan/ka/juta_berkas -dalem pikayunan 1 -hapus, utawi ngaryanin direktori RAM sané kosong (mkdir /panglimbak/shm/kosong) lan jalanin sudo rsync -a -- ngicalang / dev / shm / kosong / / jalur / ka / yutaan_berkas / mangda prasida gelis nglepasin inodes.

Napi mawinan Docker ngebekin makasami disk server tiange rikala wadah tiange padidi alit, lan sapunapi carane tiang ngresikin . /var/lib/docker rahayu?

Docker mupulang genah disk ring log stdout JSON sané nénten kagilir (/var/lib/doker/wadah/*/*-json.log), menjuntai lapisan2 lapisan gambar, miwah tembolok buildkit. Nénten ja manual rm -rf map ring tengah /var/lib/doker/tumpukan2/. Kapertama getep log JSON (/var/lib/dokker/wadah/*/*-json.log) dadosne daemon punika madue ruang napas, lantas lari . sistem docker sudo ngraut -a -f (ngilangang --jilid dadosnyane volume basis data tetep nenten kagentosin).

Punapike titiang prasida nglimbakang EBS awan/volume disk sane tetep langsung rikala server wenten ring 100% pemanfaatan disk?

Inggih, ekspansi volume online mamargi tanpa reboot, antuk asiki tangkapan: naskah panulung bagian tumbuh /panglimbakan/nvme0n1 1 nyobak ngaryanin berkas sementara ring /tmp nganggén mktemp lan gagal ring 0 byte bebas. Lintangin kegagalan punika antuk ngamargiang sudo TMPDIR = / panglimbak / shm bagian tumbuh / panglimbak / nvme0n1 1 (nganggé sané kadukung olih RAM /panglimbak/shm gunung) kasarengin antuk sudo ngubah ukuran2fs / panglimbakan / nvme0n1p1 (ext4) utawi sudo xfs_tumbuh / (XFS).


Panuntun sané mapaiketan


Sumber miwah tuntunan resmi

  • Kelompok Pengembangan Global PostgreSQL: Dokumentasi Resmi PostgreSQL 16 - Bab 30: Keandalan lan Log Tulis-Ahead (Konfigurasi WAL, Slot Replikasi, lan Pemulihan Saking Kegagalan Penuh Disk).
  • Konsorsium SQLite (sqlite.org): Cara Ngrusak Berkas Database SQLite (Penguncian Berkas, Berkas Jurnal/WAL Sane Tan Kahubungan, lan .recover Ekstensi CLI).
  • Perusahaan Oracle / Dokumentasi MySQL & Yayasan MariaDB: Pemulihan Kecelakaan InnoDB, Prosedur Pembersihan Log Biner (PURGE BINARY LOGS), miwah Ruang Meja Sementara (ibtmp1) Pangelolaan.
  • Organisasi Kernel Linux (kernel.org): Administrasi Sistem Berkas Ext4 (tune2fs Blok sané sampun kacawis, Tabel Inode, miwah /proc/<pid>/fd/ Pemotongan Deskriptor Berkas).
  • Lembaga Standar lan Teknologi Nasional (NIST) (Amerika Serikat): Publikasi Khusus 800-123: Panuntun Keamanan Server Umum lan Manajemen Ketersediaan.