Azure PostgreSQL服务器服务排序规则创建错误

时间:2017-12-13 11:17:40

标签: postgresql azure azure-sql-database postgresql-9.6

我正在尝试将当前现有数据库导入到在Azure PostgreSQL Server上运行的postgre实例

我已经将我的azure postgresql服务器参数配置为使用UTF8编码(我不确定它是否在没有重启的情况下应用,但即使我没有重启它的选项)

我正在尝试使用此命令执行此操作:

sudo -u postgres pg_dump --encoding="UTF-8" --no-owner DBNAME | psql --host=xxx.postgres.database.azure.com --port=5432 --username=xxx@yyy --dbname=DBNAME

但是它会出现类似这样的错误:

  

错误:无法创建区域设置“en_US.utf8”:无错误

我在这个过程中潜入并尝试使用UTF8(而不是UTF-8)和其他选项运行它,但每次都有相同的错误。

我创建了一个转储文件来检查内容,产生此错误的行是:

CREATE COLLATION "en_US.utf8" (lc_collate = 'en_US.utf8', lc_ctype = 'en_US.utf8');

这导致了这个错误。我试图在Azure postgre实例上手动执行它,我也得到了同样的错误。

顺便说一下,我已经使用这个SQL从控制台创建了DATABASE:

create database "DBNAME" with owner=xxx encoding='UTF-8' template template0;

此外,我尝试了其他选项来创建和导入但不使用它们。

有人可以帮助我吗?

3 个答案:

答案 0 :(得分:1)

我用这个命令解决了我的问题:

sudo -u postgres pg_dump -Fp —no-owner DBNAME |sed “/COLLATE/s/en_US.utf8/English_United States.1252/ig”|sed "/CREATE COLLATION/s/en_US.utf8/English_United States.1252/ig"|psql --host=aaa.postgres.database.azure.com --port=5432 --username=xxx@yyy --dbname=DBNAME

问题来自服务器O.S.差异。我当前的PostgreSQL服务器使用的是Ubuntu,但Azure PostgreSQL Server使用的是Windows,因此整理名称略有不同。

答案 1 :(得分:0)

CREATE COLLATION创建一个独立于操作系统的名称,可用于引用操作系统区域设置(在查询等中)。

此处lc_collate = 'en_US.utf8'lc_ctype = 'en_US.utf8'指的是Linux操作系统区域设置,在Windows上命名不同,Azure PostgreSQL使用它们(并且它们在MacOS上也有所不同)。

在Windows上,这应该可行

CREATE COLLATION "en_US.utf8" (lc_collate = 'English_United States', lc_ctype = 'English_United States');

在MacOS上,

CREATE COLLATION "en_US.utf8" (lc_collate = 'en_US', lc_ctype = 'en_US');

但是大部分时间,您都不想使用CREATE COLLATION创建自己的排序规则,但只能在PostgreSQL中使用预先包含的排序规则。通常,使用pg_dump创建的转储不包含任何CREATE COLLATION语句,因为您还没有自己创建。

除非您对排序规则做了一些特别的事情,否则是否可以删除那些特定于架构的排序规则,以便它们不会被包含在转储中?

答案 2 :(得分:0)

我们之前在运行Atlassian的Confluence时也遇到过同样的问题。 由于排序规则类型不正确,该应用程序无法启动。 我们可以通过直接分配English_United States.1252来解决。

CREATE DATABASE db 
  WITH ENCODING 'UTF8' 
  LC_COLLATE    'English_United States.1252' 
  LC_CTYPE      'English_United States.1252' 
  TEMPLATE      template0 
  OWNER         conf;