Postgresql Can';t使用pg_dump将表复制到另一个数据库

Postgresql Can';t使用pg_dump将表复制到另一个数据库,postgresql,pg-dump,Postgresql,Pg Dump,我试图将一个表从一个数据库复制到另一个数据库(不是模式)。我在终端中使用的代码如下: pg_dump -U postgres -t OldSchema.TableToCopy OldDatabase | psql -U postgres -d NewDatabase 当我按Enter键时,它请求postgres密码,我输入我的pass,然后它请求psql密码。我输入它并按enter键。我收到很多: invalid command \N ERROR: relation "TableToCopy"

我试图将一个表从一个数据库复制到另一个数据库(不是模式)。我在终端中使用的代码如下:

pg_dump -U postgres -t OldSchema.TableToCopy OldDatabase | psql -U postgres -d NewDatabase
当我按Enter键时,它请求postgres密码,我输入我的pass,然后它请求psql密码。我输入它并按enter键。我收到很多:

invalid command \N
ERROR: relation "TableToCopy" does not exist
两个表都有UTF8编码。我做错什么了吗?
操作系统:windows XP

错误输出:

psql:TblToCopy.sql:39236: invalid command \N
psql:TblToCopy.sql:39237: invalid command \N
psql:TblToCopy.sql:39238: invalid command \N
.
.
.
在上述数百个错误之后,终端会发出回声:

psql:TblToCopy.sql:39245: ERROR: syntax error at or near "509"
LINE 1: 509 some gibberish words and letters here
最后:

sql:TblToCopy.sql:39245: ERROR: relation "TableToCopy" does not exist
编辑 我读了这个对同一个问题的回复,它说使用INSERT而不是COPY,但是在文件pg_dump中创建了COPY。如何说pg_dump使用插入而不是复制


我用iconv将文件转换为utf-8。现在那个错误已经过去了,但我有一个新的错误。在这种特殊情况下,当我使用psql将数据导入数据库时,会发生一些新的情况。表已创建,但没有数据。它说:

SET
SET
SET
SET
SET
SET
SET
SET
CREATE TABLE
ALTER TABLE
psql:tblNew.sql:39610: ERROR:  value too long for type character(3)
CONTEXT:  COPY words, line 1, column first_two_letters: "سر"
ALTER TABLE
ALTER TABLE
CREATE INDEX
CREATE INDEX
CREATE INDEX
CREATE INDEX
CREATE INDEX
CREATE INDEX
CREATE TRIGGER

应引用表名,如下所示

pg_dump -U postgres -t OldSchema."TableToCopy" OldDatabase | psql -U postgres -d NewDatabase
我建议你分两步做

步骤1

pg_dump -U postgres -t OldSchema."TableToCopy" OldDatabase > Table.sql
如果步骤1正常,则执行步骤2

步骤2

psql -U postgres -d NewDatabase -f Table.sql

应引用表名,如下所示

pg_dump -U postgres -t OldSchema."TableToCopy" OldDatabase | psql -U postgres -d NewDatabase
我建议你分两步做

步骤1

pg_dump -U postgres -t OldSchema."TableToCopy" OldDatabase > Table.sql
如果步骤1正常,则执行步骤2

步骤2

psql -U postgres -d NewDatabase -f Table.sql

我试图创建一个带有编码的数据库:UTF8和一个表,并插入COPY命令试图插入的两个UTF-8编码字符,当使用insert时,它可以工作

CREATE DATABASE test
  WITH OWNER = postgres
       ENCODING = 'UTF8'
       TABLESPACE = pg_default
       LC_COLLATE = 'English_United States.1252'
       LC_CTYPE = 'English_United States.1252'
       CONNECTION LIMIT = -1;

CREATE TABLE x
(
  first_two_letters character(3)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE x
  OWNER TO postgres;

INSERT INTO x(
            first_two_letters)
    VALUES ('سر');
根据失败副本的说明,Unicode代码点为:

U+0633 U+0631

这是两个字符,这意味着您应该能够将它们存储在定义为字符(3)的列中,该列存储长度不超过3个字符(不是字节)的字符串

如果我们尝试插入,它会成功:

 INSERT INTO x( 
                first_two_letters) 
        VALUES (U&'\0633\0631');
从中,可以使用--inserts选项插入而不是复制

--插入 将数据转储为插入命令(而不是复制)。这将使恢复非常缓慢;它主要用于生成可以 可以加载到非PostgreSQL数据库中。但是,由于这个选择, 为每行生成单独的命令,这是重新加载行时的错误 只会导致该行丢失,而不会导致整个表内容丢失。 请注意,如果重新安排,恢复可能会完全失败 列顺序。--column inserts选项对列顺序是安全的 改变,尽管更慢

尝试在步骤1中使用此选项:

pg_dump -U postgres -t OldSchema."TableToCopy" --inserts OldDatabase > Table.sql
我也尝试过从一个表复制到一个文件,并使用COPY来导入,对我来说,它是有效的

您确定客户端和服务器数据库编码为UTF8吗

首先,将数据库“test”上的模式“public”中名为“x”的表导出到纯文本SQL文件:

pg_dump -U postgres -t public."x" test > x.sql
创建包含以下内容的x.sql文件:

--
-- PostgreSQL database dump
--
SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;

SET search_path = public, pg_catalog;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- Name: x; Type: TABLE; Schema: public; Owner: postgres; Tablespace: 
--

CREATE TABLE x (
    first_two_letters character(3)
);


ALTER TABLE public.x OWNER TO postgres;

--
-- Data for Name: x; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY x (first_two_letters) FROM stdin;
سر 
\.


--
-- PostgreSQL database dump complete
--
其次,导入时使用:

psql-U postgres-d test-f x.sql

我尝试创建一个带有编码的数据库:UTF8和一个表,并插入复制命令试图插入的两个UTF-8编码字符,当使用insert时,它会起作用

CREATE DATABASE test
  WITH OWNER = postgres
       ENCODING = 'UTF8'
       TABLESPACE = pg_default
       LC_COLLATE = 'English_United States.1252'
       LC_CTYPE = 'English_United States.1252'
       CONNECTION LIMIT = -1;

CREATE TABLE x
(
  first_two_letters character(3)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE x
  OWNER TO postgres;

INSERT INTO x(
            first_two_letters)
    VALUES ('سر');
根据失败副本的说明,Unicode代码点为:

U+0633 U+0631

这是两个字符,这意味着您应该能够将它们存储在定义为字符(3)的列中,该列存储长度不超过3个字符(不是字节)的字符串

如果我们尝试插入,它会成功:

 INSERT INTO x( 
                first_two_letters) 
        VALUES (U&'\0633\0631');
从中,可以使用--inserts选项插入而不是复制

--插入 将数据转储为插入命令(而不是复制)。这将使恢复非常缓慢;它主要用于生成可以 可以加载到非PostgreSQL数据库中。但是,由于这个选择, 为每行生成单独的命令,这是重新加载行时的错误 只会导致该行丢失,而不会导致整个表内容丢失。 请注意,如果重新安排,恢复可能会完全失败 列顺序。--column inserts选项对列顺序是安全的 改变,尽管更慢

尝试在步骤1中使用此选项:

pg_dump -U postgres -t OldSchema."TableToCopy" --inserts OldDatabase > Table.sql
我也尝试过从一个表复制到一个文件,并使用COPY来导入,对我来说,它是有效的

您确定客户端和服务器数据库编码为UTF8吗

首先,将数据库“test”上的模式“public”中名为“x”的表导出到纯文本SQL文件:

pg_dump -U postgres -t public."x" test > x.sql
创建包含以下内容的x.sql文件:

--
-- PostgreSQL database dump
--
SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;

SET search_path = public, pg_catalog;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- Name: x; Type: TABLE; Schema: public; Owner: postgres; Tablespace: 
--

CREATE TABLE x (
    first_two_letters character(3)
);


ALTER TABLE public.x OWNER TO postgres;

--
-- Data for Name: x; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY x (first_two_letters) FROM stdin;
سر 
\.


--
-- PostgreSQL database dump complete
--
其次,导入时使用:

psql-U postgres-d test-f x.sql

您可以使用
-n
指定模式您可以使用
-n
指定schema@phpGeek:你能粘贴错误ms和步骤2的命令吗?@phpGeek:你能粘贴错误ms和步骤2的命令吗?@phpGeek你是如何导出数据的?你是怎么进口的?服务器是否编码UTF8?您可以通过从pg_数据库中运行SELECT pg_encoding_to_char(encoding)来检查这一点,其中datname='database name';您现在遇到了另一个问题。@phpGeek您是如何导出数据的?你是怎么进口的?服务器是否编码UTF8?您可以通过从pg_数据库中运行SELECT pg_encoding_to_char(encoding)来检查这一点,其中datname='database name';你现在有一个不同的问题。