在导入数据库时,(现在)似乎数据库已删除,然后无法连接。 (这以前一直奏效。导入脚本似乎没有更改)。
整个事情都发生在docker容器中。我的第一个猜测不是问题。
pg_dump --host=$HOSTNAME --create --clean --format=plain --username=$USERNAME --file=$DIR_BACKUPS/$DATABASE-latest.sql $DATABASE
( $ VARIABLES 是从外部填充的。)
我将传递给docker的导出的SQL导入:
cat mydbname-latest.sql | docker exec -i test-postgres-9.6 psql -U postgres
脚本运行时,似乎数据库已删除,但以后无法连接。我猜数据库创建失败。 它确实存在,并且在运行哑巴之前就可以连接。
SET
SET
SET
SET
SET
set_config
------------
(1 row)
SET
SET
SET
DROP DATABASE
ERROR: invalid locale name: "de_DE.UTF-8"
ERROR: database "mydbname" does not exist
\connect: FATAL: database "mydbname" does not exist
为什么在数据库创建失败时脚本失败,这是不可见的?
为什么 ALTER DATABASE 语句会一直运行(如果未创建数据库)?
这是从导出创建的SQL的开始。
--
-- PostgreSQL database dump
--
-- Dumped from database version 9.6.10
-- Dumped by pg_dump version 9.6.10
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;
DROP DATABASE mydbname;
--
-- Name: mydbname; Type: DATABASE; Schema: -; Owner: postgres
--
CREATE DATABASE mydbname WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'de_DE.UTF-8' LC_CTYPE = 'de_DE.UTF-8';
ALTER DATABASE mydbname OWNER TO postgres;
\connect mydbname
...
\ connect mydbname 行可能引发错误。
如果有人需要更多信息,请告诉我。感谢您的帮助。
用于从映像创建docker容器的脚本:
docker run -d --name $DOCKER_CONTAINER_NAME -e POSTGRES_DB=$POSTGRES_DATABASE_NAME -e POSTGRES_USER=$POSTGRES_USER -e POSTGRES_PASSWORD=$POSTGRES_PASSWORD -p $POSTGRES_PORT:5432 -v $POSTGRES_DATA:/var/lib/postgresql/data $DOCKER_IMAGE
设置了以下变量:
DOCKER_CONTAINER_NAME=test-postgres-9.6
DOCKER_IMAGE=test/postgres:9.6
POSTGRES_DATABASE_NAME=mydbname
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_PORT=5402
POSTGRES_DATA=/Users/Itsme/docker/test/psql-data
答案 0 :(得分:1)
Docker确实解决了这个问题!我这边猜错了。
日志文件实际上确实通过日志输出显示了它:
ERROR: invalid locale name: "de_DE.UTF-8"
在Docker中启动的操作系统未设置为处理我想要的语言。
我在德语中设置了SQL哑语。我需要将其存储到使用相同语言设置配置(某种程度上)的OS和数据库中。
我正在使用Mike Dillon的Dockerfile https://github.com/appropriate/docker-postgis/blob/master/9.6-2.4/Dockerfile(2018年6月22日7b8355b)(顺便感谢他:-)。
我确实调整了Dockerfile以使其正常工作:
# Taken from: https://github.com/appropriate/docker-postgis/blob/master/9.6-2.4/Dockerfile (commit 22-JUN-2018 7b8355b985846c1591f596eae0cae78689a36a25)
# Adjusted locales
FROM postgres:9.6
MAINTAINER Mike Dillon <mike@appropriate.io>
ENV POSTGIS_MAJOR 2.4
ENV POSTGIS_VERSION 2.4.4+dfsg-4.pgdg90+1
# manually inserted (idea taken from http://jaredmarkell.com/docker-and-locales/)
RUN apt-get update \
&& apt-get install -y locales locales-all \
&& apt-cache showpkg postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR \
&& apt-get install -y --no-install-recommends \
postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR=$POSTGIS_VERSION \
postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR-scripts=$POSTGIS_VERSION \
postgis=$POSTGIS_VERSION \
&& rm -rf /var/lib/apt/lists/*
ENV LC_ALL de_DE.UTF-8
ENV LANG de_DE.UTF-8
ENV LANGUAGE de_DE.UTF-8
RUN mkdir -p /docker-entrypoint-initdb.d
COPY ./initdb-postgis.sh /docker-entrypoint-initdb.d/postgis.sh
COPY ./update-postgis.sh /usr/local/bin
我确实通过安装 locales 调整了第一个 RUN 命令,然后将环境切换为所需的语言。
顺便说一句,最后一条命令失败,因为它找不到 update-postgis.sh 文件。
帮助我的是http://jaredmarkell.com/docker-and-locales/对这个问题有了一个想法,然后终于有了https://stackoverflow.com/a/41797247/845117的注释,它为我解决了。