无法使用pg_dump将表复制到另一个数据库

时间:2013-12-26 05:34:00

标签: postgresql pg-dump

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

pg_dump -U postgres -t OldSchema.TableToCopy OldDatabase | psql -U postgres -d NewDatabase

当我按Enter键请求postgres密码我输入我的通行证然后它请求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

修改 我读到了对同一个问题\N error with psql的回复,它说要使用INSERT而不是COPY,但是在文件pg_dump中创建了COPY。怎么说pg_dump使用INSERT而不是COPY?


我用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

2 个答案:

答案 0 :(得分:2)

应引用表名,如下所示

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

答案 1 :(得分:2)

我尝试使用Encoding: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 ('سر');

根据http://rishida.net/tools/conversion/对于失败的COPY,Unicode代码点是:

  

U + 0633 U + 0631

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

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

 INSERT INTO x( 
                first_two_letters) 
        VALUES (U&'\0633\0631');

使用--inserts选项从pgdump documentation可以INSERT而不是COPY

  

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

尝试使用此代替步骤1:

pg_dump -U postgres -t OldSchema."TableToCopy" --inserts OldDatabase > Table.sql

我还尝试从表格复制到文件并使用COPY导入,对我来说它有效。

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

首先,将名为“x”的表从数据库“test”上的模式“public”导出到纯文本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