su - gpadmin
gpstart #正常启动
gpstop #正常关闭
gpstop -M fast #快速关闭
gpstop –r #重启
gpstop –u #重新加载配置文件
登陆与退出Greenplum
#正常登陆
psql gpdb
psql -d gpdb -h gphostm -p 5432 -U gpadmin
#使用utility方式
PGOPTIONS="-c gp_session_role=utility" psql -h -d dbname hostname -p port
#退出
在psql命令行执行\q
参数查询
psql -c 'SHOW ALL;' -d gpdb
gpconfig --show max_connections
创建数据库
createdb -h localhost -p 5432 dhdw
创建GP文件系统
# 文件系统名
gpfsdw
# 子节点,视segment数创建目录
mkdir -p /gpfsdw/seg1
mkdir -p /gpfsdw/seg2
chown -R gpadmin:gpadmin /gpfsdw
# 主节点
mkdir -p /gpfsdw/master
chown -R gpadmin:gpadmin /gpfsdw
gpfilespace -o gpfilespace_config
gpfilespace -c gpfilespace_config
创建GP表空间
psql gpdb
create tablespace TBS_DW_DATA filespace gpfsdw;
SET default_tablespace = TBS_DW_DATA;
删除GP数据库
gpdeletesystem -d /gpmaster/gpseg-1 -f
查看segment配置
select * from gp_segment_configuration;
文件系统
select * from pg_filespace_entry;
磁盘、数据库空间
SELECT * FROM gp_toolkit.gp_disk_free ORDER BY dfsegment;
SELECT * FROM gp_toolkit.gp_size_of_database ORDER BY sodddatname;
日志
SELECT * FROM gp_toolkit.__gp_log_master_ext;
SELECT * FROM gp_toolkit.__gp_log_segment_ext;
表描述
/d+ <tablename>
表分析
VACUUM ANALYZE tablename;
表数据分布
SELECT gp_segment_id, count(*) FROM <table_name> GROUP BY gp_segment_id;
表占用空间
SELECT relname as name, sotdsize/1024/1024 as size_MB, sotdtoastsize as toast, sotdadditionalsize as other
FROM gp_toolkit.gp_size_of_table_disk as sotd, pg_class
WHERE sotd.sotdoid = pg_class.oid ORDER BY relname;
索引占用空间
SELECT soisize/1024/1024 as size_MB, relname as indexname
FROM pg_class, gp_toolkit.gp_size_of_index
WHERE pg_class.oid = gp_size_of_index.soioid
AND pg_class.relkind='i';
OBJECT的操作统计
SELECT schemaname as schema, objname as table, usename as role, actionname as action, subtype as type, statime as time
FROM pg_stat_operations
WHERE objname = '<name>';
锁
SELECT locktype, database, c.relname, l.relation, l.transactionid, l.transaction, l.pid, l.mode, l.granted, a.current_query
FROM pg_locks l, pg_class c, pg_stat_activity a
WHERE l.relation=c.oid
AND l.pid=a.procpid
ORDER BY c.relname;
队列
SELECT * FROM pg_resqueue_status;
加载(LOAD)数据到Greenplum数据库
gpfdist外部表
# 启动服务
gpfdist -d /share/text -p 8081 –l /share/text/gpfdist.log &
# 创建外部表,分隔符为’/t’
drop EXTERNAL TABLE TD_APP_LOG_BUYER;
CREATE EXTERNAL TABLE TD_APP_LOG_BUYER (
IP text,
ACCESSTIME text,
REQMETHOD text,
URL text,
STATUSCODE int,
REF text,
name text,
VID text)
LOCATION ('gpfdist://gphostm:8081/xxx.txt')
FORMAT 'TEXT' (DELIMITER E'/t'
FILL MISSING FIELDS) SEGMENT REJECT LIMIT 1 percent;
# 创建普通表
create table test select * from TD_APP_LOG_BUYER;
# 索引
# CREATE INDEX idx_test ON test USING bitmap (ip);
# 查询数据
select ip , count(*) from test group by ip order by count(*);
gpload
# 创建控制文件
# 加载数据
gpload -f my_load.yml
copy
COPY country FROM '/data/gpdb/country_data'
WITH DELIMITER '|' LOG ERRORS INTO err_country
SEGMENT REJECT LIMIT 10 ROWS;
从Greenplum数据库卸载(UNLOAD)数据
gpfdist外部表
# 创建可写外部表
CREATE WRITABLE EXTERNAL TABLE unload_expenses
( LIKE expenses )
LOCATION ('gpfdist://etlhost-1:8081/expenses1.out',
'gpfdist://etlhost-2:8081/expenses2.out')
FORMAT 'TEXT' (DELIMITER ',')
DISTRIBUTED BY (exp_id);
# 写权限
GRANT INSERT ON writable_ext_table TO <name>;
# 写数据
INSERT INTO writable_ext_table SELECT * FROM regular_table;
copy
COPY (SELECT * FROM country WHERE country_name LIKE 'A%') TO '/home/gpadmin/a_list_countries.out';
执行sql文件
psql gpdbname –f yoursqlfile.sql
或者psql登陆后执行
\i yoursqlfile.sql
1.GP库的镜像设置参数: gp_fault_action
该参数存在master主机的postgresql.conf配置文件中,该参数的主要作用是当数据库的segment失败的时候,
数据库下一步动作的判断,主要有以下3种:none,readonly和continue。
none是指没有配置mirror,在这种模式下,数据库失败时系统将自动关闭,这时需要恢复失败的segment;
readonly是指任意一个segment实例失败时,系统将不允许任何的DDL和DML命令,在这种模式下,数据库不会关闭,仍然可以查询,恢复失败的segment时需要将系统关闭。
这个模式是默认的模式。
continue模式是指当系统遇到节点失败时,仍然可以允许系统做DDL和DML操作,在失败的segment继续能使用时必须恢复并保证它上面的数据与相对应的镜像节点数据
保持一致,恢复时需要关闭系统。
当segment和镜像同时失败,或者segment的镜像失败时,系统将不能操作直到被恢复。
更改该参数的步骤:
a.$ gpstop
b.编辑postgresql.conf文件,并保存,比如设置 gp_fault_action=readonly;
c.$ gpstart
pg_cancel_backend这个函数主要是用来取消一个查询(进程),权限必须是管理员或者查询的所有者。
具体使用如下:
首先,查出你要取消的进程号
select procpid from pg_stat_activity where ......;
其次,用这个函数来取消
select pg_cancel_backend(procpid);
这个函数主要是用来回滚事务,但是会话(session)并不会退出去,比如你要用这个函数来终止一个<IDLE>是不可能的。
当一个查询语句查询时间较长时用这个函数偶尔也不好用,这个时候需要多执行几次或去OS上用kill命令来删除这个进程效果就来得快。
可以在master 主机上查看进程,对每个客户端连接,master 都会创建一个进程。
ps -ef |grep -i postgres |grep -i con
定期使用Vacuum analyze tablename 回收垃圾和收集统计信息,尤其在大数据量delete和update,或者导入以后,非常重要。
vacuum分两种,一种是analyze,优化查询计划的。还有一种是清理垃圾数据。
postres删除工作,并不是真正删除数据,而是在被删除的数据上,坐一个标记,
只有执行vacuum后,才会真正的把物理空间释放,这个非常重要,有些经常更新的表,各种查询、更新效率会越来越慢,这个多是因为没有做vacuum的原因。
下面看一个例子
create table dw_temp.category_detail_test as select * from dw_stage.category_detail;
select count(1) from dw_temp.category_detail_test;
--9800
select pg_relation_size('dw_temp.category_detail_test');
--2228224
delete from dw_temp.category_detail_test where category_id<99999;
--查询成功: 共计 3805 行受到影响,耗时: 15 毫秒(ms)。
select pg_relation_size('dw_temp.category_detail_test');
--2228224
vacuum dw_temp.category_detail_test;
select pg_relation_size('dw_temp.category_detail_test');
该动作会消耗系统一定的资源,引起系统的IO上升,对有一定系统瓶颈来说容易造成堵塞,严重会把GP宕掉,造成数据库瞬断。
Table 9-47. Database Object Size Functions
Name Return Type Description
pg_column_size(any) int Number of bytes used to store a particular value (possibly compressed)
pg_tablespace_size(oid) bigint Disk space used by the tablespace with the specified OID
pg_tablespace_size(name) bigint Disk space used by the tablespace with the specified name
pg_database_size(oid) bigint Disk space used by the database with the specified OID
pg_database_size(name) bigint Disk space used by the database with the specified name
pg_relation_size(oid) bigint Disk space used by the table or index with the specified OID
pg_relation_size(text) bigint Disk space used by the table or index with the specified name. The table name may be qualified with a schema name
pg_total_relation_size(oid) bigint Total disk space used by the table with the specified OID, including indexes and toasted data
pg_total_relation_size(text) bigint Total disk space used by the table with the specified name, including indexes and toasted data. The table name may be qualified with a schema name
pg_size_pretty(bigint) text Converts a size in bytes into a human-readable format with size units
【查询计划和调度】
查询处理顺序:
1. 用户查询请求
2. Master(解析sql、优化sql)
3. Master把任务分配到各个Segment执行
4. 每个segment负责查询自己本节点数据(执行的操作包括:table scan、join、aggregations、sort)
这些都是同时并行执行的、而且都是独立的。
如果某个查询只涉及到单个segment的数据的话,master是不会分配到所有的segment,
仅仅是分配至该segment。例如: 单行的增删改查、通过表的分布键过滤后的少量结果集...等等
5. 查询的结果返回给master
6. master再发送给用户
【查询计划】
查看Query Plan的时是从底至上的。
Motion -- 主要是涉及到多个节点之间完成任务的话,节点之间会发生数据移动。
Slice -- GP在执行查询时为了获得最优性能,把任务进行了切片。一个查询计划是根据motion来进行切分的,每个slice以motion作为边界。
Redistribute Motion -- Segment之间移动数据。这个是非常之消耗性能的。在前期表设计的时候就要避免这样的操作。
Gather Motion -- Segment将数据传给Master。不是所有的查询计划都调用gather motion。例如:CREATE TABLE AS SELECT ...这个就没有gather motion,结果被存储到新表里面是不需要经过master的。
eg:SELECT customer,amount
FROM sales JOIN customer USING (cust_id)
WHERE dateCol = '03-06-2012';
【并行查询】
Query Dispather(QD) -- Master节点查询任务处理,负责创建和分配查询计划、收集传送最终结果
Query Executor(QE) -- Segment节点查询处理,负责完成数据的计算、多个QE之间的中间结果通讯。
为查询计划的每个slice会被分配到至少一个worker process
Gangs -- 工作于相同slice的查询计划的相关process。当一个slice任务完成后,这个gang会把数据向上级gang传递。
内部通信是通过内部进程来控制的。
CREATE TABLE SALES
(
PROD_ID numeric NOT NULL ,
CUST_ID numeric NOT NULL ,
TIME_ID DATE NOT NULL ,
CHANNEL_ID numeric NOT NULL ,
PROMO_ID numeric NOT NULL ,
QUANTITY_SOLD numeric(10,2) NOT NULL ,
AMOUNT_SOLD numeric(10,2) NOT NULL
)
WITH (appendonly=true,orientation=column,compresstype=QUICKLZ,COMPRESSLEVEL=1)
distributed by (prod_id,cust_id,time_id,channel_id,promo_id)
partition by range(time_id)
(
START (date '1998-01-01') INCLUSIVE
EVERY (INTERVAL '1 year'),
DEFAULT PARTITION other
);