From ad59066637fb14dcc85b47d764162987749c64f3 Mon Sep 17 00:00:00 2001 From: yml2213 Date: Sun, 23 Aug 2026 15:01:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A4=87=E4=BB=BD=E6=81=A2?= =?UTF-8?q?=E5=A4=8D=E6=BC=94=E7=BB=83=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/backend/src/db-backup.ts | 19 +++---------------- deploy/restore-db.sh | 2 +- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/apps/backend/src/db-backup.ts b/apps/backend/src/db-backup.ts index ce12fbe8..a73baa4e 100644 --- a/apps/backend/src/db-backup.ts +++ b/apps/backend/src/db-backup.ts @@ -417,23 +417,10 @@ async function downloadToStdout(storage: ObjectStorage, args: BackupCliArgs): Pr const tempPath = path.join('/tmp', `order-site-backup-${process.pid}-${Date.now()}.dump`) let size = 0 try { - const output = fs.createWriteStream(tempPath, { mode: 0o600 }) - for await (const chunk of stored.reader) { - const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk) - hash.update(buffer) - size += buffer.length - if (!output.write(buffer)) { - await new Promise((resolve, reject) => { - output.once('drain', resolve) - output.once('error', reject) - }) - } - } - await new Promise((resolve, reject) => { - output.once('close', resolve) - output.once('error', reject) - output.end() + const hashingStream = new HashingStream(hash, (chunkSize) => { + size += chunkSize }) + await pipeline(stored.reader, hashingStream, fs.createWriteStream(tempPath, { mode: 0o600 })) const sha256 = hash.digest('hex') const manifest = await readManifest(storage, args.key) diff --git a/deploy/restore-db.sh b/deploy/restore-db.sh index 6338f379..f6c1e416 100755 --- a/deploy/restore-db.sh +++ b/deploy/restore-db.sh @@ -316,7 +316,7 @@ verify_backup() { log "各表行数:" docker exec "${cid}" psql -U postgres -d order_site -At -F '=' \ - -c "SELECT format('SELECT %L, count(*) FROM %I;', tablename) FROM pg_tables WHERE schemaname = 'public' ORDER BY tablename \\gexec" + -c "SELECT tablename, (xpath('/row/count/text()', query_to_xml(format('SELECT count(*) AS count FROM %I.%I', schemaname, tablename), true, false, '')))[1]::text::bigint FROM pg_tables WHERE schemaname = 'public' ORDER BY tablename" log "验证通过,已清理临时容器。建议每月执行一次。" docker rm -f -v "${VERIFY_CONTAINER}" >/dev/null 2>&1 || true