溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么在Docker環(huán)境中對(duì)PostgreSQL進(jìn)行升級(jí)

發(fā)布時(shí)間:2021-01-08 14:31:18 來源:億速云 閱讀:195 作者:Leah 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)怎么在Docker環(huán)境中對(duì)PostgreSQL進(jìn)行升級(jí),文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

步驟:

  • _upgrade需要用到新舊容器的bin跟data,所以首先將舊數(shù)據(jù)庫容器的bin還有data文件復(fù)制到服務(wù)器;

  • 開啟一個(gè)PG13的容器,這個(gè)是后面用于服務(wù)的正式容器(下文稱為正式容器),然后另外開啟一個(gè)臨時(shí)容器(下文稱為臨時(shí)容器)用于升級(jí)數(shù)據(jù)文件,將這兩個(gè)容器的數(shù)據(jù)庫目錄映射到同一個(gè)目錄;

  • PG13的容器內(nèi)部會(huì)缺少很多PG10的運(yùn)行庫,所以需要從舊容器中復(fù)制到臨時(shí)容器里;

  • 臨時(shí)容器將數(shù)據(jù)升級(jí)后,由于跟正式容器的數(shù)據(jù)文件目錄映射到了同一個(gè)目錄,所以數(shù)據(jù)可以正常使用;于跟正式容器的數(shù)據(jù)文件目錄映射到了同一個(gè)目錄,所以數(shù)據(jù)可以正常使用;

首先自然是拉取一個(gè)PG13的鏡像,然后放好別動(dòng):

docker pull postgres:13.1

創(chuàng)建升級(jí)目錄:

#創(chuàng)建備份目錄
mkdir /db_update/new_data

cd /db_update

#將舊數(shù)據(jù)庫容器的bin跟data復(fù)制出來
docker cp pgdb:/usr/local old_bin
docker cp pgdb:/usr/local old_share
docker cp pgdb:/var/lib/postgresql/data old_data

#授權(quán)
chmod -R 777 /db_update/old_data

此時(shí)目錄結(jié)構(gòu)應(yīng)該是這樣的:

怎么在Docker環(huán)境中對(duì)PostgreSQL進(jìn)行升級(jí)

#新建一個(gè)正式容器,并映射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

 #新建一個(gè)臨時(shí)容器,用于升級(jí)數(shù)據(jù),映射PG10的bin跟data目錄,容器內(nèi)的data跟正式容器映射到同一個(gè)目錄
 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

容器創(chuàng)建完畢先放著,接下來做別的操作。在PG13內(nèi)會(huì)缺失不少PG10所需運(yùn)行文件(血淚教訓(xùn)),可以從舊容器將相關(guān)文件復(fù)制過來。

#將舊容器的文件復(fù)制到本機(jī)
docker cp pgdb:/usr/lib /old_lib
docker cp pgdb:/lib /old_lib2

此時(shí)的目錄結(jié)構(gòu):

怎么在Docker環(huán)境中對(duì)PostgreSQL進(jìn)行升級(jí)

#將文件復(fù)制到升級(jí)容器
docker cp /old_lib tmp:/old_lib
docker cp /old_lib2 tmp:/old_lib2

#將文件復(fù)制到對(duì)應(yīng)目錄
docker exec -it tmp /bin/bash
cp /old_lib/* /usr/lib/x86_64-linux-gnu/
cp /old_lib/* /usr/lib
cp /old_lib2/* /lib

將文件復(fù)制完畢后即可以嘗試升級(jí)數(shù)據(jù)庫,不過仍有可能出現(xiàn)缺少運(yùn)行庫的問題,同時(shí)也會(huì)有權(quán)限的問題,下面會(huì)展示如何解決這兩個(gè)問題。

#切換數(shù)據(jù)庫用戶
su -postgres

#檢查是否可以升級(jí),一連串的ok即表示可以執(zhí)行數(shù)據(jù)庫文件的升級(jí)
/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

如果出現(xiàn)下圖的提示,那就是權(quán)限問題,授權(quán)一下即可解決。

怎么在Docker環(huán)境中對(duì)PostgreSQL進(jìn)行升級(jí)

解決方法:

#在root用戶下執(zhí)行
chown -R postgres/data/old_data

如果之后包權(quán)限錯(cuò)誤 需權(quán)限 0700 則再執(zhí)行
chmod -R 0700 /data/old_data

再次執(zhí)行檢查升級(jí)命令,錯(cuò)誤也再次出現(xiàn):

怎么在Docker環(huán)境中對(duì)PostgreSQL進(jìn)行升級(jí)

已經(jīng)很多個(gè)ok了,所以別慌,執(zhí)行more pg_upgrade_server.log可以查看具體錯(cuò)誤

怎么在Docker環(huán)境中對(duì)PostgreSQL進(jìn)行升級(jí)

圖中可以看出缺少了libstdc++.so.6這個(gè)文件,我們可以手動(dòng)從舊容器里獲取這個(gè)文件復(fù)制到臨時(shí)容器里面去。

#新打開一個(gè)shell 窗口
cd /var/lib/docker/overlay2
#這條命令會(huì)顯示多個(gè)目錄的路徑,選擇其中之一就行了
find -name libstdc++.so.6
#創(chuàng)建一個(gè)文件夾
mkdir /old_lib3
#將庫文件復(fù)制過去
cp ./0928cba045d2d4cabf1f02fc2d4007e302c925393131c743390dc2266e0f1353/diff/usr/lib/x86_64-linux-gnu/libstdc++.so.6 /old_lib3
#復(fù)制到容器
docker cp /old_lib3/ tmp:/old_lib3/
docker exec -it tmp /bin/bash
cp /old_lib3/* /usr/lib/x86_64-linux-gnu/

怎么在Docker環(huán)境中對(duì)PostgreSQL進(jìn)行升級(jí)

完成上面的步驟后,再次檢查是否可升級(jí):

怎么在Docker環(huán)境中對(duì)PostgreSQL進(jìn)行升級(jí)

看到這一連串ok并且沒有返回錯(cuò)誤即代表可以正常升級(jí),如果仍然有錯(cuò)誤,可以重復(fù)上述步驟。

執(zhí)行升級(jí):

/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

怎么在Docker環(huán)境中對(duì)PostgreSQL進(jìn)行升級(jí)

至此數(shù)據(jù)庫文件升級(jí)完成。

升級(jí)完成之后將 new_data目錄按照正常的數(shù)據(jù)庫目錄映射到 docker postgres:13.1 容器 啟動(dòng)即可。

關(guān)于怎么在Docker環(huán)境中對(duì)PostgreSQL進(jìn)行升級(jí)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI