Postgresql/psql重建转储表失败

Postgresql/psql重建转储表失败,postgresql,psql,pg-dump,Postgresql,Psql,Pg Dump,我有一个在Windows 10上使用pgAdmin4(12.0)创建的表。我使用以下命令将数据转储到文件中 "C:\Program Files\PostgreSQL\12\bin\pg_dump.exe" --data-only --file="C:\\Users\\ciris\\DOCUMENTS\\programming\\pg_out\\test.sql" --host="localhost" --port="543

我有一个在Windows 10上使用pgAdmin4(12.0)创建的表。我使用以下命令将数据转储到文件中

"C:\Program Files\PostgreSQL\12\bin\pg_dump.exe" --data-only 
--file="C:\\Users\\ciris\\DOCUMENTS\\programming\\pg_out\\test.sql" 
--host="localhost" --port="5432" --username="postgres" --password --verbose
--format=p --no-owner --no-privileges --table="pc.ebd_sel_pt" "ebird_work"
转储文件约为2GB。我想获取转储文件test.sql,并在linux Postgresql数据库上重新创建该表。我在linux上的psql(v10)中创建了db,使用了:

CREATE TABLE ebc.eb_sel (
global_unique_identifier VARCHAR,
common_name VARCHAR,              
scientific_name VARCHAR,
observation_count VARCHAR, 
state_province VARCHAR,
county VARCHAR,
locality VARCHAR,
longitude NUMERIC(8,5),        
latitude NUMERIC(8,5),       
observation_date DATE,        
time_observations_started VARCHAR,
first_name VARCHAR,
last_name VARCHAR,       
protocol_type VARCHAR,
all_species_reported INTEGER,
sampling_event_identifier VARCHAR,
obs_time TIMESTAMP,
point INTEGER);        
要将数据导入在Windows中创建的表的linux版本,我使用了以下方法:

\COPY ebc.eb_sel 
FROM '/d/data/linux/pgsql/data/dat1/test.sql' 
WITH DELIMITER ',' CSV HEADER;
我在psql中得到一个错误,它说

2020-08-08 07:33:12.005 EDT [2297] ERROR:  missing data for column "common_name"
2020-08-08 07:33:12.005 EDT [2297] CONTEXT:  COPY eb_sel, line 2: "-- PostgreSQL database dump"
2020-08-08 07:33:12.005 EDT [2297] STATEMENT:  COPY  ebc.eb_sel FROM STDIN WITH DELIMITER ',' CSV HEADER;
ERROR:  missing data for column "common_name"
CONTEXT:  COPY eb_sel, line 2: "-- PostgreSQL database dump"
是什么导致了这个错误

编辑-在@GiuseppeSchembri建议我的pg_dump语句是错误的之后,我重写了其中的一部分。现在是:

"C:\Program Files\PostgreSQL\12\bin\pg_dump.exe" --data-only 
--file="C:\\Users\\ciris\\DOCUMENTS\\programming\\pg_out\\test.sql" 
--host="localhost" --port="5432" --username="postgres" --password 
--verbose --format=p --no-owner --no-privileges --dbname="ebird_work" 
--table="pc.ebd_sel_pt"
更具体地说,我将
--table=“pc.ebd_sel_pt”“ebird_work”
更改为
--dbname=“ebird_work”--table=“pc.ebd_sel_pt.”
当我直接回答下面的@GiuseppeSchembri时,db是“ebird_work”,模式是“pc”,表格是“ebd_sel_pt”


我用这个命令创建了一个新的转储文件。我尝试了相同的\COPY语句,但得到了相同的错误。我扔掉了我制作的表格,用所有大写字母重新制作了表格(我想原始表格都是大写的)。

如果你想转储表格
pc.ebd\u sel\u pt
ebid\u work
,你应该写
--table=pc.ebd\u sel\u pt
--table=ebrd\u work
。 您的模式“pc.ebd\u sel\u pt”“ebrd\u work”似乎有可疑的错误,有关详细信息,请参阅
pg\u dump
上的PostgGresql

为第二次尝试而编辑:

最简单的尝试是

Linux机器()上的psql dbname

或者如果要使用
复制

我想知道是否将
pg_dump
一起使用--data only
创建一个适合与
COPY
一起导入的文件

您是否可以尝试使用
复制到
(您必须访问服务器上的
psql
)?(有关详细信息,请参阅)

像这样的

复制表\u名称
至“绝对路径/文件名”
带有分隔符“,”CSV标题;
确保将所有权限授予绝对路径中的文件夹(在windows中,我不知道这是否必要)

但是如果桌子真的很大,你可能会想用一张桌子

pg_dump dbname | gzip>filename.gz


如果将转储从
postgres
v12导入
postgres
v10时遇到问题,您可以在Linux计算机上使用v12创建群集。

转储语句需要更改为:

"C:\Program Files\PostgreSQL\12\bin\pg_dump.exe" 
  --file="C:\Users\ciris\DOCUMENTS\programming\pg_out\all.sql" 
  --host="localhost" --port="5432" --username="postgres" --password --verbose 
  --format=p --no-owner --no-privileges --dbname="ebird_work" --table="p_loc.ebird_sel_spt"
问题显然源于我在原始语句中包含的“-data only”选项。我从有效的
pg_dump
语句中删除了它。以下是从包含“-data only”的
pg_dump
命令输出的SQL文件开头显示的内容:

在不带“-data only”选项的
pg_dump
命令中,输出包括:

--
-- PostgreSQL database dump
--

-- Dumped from database version 12.3
-- Dumped by pg_dump version 12.3

-- Started on 2020-12-15 13:42:54

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;

--
-- TOC entry 226 (class 1259 OID 31041)
-- Name: ebird_sel_spt; Type: TABLE; Schema: pc; Owner: -
--

CREATE TABLE pc.ebird_sel_spt (
    "GLOBAL_UNIQUE_IDENTIFIER" text,
    "COMMON_NAME" text,
    "SCIENTIFIC_NAME" text,
    "OBSERVATION_COUNT" text,
    "STATE_PROVINCE" text,
    "COUNTY" text,
    "LOCALITY" text,
    "LONGITUDE" double precision,
    "LATITUDE" double precision,
    "OBSERVATION_DATE" text,
    "TIME_OBSERVATIONS_STARTED" text,
    "FIRST_NAME" text,
    "LAST_NAME" text,
    "PROTOCOL_TYPE" text,
    "ALL_SPECIES_REPORTED" integer,
    "SAMPLING_EVENT_IDENTIFIER" text,
    "OBS_TIME" timestamp with time zone,
    point integer,
    geom public.geometry(Point,26910),
    pt_lon double precision,
    pt_lat double precision
);


--
-- TOC entry 3730 (class 0 OID 31041)
-- Dependencies: 226
-- Data for Name: ebird_sel_spt; Type: TABLE DATA; Schema: pc; Owner: -
--
[Data...]
pg_dump
code中的
CREATE TABLE
without“--data only”从头开始创建新表,因此我不需要在使用之前创建表

psql new_ebddb < all.sql
psql new\u ebddb

在新数据库中重新创建表。

我明白了。ebird_work是保存pc.ebd模式的数据库。该表名为ebd_sel_pt。我必须通过在web上搜索来找出如何编写\COPY语句。我误解了我写的地方——“table=pc.ebd_sel_pt ebrd_work”。我认为我想得到这个想法的页面/源出于某种原因在最后离开了模式。我认为你的观点帮助我重写了pg_dump语句,但它仍然不正确。我必须尝试另一个版本。@JohnPolo如果您想尝试使用
COPY to
而不是
pg_dump
Hi@GiuseppeSchembri,我编辑了答案。我试了你的建议。还是不行。我意识到dump语句正在创建一个.sql文件,并且我试图使用的\COPY是为csv编写的,因此在\COPY中删除了csv子句。我创建了一个新表,其中包含一个包含LIMIT 100子句的SELECT。我可以打开转储文件,然后查看内部。我没有发现“common_name”列有任何错误。但后来我注意到其他一些列没有正确对齐。因此,某个地方的列似乎有问题。800多万行。。。。。。我不知道如何检查其他列是否存在未对齐的数据。奇怪的是,pgAdmin4从未抱怨过这个问题。我不知道是否有一个“-”或其他原因导致了这个问题。我创建了另一个转储文件,并尝试在cmd中的psql服务器的Windows端重新读取它,该服务器使用的是从中转储表的版本12DB。有两个错误。“common_name”列或“error:extra data after last expected column”列的错误相同。我暂时搁置这个。感谢您的帮助。我重新研究了这个问题,在使用较小的数据库和您提供的一些信息进行实验后找到了答案。我把我的发现写进了一个新的答案。由于你努力帮助我,我使用了这些信息,我想也许你会修改你的答案,包括我答案的基本点(删除“--仅限数据”并从头开始创建新的数据库),然后用你反映我所写内容的更新答案,我可以接受你修改后的答案,这样你就可以获得学分。
psql new_ebddb < all.sql