原创 祖仙教小凡仙 海鲨数据库架构师 2020-07-14
PG DEBUG 源码安装编译
PG 编译简单多了,快而简单.
postgresql 12.2以下版本
一 环境要求
1 make 版本 3.80以上
2 gcc 版本4.5以上
3 tar gzip bzip 是否安装
当然MYSQL8 已经打下了一定基础
二安装依赖包
yum install -y cmake gcc gcc-c++ perl readline readline-devel openssl openssl-devel zlib zlib-devel ncurses-devel
yum install -y systemtap systemtap-sdt-devel
除了 perl systemtap systemtap-sdt-devel 外其他都在MYSQL时代安装了
三创建用户 目录 权限
useradd -u 1103 -g dba -d /home/pg -s /bin/bash -c "PostgerSql Software Owner" pg
echo "pg" | passwd --stdin pg
mkdir -p /u01/postgresql/pg_soft
chown -R pg:dba /u01/postgresql/pg_soft
四下载 解压
https://ftp.postgresql.org/pub/source/v12.1/postgresql-12.1.tar.gz
upload /u01/postgresql
cd /u01/postgresql
tar -zvxf postgresql-12.1.tar.gz
cd postgresql-12.1
源码目录结构简介(跳跃读取)
(1)configure:源码安装的配置脚本查看配置脚本支持的参数:./configure --help
(2)configure.in:configure文件的雏形
(3)COPYRIGHT:版权信息
(4)Makefile:Makefile模版
(5)GUNMakefile.in:Makefile的雏形
(6)HISTORY:版本变更的历史记录
(7)INSTALL:安装简要说明
(8)README:简单说明
(9)aclocal.m4:config用的文件的一部分
(10)config/:config用的文件的目录,存放了一些系统的配置文件,如c-compiler.m4文件中提供了检测C编译器的宏
(11)contrib/:已打包到PG源码中的第三方贡献的插件源码
(12)doc/:文档目录
(13)src/:源代码目录,存放了PG的核心代码
src目录简介:(跳跃读取)
DEVELOPERS:面向开发人员的注视
Makefile:Makefile
Makefile.global.in:make的设定值(从configure生成的)
Makefile.shlib:共享库用的Makefile
nls-global.mk:信息目录用的Makefile文件的规则
backend/:数据库引擎代码,数据库各个功能进程代码,系统存储部分代码,事务处理代码,查询优化部分代码等。PG最重要的代码都位于此目录
bin/:数据库外围工具代码,如initdb,psql,pg_dump等的代码
include/:系统依赖的头文件统一按照c文件的目录结构组织在include目录下
interfaces/:数据库系统提供的对外接口,如libpq。但是如ODBC、JDBC等不在这个目录,它们作为独立的项目存在
makefiles/:存放了针对不同操作系统编译所使用的makefile文件
pl/:pg提供的存储过程,包括tcl、perl、python三种脚本语言支持的存储过程和PL/pgSQL支持的存储过程
port/:平台移植相关的代码,对src\bin下的工具提供的基本函数的支持,编译后的样式是一个lib库
template/:针对不同操作系统提供的一些脚本样例
test/:各种测试脚本,PG提供的回归测试用例和自动化测试框架
timezone/:时区相关代码(从http://www.iana.org/time-zones同步的时区库)
tools/:辅助开发工具
tutorial/:PG提供的部分示例,如如何写PG认识的SQL,如何写PG风格一致的C代码等
五配置编译选项
./configure --prefix=/u01/postgresql/pg_soft --enable-debug --enable-dtrace
配置选项说明(跳跃读取):
configure和configure.in文件是GNU autoconf包的一部分。configure允许我们来检测操作系统对不同方面的兼容性,以及接下来可以被C程序和Makefile检测到变量,autoconf也安装在PostgreSQL的主服务器上。如果希望给configure文件添加选项,可以编辑configure.in,之后运行autoconf以产生configure文件。
当用户运行configure,其就开始检测操作系统的各项兼容性,将这些结果保存在config.status和config.cache,并且修改*.in文件。例如,如果存在一个Makefile.in,configure将生成一个Makefile,其已经替换掉了configure所找到的@var@参数。
当你需要编辑文件时,请确认你没将时间浪费在修改由configure产生的文件。你可以编辑*.in文件,之后重新运行configure以重现创建需要的文件。如果你在源代码目录的顶层目录下运行了make distclean,所有由configure产生的文件将会被移除,此时你将只会看到源代码分发版中的文件。
--with-segsize=SEGSIZE
设置段尺寸,以 G 字节计。大型的表会被分解成多个操作系统文件,每一个的尺寸等于段尺寸。这避免了与操作系统对文件大小限制相关的问题。默认的段尺寸(1G字节)在所有支持的平台上都是安全的。如果你的操作系统有"largefile"支持(如今大部分都支持),你可以使用一个更大的段尺寸,这可以有助于在使用非常大的表时消耗的文件描述符数目,但是要当心不能选择一个超过你将使用的平台和文件系统所支持尺寸的值。你可能希望使用的其他工具(如tar)也可以对可用文件尺寸设限。如非绝对必要,我们推荐这个值应为2的幂。注意改变这个值需要一次 initdb。
--with-blocksize=BLOCKSIZE
设置块尺寸,以 K 字节计。这是表内存储和I/O的单位。默认值(8K字节)适合于大多数情况,但是在特殊情况下可能其他值更有用。这个值必须是2的幂并且在 1 和 32 (K字节)之间。注意修改这个值需要一次 initdb。
--with-wal-segsize=SEGSIZE
设置WAL 段尺寸,以 M 字节计。这是 WAL 日志中每一个独立文件的尺寸。调整这个值来控制传送 WAL 日志的粒度非常有用。默认尺寸为 16 M字节。这个值必须是2的幂并且在 1 到 64 (M字节)之间。注意修改这个值需要一次 initdb。
--with-wal-blocksize=BLOCKSIZE
设置WAL 块尺寸,以 K 字节计。这是 WAL 日志存储和I/O的单位。默认值(8K 字节)适合于大多数情况,但是在特殊情况下其他值更好有用。这个值必须是2的幂并且在 1 到 64(K字节)之间。注意修改这个值需要一次 initdb。
--prefix=/opt/pgsql9x:安装所有文件在/opt/pgsql9x中(取代默认时的/usr/local/pgsql)。
--with-pgport=5432:为服务器和客户端设置默认端口号。默认是5432。
--with-perl:编译PL/Perl服务端语言。
--with-python:编译PL/Python服务端语言。
--with-tcl:编译PL/Tcl服务端语言。
--with-openssl:编译支持SLL(加密)连接。这需要安装OpenSSL包。
--with-pam:编译支持PAM(Pluggable Authentication Modules,可插拔认证模块)
--without-ldap:编译支持认证和连接参数检查
--with-libxml:编译libxml(支持SQL/XML),支持这个选项需要Libxml 2.6.23及最新版
--with-libxslt:编译xml2模块,使用libxslt
--enable-thread-safety:让客户端库是线程安全的
--with-wal-blocksize=16:WAL:预写式日志(Write-Ahead Logging)
设置WAL的block size,以MB为单位。这是在WAL日志中的每个独立文件的大小。为了控制WAL日志传送的粒度去调整其大小,这可能是非常有用的。默认为16MB。这个值必须是2的1到64次方(MB)。注意,改变这个值需要一个initdb。
--with-blocksize=16:设置block size,以KB为单位。这是表的存储和IO单元。默认为8K,适用于大多数情况;但是在特殊场合中,其他的值可能是非常有用的。这个值必须是2的1到32次方(KB)。注意,改变这个值需要一个initdb。
--enable-dtrace:编译PostgreSQL支持动态跟踪工具DTrace
--enable-debug:把所有程序和库以带有调试符号的方式编译
--enable-nls[=LANGUAGES]:打开本地语言支持(NLS),即以非英文显示程序的信息的能力。LANGUAGES是一个空格分隔的语言代码列表,标识你想支持的语言。比如--enable-nls=‘zh_cn de fr‘(你提供的列表和实际支持的列表之间的交集将会自动计算出来)。如果你没有声明一个列表,那么就安装所有可用的翻译。(还可以在--enable-debug前,添加两个选项:--enable-depend --enable-cassert)
make && make install
20分钟就好了
cd /home/pg
vi .bash_profile
#for postgresql
export PGPORT=5432
export PGHOME=/u01/postgresql/pg_soft
export PGDATA=/u01/postgresql/pg_data
export PATH=$PGHOME/bin:$PATH
export MANPATH=$PGHOME/share/man:$MANPATH
export LANG=zh_CN.UTF-8
export DATE=‘date +"%Y%m%d%H%M"‘
export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH
umask 022
alias stop_pg=‘pg_ctl -D $PGDATA -m fast stop‘
alias start_pg=‘pg_ctl -D $PGDATA -s -l $PGHOME/logfile start‘
[root@localhost] su - pg
initdb -D $PGDATA -E UTF8 --locale=zh_CN.utf8
[pg@localhost ~]$ initdb -D $PGDATA -E UTF8 --locale=zh_CN.utf8
The files belonging to this database system will be owned by user "pg".
This user must also own the server process.
The database cluster will be initialized with locale "zh_CN.utf8".
initdb: could not find suitable text search configuration for locale "zh_CN.utf8"
The default text search configuration will be set to "simple".
Data page checksums are disabled.
creating directory /u01/postgresql/pg_data ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... PRC
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
initdb: warning: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.
Success. You can now start the database server using:
pg_ctl -D /u01/postgresql/pg_data -l logfile start
initdb 初始化该数据库集群的缺省区域和字符集编码。
字符编码排序(LC_COLLATE)和字符集类(LCCTYPE 也就是大写、小写、数字等)是对所有数据库估定的,不能改变。
使用 C 或 POSIX 之外的字符编码排序还会有性能影响。因此在运行 initdb 的时候就做出正确的选择是非常重要的。
其它区域范畴可以在随后启动服务器的时候改变。所有服务器区域值(lc*)都可以用 SHOW ALL 显示。
选项
-A authmethod
--auth=authmethod
这个选项声明本地用户在 pg_hba.conf 里面使用的认证方法。除非你相信所有本地用户,否则不要使用 trust(缺省)。
-D directory
--pgdata=directory
这个选项声明数据库集群应该存放在哪个目录。这是 initdb 需要的唯一信息,但是你可以通过设置 PGDATA 环境变量来避免键入,
这样做可能方便一些,因为稍后数据库服务器(postgres)可以通过同一个变量找到数据库目录。
-E encoding
--encoding=encoding
选择模板数据库的编码方式。这将是你以后创建的数据库的缺省编码方式,除非你创建数据库时覆盖了它。缺省是从区域设置中获得的,
如果没有区域设置,就是 SQL_ASCII 。PostgreSQL 服务器支持的字符集在节21.2.1里描述。
--locale=locale
为数据库集群设置缺省的区域。如果没有声明这个选项,那么区域是从 initdb 运行的环境中继承过来的。
[pg@localhost pg_data]$ start_pg
[pg@localhost pg_data]$ ps -ef|grep post
root 2624 1 0 05:17 ? 00:00:00 /usr/libexec/postfix/master -w
postfix 2629 2624 0 05:17 ? 00:00:00 qmgr -l -t unix -u
pg 5740 1 0 10:16 ? 00:00:00 /u01/postgresql/pg_soft/bin/postgres -D /u01/postgresql/pg_data
pg 5742 5740 0 10:16 ? 00:00:00 postgres: checkpointer
pg 5743 5740 0 10:16 ? 00:00:00 postgres: background writer
pg 5744 5740 0 10:16 ? 00:00:00 postgres: walwriter
pg 5745 5740 0 10:16 ? 00:00:00 postgres: autovacuum launcher
pg 5746 5740 0 10:16 ? 00:00:00 postgres: stats collector
pg 5747 5740 0 10:16 ? 00:00:00 postgres: logical replication launcher
pg 5853 4045 0 10:17 pts/2 00:00:00 grep --color=auto post
psql -d template1
create user pg with password ‘123456‘;
template1=# \password
Enter new password:
Enter it again:
create database pg owner pg;
template1=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+-------+----------+------------+------------+-------------------
pg | pg | UTF8 | zh_CN.utf8 | zh_CN.utf8 | =Tc/pg +
| | | | | pg=CTc/pg
postgres | pg | UTF8 | zh_CN.utf8 | zh_CN.utf8 |
template0 | pg | UTF8 | zh_CN.utf8 | zh_CN.utf8 | =c/pg +
| | | | | pg=CTc/pg
template1 | pg | UTF8 | zh_CN.utf8 | zh_CN.utf8 | =c/pg +
| | | | | pg=CTc/pg
授权数据库
grant all on database pg to pg;
template1=# quit
正常登陆默认
[pg@localhost pg_data]$ psql
psql (12.1)
Type "help" for help.
pg=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+-------+----------+------------+------------+-------------------
pg | pg | UTF8 | zh_CN.utf8 | zh_CN.utf8 | =Tc/pg +
| | | | | pg=CTc/pg
postgres | pg | UTF8 | zh_CN.utf8 | zh_CN.utf8 |
template0 | pg | UTF8 | zh_CN.utf8 | zh_CN.utf8 | =c/pg +
| | | | | pg=CTc/pg
template1 | pg | UTF8 | zh_CN.utf8 | zh_CN.utf8 | =c/pg +
| | | | | pg=CTc/pg
(4 rows)
接入PostgreSQL数据库: psql -h IP地址 -p 端口 -U 数据库名
十一 网络安全
配置连接方式& 配置连接网段
echo -e "listen_addresses = ‘*‘\nmax_connections = 100">> $PGDATA/postgresql.conf
echo ‘host all all 0.0.0.0 md5‘>>/u01/postgresql/pg_data/pg_hba.conf
pg配置文件认证方法
认证方法(authentication method)
trust 无条件地允许联接,这个方法允许任何可以与PostgreSQL 数据库联接的用户以他们期望的任意 PostgreSQL 数据库用户身份进行联接,而不需要口令。
reject 联接无条件拒绝,常用于从一个组中"过滤"某些主机。
md5 要求客户端提供一个 MD5 加密的口令进行认证,这个方法是允许加密口令存储在pg_shadow里的唯一的一个方法。
password 和"md5"一样,但是口令是以明文形式在网络上传递的,我们不应该在不安全的网络上使用这个方式。
gss 使用GSSAPI认证用户,这只适用于 TCP/IP 连接。
sspi 使用SSPI认证用户,这只适用于 Windows 连接。
peer 获取客户端的操作系统的用户名并判断他是否匹配请求的数据库名,这只适用于本地连接。
ldap 使用LDAP服务进行验证。
radius 使用RADIUS服务进行验证。
cert 使用SSL服务进行验证。
pam 使用操作系统提供的可插入的认证模块服务 (Pluggable Authentication Modules)(PAM)来认证。
关键点
(1)在编译的时候configure的时候加上--enable-debug的选项
(2)在debug的时候PID在客户端执行SELECT pg_backend_pid();获得
(3)gdb /pathToPgSqlBin/postgres PID
(4) 现在gdb命令行b、c再执行query
原文:https://blog.51cto.com/15057847/2649682