表空间(Tablespace)允许数据库管理员在每个机器上使用多个文件系统(FileSystem),决定如何更好地使用物理存储空间来存储数据库对象。表空间被命名为在文件空间(Filespace)里的位置,在文件空间里可以创建对象。表空间允许用户为频繁使用和不频繁使用的数据库对象分配不同的存储,或者在特定的数据库对象上控制I/O性能。例如,把频繁使用的表放在使用高性能固态驱动器(SSD)的文件系统上,而把其他表放在标准的磁盘驱动器上。
一个表空间需要一个文件系统位置来存放它的数据库文件。在Greenplum数据库中,Master和每一个Segment(priamry和mirror)要求不同的存储位置。一个Greenplum数据库中所有部件所需的文件系统位置集合被称作一个文件空间。文件空间可以被一个或者多个表空间使用。
数据库超级用户才能创建文件空间。
Q:什么时候需要创建文件空间?
A:首次安装Greenplum数据库时,默认文件空间为pg_system。
文件空间的作用是管理数据库文件存放对应放置的目录。假如磁盘挂载的目录为/data,初始化时指定的primary目录为/data/primary,mirror目录为/data/mirror。文件空间默认使用的目录为/data/primary/gpseg*。
一般情况下,无须新建文件空间。在什么情况下增加文件空间呢?
例如,机器上使用的存储有SSD盘,SAS盘,把热数据放置到较快的SSD盘,冷数据放置到SSD盘。此时就需要把这两种不同的磁盘做不同的文件空间来管理数据库中不同的对象。
Q:什么时候需要创建表空间?
A:一般情况下,表空间是需要新建的。
新建表空间来管理不同的数据库或者schema的对象(这个粒度看数据库的规模而定)来防止一个目录下存放的对象过多。一个数据库对象:表,索引,序列在目录上都是一个文件,一个目录下存放的对象过多会导致集群性能下降。建议每个表空间的文件对象数量不要超过20万。
了解了文件空间和表空间的作用,以及什么情况下需要创建它们,那么下面看看怎么创建吧?
在master和segment节点上分别创建自己需要用到的文件目录。
比如,现在有6台物理机,1台master,1台standby master,4台segment,其中每台segment节点上有4个segment instance,包括2个primary instance和2个mirror instance。
也就是说,我要创建以下目录:
1. Master和Standby master节点都要创建(/home/sdtsp根据实际情况创建路径):
mkdir /home/sdtsp/gpdata/fspc_master
可以使用gpssh命令操作,具体如下:
①创建文件masterfile:vim masterfile
②编辑两台master的hosts或者ip,一行一个,不能有空行:
DSDMPM01
DSDMPM02
③执行命令gpssh,可以直接在两台master同时创建目录:
gpssh -f ‘/home/masterfile’ -e ‘mkdir /home/sdtsp/gpdata/fspc_master’
2.每一台的segment节点都要创建(/home/sdtsp根据实际情况创建路径):
mkdir /home/sdtsp/gpdata/fspc_segp
mkdir /home/sdtsp/gpdata/fspc_segm
可以使用gpssh命令操作,具体如下:
①创建文件segfile:vim segfile
②编辑四台segment的hosts或者ip,一行一个,不能有空行:
DSDMPC01
DSDMPC02
DSDMPC03
DSDMPC04
③执行命令gpssh,可以直接在四台segment同时创建目录:
gpssh -f ‘/home/segfile’ -e ‘mkdir /home/sdtsp/gpdata/fspc_segp’
gpssh -f ‘/home/segfile’ -e ‘mkdir /home/sdtsp/gpdata/fspc_segm’
1.使用gpadmin用户在master节点上登录:
$sudo su - gpadmin
2.执行创建文件空间命令,指定配置文件的名字为gpfilespace_config(自定义),命令如下:
$gpfilespace -o gpfilespace_config
3.上述命令会提示你需要输入一些信息:
文件空间filespace的名字,
primary segment在文件系统的位置,
mirror segment在文件系统上的位置,
以及master在文件系统上的位置。
primary segment和mirror segment的位置要参照segment节点上创建的目录,master的位置要参照master节点和standby master节点上创建的目录。
注意:所有指定的目录,一定是事先自己创建好的,否则会报错,没有此文件夹。
4.gpfilespace会创建一个配置文件,使用cat检查配置文件确认其是否正确。此配置文件的路径,可在创建文件空间时,指定完目录后最后一行看到,如上图。
5.再次运行filespace,基于配置文件创建文件空间
$ gpfilespace -c gpfilespace_config
在创建文件空间之后,可以使用CREATE TABLESPACE命令在文件空间上定义一个表空间,比如:
#CREATE TABLESPACE myspace FILESPACE myfilespace;
超级用户(gpadmin)定义一个表空间,使用GRANT CREATE命令授权给普通的数据库用户,比如:
#GRANT CREATE ON TABLESPACE myspace TO penny;
使用penny用户连接数据库,创建表,查看其表空间的位置:
1.对于在某个表空间上具有CREATE权限的用户,可以在该表空间上创建数据库对象,比如表、索引和数据库。
2.可以为CREATE TABLE 和CREATE INDEX命令设定默认的表空间,这样就可以在创建表或索引的时候不指定具体的表空间了:
sdpdb=> SET default_tablespace = myspace;
如下图创建的两张表:
space表的表空间为pg_default
space01表的表空间为myspace
注意:当创建数据库时没有具体指定表空间,数据库会使用与模板数据库(template database,即template01数据库)相同的表空间。
每一个Greenplum数据库都有以下默认的表空间
*** pg_global:共享的系统目录
*** pg_default:默认的表空间,被template1和template0使用
上述的表空间使用默认的系统表空间,pg_system。数据存储的目录是在系统初始化的时候被创建。
查看文件空间的信息,需要查看pg_filespace和pg_filespace_entry目录表。将其与pg_tablespace进行join连接,可以查看表空间的全部定义信息。比如:
SELECT spcname, fsname,fsedbid, fselocation
FROM pg_tablespace t, pg_filespace f,
pg_filespace_entry fe
WHERE t.spcfsoid=fe.fsefsoid
AND fe.fsefsoid=f.oid
ORDER BY spcname, fsedbid;
1.删除表空间
要删除一个表空间,用户必须是该表空间的owner或者超级用户。如果要删除一个表空间,只有在所有数据库中所有使用该表空间的对象都被删除之后才能做到。
移除一个空的表空间:
DROP TABLESPACE myspace;
2.删除文件空间
只有超级用户才能删除一个文件空间。只有所有使用一个文件空间的表空间都被移除后,该文件空间才能被删除。
移除一个空的文件空间:
DROP FILESPACE myfilespace;
注意:如果一个文件空间存储着临时或者事务文件,用户不能删除它。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。