postgresql中表空间管理

表空间作为数据库对象存放的地方,对于数据库来说是个逻辑概念,它是文件系统中一个目录下的多个数据文件组成. 目录可以不存放在PGDATA下,但是是作为cluster的一个部分,如果备份需要一起备份.

#创建表空间 只能使用superuser来创建表空间

postgres=# create tablespace ts01 location '/var/lib/pgsql/tsdata';
ERROR:  directory "/var/lib/pgsql/tsdata" does not exist
postgres=# \! mkdir -p /var/lib/pgsql/tsdata --目录需要自己创建
postgres=# create tablespace ts01 location '/var/lib/pgsql/tsdata';
CREATE TABLESPACE
postgres=# create tablespace ts02 owner hippo location '/var/lib/pgsql/tsdata'; --同一个目录只能对应一个表空间
ERROR:  directory "/var/lib/pgsql/tsdata/PG_9.4_201409291" already in use as a tablespace
postgres=# \! mkdir /var/lib/pgsql/tsdata02
postgres=# create tablespace ts02 owner hippo location '/var/lib/pgsql/tsdata02'; --可以指定用户
CREATE TABLESPACE

两种方式查看

postgres=# select * from pg_tablespace;
  spcname   | spcowner | spcacl | spcoptions 
------------+----------+--------+------------
 pg_default |       10 |        | 
 pg_global  |       10 |        | 
 ts01       |       10 |        | 
 ts02       |    16384 |        | 
(4 rows)

postgres=# \db
               List of tablespaces
    Name    |  Owner   |        Location         
------------+----------+-------------------------
 pg_default | postgres | 
 pg_global  | postgres | 
 ts01       | postgres | /var/lib/pgsql/tsdata
 ts02       | hippo    | /var/lib/pgsql/tsdata02
(4 rows)

#表空间使用

postgres=# \c database2 user2;
You are now connected to database "database2" as user "user2".
database2=> create table t1(id text);
CREATE TABLE

默认对ts01没有权限

database2=> create table t2(id text) tablespace ts01;
ERROR:  permission denied for tablespace ts01
database2=> \c - postgres
You are now connected to database "database2" as user "postgres".
database2=# alter database database2 set tablespace ts01; --连接在上面不能进行更改
ERROR:  cannot change the tablespace of the currently open database
database2=# \c postgres postgres
You are now connected to database "postgres" as user "postgres".

ts01成为database2默认表空间

postgres=# alter database database2 set tablespace ts01;
ALTER DATABASE
postgres=# \c database2 user2
You are now connected to database "database2" as user "user2".
database2=> create table t2(id text) tablespace ts01;
CREATE TABLE

授权表空间权限给某用户

postgres=# \c database2 user2;
You are now connected to database "database2" as user "user2".
database2=> create table t3(id text) tablespace ts02; --没有ts02权限
ERROR:  permission denied for tablespace ts02
database2=> \c postgres postgres
You are now connected to database "postgres" as user "postgres".
postgres=# grant create on tablespace ts02 to user2; --授权
GRANT
postgres=# \c database2 user2;
You are now connected to database "database2" as user "user2".
database2=> create table t3(id text) tablespace ts02;
CREATE TABLE

#表空间对应与文件系统 PGDATA下的pg_tblspc目录下存放的是表空间的链接

[postgres@fnddb pg_tblspc]$ pwd
/var/lib/pgsql/data/pg_tblspc
[postgres@fnddb pg_tblspc]$ ll
total 0
lrwxrwxrwx. 1 postgres postgres 21 Feb  6 22:52 16423 -> /var/lib/pgsql/tsdata
lrwxrwxrwx. 1 postgres postgres 23 Feb  6 23:04 16425 -> /var/lib/pgsql/tsdata02

#初始化cluster时默认的表空间说明 database cluster初始化时,默认创建两个表空间

  • pg_global --系统字典表都存这里
  • pg_default --template0,template1默认表空间,因此通过create database 不带tablespace参数创建的数据库都使用此表空间

//END

转载于:https://my.oschina.net/hippora/blog/376155

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值