대규모 postgresql 덤프를 더 작은 파일로 분할

대규모 postgresql 덤프를 더 작은 파일로 분할

수백 개의 테이블과 해당 데이터가 포함된 1.4GB 크기의 오래된 postgresql 덤프가 있습니다.

이 파일에서는 모든 테이블 생성 문이 먼저 모든 데이터 삽입으로 이어집니다.

다음을 사용하여 파일을 두 개로 나눌 수 있습니다.

file_name=synapse.sql

# devider:
STR='-- Data for Name:' 

# number of lines befotre the devider that should get into the bottom file already:
D=2

# get first occurrence of devider:
K=$(grep -n -- $STR $file_name |head -1|cut -d":" -f1)

# line count (N): 
N=$(wc -l < $file_name)

# length of the bottom file:
L=$(( $N - $K + $D))

# create the top of file: 
head -n $K $file_name > top_$file_name

# create bottom of file: 
tail -n $L $file_name > bottom_$file_name

(원천:https://stackoverflow.com/a/3066968/1069083)

이제 최상위 파일은 다음과 같습니다.

--
-- Name: access_tokens; Type: TABLE; Schema: public; Owner: someone
--

CREATE TABLE access_tokens (
    ...
);


ALTER TABLE access_tokens OWNER TO "someone";

--
-- Name: application_services; Type: TABLE; Schema: public; Owner: someone
...

하단 파일은 다음과 같습니다.

--
-- Data for Name: access_tokens; Type: TABLE DATA; Schema: public; Owner: someone
--

COPY access_tokens (id, user_id, device_id, token, last_used) FROM stdin;
4       @dagobertderkaufhauserpresser:matrix.test.com  \N      MDAxZWxvY2F0aW9uIG1hdHJpeC5lY2xhYnMuZGUKMDAxM2lkZW50aWZpZXIga2V5CjAwMTBjaWQgZ2VuID0gMQowMDQxY2lkIHVzZXJfaWQgPSBAZGFnb2JlcnRkZXJrYXVmaGF1c2VycHJlc3NlcjptYXRyaXguZWNsYWJzLmRlCjAwMTZjaWQgdHlwZSA9IGFjY2VzcwowMDFkY2lkIHRpbWUgPCAxNDU2ODY5OTY0MDk0CjAwMmZzaWduYXR1cmUgqG8q57PffosB-Aob1Szapvu-Bd7j9Sve9-6nPz7hL8QK      \N
5       @wobwob:matrix.test.com        \N      MDAxZWxvY2F0aW9uIG1hdHJpeC5lY2xhYnMuZGUKMDAxM2lkZW50aWZpZXIga2V5CjAwMTBjaWQgZ2VuID0gMQowMDJiY2lkIHVzZXJfaWQgPSBAd29id29iOm1hdHJpeC5lY2xhYnMuZGUKMDAxNmNpZCB0eXBlID0gYWNjZXNzCjAwMWRjaWQgdGltZSA8IDE0NTY4NzM3MTI3NzMKMDAyZnNpZ25hdHVyZSB-PHutqfj3BAB6Mtop5qdiAz70YGSL2Wz7v1w4gj83Zgo  \N
...

이제 하단 파일을 각각 테이블 이름을 파일 이름으로 사용하는 별도의 파일로 분할하려면 어떻게 해야 합니까?

답변1

csplit -s -f file. bottom_$file_name '/^-- Data for Name:/-1' '{*}'
grep -oP '^-- Data for Name:\s*\K[^;]+' file.* | tr ':' ' ' | xargs -l -t mv

새 디렉터리에 생성한 맨 아래 SQL 파일을 배치합니다. 그런 다음 csplit여러 파일로 분할하여 file.nnn형식 이름에 넣습니다. 그런 다음 grep분할된 파일에서 테이블 이름을 xargs가져와 mv.

관련 정보