这篇文章将为大家详细讲解有关怎么在Docker环境中对PostgreSQL进行升级,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
步骤:
_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进行升级就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。