postgresql-setup –upgrade失败.
/var/lib/pgsql/upgrade_postgresql.log将此失败归因于数据类型为“unknown”的列:“…检查无效’未知’用户列:致命….检查tables_using_unknown.txt”.并且“tables_using_unknown.txt”指定一个表中的一列我希望我可以删除,但不能,因为我无法让服务器启动:
systemctl start postgresql.service失败了
systemctl status postgresql.service抱怨“旧版本的数据库”
我没有找到在Fedora 28上安装postgresql 9.6的明显方法.
有没有办法在没有正在运行的服务器的情况下删除列?或者至少产生一个数据库转储?或者我可以强制升级工具删除数据类型为“未知”的列吗?还是我还缺少其他明显的解决方案?
解决方法
>我使用了一个Docker容器(在同一台机器上)和postgres 9.6来访问“旧”数据库目录,
>将有问题的列从“未知”转换为容器中的“文本”,
>将相关数据库转储到容器主机上的文件中,然后
>将转储的数据库加载到postgres 10.4环境中.
不漂亮,但工作.更详细:
我将postgresql的数据目录(Fedora中的/ var / lib / pgsql / data /)复制到一个新的空目录/ home / hj / pg-problem /中.
我创建了一个名为“Docker-pg-problem”读取的Dockerfile(文本文件)
FROM postgres:9.6 # my databases need German locale; # if you just need en_US,comment the next two lines out. RUN localedef -i de_DE -c -f UTF-8 -A /usr/share/locale/locale.alias de_DE.UTF-8 ENV LANG de_DE.utf8
并将其保存为新的空文件夹/ home / hj / pg-problem / docker /中的唯一文件.
我启动了docker守护程序并运行了一个容器,该容器使用我的有问题数据副本中的数据(在/ home / hj / pg-problem / data /中)作为容器中postgres 9.6服务器的数据目录. (注意:第三行中的“docker build”命令需要一个有效的互联网连接,需要一段时间,并且应该完成说“成功构建”).
root@host: cd /home/hj/pg-problem/docker root@host: service docker start root@host: docker build -t hj/Failed-update -f Dockerfile . root@host: docker run -it --rm -p 5431:5432 -v /home/hj/pg-problem/data:/var/lib/postgresql/data:z --name Failed-update -e POSTGRES_PASSWORD=secret hj/Failed-update
然后,我在容器中打开一个终端来修复数据库:
hj@host: docker exec -it Failed-update bash
在容器内部,我修复并转储了数据库:
root@container: su postgres postgres@container: psql <DB-name> postgres@container: alter table <Table-name> alter column <Col-Name> type text; postgres@container: \q postgres@container: dump_db <DB-name> /var/lib/postgresql/data/dbREPAIRED.sql
我将db直接转储到数据目录中,这样我就可以轻松地从docker主机访问转储文件.
在docker主机上,转储的数据库显然位于/home/hj/pg-problem/data/dbREPAIRED.sql中,从那里我可以将它加载到postgresql 10中:
postgres@host: createdb <DB-name> postgres@host: psql <DB-name> < /home/hj/pg-problem/data/dbREPAIRED.sql
由于我在一台磁盘空间有限的笔记本电脑上,我删除了docker的东西:
root@host: docker rm $(docker ps -a -q) root@host: docker rmi $(docker images -q)