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';你现在有一个不同的问题。