Postgres 源码安装

2022-05-21 21:26:31 浏览数 (1)

一.准备

代码语言:javascript复制

### 一.准备

<!--前提条件-->

要求OS上已经安装下述软件。如果没有,可以直接通过yum来安装。

##### 1 gmake或者make要求至少3.80版本以上

~~~bash
[root@Centos ~]# make -v

[root@Centos ~]# gmake -v

[root@Centos ~]# which make
/usr/bin/make
[root@Centos ~]# which gmake
/usr/bin/gmake
~~~

##### 2 C编译器

如果没有的话,可以直接安装一个最新的gcc即可

~~~bash
[root@Centos ~]# which gcc
/usr/bin/gcc
[root@Centos ~]# gcc -v
<!--查看包-->
[root@Centos ~]# rpm -qa|grep gcc*
<!--安装包-->
yum install gcc*
~~~

##### 3 tar软件包

~~~bash
[root@Centos ~]# which tar
/usr/bin/tar
[root@Centos ~]# tar --version

tar软件工具用于解压缩源码格式的安装压缩包文件。
tar -zxvf postgresql-13.2.tar.gz
~~~

##### 4 GNU readline library

该库文件默认启用。用于在psql命令行工具下,可以通过键盘的上下箭头调出历史命令以及编辑之前的命令。如果不需要此功能的话,可以在configure的时候,带上`--without-readline选项。`

~~~bash
[root@Centos ~]# rpm -qa|grep readline
[root@Centos ~]# yum install readline*  
~~~

##### 5 zlib compression library

该库文件默认启用。如果不需要此功能的话,可以在configure的时候,带上–without-zlib`选项。`当然如果带上该选项则意味着,使用pg_dump/pg_restore对数据库进行备份/恢复的时候,不支持对归档的压缩。

~~~bash
[root@Centos ~]# rpm -qa|grep zlib*
~~~

二.源码安装

代码语言:javascript复制
### 二.源码安装 

小技巧:(ctrl  l 清屏)

假定将来要把数据库软件安装在/data/postgres/13.2/路径下,数据库的数据存放在/data/postgres/13.2/data路径下

#### 1.创建postgres用户

~~~bash
[root@Centos ~]# id postgres
id: postgres: no such user
[root@Centos ~]# groupadd postgres
[root@Centos ~]# useradd -g postgres postgres
[root@Centos ~]# passwd postgres
Changing password for user postgres.
New password: 
BAD PASSWORD: The password contains the user name in some form
Retype new password: 
passwd: all authentication tokens updated successfully.

~~~

#### 2.创建数据库软件安装目录

~~~bash
[root@Centos ~]# mkdir -p /data/postgres/13.2/
[root@Centos data]# chown -R postgres:postgres /data/
[root@Centos data]# su - postgres


~~~

#### 3.获取源码

到PostgreSQL[官方网站](https://www.postgresql.org/ftp/source/),获取源码格式的数据库安装文件。

~~~bash
[root@Centos ~]# su - postgres
[postgres@Centos ~]$ wget https://ftp.postgresql.org/pub/source/v13.2/postgresql-13.2.tar.gz
报错,加参数
[postgres@Centos ~]$ wget https://ftp.postgresql.org/pub/source/v13.2/postgresql-13.2.tar.gz --no-check-certificat

下载慢,ftp上传,root上传包,授权
[root@Centos ~]# chown -R  postgres /home/postgres/postgresql-13.2.tar.gz
~~~

#### 4.解压源码

~~~bash
[postgres@Centos ~]$ tar -zxvf postgresql-13.2.tar.gz
[postgres@Centos ~]$ ll
total 26908
drwxrwxr-x. 6 postgres postgres     4096 Feb  9  2021 postgresql-13.2
-rw-r--r--. 1 postgres root     27548921 Dec 29 20:15 postgresql-13.2.tar.gz
[postgres@Centos ~]$ cd postgresql-13.2
[postgres@Centos postgresql-13.2]$ ll
total 744
-rw-r--r--.  1 postgres postgres    490 Feb  9  2021 aclocal.m4
drwxrwxr-x.  2 postgres postgres   4096 Feb  9  2021 config
-rwxr-xr-x.  1 postgres postgres 568656 Feb  9  2021 configure
-rw-r--r--.  1 postgres postgres  82388 Feb  9  2021 configure.in
drwxrwxr-x. 57 postgres postgres   4096 Feb  9  2021 contrib
-rw-r--r--.  1 postgres postgres   1192 Feb  9  2021 COPYRIGHT
drwxrwxr-x.  3 postgres postgres     87 Feb  9  2021 doc
-rw-r--r--.  1 postgres postgres   4278 Feb  9  2021 GNUmakefile.in
-rw-r--r--.  1 postgres postgres    277 Feb  9  2021 HISTORY
-rw-r--r--.  1 postgres postgres  63684 Feb  9  2021 INSTALL
-rw-r--r--.  1 postgres postgres   1665 Feb  9  2021 Makefile
-rw-r--r--.  1 postgres postgres   1213 Feb  9  2021 README
drwxrwxr-x. 16 postgres postgres   4096 Feb  9  2021 src
~~~

#### 5.执行configure

执行configure的命令行选项,–prefix参数,表示把PostgreSQL安装在哪个路径下?这里,我们就把它安装在前面第2步骤中配置的/data/postgres/13.2/路径下。默认情况下,不带该参数时,则会安装在/usr/local/pgsql路径下。

~~~bash
编译
[postgres@Centos postgresql-13.2]$ ./configure --prefix=/data/postgres/13.2/
~~~

#### 6.执行make world 

这里,也可以简单执行make就可以build安装文件的,但是,make world的意思是指把PostgreSQL相关的文档,HTML,以及其它的一些模块都会一起编译进去。比如,在有的环境下遇到无法使用uuid或者使用不了gin index的原因,就是在编译的时候,没有包含这些对应的模块。处理这种的问题的方法也不复杂,只需要进到当时安装时的那个源文件路径下,重新执行make world,然后make install-world。

建议,在初始安装的时候,就直接用make world或等价的gmake world命令。

~~~bash
[postgres@Centos postgresql-13.2]$ gmake world && gmake install-world
~~~

#### 7.执行make install-world

#### 8.初始化数据库

~~~bash
初始化数据库
[postgres@Centos postgresql-13.2]$ /data/postgres/13.2/bin/initdb -d /data/postgres/13.2/data
中间过程省略。。。。。。。
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:

    /data/postgres/13.2/bin/pg_ctl -D /data/postgres/13.2/data -l logfile start
~~~

~~~bash
初始化完多了data. 查看data大小(可以不做)
[root@Centos ~]# ll /data/postgres/13.2/
total 20
drwxrwxr-x.  2 postgres postgres 4096 Dec 29 20:37 bin
drwx------. 19 postgres postgres 4096 Dec 29 20:41 data
drwxrwxr-x.  6 postgres postgres 4096 Dec 29 20:37 include
drwxrwxr-x.  4 postgres postgres 4096 Dec 29 20:37 lib
drwxrwxr-x.  8 postgres postgres 4096 Dec 29 20:37 share
[root@Centos ~]# du -sh /data/postgres/13.2/data/
40M	/data/postgres/13.2/data/
~~~

#### 9.启动数据库

~~~bash
启动数据库
[postgres@Centos postgresql-13.2]$ /data/postgres/13.2/bin/pg_ctl -D /data/postgres/13.2/data -l logfile start

[postgres@Centos postgresql-13.2]$ ps -ef|grep postgres
root       9074   8684  0 19:58 pts/1    00:00:00 su - postgres
postgres   9075   9074  0 19:58 pts/1    00:00:00 -bash
root       9464   9407  0 20:26 pts/1    00:00:00 su - postgres
postgres   9465   9464  0 20:26 pts/1    00:00:00 -bash
postgres  20555      1  0 20:54 ?        00:00:00 /data/postgres/13.2/bin/postgres -D /data/postgres/13.2/data
postgres  20557  20555  0 20:54 ?        00:00:00 postgres: checkpointer 
postgres  20558  20555  0 20:54 ?        00:00:00 postgres: background writer 
postgres  20559  20555  0 20:54 ?        00:00:00 postgres: walwriter 
postgres  20560  20555  0 20:54 ?        00:00:00 postgres: autovacuum launcher 
postgres  20561  20555  0 20:54 ?        00:00:00 postgres: stats collector 
postgres  20562  20555  0 20:54 ?        00:00:00 postgres: logical replication launcher 
postgres  20597   9465  0 20:57 pts/1    00:00:00 ps -ef
postgres  20598   9465  0 20:57 pts/1    00:00:00 grep --color=auto postgres

需配置环境变量,否则使用绝对路径
[postgres@Centos postgresql-13.2]$ psql 
bash: psql: command not found...
[postgres@Centos postgresql-13.2]$ /data/postgres/13.2/bin/psql
psql (13.2)
Type "help" for help.

postgres=# show listen_addresses;
 listen_addresses 
------------------
 localhost
(1 row)

postgres=# q
[postgres@Centos postgresql-13.2]$ 

~~~

#### 10.修改环境变量

~~~bash
[postgres@Centos ~]$ vi .bash_profile

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

#PATH=$PATH:$HOME/.local/bin:$HOME/bin
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$PATH:/data/postgres/13.2/bin      ---添加路径
PGDATA=/data/postgres/13.2/data     --添加
export PATH PGDATA
保存退出


[postgres@Centos ~]$ psql
bash: psql: command not found...
[postgres@Centos ~]$ source .bash_profile
[postgres@Centos ~]$ psql
psql (13.2)
Type "help" for help.

postgres=# 



~~~


三.补充

代码语言:javascript复制

#### 1.修改数据库参数

##### a.修改pg_hba.conf 文件

在/data/postgres/13.2/data/pg_hba.conf 文件,添加下面的一行

~~~bash
#IPV4  local  connections:
 host  all    0.0.0.0/0  md5
~~~

对于使用IPV4的客户端,数据库服务器不做限制,可以用过任意用户访问所有数据库

##### b.修改postgresql.conf 文件

在/data/postgres/13.2/data/postgresql.conf 文件, 修改

~~~
# listen_addresses='localhost' 为 listen_addresses='*'
~~~

修改完需要重启

~~~bash
[postgres@Centos data]$ pg_ctl restart -m fast
~~~

#### 2.如何删除PostgreSQL数据库软件

postgres用户进入到前面解压的源码所在的路径/home/postgres/postgresql-13.2  ,通过执行 make uninstall 来卸载已经安装的数据库软件

~~~bash
[postgres@Centos data]$ cd /home/postgres/postgresql-13.2
[postgres@Centos postgresql-13.2]$ gmake uninstall
~~~

手工创建的路径不会删除 

#### 3.如何重新编译安装PostgreSQL数据库软件

##### a.方式1 重新解压源码、编译、安装

第4步开始重新走一遍流程,即重新解压源码,用新解压出来的源码文件,再依次进行 configure ,make world  , make install-world

##### b.清除之前的编译状态

就是把之前第5步执行configure之后的文件状态,恢复到configure之前的状态,然后再通过执行configure,make world, make install-world .  这个命令是 make distclean 

~~~bash
[postgres@Centos data]$ cd /home/postgres/postgresql-13.2
[postgres@Centos postgresql-13.2]$ gmake distclean
~~~

四.启停PostgreSQL数据库

代码语言:javascript复制
### 四.启停PostgreSQL数据库

#### 1.查看数据库是否正常运行

~~~bash
[postgres@Centos ~]$ ps -ef|grep postgres

root       9074   8684  0 19:58 pts/1    00:00:00 su - postgres
postgres   9075   9074  0 19:58 pts/1    00:00:00 -bash
root       9464   9407  0 20:26 pts/1    00:00:00 su - postgres
postgres   9465   9464  0 20:26 pts/1    00:00:00 -bash
root      20884  20843  0 21:20 pts/1    00:00:00 su - postgres
postgres  20885  20884  0 21:20 pts/1    00:00:00 -bash
postgres  21313      1  0 21:57 ?        00:00:00 /data/postgres/13.2/bin/postgres -D /data/postgres/13.2/data
postgres  21315  21313  0 21:57 ?        00:00:00 postgres: checkpointer 
postgres  21316  21313  0 21:57 ?        00:00:00 postgres: background writer 
postgres  21317  21313  0 21:57 ?        00:00:00 postgres: walwriter 
postgres  21318  21313  0 21:57 ?        00:00:00 postgres: autovacuum launcher 
postgres  21319  21313  0 21:57 ?        00:00:00 postgres: stats collector 
postgres  21320  21313  0 21:57 ?        00:00:00 postgres: logical replication launcher 
postgres  21640  20885  0 22:29 pts/1    00:00:00 ps -ef
postgres  21641  20885  0 22:29 pts/1    00:00:00 grep --color=auto postgres


[postgres@Centos ~]$ pstree -p 21313
postgres(21313)─┬─postgres(21315)
                ├─postgres(21316)
                ├─postgres(21317)
                ├─postgres(21318)
                ├─postgres(21319)
                └─postgres(21320)
~~~



#### 2.手工启动PostgreSQL数据库

~~~bash
[postgres@Centos ~]$ pg_ctl start -D /data/postgres/13.2/data -l /home/postgres/startup.log
~~~

#### 3.手工停止PostgreSQL数据库

~~~bash
[postgres@Centos ~]$ pg_ctl stop -m fast
~~~

-m fast 类似于oracle 中的 shutdown immediate

### 五.pg_ctl中的更多使用选项

~~~bash
[postgres@Centos ~]$ pg_ctl --help
~~~

[postgres@Centos ~]$ pg_ctl status

[postgres@Centos ~]$ pg_ctl reload

六 psql工具使用及数据库常用维护管理

代码语言:javascript复制
### 六 psql工具使用及数据库常用维护管理

#### 一 psql工具的使用

##### 1 用psql连接数据库

~~~bash
[postgres@Centos ~]$ psql -h localhost -p 5432 -d postgres -U postgres
psql (13.2)
Type "help" for help.

postgres=# 

~~~



其中,

- psql是PostgreSQL软件安装家目录下的bin路径下的可执行程序;
- -h选项表示host,要连接数据库服务器名或者IP地址;如果要访问的数据库在远端,不在本地服务器上,则这里应该用那台机器的IP地址;如果是云服务器的话,则用云服务商提供的域名字符串即可;
- -p选项表示port,数据库运行在哪个端口上,默认是5432,这个可以在postgres.conf配置文件里修改,但是需要restart数据库才生效;
- -d选项表示database,我们要连接访问的数据库名;
- -U选项表示username,我们以哪个用户来访问数据库。

因此,上述命令表示的是以postgres用户连接监听运行在本地机器上的5432的名为postgres的数据库。命令行上,并没有要求输入数据库密码,为什么?因为我们的pg_hba.conf文件里配置了



~~~sql
postgres=# create table pg_test(id int,name varchar(10));
CREATE TABLE
postgres=# insert into pg_test values(1,'huangwei');
INSERT 0 1
postgres=# 

~~~

#### 二 数据库常用维护管理命令

##### 1 查看数据库版本号:

~~~bash
postgres=# select version();
                                                 version                                                 
---------------------------------------------------------------------------------------------------------
 PostgreSQL 13.2 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
(1 row)


~~~

##### 2 查看所有数据库信息:

~~~
postgres=# l 
~~~

##### 3 查看数据库启动时间信息:

~~~bash
postgres=# select pg_postmaster_start_time();
   pg_postmaster_start_time    
-------------------------------
 2021-12-30 10:41:26.094734 08
(1 row)

~~~

##### 4 查看用户信息:

~~~bash
postgres=# du
                                   List of roles
 Role name |                         Attributes                         | Member of 
----------- ------------------------------------------------------------ -----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

postgres=# 

~~~

##### 5 显示所有的表:

~~~bash
postgres=# c postgres
You are now connected to database "postgres" as user "postgres".
postgres=# d
          List of relations
 Schema |  Name   | Type  |  Owner   
-------- --------- ------- ----------
 public | pg_test | table | postgres
(1 row)

postgres=# 

~~~

##### 6 查看表大小:

~~~bash
postgres=# dt  pg_test;
                              List of relations
 Schema |  Name   | Type  |  Owner   | Persistence |    Size    | Description 
-------- --------- ------- ---------- ------------- ------------ -------------
 public | pg_test | table | postgres | permanent   | 8192 bytes | 
(1 row)

postgres=# 

~~~

##### 7 查看表结构:

~~~bash
postgres=# d pg_test;
                     Table "public.pg_test"
 Column |         Type          | Collation | Nullable | Default 
-------- ----------------------- ----------- ---------- ---------
 id     | integer               |           |          | 
 name   | character varying(10) |           |          | 


~~~

##### 8 查看索引大小:

~~~bash
postgres=# create index idx_id_pg_test on pg_test(id);
CREATE INDEX
postgres=# di
                  List of relations
 Schema |      Name      | Type  |  Owner   |  Table  
-------- ---------------- ------- ---------- ---------
 public | idx_id_pg_test | index | postgres | pg_test
(1 row)

postgres=# di  idx_id_pg_test
                                    List of relations
 Schema |      Name      | Type  |  Owner   |  Table  | Persistence | Size  | Description 
-------- ---------------- ------- ---------- --------- ------------- ------- -------------
 public | idx_id_pg_test | index | postgres | pg_test | permanent   | 16 kB | 
(1 row)

postgres=# 

~~~

##### 9 创建新用户:

~~~bash
postgres=# create user t_user login password 't_user';
CREATE ROLE
postgres=# 

~~~

创建1个新用户t_user,具有login访问数据库的权限,密码跟用户名相同。执行该命令的用户,必须得有create user的权限。

##### 10 创建和使用数据库:

~~~bash
postgres=# create database testdb owner t_user;
CREATE DATABASE
postgres=# c testdb t_user
You are now connected to database "testdb" as user "t_user".
testdb=> create table test_table(id int);
CREATE TABLE
testdb=> 

~~~

创建名为testdb的数据库,其owner是上面创建的用户t_user。然后,以t_user来访问testdb数据库,并且创建了一张表。执行该命令的用户,必须得有create database的权限。

##### 11 查看视图、函数、表空间

分别是dv,df,db

~~~bash
testdb=> db
       List of tablespaces
    Name    |  Owner   | Location 
------------ ---------- ----------
 pg_default | postgres | 
 pg_global  | postgres | 
(2 rows)

testdb=> df
                       List of functions
 Schema | Name | Result data type | Argument data types | Type 
-------- ------ ------------------ --------------------- ------
(0 rows)

testdb=> 

~~~

0 人点赞