sql-表空间
-
表空间
编辑
- 表空间
- tablespaces
- 数据库
- Oracle数据库
- 表空间的设计理念
- 服务器
目录
客户要求用pgsql,所在服务器装了一下pgsql,我出了一个pgsql的分类,看这篇文章前,把这个分类下的文章都可以看一下,这是我熟悉pgsql的一套流程。以前搞过一次pgsql,很早了。
1,查看数据库
- playboy=> \l //\加上字母l,相当于mysql的,mysql> show databases;
- List of databases
- Name | Owner | Encoding
- -----------+----------+----------
- playboy | postgres | UTF8
- postgres | postgres | UTF8
- template0 | postgres | UTF8
- template1 | postgres | UTF8
- playboy=> select pg_database_size('playboy'); //查看playboy数据库的大小
- pg_database_size
- ------------------
- 3637896
- (1 row)
- playboy=> select pg_database.datname, pg_database_size(pg_database.datname) AS size from pg_database; //查看所有数据库的大小
- datname | size
- -----------+---------
- postgres | 3621512
- playboy | 3637896
- template1 | 3563524
- template0 | 3563524
- (4 rows)
- playboy=> select pg_size_pretty(pg_database_size('playboy')); //以KB,MB,GB的方式来查看数据库大小
- pg_size_pretty
- ----------------
- 3553 kB
- (1 row)
2,查看多表
- playboy=> \dt //相当于mysql的,mysql> show tables;
- List of relations
- Schema | Name | Type | Owner
- --------+------+-------+---------
- public | test | table | playboy
- (1 row)
3,查看单表
- playboy=> \d test; //相当于mysql的,mysql> desc test;
- Table "public.test"
- Column | Type | Modifiers
- --------+-----------------------+-----------
- id | integer | not null
- name | character varying(32) |
- Indexes: "playboy_id_pk" PRIMARY KEY, btree (id)
- playboy=> select pg_relation_size('test'); //查看表大小
- pg_relation_size
- ------------------
- 0
- (1 row)
- playboy=> select pg_size_pretty(pg_relation_size('test')); //以KB,MB,GB的方式来查看表大小
- pg_size_pretty
- ----------------
- 0 bytes
- (1 row)
- playboy=> select pg_size_pretty(pg_total_relation_size('test')); //查看表的总大小,包括索引大小
- pg_size_pretty
- ----------------
- 8192 bytes
- (1 row)
4,查看索引
- playboy=> \di //相当于mysql的,mysql> show index from test;
- List of relations
- Schema | Name | Type | Owner | Table
- --------+---------------+-------+---------+-------
- public | playboy_id_pk | index | playboy | test
- (1 row)
- playboy=> select pg_size_pretty(pg_relation_size('playboy_id_pk')); //查看索大小
- pg_size_pretty
- ----------------
- 8192 bytes
- (1 row)
5,查看表空间,以及大小
- playboy=> select spcname from pg_tablespace; //查看所有表空间
- spcname
- ------------
- pg_default
- pg_global
- (2 rows)
- playboy=> select pg_size_pretty(pg_tablespace_size('pg_default')); //查看表空间大小
- pg_size_pretty
- ----------------
- 14 MB
- (1 row)
在数据库运维工作中,经常会有数据目录使用率较高需要调整的情况,通常会给数据库建立多个表空间,
并分别位于不同的盘上,这时需要做的工作就是调整库中现有表和索引的表空间,下面简单总结下这块维护
工作的内容,以下都是基于 PostgreSQL 9.0.1 做的测试。
一 查询某个表所在表空间的简单方法
PostgreSQL 提供类似" \ "命令很方便得到相关信息,命令如下:
skytf=> \d test_2
Table "skytf.test_2"
Column | Type | Modifiers
--------+-----------------------+-----------
id | integer |
obj_id | integer | not null
name | character varying(64) |
Indexes:
"idx_hash_name" hash (name)
"idx_test_2" btree (id, obj_id)
Tablespace: "tbs_skytf_idx"
备注:如果这个表的表空间为当前数据库的默认表空间,那么上面则不会显示 Tablespace 信息,
相反,则会显示这张有的表空间,例如上面的表 test_2 的表空间为 tbs_skytf_idx,而
表空间 "tbs_skytf_idx" 不是数据库 skytf 的默认表空间, 那么如何查询数据库的默认
表空间呢,可以通过以下命令查询。
--1.1 查询数据库的默认表空间
skytf=> select datname,dattablespace from pg_database where datname='skytf';
datname | dattablespace
---------+---------------
skytf | 14203070
(1 row)
skytf=> select oid,spcname from pg_tablespace where oid=14203070;
oid | spcname
----------+-----------
14203070 | tbs_skytf
(1 row)
备注:通过以上查出数据库 skytf 的默认表空间为 tbs_skytf。
二 批量查询数据库表和索引的表空间
--2.1 查询表和索引所在的表空间
select relname, relkind, relpages,pg_size_pretty(pg_relation_size(a.oid)), tb.spcname
from pg_class a, pg_tablespace tb
where a.reltablespace = tb.oid
and a.relkind in ('r', 'i')
order by a.relpages desc;
备注:上面只取了部分结果,这个查询能够查询表和索引所处的表空间,但是有一点需要注意,这个查询
仅显示表空间不是数据库默认表空间的数据库对像,而我们通常需要查出位于数据库默认表空间的
对像,显然上面的查询不是我们想要的,接下来看另一个查询。
--2.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',即可查找出位于当前数据库默认表空间的
数据库表和索引。 通常这才是我们想要的结果,接下来可以把部分表转移到其它表空间上去,转移
的方法可以用 "ALTER TABLE table name move tablespace tablespace_name"或者重建索引移表空间等方法,这里不详细介绍。
--2.3 查询在某个表空间上的对像
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='tablespace_name' order by a.relpages desc; |
--2.4 手册上对于 pgclass 视图的 reltablespace 字段解释
The tablespace in which this relation is stored. If zero, the database is default tablespace is
implied. (Not meaningful if the relation has no on-disk file.)
select pg_database.datname, pg_database_size(pg_database.datname) AS size from pg_database; //查看所有数据库的大小