Docker環境下升級PostgreSQL的步驟方法詳解
前段時間接到了要升級資料庫的需求,在公司大佬的指導下搞定了升級的方案,在此記錄一下。
查閱PostgreSQL 官方文件 可以得知,官方提供了兩種方式對資料庫進行升級——pg_dumpall與pg_upgrade。
pg_dumpall 是將資料庫轉儲成一個指令碼檔案,然後在新版資料庫中可以直接匯入。這種方式操作簡單,跟著官方文件就能輕鬆操作,但是明顯只適用於資料量較少的情況,在我的測試環境裡,匯入一個2g的資料庫用了將近10分鐘。
所以我這裡選用的是 pg_upgrade ,這種方式是直接將資料檔案升級到高版本,2g資料用時一分多鐘。
目前我手上的專案的PgSql是跑在在Docker上面的,版本是10.x,需求是升級到13.x,簡單講一下步驟:
- _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的方法的文章就介紹到這了,更多相關Docker環境升級PostgreSQL內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!