一、日常管理
1 、数据库启停的几种方式:(master节点)
1 .1 、启动数据库:
常用:$ gpstart -a (启动的时候会询问一下是否启动,加入了-a之后就是默认直接启动)
$ gpstart -R,以限制模式启动数据库,此时只能用gpadmin管理员用户登录,在我们做某些维护操作,不希望其他用户连接数据库的时候,可以这么启动服务。
$ gpstart -m,单独启动master节点(重大事故无法启动了,双宕机的时候),检查一下,维护一下,维护好了之后在关闭他(关闭命令: $ gpstop -m),之后在正常启动数据库
1.2 、关闭数据库 :
常用: $ gpstop -M fast (也可以增加-a参数)快速的关闭数据库
默认情况下,如果有任何客户端连接存在,就不允许关闭Greenplum数据库。 使用-M fast选项可以在关闭前回滚所有正在进行中的事务并且中断所有连接。
gpstop 系统在关闭之前会等待所有的活动事务完成。不加参数的话会让你选择哪种形式关闭 -s,
1.3 、重启数据库:
$ gpstop -r:执行gpstop工具并带有-r选项时,会停止Greenplum数据库并在数据库完全关闭后重新启动它。(比较慢)
启动和关闭不要中途停止,此时某些进程已经启动了,再次启动的时候会检测到部分进程已经启动或者关闭,导致下一次的启停不成功
2 、维护管理 gpstate -c/-e
$gpstate 可以看到有没有宕机,mirror实例是否正常
$gpstate -e 检查数据的恢复进度(宕机恢复之后的数据同步)(恢复多少,总共缺失量是多少啊,恢复时间预计,都会显示出来)
$gpstate -s |-p显示完整的配置机状态,实例的路径,端口号等信息(-s, 表状,-p列状)
$gpstate -m 检查mirror是否正常
$gpstate -c primary跟mirror映射
3 、日志文件
日志位置,日志配置,日志信息
操作日志:maser和sagment上面都存在
master就存在数据目录(gpseg-1)(/app/gpdate/master/gpseg-1/pg_log)
sagment 节点也在同样的数据路径下
gpAdminLogs:记录gp库集群操作,启停日志,扩容,备份,会在这个日志里面 (/home/gpadmin/gpAdminLogs),过滤 日志的命令(cat,group过滤关键字)
4 、一些视图检查数据库大小的命令
gp_segment_configuration :系统表,可以查看一些配置信息
psql postgres 进入数据库
select * from gp_segment_configuration;
dbid:每个实例唯一,自己的dbid
content:日志文件中的gpseg-num,num数字就是这个content,通过这个判断是那个目录下面的日志
role:角色(当前实例的身份p|m)
preferred_role:(原本实例,初始创建是主机还是备机)和上面的不一致,说有有宕机
mode:数据库标识状态(n:没有mirror,或者mirror坏了,s:正常 ;4/5版本中:r:故障恢复的时候,表示数据正在同步中;c:数据库发生变化了,primary和mirror中数据不同步了,数据量的不同)
status:u:正常 ; b:宕机
port:初始化的时候给的端口号
datadir:日志路径,可以看错误信息
退出操作 \q
系统页面:gpstate,查看状态,有宕机会显示
gprecoverseg -r 主备机角色恢复(宕机机器正常启动,gprecoverseg 数据同步完成在之后行这条命令)同步是否完成可以通过gpstate -e(5/6页面会直接显示,其他版本需要主动查看)
二、用户权限和对列
1 、角色和权限
连接数据库标准操作: psql -d gp_test -U gpadmin
\du :可以看到所有用户
\d :查看所有的表信息和表所属的owner
\dn :查看所有的schemas
\c :查看当前登录信息
\q :退出数据库
grant命令可以进行对象权限的授予(查看(超级管理员创建的)表权限,用户分组)
select from pg_tables where tablename = “tablename” 可以查看表的相信信息,属于那个用户,owner
创建表的时候可以指定schema(需要提前存在,否则会报错,同时也存在权限问题,数据权限,还是grant命令)
可以限制用户登录时间
1.1 、创建用户
create role qs;
create user qs2;
\du 可以看到一个有登陆权限一个没有
说明默认的创建role是没有login权限,创建user是有的。
给予登陆权限
alter role qs with login;
修改用户权限和密码
alter role qs with password ‘1234’;
创建用户之后要赋予用户登录权限,然后修改$MASTER_DATA_DIRECTORY路径下的pg_hba.conf 文件
cd $MASTER_DATA_DIRECTORY
vim pg_hba.conf
文件中插入一条新的用户记录
列一:host/local
列二:要连接的数据库名
列三:用户名
列四:ip地址 10.16.2.157/24 (/24校验前三位 /32全部校验IP地址)
列五:md5/trust md5:登录要密码 trust:登录不需要密码
修改了配置文件之后需要执行命令(gpstop -u)重新加载这个文件才能生效
1.2 、创建组
连入数据库之后
create role admin createrole createdb;(组用户 一般不给他权限,仅用来控制组员权限)
把qs放入admin这个组
grant admin to qs;
赋予组权限
GRANT ALL ON TABLE tablename TO admin;
GRANT ALL ON SCHEMA public TO admin;
GRANT ALL ON DATABASE gp_test TO admin;
收回这个组
revoke admin from qs;
\du 查看
1.3 、赋予用户权限
([https://www.jb51.net/article/203376.htm](file:///https://www.jb51.net/article/203376.htm))
GRANT ALL ON DATABASE gp_test TO qs;
GRANT ALL ON SCHEMA “public” to qs;
删除指定用户:drop role qs;
直接删除可能会报错
移除对象依赖:alter table qs OWNER TO gpadmin;
ERROR: role ``"test"` `cannot be dropped because ``some` `objects depend ``on` `it
DETAIL: owner ``of` `table` `test
移除数据库依赖 revoke all on database gp_test from qs;
ERROR: role ``"test"` `cannot be dropped because ``some` `objects depend ``on` `it
DETAIL: ``privileges` `for` `database` `postgres
移除schema依赖:revoke all on schema public from qs;
ERROR: role ``"test"` `cannot be dropped because ``some` `objects depend ``on` `it
DETAIL: ``privileges` `for` `schema` `public
如果不保留owner 的数据库对象可以直接执行这个命令:drop owned by qs;然后执行对象移除
alter role qs WITH CREATEROLE; – /赋予创建角色的权限/
ALTER role qs VALID UNTIL ‘JUL 7 14:00:00 2021 +8’; /设置角色的有效期
ALTER role qs DENY DAY ‘Sunday’; / 限制时间间隔期间的访问,按日期或日期时间指定 /
1.3、查询用户的权限
1、查询用户对数据库的权限
postgres=# select datname,datacl from pg_database ;
2、查询用户对schema的权限
postgres=# select * from pg_namespace ;
3、查询用户对表的权限
postgres=# select * from information_schema.table_privileges ;
2 、资源队列
MAX_COST:用active_设置更合适,不设置,默认是-1,无限
存在优先级,级别高的会先执行
超级用户才可可以创建资源队列
授予用户资源队列:alter role qs RESOURCE QUEUE queue-name、
查看当前资源队列信息:select from pg_resqueue_attributes;
2.1 、创建资源队列
SQL:CREATE RESOURCE QUEUE qs_1 with (ACTIVE_STATEMENTS=10,MEMORY_LIMIT=‘2000MB’,PRIORITY=HIGH,COST_OVERCOMMIT=true,MIN_COST=100,MAX_COST=1000000);
其中
1.ACTIVE_STATEMENTS 最多并发运行的SQL
2.MEMORY_LIMIT 内存限制
3.PRIORITY 优先级,和CPU相关
4.MAX_COST 执行计划中SQL语句可以达到最大的COST(单位没有什么意义,只能是在设定之前先跑一下,预估一下,但是实际上不好预估,所以不使用这个参数)(1:35:30)
5.MIN_COST 低于这个值则绕过队列限制,立即执行
注意
1、只有superuser 角色权限的用户才可以创建资源队列
2、ACTIVE_STATEMENTS 与 MAX_COST 必须二选一,不能都设置为-1。
3、队列名不能为none,为保留标识符。
4、资源队列参数被数据库参数限制statement_mem
赋予用户资源队列
alter role qs RESOURCE QUEUE qs_1 ;
2.2 、查看资源队列
两种查看形式:
SQL:SELECT * FROM gp_toolkit.gp_resqueue_status;
SQL:select * from pg_resqueue_attributes;
不同用户资源对列使用情况
SQL:select * from gp_toolkit.gp_resq_role;
rrrolname | rrrsqname
2.3 、修改变更资源队列
使用ALTER RESOURCE QUEUE命令来改变资源队列的限制
ALTER RESOURCE QUEUE qs_1 WITH (ACTIVE_STATEMENTS=3);
ALTER RESOURCE QUEUE qs_1 WITH (MAX_COST=100000.0);
将活动语句数量或者内存限制重置为无限制,可以使用-1值。
ALTER RESOURCE QUEUE qs_1 WITH (MAX_COST=-1.0, MEMORY_LIMIT=‘2GB’);
改变查询优先级
ALTER RESOURCE QUEUE qs_1 WITH (PRIORITY=MIN);
2.4 、删除资源队列
drop resource queue qs_1 ;
删除资源队列时资源队列不能和任何用户有关
改为默认资源队列
alter role qs resource queue none;
三、压缩模式
创建表的时候可以指定压缩类型,压缩等级,可以指定某一列(字段)的压缩模式,超过1000万的表建议压缩
压缩推荐:zlib 等级为5(1-9)
\d+ tablename 可以查看表详细信息
创建压缩表
CREATE TABLE tc_ao_zlib5(a int,b text)
WITH(appendonly=true,compresstype=zlib,compresslevel=5) DISTRIBUTED BY(a);
Insert into tc_ao_zlib5 values(1,‘abc’);
Insert into tc_ao_zlib5 values(2,‘abc’);
Insert into tc_ao_zlib5 values(3,‘abc’);
Insert into tc_ao_zlib5 select * from tc_ao_zlib5;
Insert into tc_ao_zlib5 select * from tc_ao_zlib5;
Insert into tc_ao_zlib5 select * from tc_ao_zlib5;
Insert into tc_ao_zlib5 select * from tc_ao_zlib5;
查看表大小
select pg_size_pretty(pg_relation_size(‘tc_ao_zlib5’));
查看压缩比
select get_ao_compression_ratio(‘tc_ao_zlib5’);
查看表的oid
select oid from pg_class where relname =‘tc_ao_zlib5’;
创建普通表验证压缩比
CREATE TABLE tc_ao(a int,b text)
WITH(appendonly=true) DISTRIBUTED BY(a);
Insert into tc_ao select from tc_ao_zlib5;
查看表大小
select pg_size_pretty(pg_relation_size(‘tc_ao_zlib5’));
select pg_size_pretty(pg_relation_size(‘tc_ao’));
混合压缩模式:
Create table tb1 (c1 int encoding(compresstype=zlib,compresslevel=5),
c2 text encoding(compresstype=quicklz),
c3 text)
with (appendonly=true,orientation=column);
\d+ tb1 查看表详情
四、数据加载
查看数据分布状态:select gp_segment_id,count() from tablenma group by 1 order by 1;
4.1 、Copy命令(gp库本身)
装载
COPY person_ceshi1 FROM ‘/home/gpadmin/vuser248/csv/person_ceshi.csv’ with delimiter ‘|’ ;
卸载
COPY person_ceshi1 to ‘/home/gpadmin/vuser248/csv/person_ceshi.csv’ with delimiter ‘|’ ;
4.2 、gpfdist
启动:nohup gpfdist -d /home/gpadmin/external_table_file/ -p 1234 -l /home/gpadmin/gpfdist.log &
停止:ps -ef|grep gpfdist 然后kill -9 {pid}
启动参数介绍
基本参数
-d 数据文件所放的目录,这里的路径为 /home/gpadmin/external_table_file/ 。
-p 设置访问gpfdist端口,这个可以根据实际情况写。
-l 设置日志文件所放的目录,这个参数也可以不用填写。
必须注意“&”这个符号绝对不能忘记填写,不然开始服务会失败。
其他参数
-t 设置允许Greenplum Database建立到gpfdist进程的连接的时间。默认值是5秒。允许的值为2 ~ 600秒。在有大量网络的系统上可能需要增加、
-m :设置允许的最大数据行长度(以字节为单位)。默认是32768(32K) 256M。
-s(use 0_SYNC) :打开带有0_SYNC标志的同步I/0文件。对结果文件描述符的任何写入都会阻塞gpfdist,直到数据被物理写入底层硬件。
-w :设置Greenplum Database在关闭目标文件(如命名管道)之前延迟的秒数。缺省值是0,不延迟。最大值是600秒,10分钟。
对于具有多个分段的Greenplum数据库,当从不同分段向文件写入数据时,分段之间可能存在延迟。您可以指定Greenplum Database关闭文件之前等待的时间,以确保所有数据都写入该文件。
4.3 、外部表
指定gpfdist信息:LOCATION (‘gpfdist://文件服务器主机名或IP:gpfdist端口/加载文件’) format ‘文件格式’ (DELIMITER ‘分隔字符’)
只读外部表
CREATE (READTABLE) EXTERNAL TABLE “public”.“order” (
“id” varchar(64),
“create_by” varchar(64),
“create_date” timestamp
) LOCATION (‘gpfdist://gp-master:1234/order.csv’)
format ‘csv’ (DELIMITER ‘|’);
可写外部表
创建可写外部表
CREATE WRITABLE EXTERNAL TABLE “ods”.“order1” (
“id” varchar(64),
“create_by” varchar(64),
“create_date” timestamp
) LOCATION (‘gpfdist://gp-master:8081/order1.csv’)
format ‘CSV’ (DELIMITER ‘|’)
DISTRIBUTED BY (id);
注意
外部表的删除只能用drop external table tablename;
五、分区表
1、设计分区表
分区表过多(注意分区表数量和历史数据归档)
- 决定分区设计:日期范围、数字范围或者值的列表。
- 选择要按哪个(哪些)列对表分区。
- 决定用户需要多少个分区级别。例如,用户可以按月创建一个日期范围分区表,然后对每个月的分区按照销售地区划分子分区。
1、日期范围分区表
一个按日期范围分区的表使用单个date或者timestamp列作为分区键列。如果需要,用户可以使用同一个分区键列来创建子分区,例如按月分区然后按日建子分区。请考虑使用最细的粒度分区。例如,对于一个用日期分区的表,用户可以按日分区并且得到365个每日的分区,而不是先按年分区然后按月建子分区再然后按日建子分区。一种多级设计可能会减少查询规划时间,但是一种平面的分区设计运行得更快。
用户可以通过给出一个START值、一个END值以及一个定义分区增量值的EVERY子句让Greenplum数据库自动产生分区。默认情况下,START值总是被包括在内,而END值总是被排除在外。例如:
create table sales (
id int,
date date,
amt decimal(10, 2)
) DISTRIBUTED by (id)
partition by range (date) (
start (date '2016-01-01') INCLUSIVE
end (date '2017-01-01') EXCLUSIVE
every (interval '1 day')
);
用户也可以逐个声明并且命名每一个分区。例如:
create table sales (
id int,
date date,
amt decimal(10, 2)
) DISTRIBUTED by (id)
partition by range (date) (
partition Jan16 start (date '2016-01-01') INCLUSIVE ,
partition Feb16 start (date '2016-02-01') INCLUSIVE ,
partition Apr16 start (date '2016-04-01') INCLUSIVE ,
partition May16 start (date '2016-05-01') INCLUSIVE ,
partition Jun16 start (date '2016-06-01') INCLUSIVE ,
partition Jul16 start (date '2016-07-01') INCLUSIVE ,
partition Aug16 start (date '2016-08-01') INCLUSIVE ,
partition Sep16 start (date '2016-09-01') INCLUSIVE ,
partition Oct16 start (date '2016-10-01') INCLUSIVE ,
partition Nov16 start (date '2016-11-01') INCLUSIVE ,
partition Dec16 start (date '2016-12-01') INCLUSIVE
end (date '2017-01-01') EXCLUSIVE
);
2、数字范围分区表
一个按数字范围分区的表使用单个数字数据类型列作为分区键列。例如:
create table rank (
id int,
rank int,
year int,
gender char(1),
count int
) DISTRIBUTED by (id)
partition by range (year) (
start (2006)
end (2016) every (1),
default partition extra
);
3、列表分区
一个按列表分区的表可以使用任意允许等值比较的数据类型列作为它的分区键列。一个列表分区也可以用一个多列(组合)分区键,反之一个范围分区只允许单一列作为分区键。对于列表分区,用户必须为每一个用户想要创建的分区(列表值)声明一个分区说明。例如:
create table rank (
id int,
rank int,
year int,
gender char(1),
count int
) DISTRIBUTED by (id)
partition by LIST (gender) (
partition girls values ('F'),
partition boys values ('M'),
default partition other
);
Note: 当前的Greenplum数据库传统优化器允许列表分区带有多列(组合)分区键。一个范围分区只允许单一列作为分区键。Greenplum查询优化器不支持组合键,因此用户不能使用组合分区键。
4、多级分区表
用户可以用分区的子分区创建一种多级分区设计。使用一个子分区模板可以确保每一个分区都有相同的子分区设计,包括用户后来增加的分区。例如,下面的SQL创建所示的两级分区设计:
create table sales (
trans_id int,
date date,
amount decimal(9, 2),
region text
) DISTRIBUTED by (trans_id)
partition by range (date)
SUBPARTITION by LIST (region)
SUBPARTITION TEMPLATE (
SUBPARTITION usa values ('usa'),
SUBPARTITION asia values ('asia'),
SUBPARTITION europe values ('europe'),
default SUBPARTITION other_regions
)
(
start (date '2011-01-01') INCLUSIVE
end (date '2012-01-01') EXCLUSIVE
every (interval '1 month'),
default partition outlying_dates
);
注意:当用户创建基于范围的多级分区时,很容易会创建大量的子分区,有一些包含很少的甚至不包含数据。这可能会在系统表中增加很多项,这些项增加了优化和执行查询所需的时间和内存。增加范围区间或者选择一种不同的分区策略可减少创建的子分区数量。
5、对已有的表进行分区
表只能在创建时被分区。如果用户有一个表想要分区,用户必须创建一个分过区的表,把原始表的数据载入到新表,再删除原始表并且把分过区的表重命名为原始表的名称。用户还必须重新授权表上的权限。例如:
create table sales2 (
like sales
) partition by range (date) (
start (date '2016-01-01') INCLUSIVE
END (date '2017-01-01') EXCLUSIVE
EVERY (INTERVAL '1 month')
);
insert into sales2 select * from sales;
drop table sales;
alter table sales2 rename to sales;
grant all privileges on sales to admin;
grant select on sales to guest;
6、查看分区表的信息
- **pg_partitions:**查看有关分区设计的信息。
- **pg_partition:**跟踪分区表以及它们的继承层次关系。
- **pg_partition_templates:**展示使用一个子分区模板创建的子分区。
- **pg_partition_columns:**显示在一个分区设计中用到的分区键列。
2、维护分区表
要维护一个分区表,对顶层父表使用ALTER TABLE命令。最常用的情景是删除旧的分区以及增加新的分区,以此在一种范围分区设计中维护数据的一个滚动窗口。用户可以把旧的分区转换(交换)成追加优化的压缩存储格式来节省空间。如果在用户的分区设计中有一个默认分区,用户可以通过分裂默认分区来增加一个分区。
增加分区
用户可以用ALTER TABLE命令为一个分区设计增加一个分区。如果原始分区设计包括由一个子分区模板定义的子分区,新增加的分区也会根据该模板划分子分区。例如:
alter table sales add partition
start (date '2017-02-01') INCLUSIVE
end (date '2017-03-01') EXCLUSIVE;
如果在创建表时没有使用一个子分区模板,用户可以在增加分区时定义子分区:
alter table sales add partition
start (date '2017-02-01') INCLUSIVE
end (date '2017-03-01') EXCLUSIVE (
SUBPARTITION usa values ('usa'),
SUBPARTITION asia values ('asia'),
SUBPARTITION europe values ('europe')
);
当用户为一个现有分区增加一个子分区时,用户可以指定要更改的分区。例如:
alter table sales alter partition for (rank(12))
add partition africa values ('africa');
Note: 用户不能向一个具有默认分区的分区设计中增加分区。用户必须分裂默认分区来增加分区。
重命名分区
分区表使用下列命名习惯。分区子表的名称服从唯一性要求和长度限制。
<parentname>_<level>_prt_<partition_name>
例如:sales_1_prt_jan16
对于自动生成的范围分区,在没有给出名称时会分配一个数字:sales_1_prt_1
要重命名一个已分区的子表,应重命名顶层父表。在所有相关的子表分区的表名中,都会改变。例如下面的命令:
alter table sales rename to globalsales;
会修改相关的表名:globalsales_1_prt_1
用户可以更改一个分区的名称让它更容易标识。例如:
alter table sales rename partition for ('2016-01-01') to jan16;
会把相关的表名改为如下:sales_1_prt_jan16
在使用ALTER TABLE命令修改分区表时,总是用它们的分区名(jan16)而不是它们的完整表名(sales_1_prt_jan16)引用表。
Note: 表名不能是一个ALTER TABLE语句中的分区名。例如,ALTER TABLE sales…是正确的。 ALTER TABLE sales_1_part_jan16…则不被允许。
增加默认分区
用户可以用ALTER TABLE命令为一个分区设计增加一个默认分区。
alter table sales add default partition other;
如果用户的分区设计是多级的,该层次中每一级都必须有一个默认分区。例如:
alter table sales alter partition for (rank(1)) add default partition other;
alter table sales alter partition for (rank(2)) add default partition other;
alter table sales alter partition for (rank(3)) add default partition other;
如果到来的数据不匹配一个分区的CHECK约束并且没有默认分区,该数据就会被拒绝。默认分区确保到来的不匹配一个分区的数据能被插入到默认分区中。
删除分区
用户可以使用ALTER TABLE命令从用户的分区设计中删除一个分区。当用户删除一个具有子分区的分区时,子分区(以及其中的所有数据)也会被自动删除。对于范围分区,从范围中删除较老的分区很常见,因为旧的数据会被滚出数据仓库。例如:
alter table sales drop partition for (rank(1));
截断分区
用户可以使用ALTER TABLE命令截断一个分区。当用户截断一个具有子分区的分区时,子分区也会被自动截断。
alter table sales TRUNCATE partition for (rank(1));
分裂分区
分裂一个分区会把一个分区划分成两个分区。用户可以使用ALTER TABLE命令分裂分区。只能在最低层级的分区做分裂(包含数据的分区)。对于对级别分区,只是范围分区可以分裂,列表分区不行。用户指定的分裂值会分在后一个分区中。
例如,把一个月度分区分裂成两个,第一个分区包含日期January 1-15而第二个分区包含日期January 16-31:
alter table sales SPLIT partition
for ('2017-01-01') at ('2017-01-16')
into
(
partition jan171to15,
partition jan1716to31
);
如果用户的分区设计有一个默认分区,用户必须分裂该默认分区来增加分区。
在使用INTO子句时,指定当前的默认分区为第二个分区名。例如,要分裂一个默认的范围分区来为January 2017增加一个新的月度分区:
3、分区注意:
分区字段不能update
分区不要超过500个
不建议多级分区
六、备份
[greenplum 6.0 下gpbackup的编译与使用](file:///https://www.cnblogs.com/zsfishman/p/12153373.html)
1 、介绍:
串行(非并行)备份:数据汇总的master上面,master做备份,(1.1T执行了三天,所以只适合小数据迁移和备份,灵活)
并行备份:分布式数据库,master启动之后,各个segment同时备份各自的数据
segment节点备份各自数据,参与备份都是活动的实例,备份消耗的时间和节点的数量没有关系,每个节点备份自己的数据,看各自有多少,备份完成就结束
备份和恢复需要使用同样的参数备份和恢复需要使用同样的参数
备份数据库可以压缩,可以指定只备份数据,一次只能指定一个db,可以增量备份(假增量,判断哪些表变化了,全部重新备份,不变化的,就不备份)
备份初始获取表结构会锁表,只和alter table互斥,其他查询正常,比4/5版本的排它锁升级了很
2、命令参数
–dbname: 后面加数据库名字,用于指定备份的数据库
–backup-dir:后面加存储文件路径,可以指定备份文件存在的目录(不加的话会保存在一个默认路径中去: $ cd $MASTER_DATA_DIRECTORY/backups// )
(指定备份目录前提:集群内所有机器,都需要把这个备份目录创建出来,才能指定)
–leaf-partition-data:对于分区表,为每个叶分区创建一个数据文件,而不是为整个表创建一个数据文件,不需要额外加参数
–timestamp :后面加时间戳,来指定准确的时间戳记值(YYYYMMDDHHMMSS)(恢复数据的时候需要指定哪个备份文件) 。
–create-db:如果备份的数据库不存在,就需要这个参数,会自动创建数据库,不需要加其他参数
2.1 、备份生成的文件介绍:
查看oid:select oid from pg_class where relname=‘tablename’ ;
2.1.1 、master
.sql:备份的全局变量和指定数据库的元数据,global的对象就是resource,这些是全局的,role,是全局的(对象的备份)
下面是表空间,以及表空间的权限信息,接下来数据库里面的内容了(表和数据)
全局:集群中创建一次,就可以连接各个数据库里面,信息都是一样的,用户权限密码,都是不变的,都是这些。
toc文件:每个segment的上的csv的对应的表名和oid 的一个文件
report文件:数据库版本,数据库名字,执行命令,数据类型,成功与否
config文件:备份过程中使用的一些参数,在这里面(恢复使用:恢复与备份需要使用同样的参数,就需要这个文件)
2.1.2 、segment:
一个一个的文件
gpbackup_ 节点content)_ 时间戳_ 表的oid
3 、数据备份基本命令演示
3.1 、全量备份:
gpbackup --dbname hxods --backup-dir /home/gpadmin/backups/ (–leaf-partition-data)
3.2 、数据恢复
如果数据库在集群中不存在,就需要包括–create-db选项
gprestore --backup-dir /home/gpadmin/backups/ --timestamp 20210603163858 (–create-db)
4 、gpbackup 安装
安装包本地已经有了,拖进去执行命令就可以安装
gppkg -i 加安装包名称
七、常见故障及修复
1 、启动类故障
1.1 、数据库无法启动:
防火墙是否关闭
节点之间通信连接(ssh,ping)
配置是否合理(postgresql.conf、pg_hba、os参数,共享内存给的太小也有起不来的情况)
元数据损坏(常规操作不会出现,非常规操作可能出现,这个问题需要运维人员先评估在处理,或者是厂商介入处理)
1.2 、节点启动异常
1、节点网络是否正常
2(第一步找不到问题,进一步的查看)查看节点启动日志
3、宕机修复,(启动异常,用宕机修复命令可以尝试一下修复)
2 、配置类故障
2.1 、内存溢出:
gpconfig -l |grep protect --> gp_vmem_protect_limit 这个参数 内存,因为内存是共享的,大家都用的时候,大家的总和超过了最大值,就会溢出
资源队列设置:也会配置内存,总和超过系统内存最大值
greenplum不独享这个服务器情况下,其他应用内存使用过高(我的内存正常,但是其他的应用使用的大了),导致总和溢出
系统应用使用内存过高(需要借助操作系统命令排查)
2.2 、 OS 参数配置导致连接异常或无法连接
具体查看连接异常报错
检查系统日志
2.3 、系统服务密码过期( ssh 就过不去了)
不会影响集群运行,但是查看节点就是异常(gpstate命令),但是进去数据库里面操作全部正常
gpstate命令运行:登录到各个机器去执行,然后接收返会结果,查看节点是否正常
3 、高可用故障
master上FTS进程:联系到每个segment去探测是否正常:宕掉了就会发通知
原因可能:
网络原因:在这个时间内,多次探测重试都联系不到,就判断你宕机了,然后启动mirror机器
磁盘使用率100%:数据库就顶到了,写入什么的就都做不了了
查看日志排错:
cd pg_log,一些日志都在这里
gprecoverge -r (角色切换时,正在查询或者其他的操作,会被切断和回滚)(注意所有节点数据同步完成后在做)
gpstate -e 查看节点恢复进度
4、其他故障
5.1 、无法创建共享内存
gpconfig -s max_connections(将他改大的时候出错)
共享内存太小,内存支持不了更多的连接(该操作系统的共享内存是最简单的(如果能改)尽量不要去改postgresql.conf)
尽量去使用 gpconfig -c 来完成批量修改,一个一个修改太容易出错了
5.2 、数据库用户无法访问
1、pg_hba.conf:相当于白名单,需要把用户的认证创建进去
2、误删了一些初始化后默认的配置(例如:pg_hba.conf文件)
5.3 、长时间锁等待
(资源队列锁,有十二个会话,资源队列只有10个 会锁住)
select from pg_stat_activity 查询正在执行的会话 waiting 为t还是f
对象所(删除表是需要这个表任何操作都没有才可以(有被引用insert,会话不结束没有释放资源的话,就会一直等待))