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

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

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

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

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

首先自然是拉取一个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的更多相关文章

  1. docker环境下solrcloud+zookeeper集群部署教程

    前言:两个月前的16年11月份完成的配置,使用的solr6.1和zookeeper3.4,刚刚写成blog,目前版本可能有小版本的变化. 本例完成结果为:在docker环境下部署solrcloud集群 ...

  2. Ubuntu 12.04环境下配置Postgresql和phppgadmin

    Ubuntu 12.04环境下配置Postgresql 9.1 和phppgadmin 本系列文章由ex_net(张建波)编写,转载请注明出处. http://blog.csdn.net/zjianb ...

  3. 手把手教你在Windows环境下升级R

    在Windows环境下,我们可以使用installr包自动将R升级到最新版本.并且可以安装软件.下面主要演示如何在Windows环境下升级R,并将旧版本安装的R包复制到更新版本的R. 1.加载inst ...

  4. [评测]低配环境下,PostgresQL和Mysql读写性能简单对比(欢迎大家提出Mysql优化意见)

    [评测]低配环境下,PostgresQL和Mysql读写性能简单对比 原文链接:https://www.cnblogs.com/blog5277/p/10658426.html 原文作者:博客园--曲 ...

  5. Docker环境下的Mysql8 实现主从数据库数据同步方案

    本文记录下通过MySQL Replication在Docker环境下,通过多个容器 实现数据库主从配置. MySQL Replication就不多解释了,简单说就是MySQL非常出色的一个功能,该功能 ...

  6. docker环境下solr6.0配置(中文分词+拼音)

    前言:这篇文章是基于之前的“linux环境下配置solr5.3详细步骤”(http://www.cnblogs.com/zhangyuan0532/p/4826740.html)进行扩展的.本篇的步骤 ...

  7. Mac+Docker环境下xdebug的配置

    由于容器化的需要,前几天我本地也换成了docker环境.就研究了一下docker环境下phpstorm和xdebug的配置. http://www.mmfei.com/?p=453 这个博客给出了一个 ...

  8. Elasticsearch Docker环境下安装

    Elasticsearch Docker环境下安装 Daemon镜像配置的是https://registry.docker-cn.com Linux:vi /etc/docker/daemon.jso ...

  9. docker环境下mysql参数修改

    原文:docker环境下mysql参数修改 需要修改log_bin为on,看了好几个博客说都需要删掉容器重新生成,然而并非如此, 我们可以用docker cp 命令将docker的文件"下载 ...

随机推荐

  1. PyQt(Python+Qt)学习随笔:QListView的spacing属性

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QListView的spacing属性用于控制视图布局中数据项周围填充的空白空间的大小.缺省值为0, ...

  2. PyQt学习随笔:Qt Designer调用帮助时报错找不到assistant.exe文件的解决办法

    老猿是按照<第15.5节 PyQt5安装与配置>步骤安装的PyQt及相关工具,但最近在Qt Designer中点击帮助相关菜单时报错找不到assistant.exe文件,如图: 按照报错信 ...

  3. 自动化运维工具之Puppet master/agent模型、站点清单和puppet多环境设定

    前文我们了解了puppe中模块的使用,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14086315.html:今天我来了解下puppet的master/age ...

  4. CSS初识- 选择器 &背景& 浮动& 盒子模型

    # CSS初识-目标: > 1. 学会使用CSS选择器 > 2. 熟记CSS样式和外观属性 > 3. 熟练掌握CSS各种基础选择器 > 4. 熟练掌握CSS各种复合选择器 &g ...

  5. 剑指offer二刷——数组专题——数组中出现次数超过一半的数字

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  6. 【题解】P6329 【模板】点分树 | 震波

    题外话 (其实模板题没必要在这里水题解的--主要是想说这个qwq) 小常数的快乐.jpg 我也不知道我为啥常数特别小跑得飞快--不加快读就能在 luogu 的最优解上跑到 rank5 ( 说不定深夜提 ...

  7. 【题解】「P6832」[Cnoi2020]子弦

    [题解]「P6832」[Cnoi2020]子弦第一次写月赛题解( 首先第一眼看到这题,怎么感觉要用 \(\texttt{SAM}\) 什么高科技的?结果一仔细读题,简单模拟即可. 我们不难想出,出现最 ...

  8. 题解-CF1437F Emotional Fishermen

    题面 CF1437F Emotional Fishermen 给 \(n\) 个数的序列 \(a_i\),求有多少种 \(n\) 个数的排列 \(p_i\),使得 \[\frac{a_{p_i}}{\ ...

  9. AcWing 328. 芯片 (二进制写法)

    题目链接 我自闭了,调了一下午,我居然认为 \(2, 3\) 凑不出 \(7\),我怕是个孤儿. 这是一位非要用二进制写的勇士. 首先定义状态 \(S\),若 \(S\) 的二进制第 \(k\) 位为 ...

  10. python作业-2048小游戏

    需了解的知识 Pygame中的各个模块及其功能: Pygame.init():初始化所有导入的模块 pygame.display: pygame.display.init()  -  初始化 disp ...