目录
数据库概念
查看现有数据库
创建数据库
模板数据库
数据库配置
删除数据库
表空间
概念
表空间优势
注意
查看表空间
创建表空间
在指定表空间下创建表
temp_tablespaces
默认表空间
删除表空间
少量的对象,例如角色、数据库和表空间名,是在集群级别定义并存储在pg_global
表空间之中的。 集群内部有多个数据库,相互之间彼此隔离,但可以访问集群级对象。 每个数据库内部都有多个模式,它们包含表和函数等对象。因此,完整的层级结构为:集群、数据库、模式、表(或一些其他类型的对象,如函数)。
SELECT datname FROM pg_database;
或者
\l
当前创建数据库的角色自动成为该新数据库的拥有者。以后删除这个数据库也是该拥有者的特权
SQL命令
create database name;
或者使用shell命令
createdb dbname
为其他用户创建一个数据库
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:
CREATE DATABASE dbtemplate TEMPLATE template0;
或者shell 命令
createdb -T template1 dbtemplate2
修改数据库配置
ALTER DATABASE dbname RESET varname;
只有数据库的拥有者或者超级用户才可以删除数据库。删除数据库会移除其中包括的所有对象。数据库的删除不能被撤销。
SQL
drop database db1;
shell:
dropdb db2
PostgreSQL中的表空间允许数据库管理员在文件系统中定义用来存放表示数据库对象的文件的位置。一旦被创建,表空间就可以在创建数据库对象时通过名称引用。
1 通过使用表空间,管理员可以控制一个PostgreSQL安装的磁盘布局。 这么做至少有两个用处。首先,如果初始化集簇所在的分区或者卷用光了空间,而又不能在逻辑上扩展或者做别的什么操作,那么表空间可以被创建在一个不同的分区上,直到系统可以被重新配置。
2 其次,表空间允许管理员根据数据库对象的使用模式来优化性能。例如,一个很频繁使用的索引可以被放在非常快并且非常可靠的磁盘上,如一种非常贵的固态设备。同时,一个很少使用的或者对性能要求不高的存储归档数据的表可以存储在一个便宜但比较慢的磁盘系统上。
1 如果丢失一个表空间(文件删除、磁盘失效等), 数据库集簇可能会变成不可读或者无法启动。
2 把一个表空间放在一个临时文件系统 (如一个内存虚拟盘)上会带来整个集簇的可靠性风险。
3 即便是位于主要的 PostgreSQL 数据目录之外,表空间也是数据库集簇的一部分 并且不能被视作数据文件的一个自治集合。 它们依赖于包含在主数据目录中的元数据,并且因此不能被附加到一个 不同的数据库集簇或者单独备份
SELECT spcname FROM pg_tablespace;
或者元数据命令列出现有的表空间
\db
CREATE TABLESPACE myspace LOCATION '/home/storage/mytablespace/';
注意
1 这个位置必须是一个已有的空目录,
2 目录属于PostgreSQL操作系统用户。
3 该位置不能放在可移动 或者瞬时存储上,因为如果表空间丢失会导致集簇无法工作。
4 所有后续在该表空间中创建的对象都将被存放在这个目录下的文件中。
5 表空间的创建本身必须作为一个数据库超级用户完成,但在创建完之后之后你可以允许普通数据库用户来使用它。要这样做,给数据库普通用户授予表空间上的CREATE
权限。
# 切换数据库
\c db3
# 创建表
CREATE TABLE foo(i int) TABLESPACE myspace;
它决定临时表和索引的位置,以及用于大数据集排序等目的的临时文件的位置。 这可以是一个表空间名的列表,而不是只有一个。因此,与临时对象有关的负载可以散布在多个表空间上。每次要创建一个临时对象时,将从列表中随机取一个成员来存放它。
与一个数据库相关联的表空间用来存储该数据库的系统目录。此外,如果没有给出TABLESPACE
子句并且没有在default_tablespace
或temp_tablespaces
(如适用)中指定其他选择,它还是在该数据库中创建的表、索引和临时文件的默认表空间。如果一个数据库被创建时没有指定表空间,它会使用其模板数据库相同的表空间。
当初始化数据库集簇时,会自动创建两个表空间。pg_global
表空间被用于共享系统目录。pg_default
表空间是template1
和template0
数据库的默认表空间(并且,因此也将是所有其他数据库的默认表空间,除非被一个CREATE DATABASE
中的TABLESPACE
子句覆盖)。
表空间一旦被创建,就可以被任何数据库使用,前提是请求的用户具有足够的权限。这也意味着,一个表空间只有在所有使用它的数据库中所有对象都被删除掉之后才可以被删掉。
# 删除非空的表空间会报错
postgres=# drop tablespace myspace;
ERROR: tablespace "myspace" is not empty
# 删除使用该表空间的表后可以顺利删除表空间
db3=# drop table foo;
DROP TABLE
db3=#
db3=#
db3=# drop tablespace myspace;
DROP TABLESPACE