postgresql 10 升级(upgrade)到 postgresql 12

升级PG10的背景

迫于无奈,之前的pg10从18年一直用到现在,一直好好的。可是,最近升级了一个应用,却提示将不再兼容pg11以下的版本,好吧,这是被迫升级。

于是随便去扫描了一遍数据库的大小:

SELECT
  pg_database.datname,
  pg_size_pretty(pg_database_size(pg_database.datname)) AS SIZE
FROM pg_database;

结果:

datname size
ean 41 GB
china 154 MB
gadm 977 MB
gadm_levels 2239 MB
gitlabhq_production 73 MB
grafana 10 MB
japan_boundary 279 MB
nextcloud2 203 MB
osm_global 511 GB
osm2shp_db 3648 MB
photo_db 275 MB
photo_db_test 8537 kB
poi_db 50 GB
postgres 19 MB
sonar 248 MB
template_postgis 19 MB
template0 7801 kB
template1 7945 kB
timezone 189 MB
wb_osm_db 459 MB
world_boundary 317 MB

看这趋势,升级有点麻烦了,于实果断删掉了osm_global库,老早不更新了,也没用这个了。poi_db也很久不用,不过ean的数据还有点作用,这两个就备份一下然后存着吧,说不定哪天就需要用了。

删除数据之路

没啥好说的,不写了。只是之前 osm_global 这个DB是单独挂载到另一个磁盘来着,删掉db后,居然空间还占用着,有点过分了,于是再删搞定。删除后数据占用大约9.1G。

升级第一步

升级的方案有好几种,其他的方式都有点麻烦,直接dumpall,然后import最简单。

导出, 一定不要用gz, 如磁盘空间够用,加了gz cpu狂飙,硬盘又不是不快,而且导入又得彪一次。

sudo su - postgres
cd /opt/backup/
pg_dumpall > 202007222031.pgsql.dumpall

停用旧版PG10

systemctl stop postgresql-10

停用简单,删除相关postgresql包,中间省略100多个步骤,别提多心酸了,卸载都麻烦。

rpm -qa|grep postgresql
yum remove ......

安装新版PG12 (CentOS 7)

由于之前有安装过,而且是通过yum安装的,直接使用 https://mirrors.tuna.tsinghua.edu.cn/postgresql/ 安装,这个速度杠杠的,不过先安装 https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm 然后修改,/etc/yum.repos.d/pgdg-redhat-all.repo 替换源,并启用pg12.

剩下的过程由于过于血腥就不列了,反正都是安装失败,各种依赖冲突。真忘记了自己两年前怎么解决这些问题的,于是安心上docker。

使用postgresql 的 Docker 安装 PG12

理想情形:

  1. 步骤1: docker pull
  2. 步骤2:start
  3. 步骤3:进入容器
  4. 步骤4:导入数据收工

实际情形:

  1. 官方包不支持postgis
  2. postgis 官方只提供了Dockerfile, 需要自己build。
  3. 然后发现居然都postgis 3.0了,世界发展真快。
  4. 那个docker完全build不动。

生成自己的postgresql12-postgis3.0 镜像

下载dockerfile

cd /opt/docker-file/
git clone git@github.com:postgis/docker-postgis.git
cd docker-postgis/12-3.0

修改Dockerfile,主要替换源,替换postgresql源为清华源,替换debian源为清华源。

# 把这部分插入到RUN的前面
RUN      sed -i "s|//apt.postgresql.org/pub/repos/apt/|//mirrors.tuna.tsinghua.edu.cn/postgresql/repos/apt/|g" /etc/apt/sources.list.d/pgdg.list \
      && sed -i "s|deb.debian.org/debian|mirrors.tuna.tsinghua.edu.cn/debian|g" /etc/apt/sources.list \
      && sed -i "s|security.debian.org/debian-security|mirrors.tuna.tsinghua.edu.cn/debian-security|g" /etc/apt/sources.list \
      && apt-get update \
      # .........

准备Build:

docker build -f ./Dockerfile -t pg-postgis:12-3.0 .

查看状况:

# docker images
pg-postgis      12-3.0        d59a515fe1b1        1 hours ago         489MB
postgres        12            4b52913b0a3a        1 hours ago         313MB

运行postgresql-postgis:12-3.0镜像

挂载 /opt/backup 主要便于数据恢复和备份操作,没需要可以只挂载/var/lib/postgresql/data 具体参数参考官方说明,参数有点多。。。

sudo docker run -d \
    -p 5432:5432 \
    --name postgres \
    --restart always \
    -e POSTGRES_PASSWORD=1234567890 \
    -e PGDATA=/var/lib/postgresql/data/pgdata \
    -v /srv/postgres/data:/var/lib/postgresql/data \
    -v /opt/backup:/var/lib/postgresql/data-backup \
  pg-postgis:12-3.0

最后的最后

一切很完美,完结撒花。。

当前还没有任何评论

写下你最简单的想法