1. 表空间的概念

PostgreSQL中的表空间允许在文件系统中定义用来存放表示数据库对象的文件的位置。在PostgreSQL中表空间实际上就是给表指定一个存储目录。

2. 表空间的作用

官方解释


通过使用表空间,管理员可以控制一个PostgreSQL安装的磁盘布局。这么做至少有两个用处。

  1. 如果初始化集簇所在的分区或者卷用光了空间,而又不能在逻辑上扩展或者做别的什么操作,那么表空间可以被创建在一个不同的分区上,直到系统可以被重新配置。
  2. 表空间允许管理员根据数据库对象的使用模式来优化性能。例如,一个很频繁使用的索引可以被放在非常快并且非常可靠的磁盘上,如一种非常贵的固态设备。同时,一个很少使用的或者对性能要求不高的存储归档数据的表可以存储在一个便宜但比较慢的磁盘系统上。

用一句话来讲:能合理利用磁盘性能和空间,制定最优的物理存储方式来管理数据库表和索引。

3. 表空间跟数据库关系

  • 在Oracle数据库中;一个表空间只属于一个数据库使用;而一个数据库可以拥有多个表空间。属于"一对多"的关系
  • 在PostgreSQL集群中;一个表空间可以让多个数据库使用;而一个数据库可以使用多个表空间。属于"多对多"的关系。

4. 系统自带表空间

  • 表空间pg_default是用来存储系统目录对象、用户表、用户表index、和临时表、临时表index、内部临时表的默认空间。对应存储目录$PADATA/base/
  • 表空间pg_global用来存放系统字典表;对应存储目录$PADATA/global/

5. 查看表空间

列出现有的表空间

  1. postgres=# \db
  2. List of tablespaces
  3. Name | Owner | Location
  4. ------------+----------+---------------------
  5. pg_default | postgres |
  6. pg_global | postgres |
  7. tp_lottu | lottu | /data/pg_data/lottu
  8. (3 rows)
  9.  
  10. postgres=# select oid,* from pg_tablespace;
  11. oid | spcname | spcowner | spcacl | spcoptions
  12. -------+------------+----------+--------+------------
  13. 1663 | pg_default | 10 | |
  14. 1664 | pg_global | 10 | |
  15. 16385 | tp_lottu | 16384 | |
  16. (3 rows)

6. 创建表空间

Syntax:

  1. CREATE TABLESPACE tablespace_name [ OWNER { new_owner | CURRENT_USER | SESSION_USER } ] LOCATION 'directory'

示例如下:

  1. postgres=# \c lottu postgres
  2. You are now connected to database "lottu" as user "postgres".
  3. lottu=# CREATE TABLESPACE tsp01 OWNER lottu LOCATION '/data/pg_data/tsp';
  4. CREATE TABLESPACE

目录"/data/pg_data/tsp"必须是一个已有的空目录,并且属于PostgreSQL操作系统用户

  1. $ mkdir -p /data/pg_data/tsp
  2. $ chown -R postgres:postgres /data/pg_data/tsp

7. 权限分配

表空间的创建本身必须作为一个数据库超级用户完成,但在创建完之后之后你可以允许普通数据库用户来使用它.要这样做,给数据库普通用户授予表空间上的CREATE权限。表、索引和整个数据库都可以被分配到特定的表空间.
示例用户"rax":为普通用户。

  1. lottu=# \c lottu01 rax
  2. You are now connected to database "lottu01" as user "rax".
  3. lottu01=> create table test_tsp(id int) tablespace tsp01;
  4. ERROR: permission denied for tablespace tsp01
  5. lottu01=> \c lottu01 postgres
  6. You are now connected to database "lottu01" as user "postgres".
  7. lottu01=# GRANT CREATE ON TABLESPACE tsp01 TO rax;
  8. GRANT
  9. lottu01=# \c lottu01 rax
  10. You are now connected to database "lottu01" as user "rax".
  11. lottu01=> create table test_tsp(id int) tablespace tsp01;
  12. CREATE TABLE

8. 为数据库指定默认表空间

Syntax:

  1. ALTER DATABASE name SET TABLESPACE new_tablespace

以数据库lottu01为例:

  1. ALTER DATABASE lottu01 SET TABLESPACE tsp01;
  2. lottu01=> \c lottu01 lottu
  3. You are now connected to database "lottu01" as user "lottu".

注意1:执行该操作;不能连着对应数据库操作

  1. lottu01=# ALTER DATABASE lottu01 SET TABLESPACE tsp01;
  2. ERROR: cannot change the tablespace of the currently open database
  3. lottu01=# \c postgres postgres
  4. You are now connected to database "postgres" as user "postgres".

注意2:执行该操作;对应的数据库不能存在表或者索引已经指定默认的表空间

  1. postgres=# ALTER DATABASE lottu01 SET TABLESPACE tsp01;
  2. ERROR: some relations of database "lottu01" are already in tablespace "tsp01"
  3. HINT: You must move them back to the database's default tablespace before using this command.
  4. postgres=# \c lottu01
  5. You are now connected to database "lottu01" as user "postgres".
  6. lottu01=# drop table test_tsp ;
  7. DROP TABLE
  8. lottu01=# create table test_tsp(id int);
  9. CREATE TABLE
  10. lottu01=# \c postgres postgres
  11. You are now connected to database "postgres" as user "postgres".

注意3:执行该操作;必须是没有人连着对应的数据库

  1. postgres=# ALTER DATABASE lottu01 SET TABLESPACE tsp01;
  2. ERROR: database "lottu01" is being accessed by other users
  3. DETAIL: There is 1 other session using the database.
  4. postgres=# ALTER DATABASE lottu01 SET TABLESPACE tsp01;
  5. ALTER DATABASE

查看数据库默认表空间

  1. lottu01=# select d.datname,p.spcname from pg_database d, pg_tablespace p where d.datname='lottu01' and p.oid = d.dattablespace;
  2. datname | spcname
  3. ---------+---------
  4. lottu01 | tsp01
  5. (1 row)

9. 如何将表从一个表空间移到另一个表空间。

我们知道表空间pg_default是用来存储系统目录对象、用户表、用户表index、和临时表、临时表index、内部临时表的默认空间。若没指定默认表空间;表就所属的表空间就是pg_default。"当然也可以通过参数设置"。而不是数据库默认的表空间。这个时候我们可以将表移到默认的表空间
Syntax:

  1. ALTER TABLE name SET TABLESPACE new_tablespace

将表从一个表空间移到另一个表空间

  1. lottu01=# create table test_tsp03(id int) tablespace tp_lottu;
  2. CREATE TABLE
  3. lottu01=# alter table test_tsp03 set tablespace tsp01;
  4. ALTER TABLE

注意:该操作时会锁表。

10. 临时表空间

PostgreSQL的临时表空间,通过参数temp_tablespaces进行配置,PostgreSQL允许用户配置多个临时表空间。配置多个临时表空间时,使用逗号隔开。如果没有配置temp_tablespaces 参数,临时表空间对应的是默认的表空间pg_default。PostgreSQL的临时表空间用来存储临时表或临时表的索引,以及执行SQL时可能产生的临时文件例如排序,聚合,哈希等。为了提高性能,一般建议将临时表空间放在SSD或者IOPS,以及吞吐量较高的分区中。

  1. $ mkdir -p /data/pg_data/temp_tsp
  2. $ chown -R postgres:postgres /data/pg_data/temp_tsp
  3. postgres=# CREATE TABLESPACE temp01 LOCATION '/data/pg_data/temp_tsp';
  4. CREATE TABLESPACE
  5. postgres=# show temp_tablespaces ;
  6. temp_tablespaces
  7. ------------------
  8.  
  9. (1 row)

设置临时表空间

  • 会话级生效
  1. postgres=# set temp_tablespaces = 'temp01';
  2. SET
  • 永久生效
  1. 修改参数文件postgresql.conf
  2. 执行pg_ctl reload
  1. [postgres@Postgres201 data]$ grep "temp_tablespace" postgresql.conf
  2. temp_tablespaces = 'temp01' # a list of tablespace names, '' uses

查看临时表空间

  1. postgres=# show temp_tablespaces ;
  2. temp_tablespaces
  3. ------------------
  4. temp01
  5. (1 row)
 

PostgreSQL的表空间的更多相关文章

  1. postgresql逻辑结构--表空间(四)

    一.创建表空间 1. 语法:create tablespace tablespace_name [owner user_name] location 'directory' postgres=# cr ...

  2. PostgreSQL修改表空间

    创建两个目录做表空间: mkdir /var/lib/pgsql/mydb_tbspace/ mkdir /var/lib/pgsql/java_tbspace/ 创建表空间: postgres=# ...

  3. PostgreSQL在不同的表空间移动数据文件

    一.背景 在工作中,可能会遇到将表从一个表空间移动另一个表空间.例如 * 对数据进行冷处理 * 表空间所在的磁盘空间不足 * 建表时分配错了表空间 以上等等,可能需要你将一个表移动表空间. 二.表空间 ...

  4. PostgreSQL表空间、数据库、模式、表、用户/角色之间的关系

    看PostgreSQL9的官方文档,我越看越迷糊,这表空间,数据库,模式,表,用户,角色之间的关系怎么在PostgreSQL里这么混乱呢?经过中午的一个小实验,我逐渐理清了个中来龙去脉.下面我来还原我 ...

  5. PostgreSQL表空间、模式、表、用户/角色之间的关系

    PostgreSQL表空间.模式.表.用户/角色之间的关系是本文我们主要要介绍的内容,表空间,数据库,模式,表,用户,角色之间的关系到底是怎样的呢?接下来我们就开始介绍这一过程. 实验出角色与用户的关 ...

  6. postgresql基本操作:查看数据库、索引、表、表空间大小

    一.简介 PostgreSQL 提供了多个系统管理函数来查看表,索引,表空间及数据库的大小,下面详细介绍一下. 二.数据库对象尺寸函数 函数名 返回类型 描述 pg_column_size(any) ...

  7. PostgreSQL 表空间

    PostgreSQL 表空间 一 介绍使用表空间可以将不同的表放到不同的存储介质或不同的文件系统下,实际上是为表指定一个存储的目录.创建数据库,表,索引时可以指定表空间,将数据库,表,索引放到指定的目 ...

  8. postgresql 数据库,模式,表空间的关系

    数据库与模式模式(schema)是对数据库(database)逻辑分割在数据库创建的同时,就已经默认为数据库创建了一个模式--public,这也是该数据库的默认模式.所有为此数据库创建的对象(表.函数 ...

  9. PostgreSQL表空间

    postgres=# \h create tablespace Command: CREATE TABLESPACEDescription: define a new tablespaceSyntax ...

随机推荐

  1. How get a String Width in Libgdx?

    http://stackoverflow.com/questions/16600547/how-get-a-string-width-in-libgdx

  2. node学习笔记3——文件操作fs

    文件操作关键字: http('fs') ——  请求 node 里面的 http 模块 readFile ——  读文件,参数包括 文件名,回调函数 writeFile ——  写文件,参数包括 文件 ...

  3. share a story on OSPF & BGP

    IP掌门把两个得意门生——BGP和OSPF叫到跟前,询问他们的修炼心得,以选择弟子传授大内心法——MPLS VPN.OSPF说:“小徒苦心研读路由原理,技术资料上万页,网络在我的围护下无环路,触发更新 ...

  4. 关于Unity中坐标系的种类

    坐标空间 1:物体空间: 3D物体自己的坐标空间 一般设计时几何体以中心为原点,人物以双脚为原点; 2: 世界空间: 3D物体在场景中的世界坐标, 整个游戏场景的空间; 3: 摄像机空间: 以观察摄像 ...

  5. Mybatis系列(四):Mybatis缓存

    一.MyBatis缓存介绍 MyBatis 提供了一级缓存和二级缓存的支持        1. 一级缓存: 默认开启,基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...

  6. e829. 获得和设置JTabbedPane 的卡片

    // To create a tabbed pane, see e828 创建JTabbedPane // Get the index of the currently selected tab in ...

  7. WEB网页监控系统的设计框架思路具体解释

    提示:也能够直接在LCD上显示摄像头数据.这个參考luvcview源代码.设计思路思将YUV或者MJPEG格式的数据转换成RGB格式的数据,然后实现图片的缩放,图像缩放算法:点击这里!,然后写到fra ...

  8. 使用selenium遇到java.lang.NoSuchMethodError: org.apache.xpath.XPathContext,排查

    初试selenium webdriver,运行小程序,抛如下错误:   java.lang.NoSuchMethodError: org.apache.xpath.XPathContext.<i ...

  9. EasyUI的combobox组件Chrome浏览器不兼容问题解决办法

    EasyUI版本:jQuery EasyUI 1.4.1 Chrome浏览器版本:41.0.2272.101 m 问题描述 在Chrome浏览器下,下拉框选择选项之后,选择的值在下拉框中不显示,重新选 ...

  10. 无向带权图的最小生成树算法——Prim及Kruskal算法思路

    边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权. 最小生成树(MST):权值最小的生成树. 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路.可以 ...