日期:2014-05-16  浏览次数:20503 次

GREENPLUM介绍之数据库管理(四)-创建数据库和用户管理

GREENPLUM与ORACLE一样有着完全独立于操作系统的用户管理 系统,以及权限管理系统。首先我们介绍一下GP中的数据库 。 在GP初始化系统后,GP会自动创建出三个数据库postgre,template0,template1. 其中postgre用作系统内部数据的存放,我们既不要删除它,也不要修改它。template1是系统默认的数据,我们创建数据库时可以以 template1为模板,创建新的数据库。所以,如果有不希望其它数据库继承的对象,就不要在数据库template1中进行创建。GP中创建数据库的 语法非常简单,句法如下
CREATE DATABASE newname USING TEMPLATE tmplatedbname;
速 度非常快,这个过程中系统会生成相应的字典信息。如果没有指定using template子句,系统就使用template1数据库作为模板创建新数据库。我们也可以其它数据库为模板,创建新的数据库。template0数据 库是创建template1的模板,一般我们也不使用它创建应用对象。GP允许在一个GP SERVER中创建多个DATABASE。但是一个DATABASE只能属于一个SERVER。一个连接在同一时间点只能访问一个数据库。
??? GP中也有SCHEMA的概念。SCHEMA本质就是一个数据库中有关联关系的对象集合,或者也可以理解成对象的命名空间。GP允许在一个数据库中创建多 个SCHEMA,但是一个SCHEMA只能属于一个数据库。在创建数据库时,系统自动创建一个称为PUBLIC的SCHEMA。如果自己需要创建 SCHEMA,其句法如下
CREATE SCHEMA schema_name;
一个SCHEMA中,不允许出现同名对象。但是不同的SCHEMA是允许对象同名的。所以很多SQL 访 问对象时可以在对象名前加SCHEMA作为前缀,说明对象出处。如果不加SCHEMA做前缀,访问对象,会话按指定的SCHEMA顺序搜索对象,默认的搜 索路径只有public,新建的schema不会加到。这也是现在用户在使用工具时常见的一类问题。由于默认SCHEMA搜索路径设置不正确,导致应用无 法访问到需要的对象。就像下面的过程
xjods=# create schema xjods;
CREATE SCHEMA
xjods=# create table xjods.t1(id numeric);
NOTICE:? Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'id' as the Greenplum Database data distribution key for this table.
HINT:? The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
CREATE TABLE
xjods=#
xjods=# select * from t1;
ERROR:? relation "t1" does not exist
LINE 1: select * from t1;

SCHEMA搜索路径的设置可以在会话中指定,可以在数据库层面指定,可以在用户层面指定,还可以在服务参数中指定。
在会话中指定,只对当前连接有效。
=> set search_path to 'myschema,public';

在数据库中指定,对特定数据库有效

=> alter database <dbname> set search_path to myschema,public

在用户层面设定,对的定用户的连接有效,比如

ALTER ROLE sally SET search_path TO myschema, public, pg_catalog;

想查看当前的schema,可以用如下命令
=> SELECT current_schema();
或者
=> SHOW search_path;

如果设置存在冲突,优先级是 会话设置 优先于 用户设置 优先于 数据库设置 优先于服务参数设置。
??? 一般而且言,我们可以理解数据库对应着应用,SCHEMA则对应着每个应用的模块。在具体数据库设置时,可以根据需求进行灵活设置。比如要简化备份 ,减少系统负载的话,就应该尽量减少数据库的创建。因为这样可以减少备份的数量,以及字典的信息。
???
??? 下面再来看GP中的用户。数据库的用户从本质上讲就是用于身份审核和权限管理的机制。与ORACLE一样GP也有完全独立于操作系统的用户管理模块。也就 是GP的用户和操作系统用户没有多大关系。在创建数据库时,系统会创建一个称为gpadmin的超级管理员(建议用来安装GP操作系统用户也是 gpadmin),默认该账号从服务器 登录时,可以走操作系统认证,不需要用户名密码。它可以完成所有操作。GP中创建用户的句法如下
??? CREATE ROLE name [[WITH] option [ ... ]]
它的选项,指定了用户的身份认证,系统权限,以及资源限制等等 。具体选项如下
SUPERUSER | NOSUPERUSER
指定了用户是否是超级管理员,默认是NOSUPERUSER。 如果是超级管理员则没有访问限制。一般应用用户不要赋予这项权限。

CREATEDB | NOCREATEDB
指定了用户是否可以创建数据库。默认是NOCREATEDB

CREATEROLE | NOCREATEROLE
指定了用户是否可以创建新的用户,默认是NOCREATEROLE

CREATEEXTTABLE | NOCREATEEXTTABLE[ ( attribute='value'[, ...] ) ]
指定用户是否可以创建特定类型,特定协议的外部表。
可以指定的属性包括
type='readable'|'writable'
protocol='gpfdist'|'http'|'gphdfs'
如果使用file协议,或者execute协议的外部表,必须是超级管理员。
默认是 NOCREATEEXTTABLE

INHERIT | NOINHERIT
在GP中,没有独立的角色概念,用户既是角色,也是用户。因此当一个


LOGIN | NOLOGIN
设定用户是否有登录系统的权限。默认是NOLOGIN。一般用来管理权限的角色分配NOLOGIN权限。

CONNECTION LIMIT connlimit
限制并发连接的数量,默认值是-1,表示没有限制。在GP中有其它更合适的方式限制并发连接的数量,因此建议不要修改该设置。

[ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
设置用户的口令,并指定在字典中存放口令是否要进行加密。

VALID UNTIL 'timestamp'
指定口令的生命周期。默认是永远不过期。

IN ROLE rolename [, ...]
向角色中添加新的成员角色,这样新建用户就成了一个组的概念。可以使用grant命令实现同样的效果

ADMIN rolename [, ...]
向角色中添加新角色时,使用with admin option选项。允许角色把其它角色的权限再授予其它角色。

RESOURCE QUEUE queue_name
为用户建立资源队列后,控制用户连接的资源消耗。