2013-12-26 1 views
2

Я пытаюсь скопировать таблицу из одной базы данных в другую базу данных (НЕ). Код, который я использовал в терминале, как показано ниже:Не удается скопировать таблицу в другую базу данных с помощью pg_dump

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 

EDIT Я прочитал этот ответ по той же проблеме \N error with psql, он говорит, что вместо INSERT вместо COPY используется INSERT, но в файле 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 
+0

вы можете использовать '-n' указать схему – devanand

ответ

2

Я пытался создать базу данных с кодировкой: UTF8 со столом и вставьте два UTF8 кодированных символов команды КОПИРОВАТЬ пытаются вставить и он работает, когда используя 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 INTO x( 
       first_two_letters) 
     VALUES (U&'\0633\0631'); 

С pgdump documentation вы можете вставить вместо COPY с помощью --inserts опции

--inserts выгрузить данные в INSERT (а не COPY). Это сделает восстановление очень медленным; он в основном полезен для создания дампов, которые могут быть загружены в базы данных non-PostgreSQL . Однако, поскольку этот параметр генерирует отдельную команду для каждой строки, ошибка при перезагрузке строки приводит к потере только этой строки, а не всего содержимого таблицы. Обратите внимание, что восстановление может завершиться неудачно, если у вас есть переупорядоченный порядок столбцов . Параметр --column-inserts безопасен в отношении порядка столбцов изменений, хотя и медленнее.

Попробуйте использовать это вместо того, чтобы на шаге 1:

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

Я также попытался скопировать из таблицы в файл и использовать COPY для импорта, и для меня это работает.

Вы уверены, что ваша кодировка базы данных вашего клиента и сервера UTF8?

Во-первых, экспортировать таблицу с именем «х» из схемы «общественного» на базе данных «тест» в простом текстовом файле 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

+0

@phpGeek Как вы экспортировали данные? и как вы его импортируете? Является ли сервер кодировкой UTF8? Вы можете проверить это, запустив ** SELECT pg_encoding_to_char (encoding) FROM pg_database WHERE имя_файла = 'имя базы данных'; ** У вас другая проблема. – bitek

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 
+0

Я редактировал ответ, попробуйте еще раз. – francs

+0

@phpGeek: Можете ли вы установить как ошибку ms, так и команду шага 2? – francs

 Смежные вопросы

  • Нет связанных вопросов^_^