在Windows 7中使用以下命令创建的数据库备份文件:
pg_dump -U postgres -Fc [db_name] >D:\[db_backup_file].sql
然后我将其删除并还原为使用以下命令测试该过程:
pg_restore -U postgres -C -d postgres D:\[db_backup_file].sql
一切正常。
但是,当我尝试在另一台设备上的Ubuntu 20.04中还原它时,出现了一个错误:
could not execute query: ERROR: invalid locale name:
(与here相同)
因此,我按照给定的说明创建了数据库,
sudo -u postgres psql
create database [db_name];
然后我在终端中放置以下命令以恢复备份:
pg_restore -U postgres -d postgres /home/../../[db_backup_file].sql
但是我又一次出错了,因为表很多,所以乘以四。 因此,对于每个表,我都会遇到以下错误:
pg_restore: from TOC entry 315; 1259 29971 TABLE [table_name] postgres
pg_restore: error: could not execute query: ERROR: relation [table_name] already exists
Command was: CREATE TABLE public.[table_name] (
[pkey_column_name] integer NOT NULL,
.......
.......
.......
.......
.......
.......
);
pg_restore: from TOC entry 314; 1259 29969 SEQUENCE [table_name]_[pkey_column_name]_seq postgres
pg_restore: error: could not execute query: ERROR: relation "[table_name]_[pkey_column_name]_seq" already
exists
Command was: CREATE SEQUENCE public.[table_name]_[pkey_column_name]_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
pg_restore: from TOC entry 3522; 0 29971 TABLE DATA [table_name] postgres
pg_restore: error: COPY failed for table "[table_name]": ERROR: duplicate key value violates unique constraint "[table_name]_pkey"
DETAIL: Key ([pkey_column_name])=(1) already exists.
CONTEXT: COPY [table_name], line 1
pg_restore: from TOC entry 3267; 2606 29976 CONSTRAINT [table_name] [table_name]_pkey postgres
pg_restore: error:
could not execute query: ERROR: multiple primary keys for table "[table_name]" are not allowed
Command was: ALTER TABLE ONLY public.[table_name]
ADD CONSTRAINT [table_name]_pkey PRIMARY KEY ([pkey_column_name]);
在创建表时,主键(如果与它有关系)被定义为自动递增,形式为:
CREATE TABLE [table_name] (
[pkey_column_name] serial primary key,
.......
.......
.......
.......
.......
.......
);
有人可以帮我吗?
编辑:实际上,昨天我发布的第一个错误中缺少的代码页类型为"Greek_Greece.1253"
。如您所说,我使用了locale -a
命令,并且看到我的Ubuntu操作系统中有en_US.UTF-8
和el_GR.UTF-8
。所以我想知道问题是否可能是Windows和Ubuntu字符集之间的不兼容。如果是的话,我该如何处理呢?
幸运的是,备份文件所来自的Windows 7设备仍在使用中,因此数据库处于活动状态。但是,我试图再次创建提供与ubuntu兼容的LC_COLLATE
和LC_CTYPE
值的数据库的操作无效。
编辑2:最终是Windows-linux在字符编码方面不兼容。
当我尝试将en_US.UTF-8
或el_GR.UTF-8
与以下编码参数一起使用时:
pg_dump -E en_US.UTF-8 -U postgres -Fc [db_name] > D:\[backup_file].sql
我得到了:
pg_dump: invalid client encoding "en_US.UTF-8" specified
然后我尝试在命令恢复之前,先在ubuntu中创建数据库:
CREATE DATABASE database_name WITH ENCODING 'utf8' LC_COLLATE='el_GR.utf8' LC_CTYPE='el_GR.utf8' TEMPLATE template0;
然后:
pg_restore -U postgres -d postgres ~/../../backup_file.sql
但是我遇到的错误与最初发布时一样。
所以解决方案是在Windows中创建一个新数据库,但是现在使用'C'char编码(不接受POSIX),将表从一个数据库复制到另一个数据库:
pg_dump -U postgres -t [table_name] [database_name] | psql -U postgres -d [database_name]
,然后转储新创建的数据库,并在ubuntu环境中还原它。
答案 0 :(得分:1)
可能是您的Ubuntu操作系统没有en_US.UTF-8
语言环境。您可以通过在终端中使用以下命令来检查此问题:
locale -a # list all locales known to OS
如果在列表中找不到语言环境,请尝试根据this post
来创建一个新的语言环境。 编辑
使用Windows编码为Greek_Greece.1253
的其他信息,听起来仍然不匹配。根据{{3}},您可以使用-E选项显式设置编码。可能您想将其设置为Ubuntu可以处理的内容(即en_US.UTF-8
或el_GR.UTF-8
)
-E encoding
--encoding=encoding
Create the dump in the specified character set encoding. By default, the dump is
created in the database encoding. (Another way to get the same result is to set the
PGCLIENTENCODING environment variable to the desired dump encoding.)