Volum de producció de Docker o Kubernetes suprimit: rescatant docker system prune --volumes, overlay2 Inodes, i etcd Imatges instantànies¶
Els números d'emergència difereixen segons el país. Aquesta pàgina utilitza 911, el número dels Estats Units i el Canadà. Molts altres països utilitzen 112, 999 o un altre número. Cerqueu el número del vostre país.
Córrer docker compose down -v, docker system prune -a --volumes, docker volume rm, o kubectl delete pvc a la pestanya de terminal incorrecta en producció és una de les maneres més ràpides d'esborrar un volum de base de dades PostgreSQL, MySQL, MariaDB, Redis, MongoDB o SQLite en directe. A diferència de les instantànies de màquines virtuals al núvol que es mouen a una paperera de reciclatge de 7 dies, el controlador de volum local de Docker (/var/lib/docker/volumes/<name>/_data) i Kubernetes local-path / hostPath els proveïdors emeten immediatament l'estàndard POSIX unlink() i rmdir() crida directament contra el sistema de fitxers host Linux subjacent (ext4, XFS, o Btrfs). Cada escriptura que es produeix en aquest amfitrió Linux després d'acabar l'ordre pot sobreescriure els blocs de base de dades alliberats al disc. Si el disc del servidor s'ha omplert al 100 per cent (0 bytes free) abans que algú corria docker system prune --volumes en pànic, consultar disc del servidor 100% ple, inflor de registre WAL de la base de dades i recuperació d'espai zero; per a les supressions de fitxers Linux sense metall fora dels contenidors, vegeu accidental rm -rf o Shift-Delete a ext4, XFS, APFS i NTFS: remuntar només de lectura i tallar inode i màquina virtual VMDK, VHDX i qcow2 corrupció de la cadena d'instantànies i rescat d'hipervisor. Si aquesta interrupció de la producció afecta l'atenció al pacient de l'hospital, l'enviament d'emergències o els sistemes de seguretat d'utilitat pública, truqueu al vostre número d'emergència local (911 als Estats Units i al Canadà, 112 a tota la Unió Europea, 999 al Regne Unit) o consulteu el nostre directori de números d'emergència.
Fes això ara¶
- ** NO córrer
docker compose up -d,systemctl restart docker, o torneu a desplegar el pod de Kubernetes**: en tornar a crear el contenidor o en reiniciar el dimoni Docker s'escriuen megabytes de nousoverlay2metadades, registres JSON del contenidor i fitxers de base de dades buits recentment inicialitzats (initdb) directament sobre l'exacteext4oXFSblocs on el volum suprimit estava assegut fa segons. - Comproveu d'aquí a 5 segons si el procés del contenidor (
postgres,mysqld,redis-server,node,python) encara s'està executant a la memòria (ps auxisudo lsof +L1): si algú ha suprimit fitxers dins d'un volum muntat o ha desenllaçat un volum anònim mentre el contenidor encara s'està executant, el nucli de Linux manté viu al disc el 100 per cent dels fitxers de base de dades desenllaçats sempre que l'identificador de procés amfitrió del contenidor (PID) conté un descriptor de fitxer obert (FD). Podeu copiar aquests fitxers directament/proc/<PID>/fd/o/proc/<PID>/root/amb zero pèrdua de dades abans que el contenidor s'aturi. - Si el contenidor ja està aturat i el volum s'ha suprimit (
docker compose down -vodocker system prune --volumes), congela el disc amfitrió escriu immediatament: Atureu el dimoni Docker (sudo systemctl stop docker.socket docker.service containerd) de manera que els contenidors en segon pla i els controls de salut deixen d'escriure registres/var/lib/docker, després o bé tornar a muntar/var/lib/docker(o l'arrel/partició) només de lectura (sudo mount -o remount,ro /) o feu una instantània immediata del volum del núvol a nivell de bloc (AWS EBS Snapshot,GCP Persistent Disk Snapshot,DigitalOcean Volume Snapshot) abans de tocar res. - Si esteu a Kubernetes (
kubectl delete pvcokubectl delete namespace), comproveu el volum persistent (PV)ReclaimPolicy(kubectl get pv) immediatament: - Si el
PVteniapersistentVolumeReclaimPolicy: Retain, les teves dades no s'eliminen: elPVsimplement traslladat aReleasedestat i el vostre disc al núvol (EBS,Azure Disk,Ceph RBD,NFS) està 100 per cent intacte. - Encara que
kubectl delete pvcestà encallat aTerminating, Kubernetes Finalitzadors (kubernetes.io/pvc-protection) impedeix que el controlador CSI suprimeixi l'emmagatzematge subjacent sempre que qualsevol pod encara faci referència a aquest PVC. No suprimiu el pod fins que no copieu les dades del pod en execució. - Imatge de la partició de blocs subjacent (
dd/ddrescuea través de SSH) a un disc extern o a un volum de núvol separat abans d'executar-seext4magic,extundelete, oPhotoRec: No executeu mai els talladors de fitxers que escriguin fitxers de sortida a la mateixa partició de disc de la qual us esteu recuperant/var/lib/docker/volumes. - Per a l'estat del clúster de Kubernetes danyat o esborrat accidentalment (
kubectl delete crd/namespace), pararkube-apiserveri restaura el teu últimetcdinstantània (etcdctl snapshot restore): si el clúster està enetcdes va esborrar mentre els volums d'emmagatzematge al núvol subjacents encara existeixen, restaurant-seetcdrecupera totPV,PVC,Secret, iConfigMapobjectes simultàniament.
Danger
** No traieu mai el kubernetes.io/pvc-protection o kubernetes.io/pv-protection finalitzador amb kubectl patch ... -p '{"metadata":{"finalizers":null}}' quan hi ha un PVC enganxat Terminating**: Aquest finalitzador és l'únic que manté el controlador CSI del núvol (aws-ebs-csi-driver, pd.csi.storage.gke.io, Longhorn, Rook-Ceph) de l'emissió d'un maquinari DeleteVolume Crida a l'API per destruir el vostre disc de producció. Mentre el PVC està enganxat Terminating, el Pod encara funciona i el volum encara està muntat: executa kubectl exec o kubectl cp (o pg_dump / mysqldump) immediatament per rescatar el 100 per cent de la vostra base de dades abans que finalitzi el Pod.
Arbre de decisió: volum Docker suprimit, overlay2 capa o triatge de PVC de Kubernetes¶
Utilitzeu aquest diagrama de flux per triar la ruta de recuperació de pèrdua zero més ràpida en funció de si el procés del contenidor encara està viu, si el volum estava recolzat per un disc local o un emmagatzematge CSI al núvol i quin sistema de fitxers allotja /var/lib/docker:
flowchart TD
Start["Falten dades de producció després de l'ordre d'eliminació de Docker o Kubernetes"] --> WhichEnv{"Quina plataforma i quina ordre van provocar la pèrdua?"}
WhichEnv -->|"Docker: el contenidor encara funciona (fitxers desenllaçats dins del volum/contenidor)"| ProcRescue["Rescatar els descriptors de fitxers sense enllaçar oberts mitjançant sudo lsof +L1 i /proc/PID/fd/N o /proc/PID/root/"]
WhichEnv -->|"Docker: contenidor aturat i volum suprimit (composar -v / podar --volums)"| StopDocker["Executeu immediatament: sudo systemctl stop docker.socket docker containerd"]
WhichEnv -->|"Kubernetes: kubectl suprimeix pvc / pv / statefulset / namespace"| K8sCheck{"El pod segueix funcionant O s'ha enganxat el PVC en acabar?"}
K8sCheck -->|"Sí: el pod encara s'està executant (eliminació de CSI que bloqueja el finalitzador)"| K8sExec["NO suprimiu el pod -> Executeu kubectl exec / pg_dump / tar sobre stdout al disc local immediatament"]
K8sCheck -->|"No: Pod Gone -> Comprova kubectl get pv"| ReclaimCheck{"Què va ser PV ReclaimPolicy?"}
ReclaimCheck -->|"Retenir (estat PV = llançat)"| ClearClaimRef["Dades 100% intactes -> Edita PV per eliminar spec.claimRef.uid -> Torna a vincular-se al nou PVC"]
ReclaimCheck -->|"Suprimeix (Cloud EBS / PD / Longhorn / Local-Path)"| CloudOrLocal{"Volum CSI al núvol o disc d'amfitrió local?"}
CloudOrLocal -->|"Cloud CSI (AWS EBS / GCP / Azure / Ceph)"| CloudSnap["Comproveu la paperera de reciclatge de Cloud Console / instantànies automatitzades d'EBS / Ceph RBD Trash (rbd trash ls)"]
CloudOrLocal -->|"Disc del node local (camí local/camí de host)"| StopDocker
StopDocker --> RemountRO["Remunta la partició de l'amfitrió només de lectura (mount -o remount,ro) O transmet la imatge del bloc a través de SSH"]
RemountRO --> HostFS{"Quin sistema de fitxers allotja /var/lib/docker?"}
HostFS -->|"ext4"| Ext4Rec["Utilitzeu debugfs / ext4magic Journal Inode Transaction Rollback (-a marca de temps)"]
HostFS -->|"XFS / Btrfs"| CarveRec["Utilitzeu Btrfs Roots / xfs_irecover / Custom Signature Carving per a SQLite, Postgres Heap o InnoDB .ibd"]
Fase 1: com Docker i Kubernetes suprimeixen realment els volums del disc¶
Abans d'executar qualsevol ordre de recuperació, enteneu on vivien físicament les vostres dades a l'amfitrió Linux i què va tocar realment l'ordre de supressió:
| Tipus d'emmagatzematge i ordre d'eliminació | Ruta del sistema de fitxers de l'amfitrió al node Linux | Què va fer realment l'ordre d'eliminació | Mètode de recuperació immediata |
|---|---|---|---|
Volum Docker amb nom (docker volume rm o docker compose down -v) |
/var/lib/docker/volumes/<vol_name>/_data |
S'han desenllaçat els fitxers que hi ha dins _data/ i va eliminar l'entrada del directori /var/lib/docker/volumes/metadata.db (boltdb). |
Atureu Docker immediatament i torneu a muntar /var/lib/docker només de lectura i recupereu els inodes desenllaçats mitjançant ext4magic / debugfs o talla de signatura. |
Volum Docker anònim (docker run -v /var/lib/mysql + docker rm -v o docker system prune --volumes) |
/var/lib/docker/volumes/<64-char-hex-id>/_data |
docker system prune --volumes suprimeix tots els volums anònims i amb nom que no fan referència actualment com a mínim a un contenidor existent. |
Atureu Docker immediatament; si teníeu altres contenidors aturats els volums dels quals no van ser podats, comproveu la resta /var/lib/docker/volumes/*/_data carpetes primer abans de tallar blocs no assignats. |
Capa d'escriptura del contenidor (docker rm <container> quan les dades es van escriure fora d'un volum) |
/var/lib/docker/overlay2/<layer-id>/diff/ |
S'ha desenllaçat la part superior del contenidor diff/ directori dins de overlay2 controlador d'emmagatzematge. |
Atureu Docker immediatament i recupereu l'arbre de directoris sense enllaçar del fitxer ext4 diari o XFS blocs. |
** Docker Desktop a macOS o Windows (docker system prune --volumes)** |
Dins d'una única imatge de disc de màquina virtual: -/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw (macOS) o %LocalAppData%\Docker\wsl\disk\docker_data.vhdx (Windows WSL2). |
Enviat unlink() dins de la màquina virtual Linux, i si discard/TRIM està actiu Docker.raw / docker_data.vhdx, va fer forats escassos al fitxer amfitrió. |
Sortiu de Docker Desktop en 5 segons, copieu-lo Docker.raw o docker_data.vhdx a una unitat externa i executar ext4magic / PhotoRec contra la imatge del disc virtual. |
Kubernetes PVC amb Delete Política de reclamació a Ceph RBD (Rook-Ceph) o Longhorn |
Grup d'OSD Ceph (rbd) o /var/lib/longhorn/replicas/. |
Si csi-rbdplugin té trash habilitat (rbd trash), la imatge RBD es mou a la paperera de Ceph; en cas contrari, els blocs no es mapegen. |
Corre rbd trash ls --pool <pool> dins del rook-ceph-tools pod i restaurar amb rbd trash restore. |
Fase 2: rescatar fitxers de base de dades oberts d'un contenidor que encara està en execució (/proc/<pid>/fd/)¶
Espereu: el contenidor segueix funcionant ara mateix?
Sovint, un enginyer executa un script de migració d'aplicacions, un treball cron de neteja o un manual rm -rf /var/lib/postgresql/data/* o rm /app/data/production.sqlite3 dins d'un contenidor en execució o elimina la carpeta de muntatge d'enllaç de l'amfitrió subjacent /opt/app/data mentre que el propi recipient (postgres, mysqld, mariadbd, redis-server, mongod, gunicorn, node) està encara en funcionament.
A Linux, un fitxer no s'elimina del disc quan rm o unlink() es diu. Els seus blocs de disc i inode romanen 100 per cent assignats i llegibles fins a l'últim procés que conté un descriptor de fitxer obert (FD) a aquest inode el tanca o surt.
Pas 1: cerqueu l'identificador de procés de l'amfitrió (PID) del procés del contenidor¶
Al node de l'amfitrió de Linux (no dins del contenidor), cerqueu l'amfitrió PID de la vostra base de dades o procés de sol·licitud:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NLINK NODE NAME
mysqld 18492 999 14u REG 259,1 482344960 0 1849201 /var/lib/mysql/app_prod/users.ibd (deleted)
mysqld 18492 999 15u REG 259,1 125829120 0 1849202 /var/lib/mysql/app_prod/orders.ibd (deleted)
mysqld 18492 999 16u REG 259,1 79691776 0 1849190 /var/lib/mysql/ibdata1 (deleted)
python3 22104 1000 4u REG 259,1 89128960 0 3102944 /data/production.sqlite3 (deleted)
NLINK: diu 0, i el nom del fitxer acaba amb (deleted). El fitxer ha desaparegut completament ls /var/lib/docker/volumes/..., però cada byte (482 MB en users.ibd, 89 MB en production.sqlite3) encara viu a dins /proc/<PID>/fd/<FD>.
Pas 2: copieu els fitxers de la base de dades desenllaçats directament /proc/<PID>/fd/¶
No atureu ni reinicieu el contenidor. Mentre el procés encara s'està executant, copieu els descriptors del fitxer en brut directament a una carpeta segura del vostre amfitrió:
sudo mkdir -p /root/proc_emergency_rescue
# Example 1: Rescuing an unlinked SQLite3 database (PID 22104, FD 4)
sudo cp /proc/22104/fd/4 /root/proc_emergency_rescue/production.sqlite3
# Check if PID 22104 also holds the -wal file open (e.g. FD 5) and copy it too:
sudo cp /proc/22104/fd/5 /root/proc_emergency_rescue/production.sqlite3-wal
# Example 2: Automatically rescuing ALL open (deleted) MySQL/Postgres files for PID 18492
for fd in /proc/18492/fd/*; do
target=$(sudo readlink "$fd" 2>/dev/null)
if echo "$target" | grep -q "(deleted)"; then
fd_num=$(basename "$fd")
clean_name=$(echo "$target" | sed 's/ (deleted)//; s/\//_/g')
echo "Rescuing FD $fd_num -> $clean_name"
sudo cp "$fd" "/root/proc_emergency_rescue/${fd_num}${clean_name}"
fi
done
Pas 3: encara millor: executeu un abocament lògic en directe (pg_dump / mysqldump / .backup) abans que el contenidor tanqui els FD¶
Si postgres o mysqld encara s'està executant amb els seus fitxers de dades oberts a la memòria i /proc/<PID>/fd/, proveu d'executar primer un abocament lògic en directe sobre el sòcol Unix existent o la connexió TCP:
# If the database engine can still read its open file descriptors:
docker exec <container_name> pg_dumpall -U postgres > /root/proc_emergency_rescue/live_dump.sql
# Or for MySQL:
docker exec <container_name> mysqldump -u root -p --all-databases --single-transaction > /root/proc_emergency_rescue/live_mysql.sql
.1, .2 segmenteu els fitxers als processos de treball de manera dinàmica, per tant pg_dump pot fallar en taules sense memòria cau; combinant una consulta SQL en directe amb la còpia de totes les obertes /proc/<pid>/fd/* a través de tots postgres Els PID del backend fill desa el màxim de dades possibles d'emmagatzematge de taula.)
Fase 3: recuperació d'un volum Docker suprimit activat ext4 o XFS després de parar el contenidor¶
Què passa si corries docker compose down -v o docker system prune --volumes, de manera que el contenidor està ja aturat i tot /proc/<pid>/fd/ els descriptors estan tancats? Ara esteu en una carrera contra les escriptures de disc de fons a l'amfitrió Linux.
Pas 1: Congeleu el sistema de fitxers host de Linux en 10 segons¶
- Atura Docker, containerd, kubelet i cron immediatament, de manera que cap contenidor, control de salut o rotador de registre escrigui un altre byte a
/var/lib/docker: - Comproveu quin dispositiu de bloc i sistema de fitxers conté
/var/lib/docker: - ** Torneu a muntar la partició de només lectura (o transmeteu una imatge de partició en brut a través de SSH a una altra màquina)**:
- Si
/var/lib/dockeres troba a la seva pròpia partició dedicada o volum LVM (per exemple/dev/nvme0n1p2o/dev/mapper/vg0-docker), torneu-lo a muntar de només lectura immediatament: - Si
/var/lib/dockerestà a l'arrel/partició (/), proveu de forçar la partició arrel de només lectura mitjançant el disparador Magic SysRq del nucli (echo u | sudo tee /proc/sysrq-trigger) osudo mount -o remount,ro /. - Si esteu en un VPS al núvol (AWS EC2, GCP, DigitalOcean, Hetzner, Linode): aneu immediatament a la vostra consola web al núvol i feu clic a Crea una instantània al volum de blocs del servidor (o transmeteu el dispositiu de blocs en brut per SSH a un segon servidor:
sudo dd if=/dev/nvme0n1p1 bs=4M status=progress | gzip -1 | ssh user@backup-server "cat > /mnt/storage/docker_host_raw.img.gz").
Pas 2: comproveu si les vostres dades encara es troben en un ALTRE volum sense podar o overlay2 capa¶
Abans de tallar blocs de disc no assignats, verifiqueu que la vostra base de dades no s'hagi emmagatzemat en un muntatge d'enllaç o un volum amb un nom diferent que hagi sobreviscut:
# Search the entire /var/lib/docker tree read-only for any surviving database files:
sudo find /var/lib/docker -name "PG_VERSION" -o -name "ibdata1" -o -name "*.sqlite*" -o -name "*.db" -o -name "dump.rdb" -o -name "WiredTiger" 2>/dev/null
docker volume rm app_db_data, només per descobrir amb find /var/lib/docker això docker-compose.yml havia creat realment projectname_app_db_data (que encara està 100 per cent intacte al disc) mentre app_db_data era un volum vell sense utilitzar de fa sis mesos.
Pas 3: recuperació dels directoris de volums de Docker desenllaçats activats ext4 utilitzant el ext4 Diari (ext4magic i debugfs)¶
Quan docker volume rm elimina /var/lib/docker/volumes/<vol_name>/_data en un ext4 sistema de fitxers, ext4 elimina els zeros dels punters de bloc directe (i_block / arrel de l'arbre d'extensió) a la taula d'inodes en viu. Tanmateix, el ext4 diari (inode <8>, normalment 128 MB a 1024 MB buffer d'anell circular) encara conté còpies històriques de les taules d'inodes exactes i dels blocs de directoris just abans docker compose down -v va ser executat.
+-------------------------------------------------------------------------+
| HOW ext4magic RECOVERS A DELETED DOCKER VOLUME FROM THE EXT4 JOURNAL |
| |
| Live Inode Table on Disk (After docker volume rm): |
| Inode #918402 (users.ibd): [Size = 0, Extent Pointers = ZEROED] |
| |
| Ext4 Journal Ring Buffer (Inode <8> on Disk): |
| Transaction #41902 (10 mins ago): |
| Inode #918402 (users.ibd): [Size = 482MB, Extents = Blocks 9000..9999]|
| |
| -> ext4magic reads the old Inode Copy from Journal Transaction #41902 |
| and extracts Blocks 9000..9999 directly to your rescue drive. |
+-------------------------------------------------------------------------+
Corre ext4magic contra la vostra partició de només lectura (o el .img còpia de la instantània en un segon servidor), especificant una marca de temps (-a) des de 5 minuts abans vas córrer docker compose down -v o docker system prune --volumes:
# Install ext4magic on your rescue machine (never on the affected partition)
sudo apt-get install -y ext4magic e2fsprogs
# Dump the ext4 journal from the frozen partition / image to a file in RAM (/dev/shm)
sudo debugfs -R "dump <8> /dev/shm/ext4_journal.copy" /dev/nvme0n1p1
# Recover all files deleted under var/lib/docker/volumes after (Current Time - 15 minutes)
sudo mkdir -p /mnt/external_rescue/docker_recovered
sudo ext4magic /dev/nvme0n1p1 \
-j /dev/shm/ext4_journal.copy \
-f var/lib/docker/volumes \
-a $(date -d "-15 minutes" +%s) \
-r -d /mnt/external_rescue/docker_recovered
-j /dev/shm/ext4_journal.copy: llegeix la instantània del diari que heu desat a la memòria RAM immediatament després d'aturar Docker.
- -f var/lib/docker/volumes: S'orienta a l'arbre de directoris de volums Docker exacte (nota: omet l'inici / en ext4magic camins relatius).
- -a $(date -d "-15 minutes" +%s): diu ext4magic per reconstruir l'arbre de directoris utilitzant còpies d'inode vàlides fa 15 minuts (just abans de l'eliminació accidental).
- -r: recupera directoris complets on no s'ha sobreescrit cap bloc; si -r perd fitxers parcialment sobreescrits, executeu una segona passada per substituir -r amb -m (talla màgica + mode híbrid diari).
Pas 4: tallar fitxers SQLite, PostgreSQL o MySQL InnoDB en brut quan la revista s'hagi embolicat (XFS o ext4)¶
Warning
** Per què XFS no suporta ext4magic i requereix un desmuntatge immediat de només lectura**: A diferència ext4, que escriu còpies completes d'inode de 256 bytes al seu diari, XFS registra els deltes d'intenció de metadades i reutilitza de manera agressiva els arbres B d'inodes alliberats (agi). Si /var/lib/docker s'asseu a un XFS partició (per defecte a RHEL, Rocky Linux, AlmaLinux i Amazon Linux), desmuntant /var/lib/docker o tornar a muntar / la lectura només en qüestió de segons és el pas més important abans de tallar.
Si l'amfitrió utilitza XFS o si el ext4 diari ja embolicat sobre els punters de l'inode, utilitzeu la signatura i l'estructura tallada contra la imatge de disc en brut (docker_host_raw.img):
- Per a bases de dades SQLite3 (
.sqlite,.db- p. ex., Vaultwarden, Nextcloud, Home Assistant, Gitea, Grafana): Cada base de dades SQLite3 comença amb una capçalera ASCII inconfusible de 16 bytes al byte 0 de la seva primera pàgina de 4 kilobytes:53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00("SQLite format 3\0"), i emmagatzema la mida exacta de la pàgina de la base de dades (Bytes 16..17, normalment4096) i la mida total de la base de dades en pàgines (Bytes 28..31, sencer big-endian de 32 bits) just dins de la mateixa capçalera. - Corre
PhotoRecamb[File Opt]->[x] sqlitehabilitat, o escanejar la partició directament ambgrep -ab "SQLite format 3"per trobar el desplaçament exacte de bytes del fitxer SQLite eliminat i extreure-lodd:Un cop extret, córrer# Find the exact byte offsets of every "SQLite format 3" header on the partition: sudo grep -ab "SQLite format 3" /dev/nvme0n1p1sqlite3 carved.db ".recover" | sqlite3 repaired.dbper reconstruir cada pàgina de fulla de l'arbre B intacta.
Tip
Com calcular l'exact dd mida de bytes d'un fitxer SQLite3 desenllaçat de la seva capçalera: una vegada grep -ab "SQLite format 3" us proporciona el desplaçament de bytes inicial OFFSET de la vostra base de dades SQLite suprimida, llegiu bytes 16..17 (uint16 big-endian Mida de la pàgina, p. ex., 0x1000 = 4096 bytes) i bytes 28..31 (uint32 recompte de pàgines big-endian, p. ex., 25000 pàgines) utilitzant hexdump -C -s OFFSET -n 32. Multiplicant Page Size x Page Count us ofereix la longitud exacta de bytes a què passar dd (iflag=skip_bytes,count_bytes) quan el fitxer és contigu al disc.
- Per a MySQL / MariaDB InnoDB (
.ibdfitxers de taula): Cada InnoDB.ibdtaula consta de seqüencials16 KB(16,384byte) pàgines que contenenFIL_PAGE_INDEX(0x45BF) i l'únic de la taulaspace_id. Utilitzeu el Percona / TwinDBundrop-for-innodb(stream_parser+c_parser) conjunt d'eines per escanejar/dev/nvme0n1p1per a tots16 KBPàgines d'índex d'InnoDB i bolqueu cada fila directament als fitxers TSV/SQL per tornar-los a importar. - Per a fitxers Heap PostgreSQL (
$PGDATA/base/<db_oid>/<relfilenode>)*: PostgreSQL emmagatzema cada taula com a contigua8 KB(8,192byte) munt de pàgines que contenenPageHeaderData(pd_lower,pd_upper,pd_special). Utilitzapg_filedumpopglazarus/pduper escanejar regions de disc no assignades8 KBpàgines que coincideixen amb el disseny de tuple de columnes de la taula (HeapTupleHeaderData) i reconstrueix les files.
Fase 4: Kubernetes PVC, PV i etcd Recuperació d'emergència instantània¶
A Kubernetes (EKS, GKE, AKS, k3s, RKE2, kubeadm, OpenShift), eliminant accidentalment un PersistentVolumeClaim (kubectl delete pvc), un StatefulSet o un espai de noms sencer (kubectl delete ns prod) segueix una arquitectura molt diferent a la de Docker autònom.
Escenari A: es veu el PVC Terminating (The Finalizer Lifesaver)¶
Executar:
Si elSTATUS la columna diu Terminating, respira alleujat: les teves dades encara NO s'han esborrat.
- Per què? Cada PVC de Kubernetes creat des de Kubernetes 1.9 inclou automàticament finalizers: [kubernetes.io/pvc-protection].
- Mentre un Pod encara estigui muntant aquest PVC, el controlador de Kubernetes es nega a completar l'eliminació del PVC i mai truca al controlador CSI. DeleteVolume RPC.
- Acció immediata: NO suprimiu o reinicieu el pod, i NO pegueu el finalitzador. Copieu immediatament totes les dades del pod en execució a la vostra màquina local o a un cub S3:
# Stream a compressed tar backup or pg_dump out of the still-running pod immediately:
kubectl exec -n <namespace> <pod-name> -- pg_dumpall -U postgres > ./rescued_k8s_db.sql
# Or tar an entire mounted volume directory out over stdout:
kubectl exec -n <namespace> <pod-name> -- tar czf - /var/lib/postgresql/data > ./rescued_pvc_files.tar.gz
Escenari B: es va suprimir el PVC i kubectl get pv mostra el volum persistent en Released estat (ReclaimPolicy: Retain)¶
Executar:
Si el vostre volum persistent (pv-prod-postgres) encara apareix a la llista STATUS: Released (perquè s'utilitza la seva StorageClass reclaimPolicy: Retain), El 100 per cent de les vostres dades encara es troben sense tocar al disc subjacent. Tanmateix, Kubernetes es nega a deixar que un nou PVC s'uneixi a a Released PV perquè el PV encara conté a spec.claimRef assenyalant els antics PVC esborrats UID.
Com fer a Released PV Available de nou en 10 segons sense pèrdua de dades:
1. Editeu l'objecte PersistentVolume i suprimiu-lo spec.claimRef bloc:
kubectl get pv de nou: l'estat canvia immediatament de Released a Available.
3. Recrea el teu PersistentVolumeClaim (especificant volumeName: <your-pv-name> i capacitat/nomClass d'emmagatzematge coincidents). S'enllaçarà amb el PV existent immediatament amb tots els fitxers intactes.
Escenari C: restauració d'un estat de clúster Kubernetes esborrat des d'un etcd instantània (etcdctl snapshot restore)¶
I si algú corria kubectl delete namespace prod o helm uninstall i va eliminar 200 manifests de Kubernetes, Secrets, ConfigMaps i definicions PV en un sistema autogestionat kubeadm, k3s, o RKE2 avió de control?
- Busca el teu últim
etcdinstantània (per defecte a/var/lib/rancher/k3s/server/db/snapshots/,/var/lib/rancher/rke2/server/db/snapshots/, o el teu programat/var/backups/etcd/snapshot.db). - Verifiqueu la integritat de la instantània abans de tocar el clúster en directe:
- ** Atureu-vos
kube-apiserverietcdal node(s) del pla de control**: - En
kubeadm(beines estàtiques): Moure's/etc/kubernetes/manifests/kube-apiserver.yamli/etc/kubernetes/manifests/etcd.yamltemporalment a/root/manifests_hold/doncskubeletatura els dos contenidors netament i després torna a fer una còpia de seguretat/var/lib/etcda/var/lib/etcd.bak. - En
k3s: Corresudo systemctl stop k3sisudo k3s server --cluster-reset --cluster-reset-restore-path=/path/to/snapshot. - Restaurar el
etcddirectori de dades activatkubeadm: - Mou-te
etcd.yamlikube-apiserver.yamltorna a entrar/etc/kubernetes/manifests/. En 30 segons,kube-apiserveres torna a connectar amb el restauratetcdemmagatzema i tots els objectes Namespace, Secret, ConfigMap i PersistentVolume suprimits reapareixen.
Fase 5: Enduriment dels volums de Docker i Kubernetes contra la supressió accidental¶
Un cop restaurada la vostra base de dades de producció, implementeu aquestes quatre baranes arquitectòniques de manera que un sol error tipogràfic de la CLI no pugui suprimir mai més un volum en directe:
- Canvia tots els Kubernetes de producció
StorageClassdes dereclaimPolicy: DeleteareclaimPolicy: Retain: Per defecte, StorageClasses al núvol integrat (gp2,gp3,standard-rwo) per defectereclaimPolicy: Delete, és a dir, suprimir un PVC destrueix el disc del núvol. Crea unStorageClassambreclaimPolicy: Retain(o pegats els PV existents ambkubectl patch pv <pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}') de manera que suprimir un PVC o un espai de noms mai se suprimeix el volum del bloc subjacent. - Activa la Paperera de reciclatge d'AWS EBS/Programmes d'instantànies de GCP/Velero amb instantànies CSI: l'activació de la Paperera de reciclatge d'AWS EBS conserva qualsevol volum d'EBS suprimit durant 7 a 30 dies, fins i tot si el controlador CSI truca
DeleteVolume. - ** No utilitzeu mai
docker system prune --volumesen scripts de neteja automatitzats o corredors CI/CD**: si un contenidor de base de dades de producció es bloqueja breument (Exited (1)) en el moment exacte en què s'executa un treball crondocker system prune -a --volumes -f, Docker considera els seus volums anònims "no utilitzats" i els suprimeix permanentment. Tira--volumesde tots els scripts de neteja. - ** Utilitzeu muntatges d'enllaç d'amfitrió explícits (
/srv/prod_data/postgres:/var/lib/postgresql/data) o bases de dades gestionades externes per a càrregues de treball de producció amb estat**: a diferència/var/lib/docker/volumes/, host de directoris de muntatge d'enllaç fora/var/lib/docker/són mai tocats perdocker compose down -v,docker volume rm, odocker system prune --volumes.
Números d'emergència regionals i protocols de l'agència¶
Quan la supressió d'un contenidor o d'emmagatzematge de Kubernetes afecta les operacions clíniques de l'hospital, l'enviament de seguretat pública o les dades personals regulades, escala immediatament:
- Estats Units i Canadà: marca
911si una fallada del clúster de contenidors desactiva el seguiment clínic del pacient, els sistemes d'EHR o l'enviament d'emergència. Informeu d'esborrats d'infraestructura de contenidors maliciosos o incidents cibernètics a CISA (1-844-Say-CISA/cisa.gov/report) o el Centre Canadien per a la Ciberseguretat (1-833-CYBER-88). - Regne Unit: marca
999per amenaces a la vida o a la infraestructura crítica del NHS. Segons el RGPD del Regne Unit, la destrucció permanent o la pèrdua de disponibilitat de dades personals sense una còpia de seguretat recuperable requereix avaluar una notificació d'incompliment de 72 hores a l'ICO (0303 123 1113). - Unió Europea: marca
112a tots els estats membres de la UE. Les entitats sota la Directiva NIS2 han d'enviar un avís anticipat al seu CSIRT nacional en un termini de 24 hores després d'una interrupció greu del servei, i la pèrdua permanent de dades personals activa l'informe de l'article 33 del RGPD en un termini de 72 hores. - Austràlia i Nova Zelanda: marca
000a Austràlia o111a Nova Zelanda; informar d'incidències d'infraestructures crítiques a l'ACSC (1300 CYBER1). - Índia i Àsia-Pacífic: marca
112a l'Índia per a la resposta d'emergència; reporteu incidents de seguretat al núvol o als contenidors a CERT-In (incident@cert-in.org.in) dins del període obligatori de 6 hores.
Preguntes freqüents¶
Ho fa docker compose down -v suprimiu els muntatges d'enllaç de l'amfitrió (./data:/var/lib/mysql) o només volums Docker amb nom i anònim?¶
`docker compose down -v` NOMÉS elimina els volums amb nom declarats al `volumes:` secció de `docker-compose.yml` i volums anònims units als contenidors; això mai suprimeix fitxers dins d'un muntatge d'enllaç d'amfitrió (com ara `- /opt/mysql_data:/var/lib/mysql` o `- ./postgres_data:/var/lib/postgresql/data`). Si el vostre fitxer de redacció utilitzava una ruta d'amfitrió que començava per `/` o `./`, comproveu aquesta carpeta a l'amfitrió ara mateix: els vostres fitxers encara estan intactes al 100%.
Per què ho va fer docker system prune --volumes suprimir el volum de la meva base de dades quan només vaig aturar el contenidor durant 2 minuts per actualitzar una variable d'entorn?¶
Espereu amb cura la distinció entre `docker stop` i `docker rm`: si un contenidor és merament `Stopped / Exited` (visible a `docker ps -a`), `docker system prune --volumes` fa no suprimiu els seus volums perquè el contenidor aturat encara hi fa referència. Tanmateix, si vas córrer `docker rm
Puc recuperar un volum de Docker suprimit dins de Docker Desktop en un Mac (Apple Silicon / Intel) o Windows (WSL2)?¶
Sí, si sortiu de Docker Desktop immediatament perquè la màquina virtual deixi de funcionar `fstrim` contra el disc virtual. A macOS, Docker emmagatzema tots els volums de Linux dins `-/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw`; a Windows WSL2, dins `%LocalAppData%\Docker\wsl\disk\docker_data.vhdx`. Copia això `.raw` o `.vhdx` fitxer a un SSD extern immediatament, adjunteu-lo de només lectura a Linux (utilitzant `losetup -Pr` per `.raw` o `qemu-nbd -r` per `.vhdx`), i córrer `ext4magic` o `PhotoRec` contra el virtual `ext4` partició a l'interior.
Què passa si suprimís un Kubernetes StatefulSet amb kubectl delete statefulset postgres? Això també ha suprimit els meus PVC?¶
No. Per defecte a Kubernetes (tret que `persistentVolumeClaimRetentionPolicy.whenDeleted: Delete` es va configurar explícitament a Kubernetes 1.27+), en execució `kubectl delete statefulset` elimina el controlador StatefulSet i els seus pods, deixant-ho tot `PersistentVolumeClaims` (`data-postgres-0`, `data-postgres-1`) i les seves dades subjacents intactes al 100%.. Simplement torneu a aplicar el vostre `StatefulSet` Manifest YAML amb el mateix nom i `volumeClaimTemplates`, i els pods nous es tornaran a connectar automàticament als existents `data-postgres-0` PVC.
Com puc accedir als fitxers dins d'un Docker overlay2 directori quan el contenidor es nega a iniciar (CrashLoopBackOff / Exited (1))?¶
No suprimiu el contenidor bloquejat. Sempre que el contenidor aturat encara existeixi `docker ps -a`, la seva capa d'escriptura i els muntatges de volum estan completament intactes al disc. Podeu copiar fitxers directament fora del contenidor aturat mitjançant `docker cp
Què passa si algú esborra un Kubernetes? Namespace (kubectl delete ns prod) i tots els PVC tenien reclaimPolicy: Delete a AWS EBS o GCP?¶
Si el controlador CSI del núvol (`ebs.csi.aws.com` o `pd.csi.storage.gke.io`) ja executat `DeleteVolume` perquè `reclaimPolicy` era `Delete`, comproveu immediatament tres xarxes de seguretat a nivell de núvol: (1) comproveu **AWS Recycle Paper for EBS Volumes** a la consola AWS EC2 (si hi havia una regla de retenció activa al compte/etiquetes, el volum EBS suprimit es troba a la Paperera de reciclatge i es pot restaurar amb 1 clic); (2) comproveu **Còpia de seguretat d'AWS/DLM/Planificacions d'instantània de GCP** per obtenir la instantània de volum automatitzada més recent; i (3) comproveu si la vostra base de dades transmetia WAL/binlogs (`WAL-G`, `pgBackRest`, `Litestream`) a un cub S3/GCS.
Guies relacionades¶
- Disc del servidor 100% ple (0 bytes lliures): inflor de registre WAL de la base de dades, arbre B danyat i recuperació d'espai zero
rm -rfoMaj+Suprimiraccidental a Linux, macOS o Windows: remuntada immediata de només lectura i tallat d'inode- Corrupció de la cadena d'instantànies de la màquina virtual VMDK, VHDX i qcow2 i rescat d'hipervisor
- Comissió Git accidental de claus AWS, fitxer
.envo clau privada SSH al dipòsit públic de GitHub - Crisi d'allotjament web, migració i restauració de còpies de seguretat
- Còpies de seguretat d'ordinadors, estratègia 3-2-1 i recuperació de desastres
- Números d'emergència per països
Fonts i orientació oficial¶
- Documentació oficial de Kubernetes (
kubernetes.io/ Cloud Native Computing Foundation): Protecció d'objectes d'emmagatzematge en ús (kubernetes.io/pvc-protectionFinalitzadors), Recuperació de volums persistents (Retainvs.Delete), i en funcionamentetcdClústers per a Kubernetes (etcdctl snapshot restore). - Docker Inc. (
docs.docker.com): Gestiona les dades a Docker: volums, muntatges d'enllaç,overlay2Arquitectura del controlador d'emmagatzematge i referència de Prune. - L'organització del nucli de Linux (
kernel.org): El/procSistema de fitxers (procfsObriu la recuperació del descriptor de fitxers mitjançant/proc/<pid>/fd/) i Especificació del diari Ext4. ext4magicDocumentació del projecte (ext4magic.sourceforge.net): Inode forense i recuperació de transaccions de diari en sistemes de fitxers Ext3/Ext4.- Institut Nacional d'Estàndards i Tecnologia (
NIST) (Estats Units): Publicació especial 800-190: Guia de seguretat de contenidors d'aplicacions i recuperació d'incidents.