• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
天之涯神之兵米 显示全部楼层 发表于 2021-10-26 14:04:36 |阅读模式 打印 上一主题 下一主题
前段时间接到了要升级数据库的需求,在公司大佬的引导下搞定了升级的方案,在此记录一下。
查阅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的镜像,然后放好别动:
  1. docker pull postgres:13.1
复制代码
创建升级目录:
  1. #创建备份目录
  2. mkdir /db_update/new_data
  3. cd /db_update
  4. #将旧数据库容器的bin跟data复制出来
  5. docker cp pgdb:/usr/local old_bin
  6. docker cp pgdb:/usr/local old_share
  7. docker cp pgdb:/var/lib/postgresql/data old_data
  8. #授权
  9. chmod -R 777 /db_update/old_data
复制代码
此时目录结构应该是如许的:
  1. #新建一个正式容器,并映射data目录,初始化完成后ctrl+c 退出
  2. 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
  3. #新建一个临时容器,用于升级数据,映射PG10的bin跟data目录,容器内的data跟正式容器映射到同一个目录
  4. 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所需运行文件(血泪教训),可以从旧容器将相关文件复制过来。
  1. #将旧容器的文件复制到本机
  2. docker cp pgdb:/usr/lib /old_lib
  3. docker cp pgdb:/lib /old_lib2
复制代码
此时的目录结构:
  1. #将文件复制到升级容器
  2. docker cp /old_lib tmp:/old_lib
  3. docker cp /old_lib2 tmp:/old_lib2
  4. #将文件复制到对应目录
  5. docker exec -it tmp /bin/bash
  6. cp /old_lib/* /usr/lib/x86_64-linux-gnu/
  7. cp /old_lib/* /usr/lib
  8. cp /old_lib2/* /lib
复制代码
将文件复制完毕后即可以尝试升级数据库,不外仍有大概出现缺少运行库的标题,同时也会有权限的标题,下面会展示怎样办理这两个标题。
  1. #切换数据库用户
  2. su -postgres
  3. #检查是否可以升级,一连串的ok即表示可以执行数据库文件的升级
  4. /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
复制代码
如果出现下图的提示,那就是权限标题,授权一下即可办理。

办理方法:
  1. #在root用户下执行
  2. chown -R postgres/data/old_data
  3. 如果之后包权限错误 需权限 0700 则再执行
  4. chmod -R 0700 /data/old_data
复制代码
再次执行查抄升级命令,错误也再次出现:

已经许多个ok了,所以别慌,执行more pg_upgrade_server.log可以检察具体错误

图中可以看出缺少了libstdc++.so.6这个文件,我们可以手动从旧容器里获取这个文件复制到临时容器内里去。
  1. #新打开一个shell 窗口
  2. cd /var/lib/docker/overlay2
  3. #这条命令会显示多个目录的路径,选择其中之一就行了
  4. find -name libstdc++.so.6
  5. #创建一个文件夹
  6. mkdir /old_lib3
  7. #将库文件复制过去
  8. cp ./0928cba045d2d4cabf1f02fc2d4007e302c925393131c743390dc2266e0f1353/diff/usr/lib/x86_64-linux-gnu/libstdc++.so.6 /old_lib3
  9. #复制到容器
  10. docker cp /old_lib3/ tmp:/old_lib3/
  11. docker exec -it tmp /bin/bash
  12. cp /old_lib3/* /usr/lib/x86_64-linux-gnu/
复制代码

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

看到这连续串ok而且没有返回错误即代表可以正常升级,如果仍然有错误,可以重复上述步骤。
执行升级:
  1. /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内容请搜索草根技术分享从前的文章或继承浏览下面的相关文章盼望大家以后多多支持草根技术分享!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作