启动Greenplum数据库
gpstart -a
对于要求重启数据库生效
gpstop -r
仅重新载入更改配置文件生效
gpstop -u
使用-m模式运行gpstart:
gpstart -m
以维护模式连接到Master进行目录维护。例如:
PGOPTIONS='-c gp_session_role=utility' psql postgres
在完成管理任务后,停止处于维护模式的额Master。然后以生产模式重启它。
gpstop -mr
# 停止Greenplum数据库
gpstop
# 快速模式停止Greenplum数据库
gpstop -M fast
激活数据库存储目录
gpactivatestandby -d $MASTER_DATA_DIRECTORY
用 -f 选项运行gpstate来检查状态:
gpstate -f
在后备Master主机上,移动或者移除数据目录gpseg-1。这个例子移动该目录:
mv /data/master/gpseg-1 /data/master/backup_gpseg-1
集群状态查询
[gpadmin@gp-mdw ~]$ gpstate
20220925:22:52:20:056550 gpstate:gp-mdw:gpadmin-[INFO]:-Starting gpstate with args:
20220925:22:52:20:056550 gpstate:gp-mdw:gpadmin-[INFO]:-local Greenplum Version: 'postgres (Greenplum Database) 6.22.0 build commit:4b6c079bc3aed35b2f161c377e208185f9310a69 Open Source'
20220925:22:52:20:056550 gpstate:gp-mdw:gpadmin-[INFO]:-master Greenplum Version: 'PostgreSQL 9.4.26 (Greenplum Database 6.22.0 build commit:4b6c079bc3aed35b2f161c377e208185f9310a69 Open Source) on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-10), 64-bit compiled on Sep 8 2022 22:39:10'
20220925:22:52:20:056550 gpstate:gp-mdw:gpadmin-[INFO]:-Obtaining Segment details from master...
20220925:22:52:20:056550 gpstate:gp-mdw:gpadmin-[INFO]:-Gathering data from segments...
20220925:22:52:21:056550 gpstate:gp-mdw:gpadmin-[INFO]:-Greenplum instance status summary
20220925:22:52:21:056550 gpstate:gp-mdw:gpadmin-[INFO]:-----------------------------------------------------
20220925:22:52:21:056550 gpstate:gp-mdw:gpadmin-[INFO]:- Master instance = Active
20220925:22:52:21:056550 gpstate:gp-mdw:gpadmin-[INFO]:- Master standby = gp-smdw
20220925:22:52:21:056550 gpstate:gp-mdw:gpadmin-[INFO]:- Standby master state = Standby host passive
20220925:22:52:21:056550 gpstate:gp-mdw:gpadmin-[INFO]:- Total segment instance count from metadata = 18
20220925:22:52:21:056550 gpstate:gp-mdw:gpadmin-[INFO]:-----------------------------------------------------
20220925:22:52:21:056550 gpstate:gp-mdw:gpadmin-[INFO]:- Primary Segment Status
20220925:22:52:21:056550 gpstate:gp-mdw:gpadmin-[INFO]:-----------------------------------------------------
20220925:22:52:21:056550 gpstate:gp-mdw:gpadmin-[INFO]:- Total primary segments = 18
20220925:22:52:21:056550 gpstate:gp-mdw:gpadmin-[INFO]:- Total primary segment valid (at master) = 18
20220925:22:52:21:056550 gpstate:gp-mdw:gpadmin-[INFO]:- Total primary segment failures (at master) = 0
20220925:22:52:21:056550 gpstate:gp-mdw:gpadmin-[INFO]:- Total number of postmaster.pid files missing = 0
20220925:22:52:21:056550 gpstate:gp-mdw:gpadmin-[INFO]:- Total number of postmaster.pid files found = 18
20220925:22:52:21:056550 gpstate:gp-mdw:gpadmin-[INFO]:- Total number of postmaster.pid PIDs missing = 0
20220925:22:52:21:056550 gpstate:gp-mdw:gpadmin-[INFO]:- Total number of postmaster.pid PIDs found = 18
20220925:22:52:21:056550 gpstate:gp-mdw:gpadmin-[INFO]:- Total number of /tmp lock files missing = 0
20220925:22:52:21:056550 gpstate:gp-mdw:gpadmin-[INFO]:- Total number of /tmp lock files found = 18
20220925:22:52:21:056550 gpstate:gp-mdw:gpadmin-[INFO]:- Total number postmaster processes missing = 0
20220925:22:52:21:056550 gpstate:gp-mdw:gpadmin-[INFO]:- Total number postmaster processes found = 18
20220925:22:52:21:056550 gpstate:gp-mdw:gpadmin-[INFO]:-----------------------------------------------------
20220925:22:52:21:056550 gpstate:gp-mdw:gpadmin-[INFO]:- Mirror Segment Status
20220925:22:52:21:056550 gpstate:gp-mdw:gpadmin-[INFO]:-----------------------------------------------------
20220925:22:52:21:056550 gpstate:gp-mdw:gpadmin-[INFO]:- Mirrors not configured on this array
20220925:22:52:21:056550 gpstate:gp-mdw:gpadmin-[INFO]:-----------------------------------------------------
[gpadmin@gp-mdw ~]$
磁盘空间查询
# 数据库查看使用量
select * from gp_toolkit.gp_disk_free;
# 系统命令行查看
gpssh -f host.list -e “df -h |grep data”
查询当前连接
psql -c "select * from pg_stat_activity;"
查看数据库
psql -c "select pg_size_pretty(pg_database_size('test'));"
表占用空间
psql -c "select pg_size_pretty(pg_relation_size('schema.test'));"
表统计
select relname from pg_class t where t.relname like 'ods%';
select relname from pg_class t where t.relname like 'kn%';
统计资源
select gp_segment_id,count(*) from test group by 1 ;
查看实例配置和状态
select * from gp_segment_configuration order by 1;
收集统计信息,回收空间 定期使用回收垃圾和收集统计信息,尤其在大数据量删除,导入以后,非常重要
Vacuum analyze tablename
进程监控:
select * from pg_stat_activity where waiting ='t' ORDER BY current_query; select * from pg_stat_activity where waiting ='t' ORDER BY sess_id;
select * from pg_stat_activity where waiting ='f' ORDER BY current_query; select * from pg_stat_activity where waiting ='f' ORDER BY sess_id;
select * from pg_tablespace;
select * from pg_filespace;
查看数据分布
select * from pg_filespace_entry;
SELECT spcname, fsname,fsedbid,fselocation FROM pg_tablespace pgts, pg_filespace pgfs,pg_filespace_entry pgfse WHERE pgts.spcfsoid=pgfse.fsefsoid AND pgfse.fsefsoid=pgfs.oid ORDER BY 1,3;
查看数据库备份
select pg_start_backup('backup baseline');
select pg_stop_backup();
常看数据库.conf配置
show all
查看当前日期属于一年中第几周
select EXTRACT(week from TIMESTAMP '2018-05-11');
修复前负载判定(是否需要kill会话,是否需要重启),查看是否存在超过一个小时以上的会话,
select pid,usename,query_start,client_addr,xact_start,waiting ,waiting_reason,query from pg_stat_activity where state <>'idle' and query_start < now()-interval '1 hour' order by query_start;
查看节点负载,可以使用vmstat命令,也可以使用nmon监控工具(需安装)
节点日志备份([可选]判定实例>判定路径>备份日志,在恢复前备份日志)
select time,hostname,status,datadir,content from gp_configuration_history h,gp_segment_configuration c where h.dbid=c.dbid and "desc" like '%d, and%' order by time desc limit 10;
根据hostname和datadir,以及time备份对应实例pg_log目录下对应日期的日志
a.常规修复方式(后台运行)
nohup gprecoverseg -a &
若存在主备切换,则需要在修复完成后进行实例切回
nohup gprecoverseg -ra &
查看修复进度
gpstate -e
b. 全量修复方式(后台运行)
nohup gprecoverseg -Fa &
若存在主备切换,则需要在修复完成后进行实例切回
nohup gprecoverseg -ra &
Greenplum数据库和PostgreSQL不为并发控制使用锁。它们使用一种多版本模型来维护数据一致性,即多版本并发控制(MVCC)。MVCC为每一个数据库会话实现了事务隔离,并且每一个查询事务会看到一个数据的快照。这保证该事务会看到一致的不受其他并发事务影响的数据。
因为MVCC不会为并发控制使用显式锁,锁竞争被最小化并且Greenplum数据库在多用户环境中维持了合理的性能。为查询(读取)数据获得的锁不与为写数据获得的锁冲突。
Greenplum数据库提供了多种锁模式来控制对表中数据的并发访问。大部分Greenplum数据库的SQL命令自动获取适当的锁来确保在命令执行期间被引用的表不会被删除或者被以不兼容的方式被修改。对于不能轻易适应于MVCC行为的应用,可以使用LOCK命令来获取显式锁。不过,MVCC的正确使用通常能提供更好的性能。
锁模式 | 相关的SQL命令 | 冲突的锁 |
---|---|---|
ACCESSSHARE | SELECT | ACCESS EXCLUSIVE |
ROW SHARE | SELECT FOR UPDATE, SELECT FOR SHARE | EXCLUSIVE, ACCESS EXCLUSIVE |
ROWEXCLUSIVE | INSERT, COPY | SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE |
SHAREUPDATEEXCLUSIVE | VACUUM (without FULL), ANALYZE | SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE |
SHARE | CREATE INDEX | ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE |
SHARE ROWEXCLUSIVE | ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE | |
EXCLUSIVE | DELETE, UPDATE | ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE |
Greenplum数据库会为UPDATE、DELETE和SELECT FOR UPDATE获取更加严格的EXCLUSIVE锁(而不是PostgreSQL中的ROW EXCLUSIVE)。
使用INSERT命令在一个表中创建行。这个命令要求该表的名称和表中每一个列的值,可以选择性地以任意顺序指定列名。如果没有指定列名,以那些列在表中的顺序列出数据值,用逗号分隔它们。
例如,指定要插入的列名和值:
INSERT INTO products (name, price, product_no) VALUES ('Cheese', 9.99, 1);
只指定要插入的值:
INSERT INTO products VALUES (1, 'Cheese', 9.99);
通常,数据值都是常量,但也可以使用标量表达式。例如:
INSERT INTO films SELECT * FROM tmp_films WHERE date_prod <
'2016-05-07';
可以在单个命令中插入多行。例如:
INSERT INTO products (product_no, name, price) VALUES
(1, 'Cheese', 9.99),
(2, 'Bread', 1.99),
(3, 'Milk', 2.99);
要插入数据到一个分区表,应指定根分区表,即用CREATE TABLE命令创建的表。也可以在一个INSERT命令中指定该分区表的一个叶子子表。如果数据对于指定的叶子子表无效,会返回一个错误。不支持在INSERT命令中指定一个不是叶子子表的子表。
要插入大量数据,使用外部表或者COPY命令。对于插入大量行,这些装载机制比INSERT更加有效。
追加优化表的存储模型是为批量数据装载而优化。Greenplum不推荐对追加优化表的单行INSERT语句。对于追加优化表,Greenplum数据库支持最多127个并发INSERT事务插入到一个追加优化表。
UPDATE命令在一个表中更新行。可以更新一个表中所有的行、所有行的一个子集或者单个行。可以单独更新每一列而不影响其他列。
要执行一次更新,需要:
例如,下面的命令把所有价格为5的产品更新为价格为10:
UPDATE products SET price = 10 WHERE price = 5;
在Greenplum数据库中使用UPDATE由下列限制:
DELETE命令从一个表中删除行。指定一个WHERE子句可以删除满足特定条件的行。如果不指定WHERE子句,该表中所有的行都会被删除。其结果是一个合法的但为空的表。例如,从产品表中删除所有价格为10的行:
DELETE FROM products WHERE price = 10;
要从一个表中删除所有行:
DELETE FROM products;
在Greenplum数据库中使用DELETE具有和使用UPDATE类似的限制:
使用TRUNCATE命令可以快速地移除一个表中的所有行。例如:
TRUNCATE mytable;
这个命令在一次操作中清空一个表的所有行。注意TRUNCATE不扫描该表,因此它不会处理继承的子表或者ON DELETE的重写规则。该命令只截断所提到的表中的行。
事务允许用户把多个SQL语句捆绑在一个要么全做要么全不做的操作中。
下面是Greenplum数据库的SQL事务命令:
Greenplum数据库接受下列标准SQL事务级别:
下列信息描述了Greenplum事务级别的行为:
一个SELECT查询:
如果其他并发事务在同一个事务中后续的SELECT查询开始前提交更改,这些查询能够看到不同的数据。UPDATE和DELETE命令只找在该命令开始前提交的行。
读已提交或读未提交事务隔离允许并发事务在UPDATE或者DELETE找到行之前修改或者锁定该行。读已提交或读未提交事务隔离可能不适合执行复杂查询和更新并且要求该数据库的一致性视图的应用。
一个SELECT查询:
Greenplum数据库中的默认事务隔离级别是读已提交。要为一个事务更改隔离级别,在BEGIN该事务时声明隔离级别或者在事务开始后使用SET TRANSACTION命令设置隔离级别。
虽然新事务看不到被删除或者被更新的数据行,但是它们仍然在磁盘上占用物理空间。周期性地运行VACUUM命令可以移除这些过期的行。例如:
# 回收空间
VACUUM mytable;
# 收集查询优化器需要的统计信息
ANALYZE mytable;
VACUUM命令会收集表级别的统计信息,例如行数和页数。在装载数据后清理所有的表,包括追加优化表。有关推荐的例行清理操作的信息。重要:如果在数据库数据上频繁地执行更新和删除, VACUUM、VACUUM FULL和VACUUM ANALYZE命令应该被用来维护Greenplum数据库中的数据。有关使用VACUUM命令的信息请见Greenplum数据库参考指南。
过期行被放在空闲空间映射中。空闲空间映射的尺寸应该足够大以保存数据库中所有的过期行。如果空间不足,一个普通的VACUUM命令也不能回收使空闲空间映射溢出的过期行所占用的空间。
VACUUM FULL会回收所有的过期行空间,但是它是一种很昂贵的操作,并且在大型的分布式的Greenplum数据库表上可能会花很长的不可接受的时间来完成。如果空闲空间映射溢出,可以用一个CREATE TABLE AS 语句重建该表并且删除旧表。不鼓励使用VACUUM FULL。用下列服务器配置参数调整空闲空间映射的尺寸:
GP使用基于成本的查询优化器
ANALYZE命令收集查询优化器需要的统计信息
VACUUM ANALYZE可以一起执行:
=# VACUUM ANALYZE tb_cp_02;
数据库服务日志文件
控制写到服务器日志里的信息的详细程度。有效值是 DEBUG5, DEBUG4,DEBUG3,DEBUG2, DEBUG1,INFO,NOTICE, WARNING ,ERROR,LOG, FATAL,和 PANIC。每个级别都包含它后面的级别。越靠后的数值发往服务器日志的信息越少。缺省是 NOTICE。请注意 LOG 和 client_min_messages 里面的同名级别优先级不同。只有超级用户可以修改这个设置。
show log_min_messages;
这个选项控制那些信息发送到客户端。有效的数值是 DEBUG5,DEBUG4, DEBUG3,DEBUG2, DEBUG1,LOG,NOTICE, WARNING 和 ERROR。每个级别包含所有它后面的级别,级别越靠后,发送的信息越少。缺省是 NOTICE。这里的 LOG 和 log_min_messages 里面的有不同的级别。
show client_min_messages;
通过gplogfilter工具来查找匹配指定标准的日志数据;默认只查找默认目录下的Master日志文件。 例如, 显式master日志文件的最近3行记录
$ gplogfilter –n 3
也可以使用gplogfilter+gpssh工具组合在所有segment节点进行查找 例如,显式每个segment日志文件的最近三行
$ gpssh –f seg_host_file
=> gplogfilter –n 3 /data/primary/*/pg_log/gpdb*.csv
缺省位于~/gpAdminLogs目录下 命令方式:<script_name>_<date>.log 日志记录的格式: <timestamp>:<utility>:<host>:<user>:[INFO|WARN|FATAL]:<message>
所有的系统数据字典存放在pg_catalog模式下
在psql中列出所有的系统字典:\dtS 在psql中列出所有的系统视图:\dvS