安装
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
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)模式,这步需要提前操作。
你也可以通过丢弃数据库然后重新加载进行更新升级。详情请戳:官方文档
$ sudo yum install phpPgAdmin
$ sudo yum install pgadmin3
Fedora22或之后版本使用dnf安装可参考如下命令:
$ sudo dnf install phpPgAdmin
$ sudo dnf install pgadmin3
$ # 永久有效
$ 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
记住你可能不希望你的数据库对全世界开放。$ 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
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 =
effective_cache_size =
work_mem =
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] '