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

 更新时间:2021年01月08日 10:41:08   作者:exxxxia  
这篇文章主要介绍了Docker环境下升级PostgreSQL的步骤方法详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

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

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

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

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

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

  • _upgrade需要用到新旧容器的bin跟data,所以首先将旧数据库容器的bin还有data文件复制到服务器;
  • 开启一个PG13的容器,这个是后面用于服务的正式容器(下文称为正式容器),然后另外开启一个临时容器(下文称为临时容器)用于升级数据文件,将这两个容器的数据库目录映射到同一个目录;
  • PG13的容器内部会缺少很多PG10的运行库,所以需要从旧容器中复制到临时容器里;
  • 临时容器将数据升级后,由于跟正式容器的数据文件目录映射到了同一个目录,所以数据可以正常使用;于跟正式容器的数据文件目录映射到了同一个目录,所以数据可以正常使用;

首先自然是拉取一个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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • pgsql 实现用户自定义表结构信息获取

    pgsql 实现用户自定义表结构信息获取

    这篇文章主要介绍了pgsql 实现用户自定义表结构信息获取,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • postgresql数据库 timescaledb 时序库 把大数据量表转换为超表的问题

    postgresql数据库 timescaledb 时序库 把大数据量表转换为超表的问题

    这篇文章主要介绍了postgresql数据库 timescaledb 时序库 把大数据量表转换为超表,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 解决PostgreSQL服务启动后占用100% CPU卡死的问题

    解决PostgreSQL服务启动后占用100% CPU卡死的问题

    前文书说到,今天耗费了九牛二虎之力,终于驯服了NTFS权限安装好了PostgreSQL,却不曾想,服务启动后,新的状况又出现了。
    2009-08-08
  • PostgreSQL中json数据类型详解

    PostgreSQL中json数据类型详解

    json数据也可以被存储为text,但是 与text数据类型相比,JSON 数据类型的优势在于能强制要求每个被存储的值符合 JSON 规则,这篇文章主要介绍了PostgreSQL中json数据类型,需要的朋友可以参考下
    2023-04-04
  • Postgresql开启远程访问的步骤全纪录

    Postgresql开启远程访问的步骤全纪录

    postgre一般默认为本地连接,不支持远程访问,所以如果要开启远程访问,需要更改安装文件的配置。下面这篇文章主要给大家介绍了关于Postgresql开启远程访问的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2018-03-03
  • PostgreSQL 实现快速删除一个用户

    PostgreSQL 实现快速删除一个用户

    这篇文章主要介绍了PostgreSQL 实现快速删除一个用户,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Postgresql的日志配置教程详解

    Postgresql的日志配置教程详解

    这篇文章主要介绍了Postgresql的日志配置教程详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • PostgreSQL中date_trunc函数的语法及一些示例

    PostgreSQL中date_trunc函数的语法及一些示例

    这篇文章主要给大家介绍了关于PostgreSQL中date_trunc函数的语法及一些示例的相关资料,DATE_TRUNC函数是PostgreSQL数据库中用于截断日期部分的函数,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-04-04
  • 使用postgresql获取当前或某一时间段的年月日

    使用postgresql获取当前或某一时间段的年月日

    这篇文章主要给大家介绍了关于使用postgresql获取当前或某一时间段的年月日的相关资料,在PostgreSQL中可以使用函数 NOW() 来查询当前时间,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • PostgreSQL关闭数据库服务的三种模式

    PostgreSQL关闭数据库服务的三种模式

    PostgreSQL 提供了三种关闭数据库服务的不同方式,它们最终都是发送一个关闭信号到 postgres 主服务进程,本文将给大家详细的介绍一下这三种模式,需要的朋友可以参考下
    2024-07-07

最新评论