由于這是第2次遇到這個(gè)坑,所以有必要記錄一下,避免有人再次遇到類似的問題,引起心里的慌亂。
問題背景:
由于上云去O需求,項(xiàng)目部打算在oracle服務(wù)器上再安裝一個(gè)PG庫(kù)測(cè)試,這樣便于測(cè)試開發(fā)。同一個(gè)網(wǎng)段的應(yīng)用服務(wù)器連接數(shù)據(jù)庫(kù),也能省去網(wǎng)絡(luò)策略申請(qǐng)開通的麻煩。
當(dāng)前服務(wù)器環(huán)境A:centos6.9x64+oracle11.2.0.4,CPU、內(nèi)存、存儲(chǔ)空間足夠。貌似條件滿足,無問題。
pg開發(fā)版本要求明確選擇12.4版本,庫(kù)名用戶名密碼均已給需求。
梳理了環(huán)境情況,了解到整個(gè)環(huán)境中有生產(chǎn)庫(kù)服務(wù)器B運(yùn)行著pg12.4的版本,并且曾經(jīng)做過tar包的備份,而且那個(gè)時(shí)候tar包不大,也就300M,于是思路很明確:
理論上將這個(gè)tar包,傳輸?shù)侥繕?biāo)服務(wù)器A上,配置環(huán)境變量進(jìn)行解壓就可使用了。
操作步驟:
1.服務(wù)器A機(jī)準(zhǔn)備掛接目錄,劃分lv掛接/app目錄
檢查卷組VolGroup空間剩余107G: vgs
創(chuàng)建邏輯卷: lvcreate -L 100G -n lv_pg VolGroup
創(chuàng)建掛接點(diǎn):mkdir /app
檢查文件系統(tǒng)df -T -h 顯示ext4
創(chuàng)建ext4文件系統(tǒng)并掛接:
mkfs -t ext4 /dev/VolGroup/lv_pg
mount /dev/VolGroup/lv_pg /app
加入重啟自動(dòng)掛接vi /etc/fstab
/dev/VolGroup/lv_pg /app ext4 defaults 1 2
2.服務(wù)器B傳輸tar包到A機(jī)指定目錄,并解壓:
cat /etc/passwd檢查發(fā)現(xiàn)A存在postgres用戶,并且顯示路徑為/var/lib/pgsql,檢查路徑下有個(gè)空backup目錄和空data目錄,懷疑是曾經(jīng)有安裝過pg庫(kù),后來手動(dòng)刪除了。----后續(xù)驗(yàn)證的確如此。
scp B機(jī)IP:/路徑/pg.tar /app/
chown -R postgres:postgres /app
su - postgres
cd /app
tar -xvf pg.tar
vi /var/lib/pgsql/.bash_profile
PGHOME=/app/pgsql
PGDATA=/app/pgsql/data
PATH=$PATH:PGHOME/bin
export PGHOME
export PGDATA
export PATH
3.服務(wù)器A嘗試啟動(dòng)pg,最終成功:
su - postgres
pg_ctl start
提示**/lib64/libc.so.6:version `GLIBC_2.14’ not found**

檢查發(fā)現(xiàn)ll /lib64/libc.so.6對(duì)應(yīng)的是glibc_2.12版本。
ll /lib64/libc.so.6
lrwxrwxrwx 1 root root 19 Sep 23 08:29 /lib64/libc.so.6 -> /lib64/libc-2.12.so
需要升級(jí)glibc。
于是根據(jù)https://blog.csdn.net/officercat/article/details/39520227進(jìn)行了升級(jí)(耗時(shí)10分鐘左右)。
wget http://ftp.gnu.org/gnu/glibc/glibc-2.15.tar.gz
tar -xvf glibc-2.15.tar.gz
mkdir glibc-build-2.15
cd glibc-build-2.15
../glibc-2.15/configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
make
make install
完成后
$ cd glibc-build-2.15
$ ll libc.so.6
lrwxrwxrwx 1 root root 7 Sep 23 07:41 libc.so.6 -> libc.so
$ strings libc.so | grep GLIBC
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_2.13
GLIBC_2.14
GLIBC_2.15
GLIBC_PRIVATE
嘗試啟動(dòng)pg,竟然提示已經(jīng)有啟動(dòng)的進(jìn)程實(shí)例。但ps -ef|grep postgres、ps -ef|grep pg和netstat -ano|grep LISTEN|grep 5432均沒有發(fā)現(xiàn)pg進(jìn)程。
比較奇怪?
rpm -aq|grep postgres發(fā)現(xiàn)果然有曾經(jīng)yum安裝的pg軟件,而且是8.x版本的。
通過yum remove postgres* -y刪除卸載。
再次用pg_ctl start啟動(dòng)還是失敗,提示postgresql.conf文件的監(jiān)聽地址不對(duì)(原先tar包記錄的是B機(jī)的IP地址),修改為*號(hào)即可,再次啟動(dòng)成功。
psql連接提示密碼錯(cuò)誤拒絕,其實(shí)密碼是對(duì)的,根據(jù)提示修改pg_hba.conf的local行 md5為trust,順利登錄。
另外注意修改shared_buffers大小,調(diào)整為適當(dāng)?shù)膬?nèi)存大小提示性能。檢查free -g查看剩余內(nèi)存。
4.此時(shí)意識(shí)到該機(jī)還有個(gè)oracle庫(kù),想確認(rèn)下sga和pga的分配情況,這樣便于評(píng)估pg庫(kù)的內(nèi)存分配大小,避免內(nèi)存不足問題。
當(dāng)在oracle用戶下,執(zhí)行sqlplus / as sysdba時(shí),竟然提示Segmentation fault

這時(shí)心里真有點(diǎn)慌了,
檢查ps -ef|grep ora_進(jìn)程都還在。詢問項(xiàng)目組人員,客戶端和應(yīng)用連接數(shù)據(jù)庫(kù)反饋均還正常,松了一口氣(這種情況下,如果主機(jī)不宕,數(shù)據(jù)庫(kù)不宕,就不會(huì)馬上引起故障,但一旦主機(jī)或庫(kù)掛了,就無法再啟動(dòng)oracle數(shù)據(jù)庫(kù))。
根據(jù)Segmentation fault查了一下自己曾經(jīng)記錄的blog,突然發(fā)現(xiàn)自己在去年遇到過類似的問題(想起當(dāng)時(shí)是在oracle測(cè)試服務(wù)器上打算安裝pg測(cè)試庫(kù)),有了經(jīng)驗(yàn),處理起來就不慌不忙了。
處理辦法:
相同操作系統(tǒng)版本,redhat6.9和centos6.9的一樣。
在GLIBC_2.12老版本的環(huán)境,將/lib64目錄打包scp到服務(wù)器A,為了防止意外,先備份服務(wù)器A的/lib64目錄,然后替換老版本/lib64,效果明顯(曾經(jīng)嘗試卸載新的glic,無效),再次執(zhí)行sqlplus / as sysdba恢復(fù)正常。
此時(shí)psql 連接失敗,不過從其它客戶端是可以連接此已經(jīng)啟動(dòng)成功的pg庫(kù)的。

小結(jié):
1.升級(jí)gblic版本務(wù)必小心,升級(jí)前建議做好/lib64目錄的tar備份。linux6.x的系統(tǒng)glibc版本較低,大概率會(huì)遇到此問題。不一定只是安裝pg12.4會(huì)遇到,安裝其它版本或其它軟件也可能會(huì)遇到,需注意。
2.由于pg庫(kù)是過渡階段測(cè)試開發(fā)使用,在沒有其它可以服務(wù)器的情況下,可以臨時(shí)這么使用。(宕機(jī)情況下需要啟動(dòng)pg的話,替換一下/lib64的備份即可)
glibc 是gnu發(fā)布的libc庫(kù),也即c運(yùn)行庫(kù)。--更多關(guān)于glibc請(qǐng)自行g(shù)oogle
glibc是linux系統(tǒng)中最底層的api(應(yīng)用程序開發(fā)接口),
幾乎其它任何的運(yùn)行庫(kù)都會(huì)依賴于glibc。
glibc除了封裝linux操作系統(tǒng)所提供的系統(tǒng)服務(wù)外,
它本身也提供了許多其它一些必要功能服務(wù)的實(shí)現(xiàn),主要的如下:
(1)string,字符串處理
(2)signal,信號(hào)處理
(3)dlfcn,管理共享庫(kù)的動(dòng)態(tài)加載
(4)direct,文件目錄操作
(5)elf,共享庫(kù)的動(dòng)態(tài)加載器,也即interpreter
(6)iconv,不同字符集的編碼轉(zhuǎn)換
(7)inet,socket接口的實(shí)現(xiàn)
(8)intl,國(guó)際化,也即gettext的實(shí)現(xiàn)
(9)io
(10)linuxthreads
(11)locale,本地化
(12)login,虛擬終端設(shè)備的管理,及系統(tǒng)的安全訪問
(13)malloc,動(dòng)態(tài)內(nèi)存的分配與管理
(14)nis
(15)stdlib,其它基本功能
3.pg庫(kù)連接建庫(kù)和用戶的基本命令參考:
[postgres@ ~]$ psql -h 192.168.1.8 -U postgres
psql (12.4)
Type "help" for help.
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =T/postgres +
| | | | | postgres=CTc/postgres
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)
postgres=# create database testdb;
CREATE DATABASE
postgres=# revoke all on database testdb from public;
REVOKE
postgres=# \c testdb postgres
You are now connected to database "testdb" as user "postgres".
testdb=# create user testuser with password '密碼';
CREATE ROLE
testdb=# grant all on database testdb to testuser;
GRANT
testdb=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =T/postgres +
| | | | | postgres=CTc/postgres
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
testdb | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | postgres=CTc/postgres+
| | | | | testuser=CTc/postgres
(5 rows)




