Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tNQmu-00Axfv-Lt for pgsql-general@arkaria.postgresql.org; Tue, 17 Dec 2024 06:10:33 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1tNQmr-00FOGJ-Vt for pgsql-general@arkaria.postgresql.org; Tue, 17 Dec 2024 06:10:31 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tNQmr-00FOGA-Gg for pgsql-general@lists.postgresql.org; Tue, 17 Dec 2024 06:10:30 +0000 Received: from mail-oo1-xc31.google.com ([2607:f8b0:4864:20::c31]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1tNQmp-003F3x-IH for pgsql-general@lists.postgresql.org; Tue, 17 Dec 2024 06:10:29 +0000 Received: by mail-oo1-xc31.google.com with SMTP id 006d021491bc7-5f2ef96ac36so184785eaf.3 for ; Mon, 16 Dec 2024 22:10:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail-com.20230601.gappssmtp.com; s=20230601; t=1734415826; x=1735020626; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=wcSVxqnLH0HZyoxheHf8stadYIL/VLh+IERoa2ZMFbQ=; b=ovUfhNJ8ALZ0R54Y5Mq1COoLrmR6AnKPUYHRCQHadAAkAhxBx+jtRHKk2umIUFpkmf XCX2kdlOBKxctZIX8j14lpIDH4YTcYnLMAv8k5/zeNRFAb1/OU2rJ85usoOndO6JGMNp hk4n0wnP94eXjT5frZzKE0lxWpZmsy4ULBiwr4k/DzlhW8G7zcX8frgZyrLkhFWBcWNz knetKSsvzYfWmKv61fYaa7QRtetayxaeUxU8IMhSsjWoGtHB5KvyD9JyO1jcseED9asd Us38GXIjg4dNsCky16U0M0Bu6CnvI4h7Uy33RyUk8bOP3GOVO/aDjsCeORegxZUUy4ah oMbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734415826; x=1735020626; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=wcSVxqnLH0HZyoxheHf8stadYIL/VLh+IERoa2ZMFbQ=; b=M4CTLcpr1+qdGBrBnINH8MdIzsPCHcjiMDdwYav3MZKz1+epkpNzNP5gf+JotP2g6F XHqJfwNR5dNjVihgo21MGA0waPCywec+uttCE6b/Rj4fxFEpq/7D0PBxf1CIcOGkL3Zz vUoeTSiJtv4tcJx8ca6sljmUof8nxKPsOgnk5xOXt0pHDx/BdTJS10MpHPKUPiIjSv7r z4LeBFj9NL6rOCw6Obx1GGhDLNKxLpSuGZ6aJsfqHEicsHdO3Fwy34LoOKmd0ORr5C4H etrKEtC305wk/xjFYCQZGLQb/v1mAuOnCQBA9D1YkmNyz5R58DGJQCvvUxqZvGMfKrgz 5GMA== X-Gm-Message-State: AOJu0YzneL5BubtwRix6LI886JA6zFtFdm0940sH70jzwKupgr1Nggck qjjzfiRc/yZ5EO9O8SJXUhtQdx9Mqw8qtYIrfO5VLTZtRei1JejeukhzhXrwE+bxQ/uVLwMSzB2 R0HkKfkJXC33PHHuNfXUKTr109eTb40o= X-Gm-Gg: ASbGnct4HIpjZTM5WgjI95vfzaDdiIWoRWlJT3y7N8KcXpH8yNOHdflOpzs5Qp1lS/z SWmj8joasfB3jAOoPPiTZuzoNIjO9y5lAkb7tFA== X-Google-Smtp-Source: AGHT+IH/vdp1stSC/KhiBXHjgHK70mTT7/pA0h9T4nhtZs6k1TFo9Vvt3AngFY1JTB5h87zOfd/MyKAg2z+J55Aznl0= X-Received: by 2002:a4a:de19:0:b0:5f2:37de:5808 with SMTP id 006d021491bc7-5f328ffdef2mr2522795eaf.0.1734415825698; Mon, 16 Dec 2024 22:10:25 -0800 (PST) MIME-Version: 1.0 From: Ivan Kurnosov Date: Tue, 17 Dec 2024 19:10:09 +1300 Message-ID: Subject: How to deal with dangling files after aborted `pg_restore`? To: pgsql-general@lists.postgresql.org Content-Type: multipart/alternative; boundary="0000000000002f089c06297127c7" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000002f089c06297127c7 Content-Type: text/plain; charset="UTF-8" The scenario: 1. There is a postgresql 17 server running 2. Restore dump with `--single-transaction` flag 3. For whatever reason the server goes away (eg: we kill the process) 4. Now `base` directory is filled with abandoned table files which postgresql know nothing about Playground: Terminal 1: Start server: `docker run --rm -it -e POSTGRES_HOST_AUTH_METHOD=trust -v $PWD/postgres:/var/lib/postgresql/data postgres:17.2` Terminal 2: 1. Start container with recent pg_restore: `docker run --rm -it -v $PWD:/app -w /app postgres:17.2 bash` 2. Start dump recovery: `pg_restore -h 172.17.0.2 -U postgres -d postgres --single-transaction -v -Fc --no-owner dump.sql` Terminal 3: 1. Find what container is the server: `docker ps` 2. Kill it: `docker kill d7ecf6e66c1d` Terminal 1: Start the server again, with the same command Terminal 3: Check there are abandoned large files: ``` # ls -la /home/ivan/postgres/base/5 -rw------- 1 systemd-coredump systemd-coredump 342884352 Dec 17 18:58 16399 -rw------- 1 systemd-coredump systemd-coredump 11149312 Dec 17 18:58 16404 -rw------- 1 systemd-coredump systemd-coredump 188416 Dec 17 18:58 16403_fsm -rw------- 1 systemd-coredump systemd-coredump 686145536 Dec 17 18:58 16403 ``` Terminal 2: 1. Confirm those OIDs are not accounted: ``` psql -h 172.17.0.2 -U postgres -c 'select * from pg_class'|grep 16404 psql -h 172.17.0.2 -U postgres -c 'select * from pg_class'|grep 16403 psql -h 172.17.0.2 -U postgres -c 'select * from pg_class'|grep 16399 ``` Hence a question: am I doing something wrong? Is it expected behaviour? If so - how would one recover from this scenario now WITHOUT dropping entire database? -- With best regards, Ivan Kurnosov --0000000000002f089c06297127c7 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
The scenario:

1. There is a = postgresql 17 server running
2. Restore dump with `--single-trans= action` flag
3. For whatever reason the server goes away (eg: we = kill the process)
4. Now `base` directory is filled with abandone= d table files which postgresql know nothing about

= Playground:

Terminal 1:
Start server: `d= ocker run --rm -it -e POSTGRES_HOST_AUTH_METHOD=3Dtrust -v $PWD/postgres:/v= ar/lib/postgresql/data postgres:17.2`

Terminal 2:<= /div>
1. Start container with recent pg_restore: `docker run --rm -it -= v $PWD:/app -w /app postgres:17.2 bash`
2. Start dump recovery: `= pg_restore -h 172.17.0.2 -U postgres -d postgres --single-transaction -v -F= c --no-owner dump.sql`

Terminal 3:
1. Fi= nd what container is the server: `docker ps`
2. Kill it: `docker = kill d7ecf6e66c1d`

Terminal 1:
Start the= server again, with the same command

Terminal 3:
Check there are abandoned large files:
```
# l= s -la=C2=A0/home/ivan/postgres/base/5
<truncated>
-rw------- 1 systemd-coredump systemd-coredump 342884352 Dec 17 18:58 1639= 9
-rw------- 1 systemd-coredump systemd-coredump =C2=A011149312 Dec 17 1= 8:58 16404
-rw------- 1 systemd-coredump systemd-coredump =C2=A0 =C2=A01= 88416 Dec 17 18:58 16403_fsm
-rw------- 1 systemd-coredump systemd-cored= ump 686145536 Dec 17 18:58 16403
```

Ter= minal 2:
1. Confirm those OIDs are not accounted:=C2=A0
```
psql -h 172.17.0.2 -U postgres -c 'select * from pg_clas= s'|grep 16404
psql -h 172.17.0.2 -U postgres -c 'select *= from pg_class'|grep 16403
psql -h 172.17.0.2 -U postgres -c = 'select * from pg_class'|grep 16399
```

Hence a question: am I doing something wrong? Is it expected behavi= our? If so - how would one recover from this scenario now WITHOUT dropping = entire database?

--
With best regards, Ivan Kurnosov
--0000000000002f089c06297127c7--