频道栏目
首页 > 资讯 > 其他综合 > 正文

PostgreSQL安装与配置介绍

16-08-24        来源:[db:作者]  
收藏   我要投稿

安装

Postgresql服务的安装和初始化,根据不同的linux发行版本而有所差别。本文档目的在于总结如何在最近的fedora系统版本上,进行postgresql的基本安装。首先,你可能考虑到先安装fedora的较新版本,请查看网址。但是,不太建议你这么做。

 

$ sudo yum install postgresql-server postgresql-contrib
或者使用fedora 22及之后版本的dnf进行安装:

 

 

$ sudo dnf install postgresql-server postgresql-contrib

 

Postgresql服务默认是关闭并且无法开机自启的。你可以使用以下命令设置开机自启:

$ sudo systemctl enable postgresql
启动postgresql时,有可能会出现如下情况:

 

$ sudo systemctl start postgresql
Job for postgresql.service failed. See 'systemctl status postgresql.service' and 'journalctl -xn' for details.
数据库安装后需要加载初始数据,以下报错日志中包含了问题和解决方法:

 

 

$ journalctl -xn
-- Logs begin at Mon 2013-11-04 14:38:33 CET, end at Thu 2013-11-14 11:45:56 CET. --
Nov 14 11:45:34 mlich-lenovo.usersys.redhat.com sudo[2054]: jmlich : TTY=pts/2 ; PWD=/home/jmlich ; USER=root ; COMMAND=/bin/systemctl status postgresql
Nov 14 11:45:37 mlich-lenovo.usersys.redhat.com sudo[2073]: jmlich : TTY=pts/2 ; PWD=/home/jmlich ; USER=root ; COMMAND=/bin/systemctl status postgresql
Nov 14 11:45:56 mlich-lenovo.usersys.redhat.com sudo[2105]: jmlich : TTY=pts/2 ; PWD=/home/jmlich ; USER=root ; COMMAND=/bin/systemctl start postgresql
Nov 14 11:45:56 mlich-lenovo.usersys.redhat.com systemd[1]: Starting PostgreSQL database server...
-- Subject: Unit postgresql.service has begun with start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit postgresql.service has begun starting up.
Nov 14 11:45:56 mlich-lenovo.usersys.redhat.com postgresql-check-db-dir[2108]: An old version of the database format was found.
Nov 14 11:45:56 mlich-lenovo.usersys.redhat.com postgresql-check-db-dir[2108]: Use "postgresql-setup upgrade" to upgrade to version 9.3.
Nov 14 11:45:56 mlich-lenovo.usersys.redhat.com postgresql-check-db-dir[2108]: See /usr/share/doc/postgresql/README.rpm-dist for more information.
Nov 14 11:45:56 mlich-lenovo.usersys.redhat.com systemd[1]: postgresql.service: control process exited, code=exited status=1
Nov 14 11:45:56 mlich-lenovo.usersys.redhat.com systemd[1]: Failed to start PostgreSQL database server.
-- Subject: Unit postgresql.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- Documentation: http://www.freedesktop.org/wiki/Software/systemd/catalog/be02cf6855d2428ba40df7e9d022f03d
--
-- Unit postgresql.service has failed.
--
-- The result is failed.
使用以下命令来初始化数据库,这个命令创建了配置文件postgresql.conf和pg_hba.conf:

 

 

$ sudo postgresql-setup initdb

 

在fedora22或以后版本使用如下命令:

$ sudo postgresql-setup --initdb --unit postgresql

升级
从我的报错日志中,你可以看到这不是最新的pgsql版本,可能需要升级。

 

Nov 14 11:45:56 mlich-lenovo.usersys.redhat.com postgresql-check-db-dir[2108]: An old version of the database format was found.
Nov 14 11:45:56 mlich-lenovo.usersys.redhat.com postgresql-check-db-dir[2108]: Use "postgresql-setup upgrade" to upgrade to version 9.3.
在版本9中你可以使用升级工具,即postgresql-upgrade命令:

 

 

$ postgresql-setup upgrade

Redirecting to /bin/systemctl stop  postgresql.service
Upgrading database: OK

The configuration files was replaced by default configuration.
The previous configuration and data are stored in folder /var/lib/pgsql/data-old.

See /var/lib/pgsql/pgupgrade.log for details.
数据位于如下目录:

 

 

/var/lib/pgsql/data

/var/lib/pgsql/data-old

升级会备份你当前的数据并且迁移数据库。别忘了合并你的配置(例如使用meld命令:meld/var/lib/pgsql/data{,-old}/postgresql.conf)

 

在升级中你可能需要把postgresql改成信任(trust)模式,这步需要提前操作。

你也可以通过丢弃数据库然后重新加载进行更新升级。详情请戳:官方文档

提示&窍门

为了方便的管理数据库,可以使用图形化工具,例如phpPgAdmin或者pgadmin3
$ sudo yum install phpPgAdmin
$ sudo yum install pgadmin3

Fedora22或之后版本使用dnf安装可参考如下命令:

$ sudo dnf install phpPgAdmin
$ sudo dnf install pgadmin3

防火墙
PostgreSQL 在端口5432(或者你在postgresql.conf中设置的任意端口)上进行操作,你可以使用如下命令,开启防火墙端口:
$ # 永久有效
$ firewall-cmd --permanent --add-port=5432/tcp
$ # 暂时有效
$ firewall-cmd --add-port=5432/tcp
或者在iptables中开启:
$ iptables -A INPUT -p tcp --dport 5432 -m state --state NEW,ESTABLISHED -j ACCEPT
记住你可能不希望你的数据库对全世界开放。

SELinux 如果你开启了selinux服务,你可能在一些安装中遇到麻烦。举个例子,如果你想修改数据库的存放位置,你必须要添加一些新内容来匹配新的位置:
$ semanage fcontext -a -t postgresql_db_t "/my/new/location(/.*)?"
如果默认端口不起作用,你可能需要匹配postgre的端口类型为你想要的端口:
$ semanage port -a -t postgresql_port_t -p tcp 5433
如果你安装的webapp需要通过TCP/IP与PostgreSQL 进行交互,你需要告诉selinux允许这个操作:
# setsebool -P httpd_can_network_connect_db on

创建用户和数据库

不久后你需要创建一个用户(以及为用户创建数据库),首先,你必须使用postgres用户进入交互界面:

# su - postgres
以下就是postgre的交互界面:
$ psql
psql (9.3.2)
Type "help" for help.

postgres=#
最好给postgres用户设置一下密码:
postgres=# \password postgres
让我们回到用户创建:
postgres=# CREATE USER lenny WITH PASSWORD 'leonard';
postgres=# CREATE DATABASE carl OWNER lenny;

在系统shell中也可以使用如下命令创建用户:

$ createuser lenny
$ createdb --owner=lenny carl

配置
Postgrsql主要使用了两个配置文件: /var/lib/pgsql/data/postgresql.conf
/var/lib/pgsql/data/pg_hba.conf

Systemd

一些配置参数可以通过命令行选项传给守护进程。这一行为可能覆盖了postgresql.conf中的设置。举个例子,如果你想要修改服务的端口为5433,创建一个名为/etc/systemd/system/postgresql.service的文件,包含以下内容:

 

.include /lib/systemd/system/postgresql.service
[Service]
Environment=PGPORT=5433

 

注意:修改PGPORT或者PGDATA也需要相应的修改SELinux设置;查看selinux部分

详情请查看systemd文档。

 

postgresql.conf

如果你想让postgres接受网络连接,你应该将

 

listen_addresses = 'localhost'
修改为

 

listen_addresses = '*'
pg_hba.conf

当数据库安装后,你需要配置访问数据库服务。这可以通过编辑/var/lib/pgsql/data/pg_hba.conf文件来实现。文件中可能有这样的规则:

 

# TYPE    DATABASE        USER            ADDRESS                 METHOD
  host    all             all             127.0.0.1/32            md5
  local   all             postgres                                peer

 

第一个字段代表连接类型,可以被设置为这些值:

 

local — Unix-domain socket
host — plain or SSL-encrypted TCP/IP socket
hostssl — is an SSL-encrypted TCP/IP socket
hostnossl — plain TCP/IP socket

 

最后一列指定了使用的认证方法

 

md5 -- 客户端需要提供密码来进行md5算法处理
ident -- 根据操作系统获取连接的客户端的用户名,并且使用指定匹配查询用户名
trust -- 任何连接到PostgreSQL的人都可以作为任何用户并且不需要提供密码
peer -- 从操作系统中获取用户名,并确认用户名是否匹配数据库用户名

当数据库服务验证客户端时,它会寻找匹配的连接类型,客户端地址,要求访问的数据库以及用户名的记录。当它找到这些记录时,就会进行身份验证。如果验证失败,就不再进行后续的记录。如果没有记录匹配,用户访问就会被拒绝。

 

 

默认的设置通常局限于本地主机。

当你安装了数据库服务,一开始你如果想让它运行成功,应该要关闭防火墙,SELinux和使得postgres的身份验证被允许(记住这项操作会极大程度的暴露你的数据库,所以尽量在可信任的网络中进行此项操作---最好是在没有网络的情况下)

 

host    all             all             127.0.0.1/32            trust

 

当你能连接到数据库时,一个一个地打开安全设置并确认连接是否成功。

详情请查看pg_hbs.conf的官方文档。
优化

默认的postgres配置存在不少缺陷。它只能简单的配置数据库进行较少的连接,但是如果你需要高性能,你应该刚好的配置你的数据库。所以的配置都可以在/var/lib/pgsql/data/postgresql.conf中实现。另外,日志机制的配置也不太直观。

性能 同时连接到PostgreSQL的客户端数量
max_connections = 
shared_buffers 是入口点。它告诉PostgreSQL多少缓存被占用。设置为系统总内存的25%可以帮助你更好的开始。如果对你来说不奏效的话,可以设置为15%到40%之间。
shared_buffers = 
这个值是用于查询系统中可用的内存大小。查询计划使用这个信息来计算内存大小是否适合该计划。通常设置该值为总内存的50%。
effective_cache_size = 
当PostgreSQL执行排序操作时,它会计划是否排序查询磁盘或内存。记住内存对于每个排序实例都是可用的。当多个用户对数据库提交查询时,这可以更好的运行。因此这和max_connections变量紧密相关。
work_mem = 
详情请查看关于调优PostgreSQL的文档
日志
默认情况下,日志每周都会循环输出,你不会找到很多有用的信息(可能会错过日志级别、日期、时间等)。相对于简单的web应用,我更偏向于增加信息显示。
log_destination = 'stderr'
如果你想让syslog关注你的日志,也可以修改为‘syslog’,甚至是‘syslog,stderr’(如果使用syslog,别忘了配置syslog本身的设置;更多信息请戳官方文档)
logging_collector = on

日志记录到标准输出的情况下,如果你打开了logging_collector 选项, postgres会收集所有的log。

默认选项:
log_filename = 'postgresql-%a.log'
更多人会偏向于在日志创建时,按照日期命名日志:
log_filename = 'postgresql-%G-%m.log'
循环取决于app本身。对于数据库中有一些数据的简单app,所有的日志都一直保存在磁盘上,不会循环。
log_truncate_on_rotation = off
log_rotation_age = 31d
增加日志条目的数量:
client_min_messages = notice      # default notice
log_min_messages = info           # default warning
log_min_error_statement = notice  # default error
如果你想要慢速查询日志,可以使用这个选项:
log_min_duration_statement = 1000  # in ms
默认的日志条目不包含这些信息:
FATAL:  Ident authentication failed for user "test"
DETAIL:  Connection matched pg_hba.conf line 84: "host    all             all             ::1/128                 ident"

让我们把它改善为这样的显示形式:

2013-12-30 17:51:36 CET testx@::1(50867):postgres [11213] FATAL:  password authentication failed for user "testx"
2013-12-30 17:51:36 CET testx@::1(50867):postgres [11213] DETAIL:  Connection matched pg_hba.conf line 84: "host   all             all             ::1/128                 md5 "
你只需要插入选项log_line_prefix
# %t -- timestamp
# %u -- user
# %r -- client's host
# %d -- database
# %p -- PID
log_line_prefix = '%t %u@%r:%d [%p] '
如果你只使用一个用户登录一个数据库,简化prefix会更有效:
log_line_prefix = '%t [%p] '

最终配置
log_destination = 'stderr'
logging_collector = on
log_filename = 'postgresql-%G-%m.log'
log_truncate_on_rotation = off
log_rotation_age = 31d
client_min_messages = notice
log_min_messages = info
log_min_error_statement = notice
log_line_prefix = '%t %u@%r:%d [%p] '
相关TAG标签
上一篇:MongoDB基本管理命令
下一篇:Mysql学习总结(32)——阿里云centos配置MySQL主从复制
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站