Postgres安裝
1.事前準備
友情提示:如果不是特別熟悉,在需要debug的情況下,請不要使用docker來搭建,可能是需要一些特殊的參數,
如果有需求或者有想法的可以自行查閱資料,(好用了的話煩請賜教)
由於國內資料比較少,具體的就不自己研究了,這裏僅爲友情提示,以免大家像我一樣浪費寶貴的時間.
1.1 創建用戶
安裝時PostgreSql會根據安裝時你所使用的用戶名來當做初始數據庫名
及用戶名
,所以這裏一定要建一個postgres
用戶.
groupadd postgres
useradd -g postgres postgres
echo "postgress" | passwd --stdin postgres
1.2 安裝包下載&解壓縮
下載地址:可以選擇自己需要的版本.
https://www.postgresql.org/ftp/source/
下載後解壓縮,到自己喜歡的目錄
tar -xzvf postgresql-12.2.tar.gz -C /opt/tools/
將解壓後的目錄owner及group都指定爲postgres用戶
chown -R postgres:postgres /opt/tools/postgresql-12.2
1.3 安裝依賴組件&安裝數據庫服務
yum install -y make gcc-c++ readline-devel zlib-devel
2. 開始安裝
從現在開始請使用postgres用戶進行操作
su - postgres
2.1 configure
首先切入安裝包目錄
cd /opt/tools/postgresql-12.2/
開始進行配置,這裏的選項是爲了讓PostgreSql支持debug.(雖然跟oracle比起來很難用....)
# --prefix 後面接數據庫的安裝位置.
./configure --enable-debug --enable-cassert --disable-thread-safety CFLAGS='-O0 -g' \
--prefix=/home/postgres/pghome
2.2 安裝
建議make和make instal分開執行,有時候配置錯誤會可以少做些無用功
make
make install
2.3 環境變量配置
vi ~/.bashrc
在~/.bashrc中添加如下內容:
export LD_LIBRARY_PATH=$HOME/pghome/lib:$LD_LIBRARY_PATH
export PATH=$HOME/pghome/bin:$PATH
記得重讀配置文件
. ~/.bashrc
or
source ~/.bashrc
2.4 初始化數據庫
首先創建一個目錄,用來存放數據.
mkdir ~/pgdata
也可以選擇性的創建一個日誌文件用來存放日誌
mkdir ~/logs/pglog
ok,初始化數據庫
initdb -d --locale=C -E UTF8 -D ~/pgdata/
2.5 配置文件
- ~/pgdata/pg_hba.conf
將IPv4的相關ADDRESS開放. - ~/pgdata/postgresql.conf
將listen_addreesses = 'localhost'
這一行的註釋打開,並且如果想要讓其他主機訪問時可以換成*
表示任意主機.
接下來就是下面的port = 5432
這個端口信息的註釋也解開.
2.6 啓動,關閉,重啓
- 啓動
pg_ctl -D ~/pgdata -l ~/logs/pglog start
- 關閉
pg_ctl -D ~/pgdata stop
- 重啓
pg_ctl -D ~/pgdata restart
- 其他
pg_ctl --help
登錄的話使用
# -U 用戶名,默認會安裝postgres名的庫和用戶
psql -U postgres
3. 安裝debug插件(可選,根據個人需求)
3.1 下載:
下載地址:
https://git.postgresql.org/gitweb/?p=pldebugger.git
這裏我用的是git方式下載,所以切換到root用戶,或者安裝sudo後,給postgres用戶sudo權限.
這裏需要說明一下,我是直接在/opt/tools/postgresql-12.2/contrib/
目錄中下載的,這是由於該插件編譯時,需要PostgreSql安裝包內文件的依賴,這點在pldebugger的README.pldebugger
文件中也寫的很清楚.
git clone git://git.postgresql.org/git/pldebugger.git
下載之後,將文件夾及其文件的owner和group改爲postgres
sudo chown -R postgres:postgres /opt/tools/postgresql-12.2/contrib/pldebugger
3.2 安裝:
PostgreSQL pl/pgsql Debugger API
================================
This module is a set of shared libraries which implement an API for debugging
pl/pgsql functions on PostgreSQL 8.4 and above. The pgAdmin project
(http://www.pgadmin.org/) provides a client user interface as part of pgAdmin
III v1.10.0 and above, and pgAdmin 4.
If you wish to debug functions on PostgreSQL 8.4, 9.0 or 9.1, please checkout
the PRE-9_2 branch from GIT.
If you wish to debug functions on PostgreSQL 8.2 or 8.3, please checkout the
PRE_8_4_SERVER branch from CVS.
Installation
------------
- Copy this directory to contrib/ in your PostgreSQL source tree.
- Run 'make; make install'
- Edit your postgresql.conf file, and modify the shared_preload_libraries config
option to look like:
shared_preload_libraries = '$libdir/plugin_debugger'
- Restart PostgreSQL for the new setting to take effect.
- Run the following command in the database or databases that you wish to
debug functions in:
CREATE EXTENSION pldbgapi;
(on server versions older than 9.1, you must instead run the pldbgapi--1.1.sql
script directly using psql).
接下來要做的事情很簡單:
make
make install
完成後在~/pghome/lib/目錄中會生成一個plugin_debugger.so
的文件.
3.3 添加配置
在~/pgdata/postgresql.conf文件中,添加響應的引用.
將此行註釋打開,並將後面內容添加到等號右面.
此處的$libdir
是postgres
的一個變量,指的就是~/pghome/lib
目錄
shared_preload_libraries = '$libdir/plugin_debugger'
ok,修改完配置信息後記得重啓服務才能生效
pg_ctl -D ~/pgdata restart
如果配置文件有錯,或者指定的這個文件找不到,那麼會直接報錯,無法啓動.
啓動後進入postgres,可以查詢到剛纔的配置:
show shared_preload_libraries;
注意,到此爲止只是server支持了debug,但是如果想要使用debug時,還需要在相應的數據庫中添加相應的擴展:
CREATE EXTENSION pldbgapi;
順便安利大家一款數據庫軟件,DBeaver,開源的,也很強大,而且同時支持多種數據庫:
如果想要使用DBeaver中的debug功能,還需要安裝一個插件:
這裏也需要注意,要記得這個插件一定要放到public
的schema
中,我個人而言,放到別的shcema中測報錯:PostgreSQL debug plugin is not installed on the server.
- 其他schema中:
- public schema 中:
ok,這樣就可以痛苦的
debug一些函數,或者從其他數據庫移植過來的存儲過程
了(雖然pg沒有存儲過程的概念).
不過,很嚴重的一個問題就是,斷點時走的行數,內容跟你肉眼看到的source完全不同,你根本弄不清走到哪裏,調用了哪個函數,所以你只能藉助debug時候,右上角有個Variable面板,根據特殊的變量值來猜測到哪裏了.
不知道是不是我安裝時編譯源碼的參數有問題,有老司機請賜教.
4. real類型帶來的問題
首先不得不吐槽一下,目前真的覺得PostgreSql的調試功能真的比Oracle要弱…剛接觸不就,純屬個人感官,不喜勿噴.
不過這次還是幫了我的大忙了,再怎麼說也比肉眼看成千上萬行的函數來的好一點…
我們的項目中關於貸款相關的業務中,一個金額的計算比之前多了1!!!通過調查,最後我將原因鎖定在了postgreSql端的某些functions…
由於我們的項目剛剛嘗試從Oracle數據庫換到了PostgreSql,移植之後,由於P家沒有存儲過程的概念,所以之前的存儲過程被切分成了N個函數,一頓調查,最後發現,原來是real
類型的原因!
如圖中所示,如果利率被指定爲real
類型,那麼進行乘法(除法)運算後,小數點之後會有N多位小數,由於金額的計算經常有小數,所以之前都是讓乘積 + 0.9999
之類的,讓小數部分也計算進位,之後再TRUNC掉小數部分.
但是,本案就因爲這樣,以前計算結果明明是整數的金額,被多加上了1.