源码编译安装PostgreSQL9.5

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_42018518/article/details/88829238

目录

写在最前

1、下载

2、配置编译安装

3、用户权限与环境变量

4、初始化数据库

5、启动和连接

6、登录测试

7、控制台命令

8、postgresql添加各种约束语法

9、postgresql 查看数据库,表,索引,表空间以及大小

10、安装并使用 PostgreSQL 的扩展模块


写在最前

yum安装可以直接参照官网:https://www.postgresql.org/download/linux/redhat/

1、下载

    在postgresql的官方即可找到源码文件目录,地址如下:https://www.postgresql.org/ftp/source/,在下载列表中根据需求选择版本,进入子目录后,可以看到文件列表:

     可以看到提供了两种压缩格式,此处我们选择postgresql-9.5.4.tar.gz,下载完成后上传至CentOS服务器的指定目录即可。

2、配置编译安装

    首先进入pg压缩包目录通过tar -zxvf postgresql-9.5.4.tar.gz进行解压,然后就可以开始编译安装了,进入解压目录,通过./configure --help可以看到编译相关的帮助信息.

    --prefix=dir可以指定安装目录,还有比如--with-python则可以使用python语法的PL/Python过程语言自定义函数,根据需求我们暂且用不到,所以编译时仅指定一个安装目录即可:

# ./configure --prefix=/home/atlassian/pgsql

    运行编译后发现会提示没有c编译器,是因为新系统的原因,所以安装一个gcc编译器即可:

# yum install gcc

    安装完成后再次编译postgres,发现提示缺少readline库,如下图:

    但是通过rpm -qa | grep readline命令查看可以发现系统默认是自带readline包的,如下图:

    那么肯定还是缺少与readline相关的包了,通过yum search readline进行搜索可以发现一个readline-devel包,如下图:

    其实我们缺少的正是这个readline开发包(readline-devel),而不是readline包,所以接下来安装一下readline-devel:

# yum install readline-devel

    安装完成后再次编译postgresql,并没有再报error,可以看到提示创建了config.status配置文件:

    配置完成了,接下来就可以编译安装了,依次执行:

# make

# make install

    看到如下提示即可说明编译安装成功: 

3、用户权限与环境变量

    编译安装成功后,接下来要做的就是创建一个普通用户,因为默认超级用户(root)不能启动postgresql,所以需要创建一个普通用户来启动数据库,执行以下命令创建用户:

# useradd postgres

    接下来需要设置权限,将postgres的数据目录全部赋权给postgres用户(此处我将postgres的数据目录指定在在/home/atlassian/pgsql目录下):

# chown -R chown -R postgres.postgres /home/atlassian/pgsql/

    最后为了方便起见设置一下相关的环境变量,此处仅仅设置postgres用户的环境变量,所以首先通过su - postgres切换到postgres用户,打开.bash_profile文件并追加以下内容:

$ source .bash_profile

    接下来检验一下环境变量是否设置正确,切换任意目录输入which psql以及psql -V即可分别查看psql客户端的路径以及postgresql的数据库版本,如下图:

4、初始化数据库

由于配置了环境变量,所以此处我们直接执行initdb即可完成db初始化,但在这之前我们可以通过initdb --help看一下初始化相关的帮助信息: 

$ initdb --help

initdb initializes a PostgreSQL database cluster.

Usage:

  initdb [OPTION]... [DATADIR]

Options:

  -A, --auth=METHOD         default authentication method for local connections

      --auth-host=METHOD    default authentication method for local TCP/IP connections

      --auth-local=METHOD   default authentication method for local-socket connections

 [-D, --pgdata=]DATADIR     location for this database cluster

  -E, --encoding=ENCODING   set default encoding for new databases

      --locale=LOCALE       set default locale for new databases

      --lc-collate=, --lc-ctype=, --lc-messages=LOCALE

      --lc-monetary=, --lc-numeric=, --lc-time=LOCALE

                            set default locale in the respective category for

                            new databases (default taken from environment)

      --no-locale           equivalent to --locale=C

      --pwfile=FILE         read password for the new superuser from file

  -T, --text-search-config=CFG

                            default text search configuration

  -U, --username=NAME       database superuser name

  -W, --pwprompt            prompt for a password for the new superuser

  -X, --xlogdir=XLOGDIR     location for the transaction log directory

Less commonly used options:

  -d, --debug               generate lots of debugging output

  -k, --data-checksums      use data page checksums

  -L DIRECTORY              where to find the input files

  -n, --noclean             do not clean up after errors

  -N, --nosync              do not wait for changes to be written safely to disk

  -s, --show                show internal settings

  -S, --sync-only           only sync data directory

Other options:

  -V, --version             output version information, then exit

  -?, --help                show this help, then exit

If the data directory is not specified, the environment variable PGDATA

is used.

Report bugs to <pgsql-bugs@postgresql.org>.

    如上表格,可以看到在使用initdb进行初始化的同时我们可以指定参数来同时进行一些初始化工作,例如指定pgdata(postgresql数据目录)、指定encoding(编码)、指定数据库超级用户的用户名和密码等等,在最后面我标记出的这段话指出了如果data目录没有指定,则会默认使用环境变量中的PGDATA,由于之前我们刚刚设置了PGDATA环境变量,所以此处我们也就无需再额外指定,最后执行初始化命令即可:

$ initdb

看到如下信息就说明初始化成功了:

$ initdb

The files belonging to this database system will be owned by user "postgres".

This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".

The default database encoding has accordingly been set to "UTF8".

The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /home/atlassian/pgsql/data ... ok

creating subdirectories ... ok

selecting default max_connections ... 100

selecting default shared_buffers ... 128MB

selecting dynamic shared memory implementation ... posix

creating configuration files ... ok

creating template1 database in /home/atlassian/pgsql/data/base/1 ... ok

initializing pg_authid ... ok

initializing dependencies ... ok

creating system views ... ok

loading system objects' descriptions ... ok

creating collations ... ok

creating conversions ... ok

creating dictionaries ... ok

setting privileges on built-in objects ... ok

creating information schema ... ok

loading PL/pgSQL server-side language ... ok

vacuuming database template1 ... ok

copying template1 to template0 ... ok

copying template1 to postgres ... ok

syncing data to disk ... ok

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 /home/atlassian/pgsql/data -l logfile start

    同时在postgresql的目录可以看到生成的数据目录data以及该目录的相关数据和配置文件:

    如上图,base目录是表空间目录,global目录是相关全局变量的目录,pg_hba.conf和postgresql.conf在之前的博客也都提及了,一个是访问控制配置(127.0.0.1改为信任的客户端ip网段使其可以远程访问),一个是postgresql主配置文件(listen_address=localhost改为星号使其监听整个网络),方便起见我这里将pg_hba.conf的ip地址修改为0.0.0.0/0,而加密方式改为md5,就表示需要密码访问,算是提供一个最低级的安全防护。

    最后别忘记开放pg的5432端口,否则即使做了上面两处修改客户端依然无法连接postgresql,所以将5432端口加入到zone即可,依次运行以下命令(注意此处需要切回root用户,否则没有权限):

# firewall-cmd --zone=public --add-port=5432/tcp --permanent

# firewall-cmd --reload

    至此就配置完毕了,还可以通过firewall-cmd --zone=public --list-ports来查看已打开的端口列表再次确认一下,看到如下提示则说明已成功开启端口:

5、启动和连接

    在初始化数据库结束时我们已经看到了启动命令,如下:

cess. You can now start the database server using:

    pg_ctl -D /home/atlassian/pgsql/data -l logfile start

    由于我们设置了环境变量,所以已经指定了数据目录PGDATA, -1表示日志文件目录,通常需要指定,所以我们在/usr/local/postgresql根目录下再创建一个log目录用来存放日志文件(注意别忘记赋予可写的权限), 

    最后运行pg_ctl start -l /home/atlassian/pgsql/log/pg_server.log即可启动数据库,看到如下提示就说明启动成功了: 

$ pg_ctl start -l /home/atlassian/pgsql/log/pg_server.log

server starting

    同理停止数据库可以使用命令pg_ctl stop来关闭postgresql服务,很简单,至此关于源码编译安装postgresql就已经全部结束了。 

    或者通过ps -ef|grep postgres查看一下postgres相关是否存在相关进程,如下图也可以说明已启动成功:

    启动成功后我们就可以通过postgresql自带的客户端工具psql来进行连接,直接输入psql看到版本信息则说明连接成功:

$ psql

psql (9.5.4)

Type "help" for help.

postgres=#

    而在日志文件目录中可以看到数据库日志文件以及刚才的启动日志:

$ cat pg_server.log

< 2018-08-27 21:22:33.606 CST >LOG:  could not create IPv6 socket: Address family not supported by protocol

< 2018-08-27 21:22:33.622 CST >LOG:  redirecting log output to logging collector process

< 2018-08-27 21:22:33.622 CST >HINT:  Future log output will appear in directory "pg_log".

    接下来要做的第一件事就是设置postgres用户的密码(默认为空),用psql连接成功后直接输入\password即会提示输入两次密码。(LeHe5432@hiGo2025)

    第二件事是创建数据库用户atlassian(刚才创建的是Linux系统用户),并设置密码。

postgres=# CREATE USER atlassian WITH PASSWORD 'atlassian';

CREATE ROLE

postgres=#

    第三件事是创建用户数据库,这里为higo_wiki,并指定所有者为atlassian。

postgres=# CREATE DATABASE higo_wiki OWNER atlassian;

CREATE DATABASE

postgres=#

    第四件事是将higo_wiki数据库的所有权限都赋予atlassian,否则atlassian只能登录控制台,没有任何数据库操作权限。

postgres=# GRANT ALL PRIVILEGES ON DATABASE higo_wiki to atlassian;

GRANT

postgres=#

    当然还有切换到root用户建立软连接。

# ln -s /home/atlassian/pgsql/bin/psql /etc/alternatives/pgsql-psql

# ln -s /etc/alternatives/pgsql-psql  /usr/bin/psql

6、登录测试

    添加新用户和新数据库以后,就要以新用户的名义登录数据库,这时使用的是psql命令

$ psql -U atlassian -d higo_wiki_bak -h127.0.0.1

Password for user atlassian:

psql (9.5.4)

Type "help" for help.

higo_wiki_bak=> \l

                                     List of databases

     Name      |   Owner   | Encoding |   Collate   |    Ctype    |    Access privileges

---------------+-----------+----------+-------------+-------------+-------------------------

 higo_wiki_bak | atlassian | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =Tc/atlassian          +

               |           |          |             |             | atlassian=CTc/atlassian

 postgres      | postgres  | UTF8     | en_US.UTF-8 | en_US.UTF-8 |

 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)

higo_wiki_bak=> \q

    上面命令的参数含义如下:-U指定用户,-d指定数据库,-h指定服务器,-p指定端口。

    输入上面命令以后,系统会提示输入dbuser用户的密码。输入正确,就可以登录控制台了。

    psql命令存在简写形式。如果当前Linux系统用户,同时也是PostgreSQL用户,则可以省略用户名(-U参数的部分)。举例来说,我的 Linux系统用户名为atlassian,且PostgreSQL数据库存在同名用户,则我以atlassian身份登录Linux系统后,可以直接使用下面的命令登录数据库,且不需要密码:

$ psql higo_wiki_bak

psql (9.5.4)

Type "help" for help.

higo_wiki_bak=>

    此时,如果PostgreSQL内部还存在与当前系统用户同名的数据库,则连数据库名都可以省略。比如,假定存在一个叫做ruanyf的数据库,则直接键入psql就可以登录该数据库。

    另外,如果要恢复外部数据,可以使用下面的命令。

$ pg_dump -f 2018-08-28-wf.sql higo_wiki    # 从另一台机器导出数据

$ psql higo_wiki < 2018-08-28-wf.sql        # 导入数据

7、控制台命令

    除了前面已经用到的\password命令(设置密码)和\q命令(退出)以外,控制台还提供一系列其他命令。

\h:查看SQL命令的解释,比如\h select。

\?:查看psql命令列表。

\l:列出所有数据库。

\c [database_name]:连接其他数据库。

\d:列出当前数据库的所有表格。

\d [table_name]:列出某一张表格的结构。

\du:列出所有用户。

\e:打开文本编辑器。

\conninfo:列出当前数据库和连接的信息。

8、postgresql添加各种约束语法

1. 添加主键

alter table goods add primary key(sid);

2. 添加外键

alter table orders add foreign key(goods_id) references goods(sid)  on update cascade on delete cascade;

on update cascade: 被引用行更新时,引用行自动更新; 

on update restrict: 被引用的行禁止更新;

on delete cascade: 被引用行删除时,引用行也一起删除;

on dellete restrict: 被引用的行禁止删除;

3. 删除外键

alter table orders drop constraint orders_goods_id_fkey;

4. 添加唯一约束

alter table goods add constraint unique_goods_sid unique(sid);

5. 删除默认值

alter table goods  alter column sid drop default;

6. 修改字段的数据类型

alter table goods alter column sid type character varying;

7. 重命名字段

alter table goods rename column sid to ssid;

9、postgresql 查看数据库,表,索引,表空间以及大小

1,查看数据库

    higo_wiki=# \l                       //\加上字母l,相当于mysql的,mysql> show databases;  

    higo_wiki=# select pg_database_size('higo_wike');    //查看playboy数据库的大小  

     higo_wiki=# select pg_database.datname, pg_database_size(pg_database.datname) AS size from pg_database;    //查看所有数据库的大小

    datname    |    size

---------------+------------

 template1     |    7299588

 template0     |    7299588

 postgres      |    7422124

 higo_wiki_bak |    7438508

 higo_wiki     | 2288099500

(5 rows)

      higo_wiki=# select pg_size_pretty(pg_database_size('higo_wiki'));      //以KB,MB,GB的方式来查看数据库大小  

2,查看多表

     higo_wiki=# \dt                      //相当于mysql的,mysql> show tables;  

3,查看单表

     higo_wiki=# \d content;                 //相当于mysql的,mysql> desc content;  

     higo_wiki=# select pg_relation_size('content');   //查看表大小  

  higo_wiki=# select pg_size_pretty(pg_relation_size('content'));   //以KB,MB,GB的方式来查看表大小  

    higo_wiki=# select pg_size_pretty(pg_total_relation_size('content'));   //查看表的总大小,包括索引大小  

4,查看索引

    higo_wiki=# \di  

                    List of relations  

     Schema |     Name      | Type  |  Owner  | Table  

    --------+---------------+-------+---------+-------  

     public | playboy_id_pk | index | playboy | test  

    (1 row)  

      

    higo_wiki=# select pg_size_pretty(pg_relation_size('content_pkey'));    //查看索大小  

5,查看表空间,以及大小

    playboy=> select spcname from pg_tablespace;         //查看所有表空间  

    playboy=> select pg_size_pretty(pg_tablespace_size('pg_default'));   //查看表空间大小  

10、安装并使用 PostgreSQL 的扩展模块

猜你喜欢

转载自blog.csdn.net/weixin_42018518/article/details/88829238