pg 表空间

一、说明 
   在数据库运维工作中,经常会有数据目录使用率较高需要调整的情况,通常会给数据库建立多个表空间, 
并分别位于不同的盘上,这时需要做的工作就是调整库中现有表和索引的表空间 

二、表空间用途 
  表空间就是一个简单的目录,其主要用途分两个: 
1.单独扩展表空间用,一旦磁盘或分区被耗尽,可以创建一个表空间到其他磁盘或分区上面。 
2.区分不同对象的存储位置,比如可将索引放入较快磁盘的表空间上,而将固定不变的数据放入较慢磁盘的表空间上。 

三、表空间共享 
    与Oracle数据库中的表空间被独占不同,PostgreSQL的表空间是可以被共享的。 
当创建了一个表空间后,这个表空间可以被多个数据库、表、索引等数据库对象使用。达到对象的分离与归类的目的。 
    在PostgreSQL中有两个系统自建表空间:pg_global和pg_default。 

前者是系统全局表空间,存储了关键的共享系统目录。后者是系统全局表空间,存储了关键的共享系统目录。 
后者是系统默认表空间,可通过set default tablespace=tablespacename来指定为其他表空间,在建立数据库、表、索引等数据库对象时, 
若不指定表空间参数,则系统自动将对象创建到默认表空间中。 

四、创建表空间: 
mkdir tbs_tina 
chmod 777 tbs_tina/ 
chown postgres:postgres tbs_tina/ 

create tablespace tbs_tina owner postgres location '/pgtina/tbs_tina'; 
create tablespace ind_tina owner postgres location '/pgtina/ind_tina'; 
create table t1(id int) tablespace tbs_tina; 
create index ind_t1 on t1(id) tablespace ind_tina;  ---可以将表和索引放在不同的表空间 

五、用户表空间权限: 
has_tablespace_privilege(user, tablespace, privilege) boolean 用户是否有访问表空间的权限 CREATE 
has_tablespace_privilege(tablespace, privilege) boolean   当前用户是否有访问表空间的权限 CREATE 

tina=# create user sqluser nosuperuser noreplication nocreatedb nocreaterole login encrypted password 'sqlpasswd'; --创建一个普通用户 
CREATE ROLE                                                            
tina=# select has_tablespace_privilege('sqluser','tbs_tina','create');  --sqluser没有tbs_tina表空间的权限 
has_tablespace_privilege 
-------------------------- 

(1 row) 
tina=# grant create on tablespace tbs_tina to sqluser;  ---授权给sqluser 
GRANT 
tina=# select has_tablespace_privilege('sqluser','tbs_tina','create'); --sqluser可以使用tbs_tina表空间了 
has_tablespace_privilege 
-------------------------- 

(1 row) 
tina=# select has_tablespace_privilege('tbs_tina','create'); ---当前用户postgres 拥有表空间tbs_tina的权限 
has_tablespace_privilege 
-------------------------- 

(1 row) 

六、表空间大小查询: 
pg_tablespace_size(oid) bigint 指定 OID 代表的表空间使用的磁盘空间 
pg_tablespace_size(name) bigint 指定名字的表空间使用的磁盘空间 

tina=# select oid,* from pg_tablespace; 
  oid  |  spcname   | spcowner |                  spcacl                  | spcoptions 
-------+------------+----------+------------------------------------------+------------ 
  1663 | pg_default |       10 |                                          | 
  1664 | pg_global  |       10 |                                          | 
16525 | tbs_tina   |       10 | {postgres=C/postgres,sqluser=C/postgres} | 
(3 rows) 

tina=# select pg_tablespace_size(16525)/1024 ||'KB'; ---表空间tbs_tina的oid为16525 
?column? 
---------- 
4KB 
(1 row) 
tina=# select pg_tablespace_size('tbs_tina')/1024||'KB';  ---也可以直接使用表空间名 
?column? 
---------- 
4KB 
(1 row) 
tina=# select pg_size_pretty(pg_tablespace_size('tbs_tina')); 
pg_size_pretty 
---------------- 
4096 bytes 
(1 row) 

七、表所在表空间查询 
PostgreSQL 提供类似" \ "命令很方便得到相关信息,命令如下: 
tina=# \d test1 
                                Table "public.test1" 
Column |         Type          |                     Modifiers                      
--------+-----------------------+---------------------------------------------------- 
id     | integer               | not null default nextval('test1_id_seq'::regclass) 
name   | character varying(10) | 

tina=# \d t1 
      Table "public.t1" 
Column |  Type   | Modifiers 
--------+---------+----------- 
id     | integer | 
Tablespace: "tbs_tina" 

备注:如果这个表的表空间为当前数据库的默认表空间,那么上面则不会显示 Tablespace 信息。 

               
7.1 查询数据库的默认表空间         
tina=# select datname,dattablespace from pg_database where datname='tina'; 
datname | dattablespace 
---------+--------------- 
tina    |          1663 
(1 row) 

tina=# select oid,spcname from pg_tablespace where oid=1663; 
oid  |  spcname   
------+------------ 
1663 | pg_default 
(1 row) 

7.2 查询在默认表空间的表和索引 
select relname, relkind, relpages,pg_size_pretty(pg_relation_size(a.oid)),reltablespace,relowner 
from pg_class a where a.relkind in ('r', 'i') and reltablespace='0' order by a.relpages desc; 

备注:限制条件 reltablespace='0',即可查找出位于当前数据库默认表空间的数据库表和索引。 

7.3 查询不在默认表空间的表和索引 
tina=> select relname,relkind,relpages,pg_size_pretty(pg_relation_size(a.oid)),reltablespace,relowner from pg_class a, 
pg_tablespace tb where a.relkind in('r','i') and a.reltablespace >1664  order by a.relpages desc;  
relname | relkind | relpages | pg_size_pretty | reltablespace | relowner 
---------+---------+----------+----------------+---------------+---------- 
a       | r       |        0 | 0 bytes        |         16525 |    33979 
a       | r       |        0 | 0 bytes        |         16525 |    33979 
a       | r       |        0 | 0 bytes        |         16525 |    33979 

7.4 查询在某个表空间上的对象 
select relname, relkind, relpages,pg_size_pretty(pg_relation_size(a.oid)),reltablespace,relowner 
from pg_class a, pg_tablespace tb where a.relkind in ('r', 'i') 
and a.reltablespace=tb.oid and tb.spcname='tbs_tina' order by a.relpages desc; 
relname | relkind | relpages | pg_size_pretty | reltablespace | relowner 
---------+---------+----------+----------------+---------------+---------- 
t1      | r       |        0 | 0 bytes        |         16525 |       10 
(1 row) 

八、删除表空间 
tina=# drop tablespace ind_tina; 
ERROR:  tablespace "ind_tina" is not empty 

需要先清空表空间内的对象 
tina=# drop index ind_t1; 
DROP INDEX 
tina=# drop tablespace ind_tina; 
DROP TABLESPACE 

九、改变表空间所指向目录位置 
[root@oratest pgtina]# cp -R tbs_tina/  test_tina 

tina=# \db tbs_tina 
          List of tablespaces 
   Name   |  Owner   |     Location     
----------+----------+------------------ 
tbs_tina | postgres | /pgtina/tbs_tina 
(1 row) 

网上介绍的alter tablespace move 和修改pg_tablespace表的location位置都未验证成功

时间: 2024-12-24 21:50:31

pg 表空间的相关文章

temp 表空间无法扩展 案例分析

http://happay99.blog.hexun.com/40831530_d.html 解决ora-01652无法通过128(在temp表空间中)扩展temp段的过程  执行一个sql语句后,大约花了10分钟,好不容易有一个结果,但是报了一个ora-01652错误,查阅了oracle的错误代码说明:意思是指temp表空间无法自动扩展temp段.这种问题一般有两种原因:一是临时表空间空间太小,二是不能自动扩展. 分析过程:    既然是temp表空间有问题,那当然就要从temp表空间说起啦.

更改Oracle数据库表的表空间

oracle|数据|数据库 在Oracle数据库管理系统中,创建库表(table)时要分配一个表空间(tablespace),如果未指定表空间,则使用系统用户确省的表空间. 在Oracle实际应用中,我们可能会遇到这样的问题.处于性能或者其他方面的考虑,需要改变某个表或者是某个用户的所有表的表空间.通常的做法就是首先将表删除,然后重新建表,在新建表时将表空间指定到我们需要改变的表空间.如果该用户已经保存了大量数据,这种办法就就显得不是很方便,因为有大量数据需要提前备份出来.下面介绍一种利用数据库

Oracle表空间传输

Oracle表空间传输是8i 新增加的一种快速在数据库间移动数据的一种办法,是把一个数 据库上的格式数据文件附加到另外一个数据库中,而不是把数据导出成dmp 文件,这 在有些时候是非常管用的,因为传输表空间移动数据就象复制文件一样快. 1.关于传输表空间有一些规则(10g前): · 源数据库和目标数据库必须运行在相同的硬件平台上. [ Oracle备份与恢复总结] E-Mail / MSN : db.dw.dm@gmail.com [ Oracle备份与恢复总结] E-Mail / MSN :

关于表空间

关于表空间从Oracle8i开始,Oracle支持两种类型的表空间:字典管理方式表空间:表空间的所有存储空间的管理信息都保存在数据字典中.本地管理方式表空间:表空间上所有存储空间的管理信息都保存在数据文件头部的"位图"中. 1.字典管理表空间create tablespace ...datafile '...' size ... unuseextent management dictionary 2.本地管理表空间create tablespace ...datafile '...'

本地管理表空间与字典管理表空间的比较

比较 本地管理表空间与字典管理表空间相比大大提高了管理效率和数据库性能,其优点如下: 1.减少了递归空间管理 本地管理表空间是自己管理分配,而不是象字典管理表空间需要系统来管理空间分配,本地表空间是通过在表空间的每个数据文件中维持一个位图来跟踪在此文件中块的剩余空间及使用情况.并及时做更新.这种更新只对表空间的额度情况做修改而不对其他数据字典表做任何update操作,所以不会产生任何回退信息,从而大大减少了空间管理,提高了管理效率.同时由于本地管理表空间可以采用统一大小分配方式(UNIFORM)

如何将EXP出来的数据IMP进不同的表空间

数据 Author:Kamus Mail:kamus@itpub.net Date:2004-1   经常有人会问:原来的数据在USERS表空间里面,我想把它IMP进APP表空间,我已经修改了目的用户的默认表空间,为什么结果还是IMP到USERS表空间中了呢.   关于此问题,作如下解释: Oracle并没有提供什么参数来指定要导入哪个表空间,数据默认将导入到原本导出时数据所在的表空间中,但是我们可以通过以下的方法来实现导入到不同的表空间.   1.在IMP时候使用INDEXFILE参数 当给此

如何查看各个表空间占用磁盘情况

如何查看各个表空间占用磁盘情况? 软件环境:  1.Windows NT4.0+ORACLE 8.0.4 2.ORACLE安装路径为:C:\ORANT SQL语句:        /*     中文环境    */      col 表空间名 format a20;      select       b.file_id  文件ID号,      b.tablespace_name  表空间名,      b.bytes  字节数,      (b.bytes-sum(nvl(a.bytes,0

Oracle中如何快速删除数据字典管理的表空间

oracle|数据 我的测试环境:Hp rp7410主机,Hp-unix11.11 OS,Oracle8.1.7.4的数据库,一个有90张表大约100G的测试表空间TBS_TEST. 问题的提出:Oracle中在使用drop tablespace <tablespace_name> including contents;删除数据字典管理的表空间时存在着很大的效率问题. 测试开始: 1.使用drop tablespace <tablespace_name> including con

Oracle数据库表空间恢复方案

oracle|恢复|数据|数据库 一. 用户表空间 错误: 在启动数据库时出现ORA-01157,ORA-01110或操作系统级错误例如ORA-07360,在关闭数据库(使用shutdown normal或shutdown immediate) 时将导致错误ORA -01116,ORA-01110以及操作系统级错误ORA-07368 解决,以下有两种解决方案: 1.用户的表空间可以被轻易地重建 即最近导出的对象是可用的或表空间中的对象可以被轻易地重建等.在这种情况下,最简单的方法是offline