zoukankan      html  css  js  c++  java
  • PG-存储结构之逻辑存储结构1

    结构图

    image-20200606094651106

    存储结构

    • 逻辑存储结构:数据库内部的组织和管理数据的方式
    • 物理存储结构:操作系统中组织和管理数据的方式

    3. 逻辑存储结构

    数据库集簇是对象的集合。一个数据库集簇可以包含多个database,多个User,每个database及它里面的对象都有他们的所有者。

    image-20200608101858642

    image-20210621205123647

    3.1 数据库(Database)

    在PostgreSQL中,数据库本身也是一个对象,在逻辑上彼此隔离。

    表空间(tablespace)

    数据库在逻辑上分成多个存储单元,称为表空间。初始化后,默认创建pg_default和pg_global两个表空间。

    • pg_global:用于存放系统表。
    • pg_default:该表空间的物理文件存储在数据目录中的base目录中

    表空间实际上是为表指定一个存储目录。

    每个用户定义的表空间都在PGDATA/pg_tblspc目录里面有一个符号链接,它指向物理的表空间目录(即CREATE TABLESPACE命令里指定的目录)。符号连接是用表空间的 OID 命名。物理表空间目录中有一个名称取决于PostgreSQL服务器版本的子目录,如:PG_12_201909212(下划线分割中第二部分内容即软件版本号)。

    dev->devdb@[local]:5432=> select pg_relation_filepath('student');
                pg_relation_filepath             
    ---------------------------------------------
     pg_tblspc/16384/PG_12_201909212/16385/16429 
    

    pg_tblspc/16384/PG_12_201909212/16385/16429格式:$PGDATA/pg_tblspc/符号链接/PG_SERVER版本号_Catalog版本号/数据库oid/对象(表或索引)oid。Catalog版本号可以通过pg_controldata工具获取。

    image-20200605143701069

    • 符号链接指向物理表空间目录:如这里16384,16384 -> /ups/data/pgdata/12/pg_usr

    • 默认表空间pg_default不需要通过pg_tblspc来访问,而是对应于PGDATA/base

    • pg_global表空间也不通过pg_tblspc访问,而是对应于PGDATA/global

    • pg_relation_filepath()函数返回任务关系的相对路径($PGDATA)

      • 但是该函数只给出关系的主分支的第一个段的名称,需要追加一个段号和/或_fsm_vm或者_init来找到与该关系相关的所有文件。

        image-20200604163828187

    • 临时文件存储到在PGDATA/base/pgsql_tmp中,如果临时文件被指定在一个非pg_default表空间中则它们会被创建在该表空间的pgsql_tmp子目录中。临时文件的名称的形式为pgsql_tmpPPP.NNN,其中PPP是其所属后端的PID,而NNN用于区别该后端的不同临时文件。

    创建表空间

    -- 创建表空间
    CREATE TABLESPACE tablespace_name [ OWNER user_name ] LOCATION 'directory'
    

    查看表空间

    db
    

    image-20210913104131285

    3.2 模式(schema)

    ​ 模式是数据库实例的逻辑分割。数据库是被模式(schema)来切分的,一个数据库至少有一个模式,所有数据库内部的对象(object)是被创建于模式下。默认情况下,PostgreSQL自动创建public模式。Schema是数据库中的命名空间,在数据库中创建的所有对象都是在Schema中创建,一个用户可以从同一个客户端连接中访问不同的Schema。

    查看当前数据库所有模式名称

    select catalog_name, schema_name, schema_owner from information_schema.schemata;
    SELECT nspname FROM pg_namespace;
    
    -- 元命令查看排除information_schema和^pg_开始的内部模式名称
    dn
    
    

    image-20210913104249687

    模式的使用

    创建模式
    -- 1. 语法
    CREATE SCHEMA schema_name [ AUTHORIZATION role_specification ] [ schema_element [ ... ] ]
    CREATE SCHEMA AUTHORIZATION role_specification [ schema_element [ ... ] ]
    CREATE SCHEMA IF NOT EXISTS schema_name [ AUTHORIZATION role_specification ]
    CREATE SCHEMA IF NOT EXISTS AUTHORIZATION role_specification
    
    where role_specification can be:
    
        user_name
      | CURRENT_USER
      | SESSION_USER
    
    -- 2. 为用户dev创建同名模式
    CREATE SCHEMA IF NOT EXISTS AUTHORIZATION dev;
    
    修改
    ALTER SCHEMA name RENAME TO new_name
    ALTER SCHEMA name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
    

    公共模式

    创建一个新数据库时,默认自动创建一个名为'public'的模式。当登录数据库时,没有指定,都是以该模式(public)操作数据库对象。

    模式搜索路径

    在使用一个数据库对象时,可以使用schema_name.object_name(全称)来定位对象。这会显得非常繁琐。因此,PG提供模式搜索路径解决。

    show search_path;
    
    select current_schemas(true);
    
    -- 设置搜索路径
    set search_path = "$user", public;
    
    
    

    模式的权限

    默认情况下,每个用户都可以在public模式上CREATE和USAGE权限

    -- 回收public模式创建对象权限
    REVOKE CREATE ON SCHEMA public FROM PUBLIC;
    -- 第一个public是模式名称,第二个PUBLIC是所有用户。
    
    -- 授权
    grant usage on schema public to public;
    grant create on schema public to public;
    

    ​ 一个数据库并不直接存储表结构等对象的,而是在数据库中逻辑创建了至少一个模式,在模式中创建了表等对象,将不同的模式指派给不同的角色,可以实现权限分离,又可以通过授权,实现模式间对象的共享,并且,还有一个特点就是:public模式可以存储大家都需要访问的对象。

    段(segment)

    一个段是分配给一个逻辑结构(一个表、一个索引或其他对象)的一组区,是数据库对象使用的空间的集合;段可以有表段、索引段、回滚段、临时段和高速缓存段等。

    区(extent)

    区是数据库存储空间分配的一个逻辑单位,它由连续数据块所组成。第一个段是由一个或多个盘区组成。当一段中间所有空间已完全使用,PostgreSQL为该段分配一个新的范围。

    块(block[Page])

    数据块是PostgreSQL 管理数据文件中存储空间的单位,为数据库使用的I/O的最小单位,是最小的逻辑部件。默认值8K。

    3.3 表(Relation)

    3.3.1 表的存储属性

    TOAST

    超尺寸属性存储技术-The Oversized-Attribute Storage Technique(TOAST)

    PostgreSQL使用固定的页面尺寸(通常是8kB),并且不允许元组跨越多个数据页面。因此不可能直接存储非常大的字段值。为了克服这个限制,大的字段值会被压缩或分解成多个物理行存储到一张系统表中(TOAST表)。这些处理对用户都是透明的,只是在大部分的后端代码上有一些小的影响。这个技术称之为TOAST。TOAST 机制也被用来提升内存中大字段数据值的处理。

    只有可变长数据类型需要TOAST支持。通常在存储的值中,前四个字节表示值的总长度(包括长度本身,以字节计)。TOAST占用使用变长类型的长度字的最高两个二进制位

    填充因子(fillfactor)

    ​ fillfactor取值范围[10~100],表示插入数据时,在一个数据库中填充空间的百分比,另一部分空间预留更新时使用。

    临时表

    临时表生命周期结束后便会消失。

    分类
    • 会话级临时表:数据可以保存再整个会话的生命周期中
    • 事务级临时表:数据值存在该事务的生命周期内

    3.3.2 约束

    • 检查约束
    • 非空约束
    • 唯一约束
    • 主键
    • 外键

    3.3.3 修改表

    • 添加字段
    • 删除字段
    • 添加约束
    • 删除约束
    • 修改默认值
    • 修改字段数据类型
    • 重命名字段
    • 重命名表

    3.3.4 表继承和分区表

    表中的系统字段

    每个表中有几个隐藏的系统字段,这些系统字段代表特殊意义。

    • oid:行对象标识符
    • tableoid:包含本行的表的oid。(ps_class.oid=tableoid关联查询)
    • xmin:插入该行本本的事务ID
    • xmax:删除此行时的事务ID
    • cmin:事务内部插入类操作的命令ID
    • cmax:事务内部删除类操作的命令ID
    • ctid:行版本在其表内的物理位置。
    OID

    在内部使用对象标识符(oid)作为各种系统表的主键。

    CTID

    ctid表示数据行在它所处的表内的物理位置。vacuum full执行后,数据行在块内的物理位置会移动。

  • 相关阅读:
    单点登录cas常见问题(八)
    11G新特性 -- variable size extents
    11G新特性 -- ASM Fast Mirror Resync
    redhat 6.4 安装VirtualBox自动增强功能功:unable to find the sources of your current Linux kernel
    LINUX使用DVD光盘或者ISO作为本地YUM源
    数据库报ORA-00600: 内部错误代码, 参数: [17059],并产生大量trace日志文件
    Putty设置删除
    ssh/scp 远程连接ssh非默认端口方法
    查看LINUX版本
    RHCE7 -- systemctl命令
  • 原文地址:https://www.cnblogs.com/binliubiao/p/15264967.html
Copyright © 2011-2022 走看看