原创,如转发需注明出处。
多年没写博客,一直用的个人笔记软件,最近准备阅读PostgreSQL源码,故记录。(这两年PostgreSQL数据库在某些环境下是比较火的,原因想必大家都清楚。)
PostgreSQL是开放源码的数据库,支持Windows、Linux、Unix等多种操作系统。下面将会介绍PostgreSQL的编译、安装与运行。
一、Windows环境
1、环境准备
Windows10、Virtual Studio 2019社区版、PostgreSQL 14.3、MinGW(https://osdn.net/projects/mingw/downloads/68260/mingw-get-setup.exe)
MinGW安装后需要安装以下依赖包:
安装perl:https://strawberryperl.com/download/5.32.1.1/strawberry-perl-5.32.1.1-64bit.msi(注意配置环境变量)
修改文件编码,改成UTF-8 BOM编码,可以使用VS2019另存或者Notepad++修改:
postgresql-14.3\src\fe_utils\print.c 和 postgresql-14.3\src\backend\access\brin\brin_bloom.c
避免出现如下类似错误:
“D:\postgresql-14.3\pgsql.sln”(默认目标) (1) ->
“D:\postgresql-14.3\postgres.vcxproj”(默认目标) (2) ->
(ClCompile 目标) ->
D:\postgresql-14.3\src\backend\access\brin\brin_bloom.c(1,1): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicod
e 格式以防止数据丢失 [D:\postgresql-14.3\postgres.vcxproj]
然后打开:
进入D:\postgresql-14.3\src\tools\msvc目录,执行命令perl build.pl DEBUG,此处使用DEBUG是方便后面调试跟踪:
编译完成后,可以执行:perl vcregress.pl check命令跑下测试。然后,执行perl install.pl D:\PostgreSQL\pg14 进行安装,需要保证安装目录已存在。
进入到pg安装目录:cd D:\PostgreSQL\pg14\bin,执行建库操作:initdb.exe -D ../data,建库完成后,启动pg数据库:pg_ctl.exe -D ../data -l logfile start,启动完成后进入数据库:psql.exe -d postgres,如下:
接下来,即可通过VS2019 Attach到进程调试pgsql了,可以通过select pg_backend_pid();查询pid,也可以直接搜索进程名称。
二、Linux编译安装
1、编译
tar zxvf postgresql-11.6.tar.gz
./configure --prefix=/home/cmdev/pgsql.11.6/
编译make -j8 && make install
2、安装
创建postgres用户
groupadd postgres
useradd -g postgres postgres
设置安装目录和data目录权限
chown -R postgres:root /home/zxcao/pgsql/data/
chown -R postgres:root /home/cmdev/pgsql.11.6
设置环境变量
[postgres@kunpeng data]$ cat /home/postgres/.bash_profile
export PGHOME=/home/cmdev/pgsql.11.6
export PGDATA=/home/zxcao/pgsql/data
export PATH=$PGHOME/bin:$PATH
export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH
source /home/postgres/.bash_profile
初始化数据库
initdb -D /home/zxcao/pgsql/data
启动数据库
[postgres@kunpeng log]$ pwd
/home/zxcao/pgsql/log
[postgres@kunpeng log]$ pg_ctl -D /home/zxcao/pgsql/data/ -l logfile start
查看端口是否已启动:netstat -nltp|grep 5432
配置数据库允许连接
#设置监听整个网络,查找“listen_addresses ”字符串,
vim /home/zxcao/pgsql/data/postgresql.conf
#修改为如下:
listen_addresses = '*'
#配置连接方式:
vim /home/zxcao/pgsql/data/pg_hba.conf
#修改为如下:
host all all 192.168.2.0/24 md5
接下来,既可以通过gdb进行调试pgsql代码。
错误记录:
1、如果linux环境初始化数据库报错:
initializing pg_authid ... FATAL: wrong number of index expressions
STATEMENT: REVOKE ALL on pg_authid FROM public;
child process exited with exit code 1
解决方法:
使用编译参数:CFLAGS='-DGCC_HASCLASSVISIBILITY -O0 -Wall -W'重新编译。参照:https://www.postgresql.org/message-id/17948.1365090217%40sss.pgh.pa.us
2、执行客户端psql命令报错
[root@Centos6x64 bin]# ./psql
psql: FATAL: role "root" does not exist
分析及解决:
这是PostgreSQL用户一个非常常见的错误,由于系统用户名和数据库用户名配置错误,这种情况正在发生。大多数Linux用户都试图使用root用户登录PostgreSQL,但实际上,这是错误的。需要成为安装PostgreSQL的操作系统用户才能创建第一个用户帐户。通常,默认用户名是Postgres,默认数据库也是Postgres。在Linux上安装PostgreSQL后,应该为Postgres用户设置密码,Postgres用户是PostgreSQL的默认超级用户,不要尝试使用任何其他默认的Linux或Unix系统用户名登录。
1、设置默认Postgres用户的密码
sudo passwd postgres
2、使用"postgres"创建另一个角色
创建新角色“dbrnd” -p =设置密码 -d = allow以创建数据库
sudo -u postgres createuser dbrnd -d -P
3、psql插入语句报错
ERROR: column "czx" does not exist
LINE 1: INSERT INTO test VALUES (1, "czx");
原因:字符串要使用单引号。
4、运行createdb时报错
createdb: could not connect to database postgres: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
说明:服务器没有启动或者没有在createdb预期的地方启动。