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.96) (envelope-from ) id 1whMKH-000Ass-03 for pgsql-announce@arkaria.postgresql.org; Wed, 08 Jul 2026 07:04:09 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1whMKE-005dZq-39 for pgsql-announce@arkaria.postgresql.org; Wed, 08 Jul 2026 07:04:07 +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.96) (envelope-from ) id 1whMKE-005dZh-05 for pgsql-announce@lists.postgresql.org; Wed, 08 Jul 2026 07:04:07 +0000 Received: from mahout.postgresql.org ([2001:4800:3e1:1::227]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1whMKC-0000000075r-32u4 for pgsql-announce@lists.postgresql.org; Wed, 08 Jul 2026 07:04:05 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=postgresql.org; s=20171124; h=Message-ID:Date:Reply-To:From:To:Subject: MIME-Version:Content-Type:Sender:Cc:Content-Transfer-Encoding:Content-ID: Content-Description:In-Reply-To:References; bh=bNE0GyVWFLemB9boCaTgHPkbhO15WitabXDlXHKKxzU=; b=xJ2+dJeojHhkwFbkcB5x0f8Jkp K0c1t86Q2GI3HHMXu/7yFwAiW92FmixyuHDe0+CUKgAolxHsuhSiZpjNvnmEOtj1zQmIzQtE11nMt PZEEqnG3ceRv4gCUnA2U8Wx7TrsF45i0n9ASHm9WqJLEOV4J/+KIzmVoGCyVseq34Iw/Azt6yZXxl siHMm5V732YqIR1UdI2jjOnZJQ9Eyaq5xn28SUlzFTTwV791CiLQpnmnqKoj/8YvBtN6tiAL0NKOW 9CQbOyPOBrL8KJNSpAyyx73MXStYtxB5LhmNBG5kjTTGjE5PkhjuwD3/LrPk5zvKbkBRcFU9VTHGn BoMZLdiA==; Received: from wrigleys.postgresql.org ([217.196.149.60]) by mahout.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1whMKC-000RD9-0d for pgsql-announce@lists.postgresql.org; Wed, 08 Jul 2026 07:04:04 +0000 Received: from localhost ([127.0.0.1] helo=wrigleys.postgresql.org) by wrigleys.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1whMKA-00118J-0Z for pgsql-announce@lists.postgresql.org; Wed, 08 Jul 2026 07:04:03 +0000 Content-Type: multipart/alternative; boundary="===============8523216730336161861==" MIME-Version: 1.0 Subject: PDU: an open source PostgreSQL Data Unloader for full-database offline export and targeted WAL recovery To: PostgreSQL Announce From: PDU PostgreSQL Data Unloader via PostgreSQL Announce Reply-To: o0o0owublabdubdub@gmail.com Date: Wed, 08 Jul 2026 07:03:14 +0000 Message-ID: <178349419424.73862.12288791301277648184@wrigleys.postgresql.org> X-Auto-Response-Suppress: All Auto-Submitted: auto-generated X-pglister-tags: related X-pglister-tagsig: 6391743c35c88340013ca820e41fb25ab072c2dc0a7370cdccb19ffcec93789a List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --===============8523216730336161861== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable PDU helps recover offline PostgreSQL databases by reconstructing metadata, = exporting tables, and reading WAL for targeted row recovery. When a PostgreSQL instance cannot be started, normal SQL tools are no longe= r available. PDU, PostgreSQL Data Unloader, is an open source recovery tool= for that situation. It reads PostgreSQL data files and WAL archives direct= ly, without modifying the original data directory. PDU can reconstruct database, schema, and table metadata while the database= is offline. After the structure is discovered, it can export a single tabl= e, a schema, or a full database with one command. The output is CSV, which = makes it practical to inspect recovered data or load it into another Postgr= eSQL instance. For accidental DELETE and UPDATE operations, PDU can also recover selected = row data from WAL. This recovery path does not rely on tuple remnants left = before VACUUM. Instead, it reads WAL records available on a replica or in W= AL archives, then reconstructs deleted rows or pre-update row versions from= those records. The recovery window therefore depends on WAL availability. Current capabilities include: - offline discovery of PostgreSQL database, schema, and table metadata - export of a single table, a schema, or a full database to CSV - direct reading of PostgreSQL heap and TOAST files - WAL-based recovery of deleted rows and pre-update row versions - recovery support for catalog corruption, accidental DELETE/UPDATE, and da= maged data files - support for PostgreSQL 14 to 18 PDU is intended as an emergency recovery aid. It is not a replacement for b= ackups, PITR, or existing PostgreSQL recovery practices. Project repository: [https://github.com/wublabdubdub/PDU-PostgreSQLDataUnloader ](https://github.com/wublabdubdub/PDU-PostgreSQLDataUnloader) Feedback is welcome, especially around heap/TOAST parsing, offline metadata= reconstruction, WAL decoding, supported data types, and recovery edge case= s. --===============8523216730336161861== Content-Type: text/html; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable PDU: an open source PostgreSQL Data Unloader for full-database o= ffline export and targeted WAL recovery
 

PDU: an open source PostgreSQL Data Unloader for full-database offlin= e export and targeted WAL recovery

PDU helps recover offline PostgreSQL databa= ses by reconstructing metadata, exporting tables, and reading WAL for targe= ted row recovery.

When a PostgreSQL instance cannot be starte= d, normal SQL tools are no longer available. PDU, PostgreSQL Data Unloader,= is an open source recovery tool for that situation. It reads PostgreSQL da= ta files and WAL archives directly, without modifying the original data dir= ectory.

PDU can reconstruct database, schema, and t= able metadata while the database is offline. After the structure is discove= red, it can export a single table, a schema, or a full database with one co= mmand. The output is CSV, which makes it practical to inspect recovered dat= a or load it into another PostgreSQL instance.

For accidental DELETE and UPDATE operations= , PDU can also recover selected row data from WAL. This recovery path does = not rely on tuple remnants left before VACUUM. Instead, it reads WAL record= s available on a replica or in WAL archives, then reconstructs deleted rows= or pre-update row versions from those records. The recovery window therefo= re depends on WAL availability.

Current capabilities include:

  • offline discove= ry of PostgreSQL database, schema, and table metadata
  • export of a sin= gle table, a schema, or a full database to CSV
  • direct reading = of PostgreSQL heap and TOAST files
  • WAL-based recov= ery of deleted rows and pre-update row versions
  • recovery suppor= t for catalog corruption, accidental DELETE/UPDATE, and damaged data files<= /li>
  • support for Pos= tgreSQL 14 to 18

PDU is intended as an emergency recovery ai= d. It is not a replacement for backups, PITR, or existing PostgreSQL recove= ry practices.

Project repository: https://github.com/wublabd= ubdub/PDU-PostgreSQLDataUnloader

Feedback is welcome, especially around heap= /TOAST parsing, offline metadata reconstruction, WAL decoding, supported da= ta types, and recovery edge cases.

This email was sent to you from PDU PostgreSQL Data Unloader. It was delive= red on their behalf by the PostgreSQL project. Any questions about the content of the message shou= ld be sent to PDU PostgreSQL Data Unloader.

You were sent this email as a subscriber of the pgsql-announce mai= linglist, for the content tag Related Open Source. To unsubscribe from further emails, or change which emails you want to receive, please click th= e personal unsubscribe link that you can find in the headers of this email, or visit https://lists.postgresql.org/unsubscribe/.
 
--===============8523216730336161861==--