• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Docker环境下升级PostgreSQL的步骤方法详解

    前段时间接到了要升级数据库的需求,在公司大佬的指导下搞定了升级的方案,在此记录一下。

    查阅PostgreSQL 官方文档 可以得知,官方提供了两种方式对数据库进行升级——pg_dumpall与pg_upgrade。

    pg_dumpall 是将数据库转储成一个脚本文件,然后在新版数据库中可以直接导入。这种方式操作简单,跟着官方文档就能轻松操作,但是明显只适用于数据量较少的情况,在我的测试环境里,导入一个2g的数据库用了将近10分钟。

    所以我这里选用的是 pg_upgrade ,这种方式是直接将数据文件升级到高版本,2g数据用时一分多钟。

    目前我手上的项目的PgSql是跑在在Docker上面的,版本是10.x,需求是升级到13.x,简单讲一下步骤:

    首先自然是拉取一个PG13的镜像,然后放好别动:

    docker pull postgres:13.1

    创建升级目录:

    #创建备份目录
    mkdir /db_update/new_data
    
    cd /db_update
    
    #将旧数据库容器的bin跟data复制出来
    docker cp pgdb:/usr/local old_bin
    docker cp pgdb:/usr/local old_share
    docker cp pgdb:/var/lib/postgresql/data old_data
    
    #授权
    chmod -R 777 /db_update/old_data

    此时目录结构应该是这样的:

    #新建一个正式容器,并映射data目录,初始化完成后ctrl+c 退出
     docker run --name="pg13_new" -v "/db_update/new_data:/var/lib/postgresql/data/pgdata" -e POSTGRES_USER=dbuser -e POSTGRES_PASSWORD=123456 -e PGDATA=/var/lib/postgresql/data/pgdata postgres:13.1
    
     #新建一个临时容器,用于升级数据,映射PG10的bin跟data目录,容器内的data跟正式容器映射到同一个目录
     docker run -dti --name="tmp" -v $(pwd)/old_bin:/usr/lib/postgresql/10 -v $(pwd)/old_share:/usr/share/postgresql/10 -v $(pwd)/new_data:/data/new_data -v $(pwd)/old_data:/data/old_data -e PGDATA:/data/new_data --privileged=true postgres:13.1 /bin/bash

    容器创建完毕先放着,接下来做别的操作。在PG13内会缺失不少PG10所需运行文件(血泪教训),可以从旧容器将相关文件复制过来。

    #将旧容器的文件复制到本机
    docker cp pgdb:/usr/lib /old_lib
    docker cp pgdb:/lib /old_lib2

    此时的目录结构:

    #将文件复制到升级容器
    docker cp /old_lib tmp:/old_lib
    docker cp /old_lib2 tmp:/old_lib2
    
    #将文件复制到对应目录
    docker exec -it tmp /bin/bash
    cp /old_lib/* /usr/lib/x86_64-linux-gnu/
    cp /old_lib/* /usr/lib
    cp /old_lib2/* /lib

    将文件复制完毕后即可以尝试升级数据库,不过仍有可能出现缺少运行库的问题,同时也会有权限的问题,下面会展示如何解决这两个问题。

    #切换数据库用户
    su -postgres
    
    #检查是否可以升级,一连串的ok即表示可以执行数据库文件的升级
    /usr/lib/postgresql/13/bin/pg_upgrade -b /usr/lib/postgresql/10/bin -B /usr/lib/postgresql/13/bin -d /data/old_data -D /data/new_data -U dbuser -p 5433 -P 5434 -c

    如果出现下图的提示,那就是权限问题,授权一下即可解决。

    解决方法:

    #在root用户下执行
    chown -R postgres/data/old_data
    
    如果之后包权限错误 需权限 0700 则再执行
    chmod -R 0700 /data/old_data

    再次执行检查升级命令,错误也再次出现:

    已经很多个ok了,所以别慌,执行more pg_upgrade_server.log可以查看具体错误

    图中可以看出缺少了libstdc++.so.6这个文件,我们可以手动从旧容器里获取这个文件复制到临时容器里面去。

    #新打开一个shell 窗口
    cd /var/lib/docker/overlay2
    #这条命令会显示多个目录的路径,选择其中之一就行了
    find -name libstdc++.so.6
    #创建一个文件夹
    mkdir /old_lib3
    #将库文件复制过去
    cp ./0928cba045d2d4cabf1f02fc2d4007e302c925393131c743390dc2266e0f1353/diff/usr/lib/x86_64-linux-gnu/libstdc++.so.6 /old_lib3
    #复制到容器
    docker cp /old_lib3/ tmp:/old_lib3/
    docker exec -it tmp /bin/bash
    cp /old_lib3/* /usr/lib/x86_64-linux-gnu/

    完成上面的步骤后,再次检查是否可升级:

    看到这一连串ok并且没有返回错误即代表可以正常升级,如果仍然有错误,可以重复上述步骤。

    执行升级:

    /usr/lib/postgresql/13/bin/pg_upgrade -b /usr/lib/postgresql/11/bin -B /usr/lib/postgresql/13/bin -d /data/old_data -D /data/new_data -U dbuser

    至此数据库文件升级完成。

    升级完成之后将 new_data目录按照正常的数据库目录映射到 docker postgres:13.1 容器 启动即可。

    到此这篇关于Docker环境下升级PostgreSQL的方法的文章就介绍到这了,更多相关Docker环境升级PostgreSQL内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • Docker启动PostgreSQL时创建多个数据库的解决方案
    • docker安装并持久化postgresql数据库的操作步骤
    • 用docker运行postgreSQL的方法步骤
    • docker环境下数据库的备份(postgresql, mysql) 实例代码
    • Docker中运行PostgreSQL并推荐几款连接工具
    上一篇:postgresql insert into select无法使用并行查询的解决
    下一篇:postgresql安装及配置超详细教程
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Docker环境下升级PostgreSQL的步骤方法详解 Docker,环境,下,升级,PostgreSQL,