PostgreSQL数据库管理 第五章表空间管理
概述
PostgreSQL是一个功能非常强大的、源代码开放的客户/服务器关系型数据库管理系统(RDBMS)。支持丰富的数据类型(如JSON和JSONB类型,数组类型)和自定义类型。PostgreSQL内存页面的默认大小是8kB。
PostgreSQL的层级结构
1.逻辑层次关系
Database Cluster(instance)--》Database--》Schema--》Objects(Table)-->Tuples
2.物理层次关系
Database Cluster --》Tablespaces --》Files --》 Blocks
5.1 表空间概念与数据库关系
在 PostgreSQL 中,表空间(tablespace)表示数据文件的存放目录,这些数据文件代表了数据库的对象,例如表或索引。当我们访问表时,系统通过它所在的表空间定位到对应数据文件所在的位置。
在PostgreSQL中表空间实际上就是给表或者索引指定一个存储目录。
在Oracle,db2数据库中;一个表空间只属于一个数据库使用;而一个数据库可以拥有多个表空间。属于"一对多"的关系
在PostgreSQL集群中;一个表空间可以让多个数据库使用;而一个数据库可以使用多个表空间。属于"多对多"的关系。
5.2 表空间作用
通过使用表空间,管理员可以控制一个PostgreSQL安装的磁盘布局。这么做至少有两个用处。
1 如果初始化集簇所在的分区或者卷用光了空间,而又不能在逻辑上扩展或者做别的什么操作,那么表空间可以被创建在一个不同的分区上,直到系统可以被重新配置。
2 表空间允许管理员根据数据库对象的使用模式来优化性能。例如,一个很频繁使用的索引可以被放在非常快并且非常可靠的磁盘上,如一种非常贵的固态设备。同时,一个很少使用的或者对性能要求不高的存储归档数据的表可以存储在一个便宜但比较慢的磁盘系统上。
5.3 系统自带表空间
1表空间pg_default是用来存储系统目录对象、用户表、用户表index、和临时表、临时表index、内部临时表的默认空间。对应存储目录$PADATA/base/
2 表空间pg_global用来存放系统字典表;对应存储目录$PADATA/global/
5.4 表空间查看
postgres=# \db
postgres=# \db+ 详细信息
5.4.1 表空间和数据库关系
select oid, datname, datlastsysoid, dattablespace from pg_catalog.pg_database order by 1,2;
postgres=# select oid,* from pg_catalog.pg_tablespace;
5.4.2 表空间和对象的关系
5.4.3 查看表的存储路径与大小
查看单表大小
select pg_size_pretty(pg_relation_size('test1'));
查看所有表的大小
SELECT
table_name,
pg_size_pretty(table_size) AS table_size,
pg_size_pretty(indexes_size) AS indexes_size,
pg_size_pretty(total_size) AS total_size
FROM (
SELECT
table_name,
pg_table_size(table_name) AS table_size,
pg_indexes_size(table_name) AS indexes_size,
pg_total_relation_size(table_name) AS total_size
FROM (
SELECT ('"' || table_schema || '"."' || table_name || '"') AS table_name
FROM information_schema.tables
) AS all_tables
ORDER BY total_size DESC
) AS pretty_sizes;
查看表的物理存储路径
select pg_relation_filepath('test1');
5.5 创建表空间
目录表空间目录必须是一个已有的空目录,并且属于PostgreSQL操作系统用户
[postgres@Redhat7 ~]$ mkdir /pgdb/jsdb
CREATE TABLESPACE tablespace_name [ OWNER { new_owner | CURRENT_USER | SESSION_USER } ] LOCATION 'directory'
atlasdb=# create tablespace jsdb owner postgres location '/pgdb/jsdb';
atlasdb=# create tablespace jkdb owner postgres location '/pgdb/jkdb';
atlasdb=# CREATE TABLE t2(id int) tablespace jsdb;
insert into t2 valuse (1);
atlasdb=# CREATE TABLE t3(id int) tablespace jkdb;
atlasdb=# insert into t2 values (1);
INSERT 0 1
Time: 0.670 ms
atlasdb=# insert into t3 values (1);
INSERT 0 1
Time: 0.602 ms
5.6 为数据库指定默认表空间
查看数据库默认表空间参照5.4.1
操作失败不能对修改数据库有连接
atlasdb=# alter database atlasdb set tablespace jsdb;
ERROR: cannot change the tablespace of the currently open database
Time: 0.239 ms
成功
postgres=# alter database atlasdb set tablespace jsdb;
ERROR: some relations of database "atlasdb" are already in tablespace "jsdb"
HINT: You must move them back to the database's default tablespace before using this command.
Time: 101.146 ms
错误:数据库“ATLASDB”的一些关系已经在表空间“JSDB”中
提示:在使用此命令之前,必须将它们移回数据库的默认表空间。
atlasdb=# ALTER TABLE t2 SET TABLESPACE pg_default;
ALTER TABLE
postgres=# alter database atlasdb set tablespace jsdb;
ALTER DATABASE
5.7 移动对象到新表空间
atlasdb=# ALTER TABLE t2 SET TABLESPACE jsdb;
ALTER TABLE
atlasdb=# ALTER TABLE t3 SET TABLESPACE jsdb;
ALTER TABLE
atlasdb=# ALTER TABLE test1 SET TABLESPACE jsdb;
ALTER TABLE
5.8 删除表空间
atlasdb=# DROP TABLESPACE jkdb;
DROP TABLESPACE
atlasdb=# DROP TABLESPACE jsdb;
ERROR: tablespace "jsdb" is not empty
5.X 疑问
表空间和对象的关系如何查询