PostgreSQL从菜鸟到专家 Linux和Unix上配置PostgreSQL

在Linux和Unix上配置PostgreSQL

在你安装好PostgreSQL后,无论是通过RPM包或者通过源码编译,你都需要执行一些步骤让它运行起来。第一步,你需要建立一个叫postgres的用户,然后你需要为数据库建立一个目录并初始化数据库结构。然后,你可以通过启动postmaster进程启动PostgreSQL了。

建立postgres用户

PostgreSQL的数据库主进程postmaster是一个特别的程序。它负责处理所有的用户对所有数据库的访问。它必须允许用户访问自己的数据但在没授权的情况下不允许访问其他用户的数据。为了实现这个功能,它需要能够控制所有的数据文件,因而普通用户不允许直接访问这些文件。postmaster进程将通过检查访问数据的用户的赋权情况控制对数据文件的访问。

一般来说,PostgreSQL需要用一个非管理员用户运行,也就是说可以是任何普通用户;如果你在你的home目录里头安装了数据库,这个用户可以是你自己的用户。但是,PostgreSQL通常使用一个概念上的虚拟用户来完成数据访问。通常,这个一个叫做postgres的用户被建立用来管理这些数据文件,它不需要其他的访问权限。另外,postgres虚拟用户可以提供一些其他的安全措施,例如这个用户无法登录,所以别人无法非法访问这些数据。postmaster程序代表其他用户用这个用户去访问数据库文件。

因此,建立一个可运行的PostgreSQL系统的第一步就是建立postgres用户。每个系统建立用户的方法都不同。Linux可以通过root用户使用useradd命令添加:

# useradd postgres

其他的UNIX系统中尼可能需要建立home目录,修改配置文件或者运行相关的工具。请参考你的系统的文档来获得相关管理工具的细节。

建立数据库目录

下一步,你必须通过root用户建立一个目录给PostgreSQL用来存放数据库,并将目录的所有者设置为postgres:

# mkdir /usr/local/pgsql/data

# chown postgres /usr/local/pgsql/data

在这里我们使用默认的位置给数据库。你可以选择在其他地方存储数据,就像我们前面在“PostgreSQL的安装解析”小节里讨论的一样。

初始化数据库

通过initdb工具初始化PostgreSQL数据库,初始化时需要制定你文件系统中想要存储数据库的位置。这将做很多事,包括建立PostgreSQL需要运行的数据结构以及初始化一个可工作的数据库:template1。

你需要使用postgres用户来运行initdb工具。为了做到这点,最可靠的方法是完成两步,第一步是通过su命令切换到root用户,然后切换成postgres用户,就像以下所示(作为一个普通用户,你可能无法用其他用户身份运行程序,所以你必须先变成超级用户):

$ su

# su – postgres

pg$

现在你运行的程序是以postgres用户运行的,并且你可以访问PostgreSQL的数据文件了。很明显,我们现实了postgres用户的shell的命令提示符pg$。

警告:不要为了图方便直接用root而不是postgres用户完成以上过程。由于安全原因,用root身份运行服务进程可能非常危险。如果这个进程有问题,可能导致外部通过网络非法访问你的系统。由于这个原因,postmaster将拒绝通过root运行。

通过initdb命令初始化数据库:

pg$ /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data

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”.

WARNING: enabling “trust” authentication for local connections

You can change this by editing pg_hba.conf or using the -A option the

next time you run initdb.

Success. You can now start the database server using:

/usr/local/pgsql9/bin/postgres -D pgdata

or

/usr/local/pgsql9/bin/pg_ctl -D pgdata -l logfile start

pg$

如果一切正常,你将在initdb命令的-D参数指向的位置拥有一个全新的空白数据库。

配置连接权限

默认情况下,PostgreSQL不允许全面的远程访问。为了赋权给远程连接,你必须编辑配置文件pg_hba.conf。这个文件存在于数据库文件的区域(在本例中,位于/usr/local/pgsql/),它包含允许或者拒绝特定用户连接到数据库的权限的配置记录。默认情况下,本地用户可以连接但远程用户不允许。文件格式非常简单,PostgreSQL自带的默认文件包含大量的有用的注释用于协助添加记录。你可以根据需要给单个的用户、主机、计算机组或者单独的数据库赋权。

例如,希望允许用户neil通过IP地址为192.168.0.3的主机连接到bpsimple数据库,添加以下行到pg_hba.conf文件:

host bpsimple neil 192.168.0.3/32 md5

注意,在早于8.0版本的PostgreSQL中,pg_hba.conf通过IP地址和子网掩码说明一个主机地址,所以之前的例子应该写成这样:

host bpsimple neil 192.168.0.3 255.255.255.255 md5

本例中,我们将添加一条记录来运行局域网中(本例中,子网为192.168.x.x)的任何计算机通过密码认证访问数据库。(如果你需要不同的访问策略,参考配置文件里头的注释)我们添加一行到pg_hba.conf的末尾,就像这样:

host all all 192.168.0.0/16 md5

这意味着IP地址由192.168开头的计算机可以访问所有的数据库。此外,加入我们信任网络中的所有用户,我们可以通过指定使用trust标记不受限的访问方法作为访问策略,就像这样:

host all all 192.168.0.0/16 trust

PostgreSQL的postmaster服务进程读取配置文件postgresql.conf(也存在于数据目录中)来设置一系列的运行选项,包括(如果没有另外指定-D选项或者配置PGDATA环境变量)数据库数据文件的位置。这个配置文件被很好的注释了,如果你想修改任何设置,它都提供了向导。PostgreSQL的文档有一章讲述了运行配置。

例如,我们可以设置postgresql.conf文件中的listen_addresses参数允许服务器监听网络连接,而不是通过-i选项:

listen_addresses=’*’

实际上,我们推荐通过postgresql.conf设置配置参数来控制postmaster进程的行为。

启动postmaster进程

现在,你可以启动服务进程了。再次提醒,你可以使用-D选项告诉postmaster数据库文件所在位置。如果你想允许网络上的用户访问你的数据,你可以使用-i选项启用远程访问(如果你没在postgresql.conf文件中启用listen_addresses选项,就像前面所说的):

pg$ /usr/local/pgsql/bin/postmaster -i -D /usr/local/pgsql/data >logfile 2>&1 &

这条命令启动postmaster,重定向进程输出到一个文件(名叫logfile,存放在postgres用户的home目录中),并且通过shell的2>&1合并标准输出和标准错误输出。你可以通过重定向输出到其他文件来选择不同的日志位置。

PostgreSQL提供的pg_ctl工具提供了一种简单的方法启动、停止和重启(就是停止和启动)postmaster进程。如果PostgreSQL就像之前所属的那样完全由postgresql.conf文件配置,可以简单的使用以下命令启动、停止和重启:

pg_ctl start

pg_ctl stop

pg_ctl restart

连接到数据库

现在你可以通过尝试连接到数据库测试它是否正常工作了。psql工具是用来与数据库进行交互和进行简单的管理工作例如建立用户,建立数据库以及建表。在本章后面我们将用它来建立和填充数据库,在第5章将详细讲解它的功能。现在,你可以简单地尝试连接到一个数据库。以下的反馈显示你已经运行了postmaster:

pg$ /usr/local/pgsql/bin/psql

psql: FATAL 1: Database “postgres” does not exist in the system catalog.

不要被上面显示的致命错误吓着。默认情况下,psql连接到本机的数据库并尝试用启动这个程序的用户的名称打开数据库。因为我们在这里没有建立叫postgres的数据库,所以连接失败。这象征着,postmaster进程运行了并且能够正常响应失败的细节。

为了指定连接的数据库,可以传递-d参数给psql。全新的PostgreSQL系统包含一些系统使用的数据库作为你需要新建的数据库的模板。其中有一个叫做template1。如果你需要,你可以连接到数据库这个数据库用来完成管理功能。

为了检查网络连接,你可以使用网络上其他机器安装的psql作为客户端,或者其他的PostgreSQL兼容的程序。在psql中,你可以使用-h选项指定主机(无论是名称还是IP地址),并指定一个系统数据库(如果你还没建立一个真正的数据库)。

remote$ psql -h 192.168.0.111 -d template1

Welcome to psql 8.0.0,the PostgreSQL interactive terminal.

Type: \copyright for distribution terms

\h for help with SQL commands

\? for help with psql commands

\g or terminate with semicolon to execute query

\q to quit

template1=# \q

remote$

配置自动启动

最后一步需要做的是安排postmaster服务进程在机器重启的时候自动启动。实际上你所有要做的就是确保postmaster在启动后被运行了。再次,对于Linux和UNIX变种系统,这里都有一些小标准可以遵从。请参考你的系统文档的细节。

如果你是从Linux发行版安装的PostgreSQL,启动脚本应该已经通过RPM包安装的时候完成配置了。在SuSE Linux中,PostgreSQL在系统进入多用户模式的时候通过/etc/rc.d/init.d下面的一个叫做postgresql的脚本启动。

如果你想自己写启动脚本,最简单的办法是建立一个简单的脚步使用你需要的参数启动postmaster,并且在一个自动启动的脚本里头添加一个到你的脚本的调用就OK,例如在/etc/rc.d里面的脚本。需要确保postmaster是由postgres用户启动的。以下是从源码安装的一个默认安装的PostgreSQL的可以完成以上工作的示例脚本:

#!/bin/sh

# Script to start and stop PostgreSQL

SERVER=/usr/local/pgsql/bin/postmaster

PGCTL=/usr/local/pgsql/bin/pg_ctl

PGDATA=/usr/local/pgsql/data

OPTIONS=-i

LOGFILE=/usr/local/pgsql/data/postmaster.log

case “$1″ in

start)

echo -n “Starting PostgreSQL…”

su -l postgres -c “nohup $SERVER $OPTIONS -D $PGDATA >$LOGFILE 2>&1 &”

;;

stop)

echo -n “Stopping PostgreSQL…”

su -l postgres -c “$PGCTL -D $PGDATA stop”

;;

*)

echo “Usage: $0 {start|stop}”

exit 1

;;

esac

exit 0

注:在Debian Linux中,在su -l的地方,你需要使用su -。

建立一个包含以上脚本的可执行脚本。给它命名为MyPostgreSQL。使用chmod命令给它赋予执行权限,就像以下的情况:

# chmod a+rx MyPostgreSQL

然后,你需要安排脚本在服务器启动和关机的时候启动和停止PostgreSQL:

MyPostgreSQL start

MyPostgreSQL stop

对于使用System V类型的init脚本的系统(例如很多Linux发行版),你可以把脚本放在适当的位置。例如在SuSE Linux中,你应该把脚本放在/etc/rc.d/init.d/MyPostgreSQL,并且建立以下位置的软连接到这个脚本来实现在服务器进入和离开多用户模式的时候启动和停止PostgreSQL:

/etc/rc.d/rc2.d/S25MyPostgreSQL

/etc/rc.d/rc2.d/K25MyPostgreSQL

/etc/rc.d/rc3.d/S25MyPostgreSQL

/etc/rc.d/rc3.d/K25MyPostgreSQL

请参考你的系统文档关于启动脚本的部分的详细信息。

停止PostgreSQL

PostgreSQL服务进程有序关闭非常重要,这将允许它将任何未写入数据库的数据写入数据库并释放它使用的共享内存资源。

为了安全地关闭数据库,可以通过postgres用户或者root用户使用pg_ctrl工具这样做:

# /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data stop

如果有启动脚本,你可以像下面这样使用它们。

# /etc/rc.d/init.d/MyPostgreSQL stop

这些脚本能保证数据库在机器关机或者重启的时候能正常关闭。

相关资源

为了在使用PostgreSQL时方便一点,最好添加PostgreSQL应用程序路径到执行程序的搜索路径中,手册文件也需要这么做。在标准UNIX shell中,添加以下代码到你的启动脚本中(.profile or .bashrc):

PATH=$PATH:/usr/local/pgsql/bin

MANPATH=$MANPATH:/usr/local/pgsql/man

export PATH MANPATH

当前和最新测试版本的PostgreSQL的源码可以在http://www.postgresql.org找到。更多的PostgreSQL资源信息在本书附录G中列出来了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读601次。Oracle的数据导入导出是一项基本的技能,但是对于懂数据库却不熟悉Oracle的同学可能会有一定的障碍。正好在最近的一个项目中碰到了这样一个任务,于是研究了一下Oracle的数据导入导出,在这里跟大家分享一下。......_oracle 迁移方法 对比
文章浏览阅读553次。开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共700多人左右 1 + 2)。最近我们在使用MYSQL 8 的情况下(8.025)在数据库运行中出现一个问题 参数prefer_order_i..._mysql prefer_ordering_index
文章浏览阅读3.5k次,点赞3次,收藏7次。折腾了两个小时多才成功连上,在这分享一下我的经验,也仅仅是经验分享,有不足的地方欢迎大家在评论区补充交流。_navicat连接opengauss
文章浏览阅读2.7k次。JSON 代表 JavaScript Object Notation。它是一种开放标准格式,将数据组织成中详述的键/值对和数组。_postgresql json
文章浏览阅读2.9k次,点赞2次,收藏6次。navicat 连接postgresql 注:navicat老版本可能报错。1.在springboot中引入我们需要的依赖以及相应版本。用代码生成器生成代码后,即可进行增删改查(略)安装好postgresql 略。更改配置信息(注释中有)_mybatisplus postgresql
文章浏览阅读1.4k次。postgre进阶sql,包含分组排序、JSON解析、修改、删除、更新、强制踢出数据库所有使用用户、连表更新与删除、获取今年第一天、获取近12个月的年月、锁表处理、系统表使用(查询所有表和字段及注释、查询表占用空间)、指定数据库查找模式search_path、postgre备份及还原_pgsql分组取每组第一条
文章浏览阅读3.3k次。上一篇我们学习了日志清理,日志清理虽然解决了日志膨胀的问题,但就无法再恢复检查点之前的一致性状态。因此,我们还需要日志归档,pg的日志归档原理和Oracle类似,不过归档命令需要自己配置。以下代码在postmaster.c除了开启归档外,还需要保证wal_level不能是MINIMAL状态(因为该状态下有些操作不会记录日志)。在db启动时,会同时检查archive_mode和wal_level。以下代码也在postmaster.c(PostmasterMain函数)。......_postgresql archive_mode
文章浏览阅读3k次。系统:ubuntu22.04.3目的:利用向日葵实现windows远程控制ubuntu。_csdn局域网桌面控制ubuntu
文章浏览阅读1.6k次。表分区是解决一些因单表过大引用的性能问题的方式,比如某张表过大就会造成查询变慢,可能分区是一种解决方案。一般建议当单表大小超过内存就可以考虑表分区了。1,继承式分区,分为触发器(trigger)和规则(rule)两种方式触发器的方式1)创建表CREATE TABLE "public"."track_info_trigger_partition" ( "id" serial, "object_type" int2 NOT NULL DEFAULT 0, "object_name..._pg数据表分区的实现
文章浏览阅读3.3k次。物联网平台开源的有几个,就我晓得的有、、thingskit、JetLink、DG-iot(还有其他开源的,欢迎在评论区留言哦!),然后重点分析了下ThingsBoard、ThingsPanel和JetLink,ThingsBoard和Jetlinks是工程师思维产品,可以更多的通过配置去实现开发的目的,ThingsPanel是业务人员思路产品,或者开发或者用,避免了复杂的配置带来的较高学习门槛。ThingsBoard和Jetlinks是Java技术体系的,ThingsPanel是PHP开发的。_jetlinks和thingsboard
文章浏览阅读3.8k次。PostgreSQL 数据类型转换_pgsql数字转字符串
文章浏览阅读7k次,点赞3次,收藏14次。在做数据统计页面时,总会遇到统计某段时间内,每天、每月、每年的数据视图(柱状图、折线图等)。这些统计数据一眼看过去也简单呀,不就是按照时间周期(天、月、年)对统计数据进行分个组就完了嘛?但是会有一个问题,简单的写个sql对周期分组,获取到的统计数据是缺失的,即没有数据的那天,整条记录也都没有了。如下图需求:以当前月份(2023年2月)为起点,往后倒推一年,查询之前一年里每个月的统计数据。可见图中的数据其实是缺少的,这条sql只查询到了有数据的月份(23年的1月、2月,22年的12月)_如何用一条sql查出按年按月按天的汇总
文章浏览阅读3.8k次,点赞66次,收藏51次。PostgreSQL全球开发小组与2022年10月13日,宣布发布PostgreSQL15,这是世界上最先进的开源数据库的最新版本_mysql8 postgresql15
文章浏览阅读1.3k次。上文介绍了磁盘管理器中VFD的实现原理,本篇将从上层角度讲解磁盘管理器的工作细节。_smgrrelationdata
文章浏览阅读1.1k次。PostgreSQL设置中文语言界面和局域网访问_postgressql汉化
文章浏览阅读4.2k次。PostgreSQL 修改数据存储路径_如何设置postgresql 数据目录
文章浏览阅读4.7k次。在项目中用到了多数据源,在连接postgres数据库时,项目启动报错,说数据库连接错误,说dual不存在,网上好多教程都是说数据库查询的时候的大小写问题,而这个仅仅是连接,咋鞥却处理方法是修改application-dev.yml中的配置文件.项目中的druid参数是这样的:确实在配置文件中有个查询语句。_relation "dual" does not exist
文章浏览阅读4.9k次。PostgreSQL是一款强大的关系型数据库,但在实际使用过程中,许多用户经常会遇到慢SQL的问题。这些问题不仅会降低数据库性能,还会直接影响业务流程和用户体验。因此,本文将会深入分析PostgreSQL慢SQL的原因和优化方案,帮助用户更好地利用这个优秀的数据库系统。无论你是初学者还是专业开发者,本文都将为你提供实用的技巧和方法,让你的PostgreSQL数据库始终保持高效快速。_postgresql数据库优化
文章浏览阅读1.6k次。Linux配置postgresql开机自启_linux 启动pgsql
文章浏览阅读2k次。本篇介绍如何在centos7系统搭建一个postgresql主备集群实现最近的HA(高可用)架构。后续更高级的HA模式都是基于这个最基本的主备搭建。_postgresql主备