设为首页 收藏本站
查看: 954|回复: 0

[经验分享] PostgreSQL培训

[复制链接]

尚未签到

发表于 2016-11-19 06:40:51 | 显示全部楼层 |阅读模式
1.安装指导
  1.1简版命令集
      ./configure
      gmake
      su
      gmake install
      adduser postgres
      mkdir /usr/local/pgsql/data
      chown postgres /usr/local/pgsql/data
      su - postgres
      /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
      /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data >logfile 2>&1 &
      /usr/local/pgsql/bin/createdb test
      /usr/local/pgsql/bin/psql test
  请检查一下,看看你是否有足够的磁盘空间。你将大概需要近 65MB 用于存放安装过程中的源码树和大约 15MB 用于安装目录。一个空数据库大概需要 25MB 。然后在使用过程中大概需要在一个平面文本文件里存放同等数据量五倍的空间存储数据。如果你要运行回归测试,还临时需要额外的 90MB 。请用 df 命令检查剩余磁盘空间。
2.操作系统环境
  2.1表空间
PostgreSQL 里的表空间允许数据库管理员在文件系统里定义那些代表数据库对象的文件存放位置。一旦创建了表空间,那么就可以在创建数据库对象的时候引用它。

通过使用表空间,管理员可以控制一个 PostgreSQL 安装的磁盘布局。这么做至少有两个用处。首先,如果初始化集群所在的分区或者卷用光了空间,而又不能逻辑上扩展或者别的什么操作,那么表空间可以在一个不同的分区上创建和使用,直到系统可以重新配置。

第二,表空间允许管理员根据数据库对象的使用模式安排数据位置,从而优化性能。比如,一个很频繁使用的索引可以放在非常快并且非常可靠的磁盘上,比如一种非常贵的固态设备。而同时,一个存储归档的数据,很少使用的或者对性能要求不高的表可以存储在一个便宜但比较慢的磁盘系统上。

要定义一个表空间,使用 CREATE TABLESPACE 命令,比如:

CREATE TABLESPACE fastspace LOCATION '/mnt/sda1/postgresql/data';这个位置必须是一个现有的空目录,并且属于 PostgreSQL 系统用户。所有随后在该表空间创建的对象都将被存放在这个目录下的文件里。
【注意】通常在一个逻辑文件系统上建立多个表空间没有什么意义,因为无法控制一个逻辑文件系统里不同文件的位置。不过,PostgreSQL 并不做这方面的任何强制,并且它实际上并不知道文件系统边界。它只知道在指定的目录里存储文件。

创建表空间本身必须用数据库超级用户身份进行,但之后你就可以允许普通数据库用户利用它了。要做这件事情,在表空间上给这些用户授予 CREATE 权限。

表、索引和整个数据库都可以放在特定的表空间里。想要这么做的话,在给定表空间上有 CREATE 权限的用户必须把表空间的名字以一个参数的形式传递给相关的命令。比如,下面的命令在表空间 space1 上创建一个表:

CREATE TABLE foo(i int) TABLESPACE space1;另外,还可以使用 default_tablespace 参数:

SET default_tablespace = space1;
CREATE TABLE foo(i int);只要 default_tablespace 被设置为非空字符串,那么它就为没有明确使用 TABLESPACE 子句的 CREATE TABLE 和 CREATE INDEX 命令提供一个隐含的子句。

与一个数据库相关联的表空间用于存储该数据库的系统表,以及任何使用该数据库的服务器进程创建的临时文件。另外,如果在创建数据库对象时没有给出 TABLESPACE 子句(不管是明确的还是通过 default_tablespace),那么这是在该数据库里创建这些对象使用的缺省表空间。如果创建数据库时没有给它声明一个表空间,那么它使用与它拷贝的模版数据库相同的表空间。

initdb 自动创建两个表空间。pg_global 表空间用于共享的系统表。pg_default 是 template1 和 template0 数据库的缺省表空间(因此,这个表空间也将是任何其它数据库的缺省表空间)。

创建了表空间之后,它就可以用于任何数据库,只要请求的用户有足够权限。这意味着除非我们把使用这个表空间的所有数据库里的所有对象都删除掉,否则我们不能删除该表空间。

要删除一个空的表空间,使用 DROP TABLESPACE 命令。

检查 pg_tablespace 系统表就可以获取现有的表空间,比如

SELECT spcname FROM pg_tablespace;psql 程序的 \db 元命令也可以用于列出现有表空间。

为了简化表空间的实现,PostgreSQL 使用了大量符号连接。这就意味着表空间只能在支持符号连接的系统上使用。

目录 $PGDATA/pg_tblspc 包含指向集群里定义的每个非内置表空间的符号连接。尽管我们不建议,但是我们还是可能通过手工重定义这些连接来调整表空间的布局。两个警告:在服务器运行的时候不要这么干;并且在你重启服务器之后,更新 pg_tablespace 表以显示新的位置。如果你不这么做,pg_dump 将继续显示旧的表空间位置。

3.区域支持
概述
区域支持是在使用 initdb 创建一个数据库集群的时候自动初始化的。缺省时,initdb 将会按照它的执行环境的区域设置初始化数据库集群;因此如果你的系统已经设置为你的数据库集群想要的区域,那么你就没有什么可干的。如果你想使用其它的区域(或者你还不知道你的系统设置的区域是什么),那么你可以用 --locale 命令行选项告诉 initdb 你需要的区域究竟是哪个。比如:

initdb --locale=sv_SE这个例子就把区域设置为瑞典(sv),用瑞典语说话(SE)。其它的可能性是 en_US(美国英语)和 fr_CA(加拿大法语)等等。如果有多于一种字符集可以用于区域,那么声明看起来像下面这样:cs_CZ.ISO8859-2 。你的系统里有哪些可用的区域设置,它们的名字是什么,这些信息都取决于你的操作系统提供商提供了什么以及你安装了什么东西。在大多数系统上,命令 locale -a 将提供所有可用区域的一个列表。

有时候,把几种区域规则混合起来也很有用,比如,使用英语字符规则而用西班牙语信息。为了支持这些,我们有一套区域子范畴用于控制区域规则的某一方面:

LC_COLLATE 字符串排序顺序
LC_CTYPE 字符分类(什么是字母?它是这个字母的等效大写?)
LC_MESSAGES 信息的语言
LC_MONETARY 货币金额的格式
LC_NUMERIC 数字的格式
LC_TIME 日期和时间的格式

这些范畴名转换成 initdb 选项的名字以覆盖某个特定范畴的区域选择。比如,要把区域设置为加拿大法语,但使用美国的货币格式化规则,可以使用 initdb --locale=fr_CA --lc-monetary=en_US 。

如果你想要你的系统表现得像没有区域支持一样,那么使用特殊的区域 C 或 POSIX 。

一些区域范畴的性质是它们的值必需在数据库集群的生命期内固定。也就是说,一旦运行了 initdb 之后,你就再也不能更改它们了。LC_COLLATE 和 LC_CTYPE 就是这样的范畴。它们影响索引的排序顺序,因此它们必需保持固定,否则在文本字段上的索引将会崩溃。PostgreSQL 通过记录 initdb 看到的 LC_COLLATE 和 LC_CTYPE 来强迫这一点。服务器在启动的时候自动使用这两个数值。

其它区域范畴可以在服务器启动的时候根据需要设置运行时配置变量来改变(参阅节17.10.2获取细节)。initdb 选择的缺省值实际上只是做为服务器启动缺省写入 postgresql.conf 配置文件。如果你在 postgresql.conf 里面删除了这些缺省值,那么服务器将会继承来自运行环境的设置。

请注意服务器的区域行为是由它看到的环境变量决定的,而不是由客户端的环境变量影响的。因此,我们要在启动服务器之前认真地设置好这些变量。这样带来的一种情况是如果客户端和服务器设置成不同的区域,那么消息可能以不同的语言呈现,实际情况取决于它们的源是什么。

【注意】在我们谈到从执行环境继承区域的时候,我们的意思是在大多数操作系统上的下列动作:对于一个给定的区域范畴,比如字符集,按照下面的顺序评估这些环境变量,直到找到一个已设置的:LC_ALL, LC_COLLATE(变量对应相应的范畴), LANG 。如果这些环境变量一个都没有设置,那么区域缺省为 C 。

一些信息区域化库也使用环境变量 LANGUAGE ,它覆盖所有其它用于设置语言信息的区域设置。如果有问题,请参考你的操作系统文档,特别是 gettext 的文档获取更多信息。

要允许将信息翻译成用户选择的语言,制作时必需打开 NLS 选项。这个选项独立于其它区域支持。

行为
区域设置特别影响下面的 SQL 特性:

使用 ORDER BY 和区域的排序

使用 LIKE 子句的索引能力

upper, lower, initcap 函数

to_char 函数族

PostgreSQL 里使用非 C 或 POSIX 区域的缺点是速度。它降低了字符处理的速度并阻止了在 LIKE 类查询里面普通索引的使用。因此,只有在你实际上需要的时候才使用它。

为了允许 PostgreSQL 在非 C 区域下的 LIKE子句中使用索引,有好几个自定义的操作符类可以用。这些操作符类允许创建一个严格地比较每个字符的索引,而忽略区域比较规则。请参考节11.8获取更多信息。

问题
如果经过上面解释后区域支持仍然不能运转,那你就要检查一下操作系统的区域支持是否正确配置。要检查某个区域是否安装并且正常运转,你可以使用 locale -a 命令(如果你的系统提供了该命令)。

请检查核实 PostgreSQL 确实使用了你认为它该用的区域设置。LC_COLLATE 和 LC_CTYPE 的设置都是在 initdb 时决定的,如果不重复 initdb 是不可能改变的。其它的区域设置包括 LC_MESSAGES 和 LC_MONETARY 都是由服务器的启动环境决定的,但是可以在运行时修改。你可以用 SHOW 命令检查数据库正在使用的区域设置。

src/test/locale 目录包含 PostgreSQL 的区域支持测试套件。

那些通过分析错误信息处理服务器端错误的客户端应用很明显会有问题,因为服务器信息可能会以不同的语言表示。我们建议这类应用的开发人员改用错误代码机制。

维护信息翻译表需要许多志愿者的坚持不懈的努力,他们就是希望 PostgreSQL 以他们的语言说话的人。如果你的语言信息目前还不可用或者没有完全翻译完成,那么我们很欢迎你的协助。如果你想帮忙,那么请参考章46或者向开发者邮递列表发邮件

4.字符集
要想打开自动字符集转换功能,你必须告诉 PostgreSQL 你想在客户端使用的字符集(编码)。你可以用好几种方法实现这个目的。

用 psql 里的 \encoding 命令。\encoding 允许你动态修改客户端编码。比如,把编码改变为 SJIS ,键入:

\encoding SJIS使用 libpq 函数。\encoding 在做此用途的时候实际上是调用了 PQsetClientEncoding() 函数。

int PQsetClientEncoding(PGconn *conn, const char *encoding);这里的 conn 是一个与服务器的连接,encoding 是你想用的编码。如果编码设置成功它返回 0 ,否则返回 -1 。本次连接的当前编码可以用下面函数显示:

int PQclientEncoding(const PGconn *conn);请注意它只返回编码的 ID ,而不是像 EUC_JP 这样的编码符号字符串。要把编码 ID 转换为编码符号,你可以用:

char *pg_encoding_to_char(int encoding_id);可以用 SQL 命令 SET client_encoding TO 设置客户端编码:

SET CLIENT_ENCODING TO 'value';你还可以把 SQL 语法里的 SET NAMES 用于这个目的:

SET NAMES 'value';查询当前客户端编码:

SHOW client_encoding;返回缺省编码:

RESET client_encoding;使用 PGCLIENTENCODING 。如果在客户端的环境里定义了 PGCLIENTENCODING 环境变量,那么在与服务器进行连接时将自动选择客户端编码。这个编码随后可以用上面谈到的任何其它方法覆盖。

使用 client_encoding 配置变量。如果在 client_encoding 里设置了该变量,那么在与服务器建立了连接之后,这个客户端编码将自动选定。这个设置随后可以被上面提到的其它方法覆盖。

假如无法进行特定的字符转换,比如,你选的服务器编码是 EUC_JP 而客户端是 LATIN1 ,那么有些日文字符不能转换成 LATIN1 。这时将报告错误。

如果客户端字符集定义成了 SQL_ASCII ,那么编码转换会被关闭,不管服务器的字符集是什么都一样。和服务器一样,除非你的工作环境全部是 ASCII 数据,否则使用 SQL_ASCII 是不明智的。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-302265-1-1.html 上篇帖子: PostgreSQL崛起 下篇帖子: postgresql锁
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表