暂无图片
暂无图片
6
暂无图片
暂无图片
暂无图片

注意在有oracle库的linux6.9上又安装postgresql12.4的小坑

原创 jieguo 2022-03-08
1313

由于这是第2次遇到这个坑,所以有必要记录一下,避免有人再次遇到类似的问题,引起心里的慌乱。

问题背景:

由于上云去O需求,项目部打算在oracle服务器上再安装一个PG库测试,这样便于测试开发。同一个网段的应用服务器连接数据库,也能省去网络策略申请开通的麻烦。
当前服务器环境A:centos6.9x64+oracle11.2.0.4,CPU、内存、存储空间足够。貌似条件满足,无问题。
pg开发版本要求明确选择12.4版本,库名用户名密码均已给需求。
梳理了环境情况,了解到整个环境中有生产库服务器B运行着pg12.4的版本,并且曾经做过tar包的备份,而且那个时候tar包不大,也就300M,于是思路很明确:
理论上将这个tar包,传输到目标服务器A上,配置环境变量进行解压就可使用了。

操作步骤:

1.服务器A机准备挂接目录,划分lv挂接/app目录

检查卷组VolGroup空间剩余107G: vgs
创建逻辑卷: lvcreate -L 100G -n lv_pg VolGroup
创建挂接点:mkdir /app
检查文件系统df -T -h 显示ext4
创建ext4文件系统并挂接:
mkfs -t ext4 /dev/VolGroup/lv_pg
mount /dev/VolGroup/lv_pg /app
加入重启自动挂接vi /etc/fstab
/dev/VolGroup/lv_pg /app ext4 defaults 1 2

2.服务器B传输tar包到A机指定目录,并解压:

cat /etc/passwd检查发现A存在postgres用户,并且显示路径为/var/lib/pgsql,检查路径下有个空backup目录和空data目录,怀疑是曾经有安装过pg库,后来手动删除了。----后续验证的确如此。
scp B机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.服务器A尝试启动pg,最终成功:

su - postgres
pg_ctl start
提示**/lib64/libc.so.6:version `GLIBC_2.14’ not found**
image.png
检查发现ll /lib64/libc.so.6对应的是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
需要升级glibc。
于是根据https://blog.csdn.net/officercat/article/details/39520227进行了升级(耗时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

尝试启动pg,竟然提示已经有启动的进程实例。但ps -ef|grep postgres、ps -ef|grep pg和netstat -ano|grep LISTEN|grep 5432均没有发现pg进程。
比较奇怪?
rpm -aq|grep postgres发现果然有曾经yum安装的pg软件,而且是8.x版本的。
通过yum remove postgres* -y删除卸载。
再次用pg_ctl start启动还是失败,提示postgresql.conf文件的监听地址不对(原先tar包记录的是B机的IP地址),修改为*号即可,再次启动成功。
psql连接提示密码错误拒绝,其实密码是对的,根据提示修改pg_hba.conf的local行 md5为trust,顺利登录。
另外注意修改shared_buffers大小,调整为适当的内存大小提示性能。检查free -g查看剩余内存。

4.此时意识到该机还有个oracle库,想确认下sga和pga的分配情况,这样便于评估pg库的内存分配大小,避免内存不足问题。

当在oracle用户下,执行sqlplus / as sysdba时,竟然提示Segmentation fault
image.png
这时心里真有点慌了,
检查ps -ef|grep ora_进程都还在。询问项目组人员,客户端和应用连接数据库反馈均还正常,松了一口气(这种情况下,如果主机不宕,数据库不宕,就不会马上引起故障,但一旦主机或库挂了,就无法再启动oracle数据库)。
根据Segmentation fault查了一下自己曾经记录的blog,突然发现自己在去年遇到过类似的问题(想起当时是在oracle测试服务器上打算安装pg测试库),有了经验,处理起来就不慌不忙了。
处理办法:
相同操作系统版本,redhat6.9和centos6.9的一样。
在GLIBC_2.12老版本的环境,将/lib64目录打包scp到服务器A,为了防止意外,先备份服务器A的/lib64目录,然后替换老版本/lib64,效果明显(曾经尝试卸载新的glic,无效),再次执行sqlplus / as sysdba恢复正常。
此时psql 连接失败,不过从其它客户端是可以连接此已经启动成功的pg库的。
image.png

小结:

1.升级gblic版本务必小心,升级前建议做好/lib64目录的tar备份。linux6.x的系统glibc版本较低,大概率会遇到此问题。不一定只是安装pg12.4会遇到,安装其它版本或其它软件也可能会遇到,需注意。
2.由于pg库是过渡阶段测试开发使用,在没有其它可以服务器的情况下,可以临时这么使用。(宕机情况下需要启动pg的话,替换一下/lib64的备份即可)

glibc 是gnu发布的libc库,也即c运行库。--更多关于glibc请自行google
  glibc是linux系统中最底层的api(应用程序开发接口),

  几乎其它任何的运行库都会依赖于glibc。

  glibc除了封装linux操作系统所提供的系统服务外,

  它本身也提供了许多其它一些必要功能服务的实现,主要的如下:

  (1)string,字符串处理

  (2)signal,信号处理

  (3)dlfcn,管理共享库的动态加载

  (4)direct,文件目录操作

  (5)elf,共享库的动态加载器,也即interpreter

  (6)iconv,不同字符集的编码转换

  (7)inet,socket接口的实现

  (8)intl,国际化,也即gettext的实现

  (9)io

  (10)linuxthreads

  (11)locale,本地化

  (12)login,虚拟终端设备的管理,及系统的安全访问

  (13)malloc,动态内存的分配与管理

  (14)nis

  (15)stdlib,其它基本功能

3.pg库连接建库和用户的基本命令参考:

[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)


最后修改时间:2022-03-08 12:42:17
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论