介绍
这篇文章将为大家详细讲解有关怎么在码头工人环境中对PostgreSQL进行升级,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
步骤:
- <李>
_upgrade需要用到新旧容器的本跟数据,所以首先将旧数据库容器的本还有数据文件复制到服务器;
李> <李>开启一个PG13的容器,这个是后面用于服务的正式容器(下文称为正式容器),然后另外开启一个临时容器(下文称为临时容器)用于升级数据文件,将这两个容器的数据库目录映射到同一个目录;
李> <李>PG13的容器内部会缺少很多PG10的运行库,所以需要从旧容器中复制到临时容器里;
李> <李>临时容器将数据升级后,由于跟正式容器的数据文件目录映射到了同一个目录,所以数据可以正常使用,于跟正式容器的数据文件目录映射到了同一个目录,所以数据可以正常使用;
李>首先自然是拉取一个PG13的镜像,然后放好别动:
docker pull postgres: 13.1
创建升级目录:
#创建备份目录 mkdir /db_update/new_data cd /db_update #将旧数据库容器的本跟数据复制出来 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
此时目录结构应该是这样的:
#新建一个正式容器,并映射数据目录,初始化完成后ctrl + c 退出 ,docker run - name=皃g13_new", -v “/db_update/new_data:/var/lib/postgresql/数据/pgdata", -e POSTGRES_USER=dbuser -e POSTGRES_PASSWORD=123456, -e PGDATA=/var/lib/postgresql/数据/pgdata postgres: 13.1 ,#新建一个临时容器,用于升级数据,映射PG10的本跟数据目录,容器内的数据跟正式容器映射到同一个目录 ,docker run  -dti - name=皌mp", -v $ (pwd)/old_bin:/usr/lib/postgresql/10, -v $ (pwd)/old_share:/usr/share/postgresql/10, -v (pwd)/new_data:美元/数据/new_data -v (pwd)/old_data:美元/数据/old_data -e PGDATA:/数据/new_data ——特权=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 #检查是否可以升级,一连串的好即表示可以执行数据库文件的升级/usr/lib/postgresql/13/bin/pg_upgrade -b /usr/lib/postgresql/10/bin -b /usr/lib/postgresql/13/bin -d /数据/old_data -d /数据/new_data -U dbuser -p 5433年,-p 5434年,- c
如果出现下图的提示,那就是权限问题,授权一下即可解决。
解决方法:
#在根用户下执行 chown -R  postgres/数据/old_data 如果之后包权限错误,需权限,0700,则再执行 chmod -R 0700年,/数据/old_data
再次执行检查升级命令,错误也再次出现: