由于上云去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**
检查发现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。
于是根据进行了升级(耗时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
这时心里真有点慌了,
检查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库的。
小结:
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)