V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
fl2d
V2EX  ›  问与答

求助,升级了一下两年没升级的 archlinux, postgresql 挂了。。

  •  
  •   fl2d · 2017-04-14 01:43:13 +08:00 · 5085 次点击
    这是一个创建于 2785 天前的主题,其中的信息可能已经有所发展或是发生改变。
    以前没咋用过 linux 。最近用一个两年没 syu 的 archlinux 服务器,装啥都出奇怪的问题,但也不敢升级,上面跑着好多东西呢,怕出问题。刚才实在忍不了了,战战兢兢的 pacman -syu 了,结果,当真, owncloud 挂了,分析是由于 postgresql 挂了引起的。求助,哪位能指点一下么。。

    还有,如果删除再重装 pgsql 的话,原来的数据库咋保留?网上查的都是在服务运行的状态下 dump ,再升到高版本的 reload ,可我已经升级了,并且服务也不启动了。


    # systemctl start postgresql

    Job for postgresql.service failed because the control process exited with error code.
    See "systemctl status postgresql.service" and "journalctl -xe" for details.



    # systemctl status postgresql.service

    postgresql.service - PostgreSQL database server
    Loaded: loaded (/usr/lib/systemd/system/postgresql.service; enabled; vendor preset: disabled)
    Active: failed (Result: exit-code) since Fri 2017-04-14 02:09:00 ; 7min ago
    Process: 26394 ExecStop=/usr/bin/pg_ctl -s -D ${PGROOT}/data stop -m fast (code=exited, status=0/SUCCESS)
    Process: 5814 ExecStartPre=/usr/bin/postgresql-check-db-dir ${PGROOT}/data (code=exited, status=1/FAILURE)
    Main PID: 17344 (code=exited, status=0/SUCCESS)

    Apr 14 02:09:00 xxx.xxx systemd[1]: Starting PostgreSQL database server...
    Apr 14 02:09:00 xxx.xxx postgres[5814]: An old version of the database format was found.
    Apr 14 02:09:00 xxx.xxx postgres[5814]: You need to dump and reload before using PostgreSQL 9.6.
    Apr 14 02:09:00 xxx.xxx postgres[5814]: See http://www.postgresql.org/docs/9.6/static/upgrading.html
    Apr 14 02:09:00 xxx.xxx systemd[1]: postgresql.service: Control process exited, code=exited status=1
    Apr 14 02:09:00 xxx.xxx systemd[1]: Failed to start PostgreSQL database server.
    Apr 14 02:09:00 xxx.xxx systemd[1]: postgresql.service: Unit entered failed state.
    Apr 14 02:09:00 xxx.xxx systemd[1]: postgresql.service: Failed with result 'exit-code'.



    # journalctl -xe

    Unit postgresql.service has begun starting up.
    Apr 14 02:09:00 xxx.xxx postgres[5814]: An old version of the database format was found.
    Apr 14 02:09:00 xxx.xxx postgres[5814]: You need to dump and reload before using PostgreSQL 9.6.
    Apr 14 02:09:00 xxx.xxx postgres[5814]: See http://www.postgresql.org/docs/9.6/static/upgrading.html
    Apr 14 02:09:00 xxx.xxx systemd[1]: postgresql.service: Control process exited, code=exited status=1
    Apr 14 02:09:00 xxx.xxx systemd[1]: Failed to start PostgreSQL database server.
    -- Subject: Unit postgresql.service has failed
    -- Defined-By: systemd
    -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
    --
    -- Unit postgresql.service has failed.
    --
    -- The result is failed.
    Apr 14 02:09:00 xxx.xxx systemd[1]: postgresql.service: Unit entered failed state.
    Apr 14 02:09:00 xxx.xxx systemd[1]: postgresql.service: Failed with result 'exit-code'.
    第 1 条附言  ·  2017-04-17 18:12:18 +08:00
    多谢大家的帮助,虽然 owncloud 的还是死着,但是数据库的问题貌似解决了。

    按有些朋友的建议,我把老版本一个一个试着装了一遍,然后 systemctl start postgresql ,仍然报错。之后试 pg_upgrade ,还是不行,我随手试了一下 pg_ctl start ,提示让设数据目录的路径。设置后,再 pg_ctl start ,结果神奇的提示我原来数据库的版本号了。于是我再装会那个版本,再 pg_ctl start ,就神奇的启动了。说实话这个命令和 systemctl start postgresql 有啥区别,我也不太清楚。。或许一样的?再回来试 systemctl start postgresql ,也可以启动了。。。真特么是玄学。。我之前肯定装过这个老版本,可是不知为啥当初就不行。。


    但是,根本问题仍然没有解决, owncloud 还是 http error 500 。。新开了一帖: /t/355447 ,还得求助大家。。
    41 条回复    2017-04-14 23:58:13 +08:00
    cnnblike
        1
    cnnblike  
       2017-04-14 02:20:23 +08:00   ❤️ 1
    You need to dump and reload before using PostgreSQL 9.6.
    fl2d
        2
    fl2d  
    OP
       2017-04-14 02:36:35 +08:00
    @cnnblike
    为了让 pgsql 启动,我需要 dump ;为了 dump ,需要启动 pgsql 。死循环了啊。。

    # pg_dumpall > ./backdir/pgsql.old
    pg_dumpall: could not connect to database "template1": could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/run/postgresql/.s.PGSQL.5432"?
    sagaxu
        3
    sagaxu  
       2017-04-14 06:00:20 +08:00 via Android   ❤️ 1
    升级 pgsql 前没读 release notes 么,跨度比较大的版本之间,二进制 db 文件是不兼容的,要用老版本 pgsql 启动 dump 出兼容性高的导出格式,然后导入到新版本 pgsql
    fl2d
        4
    fl2d  
    OP
       2017-04-14 08:16:49 +08:00
    @sagaxu
    没看 T T 。。 直接更新所有了。。我现在已经把 pgsql 升级了,还有办法 dump 以前的数据库不?
    t123yh
        5
    t123yh  
       2017-04-14 08:44:13 +08:00 via Android   ❤️ 1
    @fl2d 可以的,删掉 pgsql ,手动装老版本就可以了,最好把数据库文件手动复制出来备份一下。
    kemad
        6
    kemad  
       2017-04-14 09:16:16 +08:00   ❤️ 1
    binjoo
        7
    binjoo  
       2017-04-14 09:18:13 +08:00
    生产上的版本更新难道不应该很慎重吗?
    ChasYuan
        8
    ChasYuan  
       2017-04-14 09:19:39 +08:00
    两年没升级都敢这么玩。心疼~
    fl2d
        9
    fl2d  
    OP
       2017-04-14 09:24:43 +08:00
    @t123yh
    把 /var/lib/postgres/data 考出来, 然后删了现在的 pgsql ,然后再装老版本,再把 data 文件夹拷回去,是吧?
    多谢!我试试!
    重新装了老版本后,还需要 import 老数据库之类的不?
    murusu
        10
    murusu  
       2017-04-14 09:25:57 +08:00   ❤️ 1
    @fl2d 文档不是说了可以用 pg_upgrade 来离线升级数据库吗?试过还是不行?
    fl2d
        11
    fl2d  
    OP
       2017-04-14 09:28:08 +08:00
    @binjoo
    @ChasYuan 不升级实在没法儿用了,加上我又掉以轻心了。。。。。都是泪。。。。
    noqwerty
        12
    noqwerty  
       2017-04-14 09:29:36 +08:00 via iPhone
    感觉到了 docker 的重要性
    klesh
        13
    klesh  
       2017-04-14 10:15:26 +08:00 via Android   ❤️ 1
    我记得是有个升级的工具的 pg 会带,就是 10 楼说的。你查下文档
    klesh
        14
    klesh  
       2017-04-14 10:16:03 +08:00 via Android
    另生产环境用 arch 有点不太妥当吧
    msg7086
        15
    msg7086  
       2017-04-14 11:03:47 +08:00   ❤️ 1
    我给你的建议,去 Linode/DO/Vultr 任何一个能按小时算钱的地方。
    开一台新机器,装一个 Debian 老版本系统,找版本对应的,数据复制进去, dump 出来。
    再开一台新机器,装一个 Debian 最新版的系统,数据 dump 回去,然后检查数据完整性。
    一切都 OK 的话,再删掉原机器上的库。

    永远不要在没有验证新数据的情况下删除旧数据。
    msg7086
        16
    msg7086  
       2017-04-14 11:05:03 +08:00
    另外 Arch 天生就是必须要经常滚的,你两年不滚的话妥妥要出事啊。
    不滚的话, CentOS / Debian 系都是很好的。
    fl2d
        17
    fl2d  
    OP
       2017-04-14 12:00:11 +08:00
    @t123yh
    我发现我不知道以前老版本是啥啊。。而且,我看文档说,大版本才有不兼容的问题,小版本问题不大啊, 2 年前也是 9.4 9.5 了,现在 9.6 。我 pacman -Rns postgresql 然后再用 pacman -S postgresql 装了几遍,还不行。。

    @murusu
    @klesh
    有点奇怪,按照 pg_upgrade 文档说明,数据目录下面应该有老版本和新版本两个目录,类似于
    /var/lib/postgres/8.4/data
    /var/lib/postgres/9.6/data
    可是我的数据目录只有一个 /var/lib/postgres/data 。。
    根据我贴出来的 systemctl status postgresql.service 的输出结果,能确认是久数据库造成的无法启动么?
    或者那其实只是个 warning 而不是 error ?


    @msg7086
    这个服务器以前不是我玩儿的。我有升级强迫症,要换我,肯定整天 syu 。。
    fl2d
        18
    fl2d  
    OP
       2017-04-14 12:24:51 +08:00
    @t123yh
    @murusu
    @klesh
    @msg7086

    额。。发现了。。源代码里显示完提示就 exit 了。。确实是由于老版本数据格式造成的。。
    可是我咋升级啊?服务不能启动, dump 不能用。 pg_upgrade 也完全和文档里对不上啊。。。

    还有,请问,怎能确定我之前的版本号啊?
    我下到我的 mac 里,装老版本 pgsql , dump 一下,再恢复会去,可以不?



    # Check version of existing PGDATA
    + if [ x`cat "$PGDATA/PG_VERSION"` = x"$PGMAJORVERSION" ]
    + then
    + : A-OK
    + elif [ x`cat "$PGDATA/PG_VERSION"` = x"$PREVMAJORVERSION" ]
    + then
    + echo $"An old version of the database format was found."
    + echo $"See https://wiki.archlinux.org/index.php/PostgreSQL#Upgrading_PostgreSQL"
    + exit 1
    + else
    + echo $"An old version of the database format was found."
    + echo $"You need to dump and reload before using PostgreSQL $PGMAJORVERSION."
    + echo $"See http://www.postgresql.org/docs/$PGMAJORVERSION/static/upgrading.html"
    + exit 1
    + fi
    ho121
        19
    ho121  
       2017-04-14 12:31:43 +08:00 via Android   ❤️ 1
    看看 pacman 的 cache 里有没有老版本的包
    jhaohai
        20
    jhaohai  
       2017-04-14 13:10:47 +08:00
    arch 两年动过居然没升死?
    sujin190
        21
    sujin190  
       2017-04-14 13:19:17 +08:00   ❤️ 1
    日志中已经写了,要用 PostgreSQL 9.6 版本启动,应该是升级系统的时候自动升级了 PostgreSQL 了,你重新安装一个 9.6 版本就是了啊,源里没有的话,可以从官网下载,编译,然后在修改一下配置文件就好了
    sujin190
        22
    sujin190  
       2017-04-14 13:20:14 +08:00
    @fl2d #17 你可以吧 /var/lib/postgres/data cp 成 /var/lib/postgres/8.4/data ,修正一下权限就行了
    jy02201949
        23
    jy02201949  
       2017-04-14 13:44:25 +08:00 via iPhone
    当初就是冲着大家说 arch 滚不死去的,然后。。。我换了 ubuntu
    msg7086
        24
    msg7086  
       2017-04-14 13:55:07 +08:00
    @jy02201949 Ubuntu 连滚都滚不起来了 hhh
    standin000
        25
    standin000  
       2017-04-14 14:00:14 +08:00
    archlinux 滚不死是假象,一定要每次升级时遵循升级文档,一次都不能少。。。
    fl2d
        26
    fl2d  
    OP
       2017-04-14 14:07:40 +08:00
    @ho121

    果然 cache 里有以前的安装包!
    可是不知为啥, pacman -Rns postgresql 后,再用 psql -V 查看版本号,还能显示版本号,并且是最新的,很奇怪。。
    用 pacman -U name 安装上从 cache 里找到的老版本后,还是无法启动服务。。

    应该是原来的 postgresql 删除不彻底,或者版本变量错误造成的吧?
    wangxiyu191
        27
    wangxiyu191  
       2017-04-14 14:08:22 +08:00
    arch 现在这么优秀了么。。两年滚一次系统都不挂了?
    NonClockworkChen
        28
    NonClockworkChen  
       2017-04-14 14:11:29 +08:00
    @msg7086 大神能解释一下什么叫滚,是 Rolling Release,百度了一下,没这方面的介绍..
    jarlyyn
        29
    jarlyyn  
       2017-04-14 14:13:05 +08:00
    系统服务上 docker 是一个好习惯。
    AstroProfundis
        30
    AstroProfundis  
       2017-04-14 14:49:30 +08:00   ❤️ 1
    讲道理楼主这个锅不应该是 Arch 的,最多也只能甩给 postgresql, 我个人是觉得搞大动作前不备份数据是楼主自己的锅...

    首先备份 db 数据文件,卸载当前版本,用上面 cache 里面找到的旧包安装,尝试启动后 dump
    如果装了旧版还是不能启动,你至少看到 cache 知道版本号了,找个一样或者尽可能接近的版本在别的机器上安装好,复制数据文件过去启动起来 dump, 完了回这边的最新版导入

    以及两年不滚的 Arch 不做备份&&细读文档就直接开搞是真猛士,系统没挂已经很给面子了....
    msg7086
        31
    msg7086  
       2017-04-14 15:01:22 +08:00   ❤️ 5
    @NonClockworkChen 过奖了,咱不是大神。

    固定版本的发行版对单个版本内的软件更新是有特殊要求的,就是原则上只能加入 bug fix 而不能更新到新功能版本,或者加入新功能补丁。
    比如说 CentOS 6.0 发布时候用的内核是 2.6.32 ,那么 6.X 永远只会用这个内核版本。会打入无数的补丁,但是永远也不会升级到 3.X 。普通的软件包也是一样,永远只打补丁,不更新功能版本。
    要用新内核,或者新软件,只能上 CentOS 7.x 。(或者用第三方版本库,比如来自 Fedora 的 EPEL )
    一旦一个版本发行了,这个版本的软件就被「冻结」了。

    滚动更新则相反,软件版本不会冻结,而是持续加入新功能,更新到新版本,比如 Arch ,内核出 4.9 了,他很快就会跟进,出 4.10 了,也马上会跟。应用程序也一样, PHP7 出了,也马上就会跟上, Nginx 有了 http2 ,也马上就会跟上。
    这种更新方式就叫做滚动更新。没有固定的发行版本,每时每刻镜像里的软件包都能打包出一个 Nightly 版本。只要你不停更新软件包,就能一直保持在科技前沿。

    固定发行版的好处是软件平台稳定,比如 CentOS 6 发布以后,可以用很多年,那么为其编写的程序也可以长期稳定工作,而不用担心系统更新了以后出现不兼容情况。
    坏处就是,时空完全冻结在发布的那个年代了,不要想着用现代甚至未来的黑科技。
    滚动更新则相反,传统软件很难开发,因为软件版本更迭太快。但是对于互联网行业来说,随时可以用上最新的技术就是其巨大的优势。
    MFC
        32
    MFC  
       2017-04-14 15:11:09 +08:00
    @sagaxu 这东西至今都不如 mysql 流行,看来是有道理的。如果数据库已经很大了,比如几十 G ,那导出导入还不得痛苦死。。。。就为软件升个级就这么折腾。。。。
    NonClockworkChen
        33
    NonClockworkChen  
       2017-04-14 15:11:10 +08:00
    @msg7086 谢谢,解释的很详细,明白了.
    msg7086
        34
    msg7086  
       2017-04-14 15:49:26 +08:00
    @MFC 几十 G 真不大其实。上 T 的数据库那就(手动滑稽
    kkk123
        35
    kkk123  
       2017-04-14 16:33:46 +08:00
    邮件服务器当初被安利装了 psql ,后来想升级发现好可怕。。。先用着不升了,同样入坑的还有 maria...,还是 mysql 妥妥的
    fl2d
        36
    fl2d  
    OP
       2017-04-14 19:04:00 +08:00
    @AstroProfundis

    请问,在类似系统装老版本 postgresql 后,然后怎么导入老数据库啊?
    直接复制到数据文件夹就行了? initdb 怎么正啊?

    现在装了老版本,还是一样的提示, An old version of the database format was found 。。 T T
    pubby
        37
    pubby  
       2017-04-14 19:19:21 +08:00 via Android
    @kkk123 mysql 也一样的,当初一个几年前老版本的 slave 库,升级到 5.7 也起不来,需要安装几个中间版本一步步升级数据库
    AstroProfundis
        38
    AstroProfundis  
       2017-04-14 19:39:35 +08:00
    @fl2d 正常情况应该是直接复制过去启动就行了,还提示版本旧的话.......也许你两年前升级了数据库但没有重启过所以内存里面跑着的一直是更旧的版本?(纯猜测了,但换成我的话这个时候就再找更老的版本一点点往回试...当然备份一定得做好放到安全的地方)
    DesignerSkyline
        39
    DesignerSkyline  
       2017-04-14 19:55:59 +08:00 via Android
    @msg7086 蕾姆酱讲得很清楚了!赞一个
    qceytzn
        40
    qceytzn  
       2017-04-14 21:36:21 +08:00
    @kkk123 maria 不就是 CentOS 7 里的 mysql 吗??我在新的 CentOS 7 里安装 mysql 的话最后都是给我装的 maria
    Tyanboot
        41
    Tyanboot  
       2017-04-14 23:58:13 +08:00
    @kkk123 mariadb 还是可以的,很多发行版里面装 mysql 都会自动换成 mariadb 的。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5998 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 02:09 · PVG 10:09 · LAX 18:09 · JFK 21:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.