【PG】PostgreSQL数据库管理

目录

数据库概念

查看现有数据库

创建数据库

模板数据库

数据库配置

删除数据库

表空间

概念

表空间优势

注意

查看表空间

创建表空间

在指定表空间下创建表

temp_tablespaces

默认表空间

删除表空间


数据库概念

少量的对象,例如角色、数据库和表空间名,是在集群级别定义并存储在pg_global表空间之中的。 集群内部有多个数据库,相互之间彼此隔离,但可以访问集群级对象。 每个数据库内部都有多个模式,它们包含表和函数等对象。因此,完整的层级结构为:集群、数据库、模式、表(或一些其他类型的对象,如函数)。

查看现有数据库

SELECT datname FROM pg_database;

或者

\l

创建数据库

当前创建数据库的角色自动成为该新数据库的拥有者。以后删除这个数据库也是该拥有者的特权

SQL命令

sql 复制代码
create database name;
或者使用shell命令

createdb dbname

为其他用户创建一个数据库

sql 复制代码
create database db4 owner role1;
或者使用shell命令
createdb -O role2 db5

模板数据库

CREATE DATABASE实际上通过拷贝一个已有数据库进行工作。默认情况下,它拷贝名为template1的标准系统数据库。所以该数据库是创建新数据库的"模板"。 如果你为template1数据库增加对象,这些对象将被拷贝到后续创建的用户数据库中。 这种行为允许对数据库中标准对象集合的站点本地修改。例如,如果你把过程语言PL/Perl安装到 template1中,那么你在创建用户数据库后不需要额外的操作就可以使用该语言。

系统里还有名为template0的第二个标准系统数据库。 这个数据库包含和template1初始内容一样的数据,也就是说,只包含你的PostgreSQL版本预定义的标准对象。 在数据库集簇被初始化之后,不应该对template0做任何修改。 通过指示CREATE DATABASE使用template0取代template1进行拷贝, 你可以创建一个"原始的"用户数据库(其中不存在用户定义的对象,并且系统对象没有被改变),它不会包含任何template1中的站点本地附加物。 这一点在恢复一个pg_dump转储时非常方便:转储脚本应该在一个原始的数据库中恢复以确保我们重建被转储数据库的正确内容,而不和任何现在可能已经被加入到template1中的附加物相冲突。

另一个从template0而不是template1复制的常见原因是, 可以在复制template0时指定新的编码和区域设置,而一个template1的副本必须使用和它相同的设置。这是因为的template1可能包含编码相关或区域相关的数据,而template0中没有。

重点

有两个默认数据库 分别为template0和template1;``默认创建数据库是拷贝的template1.

template0和template1的区别

1 可以对 template1 进行修改 ,不要对template0修改

2 复制template0时可以指定编码和区域设置,template1必须使用和它相同的设置。

3 当template1有很多无用的垃圾时,可以删除template1然后从template0重建

sql 复制代码
SQL:
CREATE DATABASE dbtemplate  TEMPLATE template0;
或者shell 命令
createdb -T template1 dbtemplate2

数据库配置

sql 复制代码
修改数据库配置
ALTER DATABASE dbname RESET varname;

删除数据库

只有数据库的拥有者或者超级用户才可以删除数据库。删除数据库会移除其中包括的所有对象。数据库的删除不能被撤销。

sql 复制代码
SQL
drop database db1;
shell:
dropdb db2

表空间

概念

PostgreSQL中的表空间允许数据库管理员在文件系统中定义用来存放表示数据库对象的文件的位置。一旦被创建,表空间就可以在创建数据库对象时通过名称引用。

表空间优势

1 通过使用表空间,管理员可以控制一个PostgreSQL安装的磁盘布局。 这么做至少有两个用处。首先,如果初始化集簇所在的分区或者卷用光了空间,而又不能在逻辑上扩展或者做别的什么操作,那么表空间可以被创建在一个不同的分区上,直到系统可以被重新配置。

2 其次,表空间允许管理员根据数据库对象的使用模式来优化性能。例如,一个很频繁使用的索引可以被放在非常快并且非常可靠的磁盘上,如一种非常贵的固态设备。同时,一个很少使用的或者对性能要求不高的存储归档数据的表可以存储在一个便宜但比较慢的磁盘系统上。

注意

1 如果丢失一个表空间(文件删除、磁盘失效等), 数据库集簇可能会变成不可读或者无法启动。

2 把一个表空间放在一个临时文件系统 (如一个内存虚拟盘)上会带来整个集簇的可靠性风险。

3 即便是位于主要的 PostgreSQL 数据目录之外,表空间也是数据库集簇的一部分 并且不能被视作数据文件的一个自治集合。 它们依赖于包含在主数据目录中的元数据,并且因此不能被附加到一个 不同的数据库集簇或者单独备份

查看表空间

sql 复制代码
SELECT spcname FROM pg_tablespace;
或者元数据命令列出现有的表空间
\db

创建表空间

sql 复制代码
CREATE TABLESPACE myspace LOCATION '/home/storage/mytablespace/';

注意

1 这个位置必须是一个已有的空目录,

2 目录属于PostgreSQL操作系统用户。

3 该位置不能放在可移动 或者瞬时存储上,因为如果表空间丢失会导致集簇无法工作。

4 所有后续在该表空间中创建的对象都将被存放在这个目录下的文件中。

5 表空间的创建本身必须作为一个数据库超级用户完成,但在创建完之后之后你可以允许普通数据库用户来使用它。要这样做,给数据库普通用户授予表空间上的CREATE权限。

在指定表空间下创建表

sql 复制代码
# 切换数据库
\c db3

# 创建表
CREATE TABLE foo(i int) TABLESPACE myspace;

temp_tablespaces

它决定临时表和索引的位置,以及用于大数据集排序等目的的临时文件的位置。 这可以是一个表空间名的列表,而不是只有一个。因此,与临时对象有关的负载可以散布在多个表空间上。每次要创建一个临时对象时,将从列表中随机取一个成员来存放它。

与一个数据库相关联的表空间用来存储该数据库的系统目录。此外,如果没有给出TABLESPACE子句并且没有在default_tablespacetemp_tablespaces(如适用)中指定其他选择,它还是在该数据库中创建的表、索引和临时文件的默认表空间。如果一个数据库被创建时没有指定表空间,它会使用其模板数据库相同的表空间。

默认表空间

当初始化数据库集簇时,会自动创建两个表空间。pg_global表空间被用于共享系统目录。pg_default表空间是template1template0数据库的默认表空间(并且,因此也将是所有其他数据库的默认表空间,除非被一个CREATE DATABASE中的TABLESPACE子句覆盖)。

删除表空间

表空间一旦被创建,就可以被任何数据库使用,前提是请求的用户具有足够的权限。这也意味着,一个表空间只有在所有使用它的数据库中所有对象都被删除掉之后才可以被删掉。

sql 复制代码
# 删除非空的表空间会报错
postgres=# drop tablespace myspace;
ERROR:  tablespace "myspace" is not empty

# 删除使用该表空间的表后可以顺利删除表空间
db3=# drop table foo;
DROP TABLE
db3=#
db3=#
db3=#  drop tablespace myspace;
DROP TABLESPACE
相关推荐
阿华的代码王国24 分钟前
MySQL ------- 索引(B树B+树)
数据库·mysql
Hello.Reader1 小时前
StarRocks实时分析数据库的基础与应用
大数据·数据库
执键行天涯1 小时前
【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何
java·数据库·mybatis
yanglamei19621 小时前
基于GIKT深度知识追踪模型的习题推荐系统源代码+数据库+使用说明,后端采用flask,前端采用vue
前端·数据库·flask
Darling_001 小时前
LeetCode_sql_day28(1767.寻找没有被执行的任务对)
sql·算法·leetcode
zxrhhm1 小时前
SQLServer TOP(Transact-SQL)
sql·sqlserver
工作中的程序员1 小时前
ES 索引或索引模板
大数据·数据库·elasticsearch
严格格2 小时前
三范式,面试重点
数据库·面试·职场和发展
微刻时光2 小时前
Redis集群知识及实战
数据库·redis·笔记·学习·程序人生·缓存
单字叶2 小时前
MySQL数据库
数据库·mysql