PostgreSQL的表空间、数据库、用户之间的关系

联系:手机/微信(+86 17813235971) QQ(107644445)

标题:PostgreSQL的表空间、数据库、用户之间的关系

作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]

玩多了Oracle,习惯了使用Oracle的体系架构去对比别的数据库,今天看PostgreSQL发现两者明显不一样:
1. 在数据库/表空间/schema三者关系上的区别
20180803011116


表空间是物理结构,同一表空间下可以有多个数据库
数据库是逻辑结构,是表/索引/视图/存储过程的集合,一个数据库下可以有多个schema
模式是逻辑结构,是对数据库的逻辑划分
2. 在oracle中用户和schema基本上可以画上等同关系,但是pg中两者没有这样严格的对应关系

相关测试实验
创建用户
在pg中role比user少login,其他基本上相同(也就是说如果给role授权login,等同user)

postgres=# CREATE USER u_xifenfei WITH
postgres-# LOGIN
postgres-# SUPERUSER
postgres-# CREATEDB
postgres-# CREATEROLE
postgres-# INHERIT
postgres-# REPLICATION
postgres-# CONNECTION LIMIT -1
postgres-# PASSWORD 'xifenfei';
CREATE ROLE

创建表空间

postgres=# CREATE TABLESPACE tbs_xifenfei
postgres-#   OWNER u_xifenfei
postgres-#   LOCATION 'D:\Program Files\PostgreSQL\tbs_xifenfei';
CREATE TABLESPACE

创建数据库

postgres=# CREATE DATABASE db_xifenfei
postgres-#     WITH
postgres-#     OWNER = u_xifenfei
postgres-#     ENCODING = 'UTF8'
postgres-#     TABLESPACE = tbs_xifenfei
postgres-#     CONNECTION LIMIT = -1;
CREATE DATABASE

查询数据库和表空间信息

postgres=# select oid, datname, datlastsysoid, dattablespace
postgres-#  from pg_catalog.pg_database order by 1,2;
  oid  |   datname   | datlastsysoid | dattablespace
-------+-------------+---------------+---------------
     1 | template1   |         12937 |          1663
 12937 | template0   |         12937 |          1663
 12938 | postgres    |         12937 |          1663
 16407 | db_xifenfei |         12937 |         16406
(4 行记录)
postgres=# select oid,* from pg_catalog.pg_tablespace;
  oid  |   spcname    | spcowner | spcacl | spcoptions
-------+--------------+----------+--------+------------
  1663 | pg_default   |       10 |        |
  1664 | pg_global    |       10 |        |
 16406 | tbs_xifenfei |    16405 |        |
(3 行记录)

使用u_xifenfei用户登录

C:\Users\Administrator>psql -U u_xifenfei -d db_xifenfei
用户 u_xifenfei 的口令:
psql (10.4)
输入 "help" 来获取帮助信息.
db_xifenfei=# \c
您现在已经连接到数据库 "db_xifenfei",用户 "u_xifenfei".

创建测试表

db_xifenfei=# create table t_xifenfei as select * from pg_database;
SELECT 5
db_xifenfei=# select pg_relation_filepath('t_xifenfei');
            pg_relation_filepath
---------------------------------------------
 pg_tblspc/16406/PG_10_201707211/16407/16408
(1 行记录)
db_xifenfei=# insert into t_xifenfei select * from t_xifenfei;
INSERT 0 5
…………
db_xifenfei=# insert into t_xifenfei select * from t_xifenfei;
INSERT 0 327680
db_xifenfei=# select count(*) from t_xifenfei;
  count
---------
 1310720
(1 行记录)

20180803001342


这里可以发现,创建表空间其实对应的是一个文件夹路径,创建数据库是在对应的表空间中创建相关目录和文件,创建表是对应的相关文件.
参考:PostgreSQL tablespace database schema