1 现象
一台源码编译安装之后的PostgreSQL数据库,在创建使用uuid的时候,报错。
postgres=# \c You are now connected to database "postgres" as user "postgres". postgres=# CREATE OR REPLACE FUNCTION uuid_generate_v4() postgres-# RETURNS uuid AS postgres-# '$libdir/uuid-ossp', 'uuid_generate_v4' postgres-# LANGUAGE c VOLATILE STRICT postgres-# COST 1; ERROR: could not access file "$libdir/uuid-ossp": No such file or directory postgres=#
2 原因
源码编译安装的时候,没有选择编译uuid,需要重新编译
[postgres@localhost postgresql-9.6.4]$ pwd /home/postgres/postgresql-9.6.4 [postgres@localhost postgresql-9.6.4]$ ./configure --prefix=/postgres/9.6.4/ --with-ossp-uuid .. . ..
这里有两点需要注意:
需要使用之前解压出来的源码文件,如果之前解压的源码被删除,那么可以用与已经安装的数据库软件相同版本的压缩包重新解压;
--prefix选项要与之前安装时的相同目录;
在重新编译的过程中,如果遇到下述错误:
checking for uuid_export in -lossp-uuid... no checking for uuid_export in -luuid... no configure: error: library 'ossp-uuid' or 'uuid' is required for OSSP-UUID
则,解决:yum install uuid-devel -y
yum install uuid-devel -y
然后,重新继续编译,编译完成之后,再到源码的contrib路径下,执行 make和make install来安装uuid-ossp.
[postgres@localhost uuid-ossp]$ pwd /home/postgres/postgresql-9.6.4/contrib/uuid-ossp [postgres@localhost uuid-ossp]$ make make: 对“all”无需做任何事。 [postgres@localhost uuid-ossp]$ make install /bin/mkdir -p '/postgres/9.6.4/lib' /bin/mkdir -p '/postgres/9.6.4/share/extension' /bin/mkdir -p '/postgres/9.6.4/share/extension' /bin/install -c -m 755 uuid-ossp.so '/postgres/9.6.4/lib/uuid-ossp.so' /bin/install -c -m 644 ./uuid-ossp.control '/postgres/9.6.4/share/extension/' /bin/install -c -m 644 ./uuid-ossp--1.1.sql ./uuid-ossp--1.0--1.1.sql ./uuid-ossp--unpackaged--1.0.sql '/postgres/9.6.4/share/extension/' [postgres@localhost uuid-ossp]$
3 最后,重新启动数据库
后来经过测试,可以不需要重启数据库。
直接到对应的库里,创建该函数即可。
postgres=# \c zyd_test You are now connected to database "zyd_test" as user "postgres". zyd_test=# CREATE OR REPLACE FUNCTION uuid_generate_v4() RETURNS uuid AS '$libdir/uuid-ossp', 'uuid_generate_v4' LANGUAGE c VOLATILE STRICT COST 1; CREATE FUNCTION zyd_test=# alter function uuid_generate_v4() owner to zyd_test ; ALTER FUNCTION zyd_test=#