百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

云贝教育 |【技术文章】PG表空间介绍

toyiye 2024-07-03 02:10 11 浏览 0 评论

一、表空间概述

PostgreSQL 中的ablespace 允许数据库管理员定义文件系统中可以存储表示数据库对象的文件的位置。创建后,在创建数据库对象时可以通过名称引用表空间。

通过使用表空间,管理员可以控制 PostgreSQL 安装的磁盘布局。这至少在两个方面很有用。首先,如果初始化集群的分区或卷空间不足且无法扩展,则可以在不同的分区上创建表空间并使用它,直到可以重新配置系统为止。

其次,表空间允许管理员利用数据库对象使用模式的知识来优化性能。例如,可以将频繁使用的索引放置在非常快、高度可用的磁盘上,例如昂贵的固态设备。同时,存储很少使用或性能不关键的归档数据的表可以存储在较便宜、较慢的磁盘系统上。


注意:

即使位于主 PostgreSQL 数据目录之外,表空间也是数据库集群的一个组成部分,不能被视为数据文件的自治集合。它们依赖于主数据目录中包含的元数据,因此不能附加到不同的数据库集群或单独备份。同样,如果丢失表空间(文件删除、磁盘故障等),数据库集群可能会变得不可读或无法启动。将表空间放置在 RAM 磁盘等临时文件系统上会危及整个集群的可靠性。


二、表空间使用

要定义表空间,请使用 CREATE TABLESPACE 命令,例如:

CREATE TABLESPACE fastspace LOCATION '/ssd1/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 子句。

还有一个 temp_tablespaces 参数,它确定临时表和索引以及用于对大型数据集进行排序等目的的临时文件的位置。这可以是表空间名称的列表,而不仅仅是一个,以便与临时对象相关的负载可以分布在多个表空间上。每次创建临时对象时都会从列表中随机选择一个成员。

与数据库关联的表空间用于存储该数据库的系统目录。此外,如果没有给出 TABLESPACE 子句并且 default_tablespace 或 temp_tablespaces 没有指定其他选择(视情况而定),则它是用于在数据库中创建的表、索引和临时文件的默认表空间。如果创建数据库时未为其指定表空间,则它将使用与从中复制的模板数据库相同的表空间。

数据库集群初始化时会自动创建两个表空间。 pg_global 表空间用于共享系统目录。 pg_default 表空间是 template1 和 template0 数据库的默认表空间(因此,也将是其他数据库的默认表空间,除非被 CREATE DATABASE 中的 TABLESPACE 子句覆盖)。

创建后,只要请求用户具有足够的权限,就可以从任何数据库使用表空间。这意味着在删除使用该表空间的所有数据库中的所有对象之前,无法删除该表空间。

要删除空表空间,请使用 DROP TABLESPACE 命令。

要确定现有表空间集,请检查 pg_tablespace 系统目录,例如

SELECT spcname FROM pg_tablespace;

psql 程序的 db 元命令对于列出现有表空间也很有用。

目录 $PGDATA/pg_tblspc 包含指向集群中定义的每个非内置表空间的符号链接。尽管不推荐,但可以通过重新定义这些链接来手动调整表空间布局。在任何情况下都不要在服务器运行时执行此操作。请注意,在 PostgreSQL 9.1 及更早版本中,您还需要使用新位置更新 pg_tablespace 目录。 (如果不这样做,pg_dump 将继续输出旧的表空间位置。)


三、表空间语法介绍

3.1 创建语法

CREATE TABLESPACE tablespace_name
[ OWNER { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER } ]
 LOCATION 'directory'
[ WITH ( tablespace_option = value [, ... ] ) ]

3.2 描述

CREATE TABLESPACE 注册一个新的集群范围的表空间。表空间名称必须与数据库集群中任何现有表空间的名称不同。

表空间允许超级用户在文件系统上定义一个替代位置,其中包含数据库对象(例如表和索引)的数据文件可以驻留在其中。

具有适当权限的用户可以将 tablespace_name 传递给 CREATE DATABASE、CREATE TABLE、CREATE INDEX 或 ADD CONSTRAINT,以便将这些对象的数据文件存储在指定的表空间中。


3.3 参数介绍

tablespace_name

要创建的表空间的名称。该名称不能以 pg_ 开头,因为此类名称是为系统表空间保留的。

user_name

将拥有该表空间的用户的名称。如果省略,则默认为执行该命令的用户。只有超级用户才能创建表空间,但他们可以将表空间的所有权分配给非超级用户。

directory

将用于表空间的目录。该目录必须存在(CREATE TABLESPACE 不会创建它),应该为空,并且必须由 PostgreSQL 系统用户拥有。该目录必须由绝对路径名指定。

tablespace_option

要设置或重置的表空间参数。目前,唯一可用的参数是 seq_page_cost、random_page_cost、 effective_io_concurrency 和maintenance_io_concurrency。为特定表空间设置这些值将覆盖规划器对从该表空间中的表读取页面的成本的通常估计,以及执行器的预取行为,如由同名配置参数建立的(请参阅 seq_page_cost、random_page_cost、 effective_io_concurrency、maintenance_io_concurrency) )。如果一个表空间位于比 I/O 子系统的其余部分更快或更慢的磁盘上,这可能很有用。

3.4 注意

CREATE TABLESPACE 不能在事务块内执行。

3.5 示例

要在文件系统位置 /data/dbs 创建表空间 dbspace,首先使用操作系统工具创建目录并设置正确的所有权:

mkdir /data/dbs
chown postgres:postgres /data/dbs

然后在 PostgreSQL 中发出表空间创建命令:

CREATE TABLESPACE dbspace LOCATION '/data/dbs';

要创建由不同数据库用户拥有的表空间,请使用如下命令:

CREATE TABLESPACE indexspace OWNER genevieve LOCATION '/data/indexes';

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码