GreenPlum的那些事《三》——常用操作
我们前面已经说了,GPDB是一个列式数据库,数据库都有什么特性呢?都能做什么呢?熟悉MySQL,Oracle的同学可能就比较清楚关系型数据库的管理,下面我们就来说下GPDB的一些管理和常用操作。
数据库常用操作分为:创建数据库、创建schema、创建资源池、创建角色、创建用户、创建表。下面我们一一来说下GPDB这些常用操作,和关系型数据库MYSQL有什么不同呢?
(福利推荐:阿里云、腾讯云、华为云服务器最新限时优惠活动,云服务器1核2G仅88元/年、2核4G仅698元/3年,点击这里立即抢购>>>)
- 创建数据库
gp_sydb=# CREATE DATABASE GPTEST;
CREATE DATABASE
删除数据库
gp_sydb=# DROP DATABASE GPTEST; DROP DATABASE
你也可以通过 createdb 创建数据库
[[email protected] ~]$ createdb -h mpp01 -p 5432 GPTEST
查看创建的数据库:
gp_sydb=# l List of databases Name | Owner | Encoding | Access privileges -----------+---------+----------+--------------------- GPTEST | gpadmin | UTF8 | gp_sydb | gpadmin | UTF8 | postgres | gpadmin | UTF8 | template0 | gpadmin | UTF8 | =c/gpadmin : gpadmin=CTc/gpadmin template1 | gpadmin | UTF8 | =c/gpadmin : gpadmin=CTc/gpadmin (5 rows)
- 创建schema
创建schema
GPTEST=# CREATE SCHEMA bdp; CREATE SCHEMA
查看schema
GPTEST=# dn List of schemas Name | Owner --------------------+--------- bdp | gpadmin gp_toolkit | gpadmin information_schema | gpadmin pg_aoseg | gpadmin pg_bitmapindex | gpadmin pg_catalog | gpadmin pg_toast | gpadmin public | gpadmin (8 rows)
查看当前的schema
GPTEST=# SELECT current_schema(); current_schema ---------------- public (1 row)
可以看到当前schema是public,这是创建用户的时候,我们没有给它分配schema,那就是用默认的schema public。
把新建的schema赋给数据库gptest
gptest=# dn List of schemas Name | Owner --------------------+--------- bdp | gpadmin gp_toolkit | gpadmin information_schema | gpadmin pg_aoseg | gpadmin pg_bitmapindex | gpadmin pg_catalog | gpadmin pg_toast | gpadmin public | gpadmin (8 rows) gptest=# ALTER DATABASE GPTEST SET search_path TO bdp, public, pg_catalog; ALTER DATABASE gptest=# SELECT current_schema(); current_schema ---------------- bdp (1 row)
可以看到赋了新的schema。
- 创建角色
创建角色,如果有很多用户对于一批表都有一样的权限,这时候可以创建一个角色,把这些权限先赋给角色,然后把角色赋权给各个用户。
gptest=# create role selectbdp; CREATE ROLE gptest=# du List of roles Role name | Attributes | Member of -----------+---------------------------------------------------------------------------------------------------------------------------------+----------- bdp01 | | {} gpadmin | Superuser, Create role, Create DB, Ext gpfdist Table, Wri Ext gpfdist Table, Ext http Table, Ext hdfs Table, Wri Ext hdfs Table | {} selectbdp | Cannot login | {} gptest=#
可以看到角色已经创建成功。
赋权角色。
gptest=# grant selectbdp to gpadmin; GRANT ROLE
角色其实就是一个用户组。
- 创建用户:
gptest=# create user bdp01 WITH PASSWORD 'passwd123'; NOTICE: resource queue required -- using default resource queue "pg_default" CREATE ROLE gptest=#
使用用户登录:
psql -Ubdp01 -d gptest -w 'passwd123'
发现报错了:
[[email protected] gpseg-1]$ psql -Ubdp01 -d gptest -w 'passwd123' Password for user bdp01: psql: FATAL: no pg_hba.conf entry for host "[local]", user "bdp01", database "gptest", SSL off
GPDB登录需要在pg_hba.conf文件中添加信任的用户:
local all bdp01 trust
添加后,使配置文件生效,再次登录:
[[email protected] gpseg-1]$ psql -Ubdp01 -d gptest -w 'passwd123' psql: warning: extra command-line argument "passwd123" ignored psql (8.3.23) Type "help" for help. gptest=>
登录成功!
- 创建资源队列
为什么要创建资源队列呢?我们知道一个数据库肯定不是给一个用户使用的,通常是有ETL用户,进行数据加载,数据清洗。还有WEB端用户进行查询,还有个人用户进行开发查询使用等等。这么多用户,如果不进行资源队列管控,那么就会出现资源争抢现象,影响线上应用功能。比如一个新手开发人员写了一个比较菜的查询语句,占用了大量资源,此时数据库的其他查询用户都需要排队等待了。再比如加载数据是需要使用大量资源,那么也会影响查询性能,以上你会发现,你需要把不同类型的操作进行资源隔离,这就是为什么要有资源队列了。
查看已有的资源队列:
gptest=> SELECT rolname, rsqname FROM pg_roles, gp_toolkit.gp_resqueue_status gptest-> WHERE pg_roles.rolresqueue=gp_toolkit.gp_resqueue_status.queueid; rolname | rsqname -----------+------------ bdp01 | pg_default selectbdp | pg_default gpadmin | pg_default (3 rows)
创建一个新的资源队列:
gptest=# create resource queue load_queue with (active_statements=3,MEMORY_LIMIT='1024MB',PRIORITY=LOW); CREATE QUEUE
把创建的资源队列赋权给刚才创建的用户bdp01:
gptest=# ALTER USER bdp01 resource queue load_queue; ALTER ROLE
再次查询资源池分配情况:
gptest=# SELECT rolname, rsqname FROM pg_roles, gp_toolkit.gp_resqueue_status WHERE pg_roles.rolresqueue=gp_toolkit.gp_resqueue_status.queueid; rolname | rsqname -----------+------------ bdp01 | load_queue selectbdp | pg_default gpadmin | pg_default (3 rows)
可以看到bpd01已经使用了新的资源池了。
- 创建表
简单的建表语句,此处不在讲解了,来说两个地方,一个是分区,一个是分布键。
- 分区:
来看下分区的数据结构
分区是把一张大表按照适合的维度进行分割,通过表的继承,规则,约束实现。
并不是每个表都适合分区,只有很大的表才适合分区,应为分区多了会增加表的元数据信息,特别是多级分区。如果一个表被按照日和城市划分并且有1000个日以及1000个城市,那么分区的总数就是一百万。列存表会把每一列存在一个物理表中,因此如果这个表有100个列,系统就需要为该表管理一亿个文件。一方面Linux的iNode可能不会有这么大,就会出现文件查询报错等,分区过多了,对于数据库停止和恢复也会造成很大影响的。所以建立分区表的时候,对分区进行自动的创建和删除,以保障合适的数据周期很重要。
- 分布键 在MPP架构中,一个查询是需要从所有segment获取数据然后在master汇总得到结果的。那么这样,影响查询性能的就有两个问题,查询最慢的segment和网络带宽。分布键就是为了解决第一个问题,让数据尽可能均匀的分布在每个segment上,从而避免数据倾斜导致的查询效率问题。第二个网络问题,MPP数据集群搭建要求集群内部为万兆网连接,并且机器配置一样,从而避免影响。
分布键一般选择主键,比如手机号等。
尽量选择经常需要 JOIN 的列,当关联键和分布键均一致时,可以在 Segment 中完成 JOIN,不需要重分布或者广播小表。
以上就是GPDB简单的管理流程,后面我们会再介绍更深入的查询优化和管理知识。
你还在原价购买阿里云、腾讯云、华为云、天翼云产品?那就亏大啦!现在申请成为四大品牌云厂商VIP用户,可以3折优惠价购买云服务器等云产品,并且可享四大云服务商产品终身VIP优惠价,还等什么?赶紧点击下面对应链接免费申请VIP客户吧:
相关文章
- SQL 注入漏洞检测与利用
- Amoeba 实现MySQL读写分离
- T-SQL程序练习02
- T-SQL程序练习03
- 【MySQL系列】- MySQL执行计划一览
- 安卓开发过程中的RatingBar、Handler以及GPS在大型项目中的使用【Android】
- DVWA漏洞演练平台 - SQL注入
- 审计一套CMS中的SQL注入
- mysql 函数: find_in_set()、instr()
- PHP 编程SQL注入问题与代码
- Redis 数据库配置与应用
- MySQL 之基础命令(精简笔记)
- MySQL 之高级命令(精简笔记)
- MySQL 之单表查询(精简笔记)
- MySQL 权限与备份管理(精简笔记)
- MySQL 存储过程与函数(精简笔记)
- PHP SQL 注入代码审计
- 教你快速实现“基于Docker快速构建基于Prometheus的MySQL监控系统”
- MySQL 字符串与时间操作函数
- 客快物流大数据项目(九十七):ClickHouse的SQL语法