加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql – pg_upgrade工具失败:无效的“未知”用户列

发布时间:2020-12-13 15:53:43 所属栏目:百科 来源:网络整理
导读:从9.6到10.4的 Postgresql更新(在Fedora 28上)让我感到困惑:一个数据库中的一个表有一列数据类型为“未知”.我很乐意删除该列,但由于我无法启动postgresql服务(因为“找到了旧版本的数据库格式”),我无权访问该数据库.更详细: postgresql-setup –upgrade
从9.6到10.4的 Postgresql更新(在Fedora 28上)让我感到困惑:一个数据库中的一个表有一列数据类型为“未知”.我很乐意删除该列,但由于我无法启动postgresql服务(因为“找到了旧版本的数据库格式”),我无权访问该数据库.更详细:

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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读