Docker環(huán)境下升級(jí)PostgreSQL的步驟方法詳解
前段時(shí)間接到了要升級(jí)數(shù)據(jù)庫(kù)的需求,在公司大佬的指導(dǎo)下搞定了升級(jí)的方案,在此記錄一下。
查閱PostgreSQL 官方文檔 可以得知,官方提供了兩種方式對(duì)數(shù)據(jù)庫(kù)進(jìn)行升級(jí)——pg_dumpall與pg_upgrade。
pg_dumpall 是將數(shù)據(jù)庫(kù)轉(zhuǎn)儲(chǔ)成一個(gè)腳本文件,然后在新版數(shù)據(jù)庫(kù)中可以直接導(dǎo)入。這種方式操作簡(jiǎn)單,跟著官方文檔就能輕松操作,但是明顯只適用于數(shù)據(jù)量較少的情況,在我的測(cè)試環(huán)境里,導(dǎo)入一個(gè)2g的數(shù)據(jù)庫(kù)用了將近10分鐘。
所以我這里選用的是 pg_upgrade ,這種方式是直接將數(shù)據(jù)文件升級(jí)到高版本,2g數(shù)據(jù)用時(shí)一分多鐘。
目前我手上的項(xiàng)目的PgSql是跑在在Docker上面的,版本是10.x,需求是升級(jí)到13.x,簡(jiǎn)單講一下步驟:
- _upgrade需要用到新舊容器的bin跟data,所以首先將舊數(shù)據(jù)庫(kù)容器的bin還有data文件復(fù)制到服務(wù)器;
- 開(kāi)啟一個(gè)PG13的容器,這個(gè)是后面用于服務(wù)的正式容器(下文稱(chēng)為正式容器),然后另外開(kāi)啟一個(gè)臨時(shí)容器(下文稱(chēng)為臨時(shí)容器)用于升級(jí)數(shù)據(jù)文件,將這兩個(gè)容器的數(shù)據(jù)庫(kù)目錄映射到同一個(gè)目錄;
- PG13的容器內(nèi)部會(huì)缺少很多PG10的運(yùn)行庫(kù),所以需要從舊容器中復(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ù)庫(kù)容器的bin跟data復(fù)制出來(lái) 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)該是這樣的:
#新建一個(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)建完畢先放著,接下來(lái)做別的操作。在PG13內(nèi)會(huì)缺失不少PG10所需運(yùn)行文件(血淚教訓(xùn)),可以從舊容器將相關(guān)文件復(fù)制過(guò)來(lái)。
#將舊容器的文件復(fù)制到本機(jī) docker cp pgdb:/usr/lib /old_lib docker cp pgdb:/lib /old_lib2
此時(shí)的目錄結(jié)構(gòu):
#將文件復(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ù)庫(kù),不過(guò)仍有可能出現(xiàn)缺少運(yùn)行庫(kù)的問(wèn)題,同時(shí)也會(huì)有權(quán)限的問(wèn)題,下面會(huì)展示如何解決這兩個(gè)問(wèn)題。
#切換數(shù)據(jù)庫(kù)用戶 su -postgres #檢查是否可以升級(jí),一連串的ok即表示可以執(zhí)行數(shù)據(jù)庫(kù)文件的升級(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)限問(wèn)題,授權(quán)一下即可解決。
解決方法:
#在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):
已經(jīng)很多個(gè)ok了,所以別慌,執(zhí)行more pg_upgrade_server.log可以查看具體錯(cuò)誤
圖中可以看出缺少了libstdc++.so.6這個(gè)文件,我們可以手動(dòng)從舊容器里獲取這個(gè)文件復(fù)制到臨時(shí)容器里面去。
#新打開(kāi)一個(gè)shell 窗口 cd /var/lib/docker/overlay2 #這條命令會(huì)顯示多個(gè)目錄的路徑,選擇其中之一就行了 find -name libstdc++.so.6 #創(chuàng)建一個(gè)文件夾 mkdir /old_lib3 #將庫(kù)文件復(fù)制過(guò)去 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/
完成上面的步驟后,再次檢查是否可升級(jí):
看到這一連串ok并且沒(méi)有返回錯(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
至此數(shù)據(jù)庫(kù)文件升級(jí)完成。
升級(jí)完成之后將 new_data目錄按照正常的數(shù)據(jù)庫(kù)目錄映射到 docker postgres:13.1 容器 啟動(dòng)即可。
到此這篇關(guān)于Docker環(huán)境下升級(jí)PostgreSQL的方法的文章就介紹到這了,更多相關(guān)Docker環(huán)境升級(jí)PostgreSQL內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
postgresql rank() over, dense_rank(), row_number()用法區(qū)別
這篇文章主要介紹了postgresql rank() over, dense_rank(), row_number()的用法區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12關(guān)于PostgreSql數(shù)據(jù)庫(kù)與mysql數(shù)據(jù)庫(kù)的不同點(diǎn)以及注意事項(xiàng)
PostgreSQL和MySQL是兩種流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS),它們都可以用來(lái)存儲(chǔ)和管理數(shù)據(jù),但是它們?cè)谀承┓矫嬗兴煌?下面這篇文章主要給大家介紹了關(guān)于PostgreSql數(shù)據(jù)庫(kù)與mysql數(shù)據(jù)庫(kù)的不同點(diǎn)以及注意事項(xiàng)的相關(guān)資料,需要的朋友可以參考下2023-05-05postgresql的jsonb數(shù)據(jù)查詢和修改的方法
這篇文章主要介紹了postgresql的jsonb數(shù)據(jù)查詢和修改的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Postgresql中json和jsonb類(lèi)型區(qū)別解析
在我們的業(yè)務(wù)開(kāi)發(fā)中,可能會(huì)因?yàn)樘厥狻練v史,偷懶,防止表連接】經(jīng)常會(huì)有JSON或者JSONArray類(lèi)的數(shù)據(jù)存儲(chǔ)到某列中,這個(gè)時(shí)候再PG數(shù)據(jù)庫(kù)中有兩種數(shù)據(jù)格式可以直接一對(duì)多或者一對(duì)一的映射對(duì)象,接下來(lái)通過(guò)本文介紹Postgresql中json和jsonb類(lèi)型區(qū)別,需要的朋友可以參考下2024-06-06postgresql查詢每個(gè)月的最后一天日期并對(duì)未查到的日期結(jié)果補(bǔ)0(操作示例)
這篇文章主要介紹了postgresql查詢每個(gè)月的最后一天日期,并對(duì)未查到的日期結(jié)果補(bǔ)0,pgsql需要使用函數(shù)使用date_trunc()函數(shù)找到指定月第一天,然后對(duì)該日期先加一個(gè)月在減一個(gè)月就能得到你傳給的日期的最后一天日期,感興趣的朋友跟隨小編一起看看吧2023-10-10springboot 沒(méi)法掃描到repository的解決
這篇文章主要介紹了springboot 沒(méi)法掃描到repository的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01Postgresql常用函數(shù)及使用方法大全(看一篇就夠了)
使用函數(shù)可以極大的提高用戶對(duì)數(shù)據(jù)庫(kù)的管理效率,函數(shù)表示輸入?yún)?shù)表示一個(gè)具有特定關(guān)系的值,下面這篇文章主要給大家介紹了關(guān)于Postgresql常用函數(shù)及使用方法的相關(guān)資料,需要的朋友可以參考下2022-11-11PostgreSQL 數(shù)據(jù)同步到ES 搭建操作
這篇文章主要介紹了PostgreSQL 數(shù)據(jù)同步到ES 搭建操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01