我在 GCS 中有一個大型 (>500GB) Postgres 轉儲,我想從中洗掉COPY命令。鑒于轉儲的大小,我想在gsutil cat流上執行替換而不是在本地存盤:
gsutil cat gs://mybucket.mydomain.com/path/to/mydump.sql | some_command > mydump-commands.sql
該COPY命令可以跨越多行,但始終以\.自己的行結束。
我用 perl 試過:
# some_command =
perl -pe 'BEGIN{undef $/;} s/COPY.*\\.//smg'
這適用于一個小樣本本地檔案(如下),但似乎不適用于從標準輸入流式傳輸。
--
-- PostgreSQL database dump
--
-- Dumped from database version 14.1
-- Dumped by pg_dump version 14.1
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
SET default_tablespace = '';
SET default_table_access_method = heap;
--
-- Name: mytable; Type: TABLE; Schema: dummy; Owner: bchrobot
--
CREATE TABLE dummy.mytable (
id integer,
title text
);
ALTER TABLE dummy.mytable OWNER TO bchrobot;
--
-- Data for Name: mytable; Type: TABLE DATA; Schema: dummy; Owner: bchrobot
--
COPY dummy.mytable (id, title) FROM stdin;
1 my first title
2 my second title
\.
--
-- PostgreSQL database dump complete
--
對此有什么建議,特別是對于使用流?
uj5u.com熱心網友回復:
此sed命令作為 的替換some_command,將洗掉以 開頭COPY的行和由 組成的行之間的所有行\.,包括這兩行。
sed '/^COPY/,/^\\\.$/d'
uj5u.com熱心網友回復:
首先,你也需要逃避這個時期\.。而且由于您有一些行首^和行尾$限制,因此您也應該添加這些限制。
由于您正在流式傳輸輸入,因此您不能undef $/或它將嘗試將所有 500Gb 讀入記憶體,您的程式可能會掛起。您必須以逐行模式閱讀。
您可以嘗試使用觸發器運算子:
perl -ne'print unless /^COPY/ ... /^\\\.$/' psql.txt
如果 LHS 模式匹配為真,則范圍運算子...(或)將為真,并且對于之后的每一行,直到并包括當 RHS 模式為真時。..否則為假。
因此,我們列印所有未包含在此段落中的行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/417081.html
標籤:
