PostgreSQL登录及修改密码
PostgreSQL 连接问题 FATAL: no pg_hba.conf entry for host
命令行方式登录PostgreSQL
理解PostgreSQL中的权限
PostgreSQL学习—模式schema
PostgreSQL中布尔类型(boolean)
postgresql建表示例
PostgreSQL 临时表
PostgreSQL 之 with查询
create temp table countsXXX with (appendonly=true,compresstype=quicklz) on commit drop as
select XXX,YYY,count(*) as countXXX from temp.table_Z group by XXX,YYY
distributed by (XXX);
select * from countsXXX where countXXX>1;
ALTER TABLE的用法 增加列、删除列、改列名、改列约束、改表名
greenplum创建表,修改表语句
ALTER TABLE report.AAA
ADD COLUMN DFLAG boolean DEFAULT FALSE
修改默认值
ALTER TABLE report.AAA
ALTER COLUMN DFLAG SET DEFAULT FALSE
修改列的数据类型
alter table temp.tty
alter column AAA type bigint
Greenplum update语法
update report.AAA t
set dflag = TRUE
from (
select CCC
from cnp_wip.CCC
where status_bo ='BBB:'||site||',407' and date(MODIFIED_DATE_TIME)=current_date
) t1
where t.CCC = t1.CCC
或者
create temp table CCC_tmp with(appendonly=true,compresstype=quicklz) on commit drop as
select CCC
from cnp_wip.CCC
where status_bo ='BBB:'||site||',407' and date(MODIFIED_DATE_TIME)=current_date
distributed by (CCC);
update report.AAA t
set dflag = TRUE
from (
select *
from CCC_tmp
) t1
where t.CCC = t1.CCC
PostgreSQL: 浅谈 PostgreSQL 的 timestamp 类型
now()
current_timestamp
current_date
current_time
两年后
now() + interval ‘2 years’
一个月后
now() + interval ‘1 month’
三周前
now() - interval ‘3 week’
十分钟后
now() + ‘10 min’
计算两个时间差
select age(now(), timestamp ‘1989-02-05’);
select age(timestamp ‘2007-09-15’);
时间字段的截取
EXTRACT(field FROM source)
extract(year from now())
extract(month from now());
extract(day from timestamp ‘2013-04-13’);
EXTRACT(DAY FROM INTERVAL ‘40 days 1 minute’);
方法一:
(to_timestamp(XX_DATE_TIME,'YYYY-MM-DD HH24:MI:SS')::timestamp without time zone + interval '8 hour') AS XX_DATE
方法二:
来源
时区没有时间戳并说它是UTC,那么我会把它打印成我当地的时区
SELECT ((timestamp '2015-10-24 16:38:46') AT TIME ZONE 'UTC');
timezone
------------------------
2015-10-24 17:38:46+01
你想要的“EST”似乎在美洲的某个地方,从返回的值来判断。如果需要,可以将表达式包装在一个小SQL函数中。
SELECT ((timestamp '2015-10-24 16:38:46') AT TIME ZONE 'UTC') AT TIME ZONE 'EST';
timezone
---------------------
2015-10-24 11:38:46
(1 row)
在查询中执行类似操作
SELECT ((stored_timestamp AT TIME ZONE 'UTC') AT TIME ZONE 'EST') AS local_timestamp
FROM my_table;
其实就是把本地时间转成UTC,再把UTC转成目标时区
Postgresql查询每组的前N条记录
postgres 分组排序获取前几条
PostgreSQL雕虫小技,分组TOP性能提升44倍
row_number() over(partition by XX,yy,ZZ,mm order by SUM(nn) desc) as mm_order
postgresql----字符串函数与操作符
postgreSQL中的array_to_string函数和如何实现group_concat
postgresql如何实现group_concat功能
PostgreSQL数据库切割和组合字段函数
postgresql字符转义
Postgresql 条件表达式
postgres-# SELECT num,
postgres-# CASE num WHEN 1 THEN 'one'
postgres-# WHEN 2 THEN 'two'
postgres-# WHEN 3 THEN 'three'
postgres-# ELSE 'other'
postgres-# END
postgres-# FROM t_1
postgres-# ORDER BY 1, 2;
Postgresql 10 HASH分区实现
PostgreSQL PARTITION 分区表
不到一定数据量没必要分区,数据按分区键分布要均匀
PostgreSQL 数据库性能提升的几个方面
PostgreSQL学习手册(SQL语言函数)
PostgreSQL学习手册(五) 函数和操作符
Welcome to Withdata Software!
测试有效
导数据的时候主要是主外键容易出问题,同时DBeaver导数据也存在一定bug,但可以用。
为了数据转换更顺利,可以先在mysql中建立没有主外键的表,然后再从postgrresql中导出数据,完成后再补上主外键信息。
su -postgresql
psql
\c ambri
\l
pg -dump -u postgre hive > hive.sql
查看pg的相关设置
select * from pg_settings
例如
select * from pg_settings where name='statement_timeout' --查看语句执行时长,statement_timeout = 0 表示可以一直执行下去
select * from pg_settings where name='client_encoding' --查看客户端编码格式
postgresql中字符串需要用单引号包裹,如果使用双引号,系统将认为那是变量.所以最常见的转义就是对单引号的转义,postgresql对单引号的转义有两种方式:
一是在需要转义的单引号前面再加一个单引号:
UPDATE user SET username = 'Peter''s Name' WHERE id = 1;
二是在字符串前面加上E,然后使用反斜杠:
DELETE FROM user WHERE username = E'Peter\'s Name';
如果你不想要每次都写E或者加上单引号就直接使用自己习惯的反斜杠,可以设置postgresql的一个参数:
SET standard_conforming_strings = on;
这样就可以不加E直接使用反斜杠转义了.想要关闭只需要:
SET standard_conforming_strings = off;
也可以对相关的值进行设置,比如。
SET statement_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
从外部导入数据的时候可能要做一些设置,但是本身系统如果很多人在用,又不能影响别人。可以把原来的设置保存下来。临时改过去,导完数据后,再改回来。当然最好不要这么操作。
psql
\l
\c ambari;
\dp+ ambari.
\dS ambari.admin
Greenplum运维脚本编写方式
GreenPlum高效去除表重复数据
--查找重复数据并合并,通过计数知道哪些是重复的
CREATE TEMP TABLE ZT_duplicate_jr with(appendonly=true,compresstype=quicklz) ON COMMIT DROP AS
select
aaa
,bbb
,ccc
,count(*)
from
report.tbltabl
where
aaa > i_begintime
group by bbb,ccc
having count(*)>1
distributed by (bbb);
--删除重复数据
delete from
report.tbltabl as a
using ZT_duplicate_jr as b
where
coalesce(a.bbb ,'infd')=coalesce(b.bbb ,'infd')
AND coalesce(a.ccc,'infd')=coalesce(b.ccc,'infd');
----将之前合并好的重复数据插回结果表
insert into report.tbltabl
select
A.aaa,A.bbb,A.ccc
from ZT_duplicate_jr as A ;
PostgreSQ 连接问题 FATAL: no pg_hba.conf entry for host
/*需要在写集群各步步骤都做完之后再进行同步*/
/*第一次增量同步前需要全量同步*/
/*copy_table_between_cluster是将数据从源表搬到目标表(或中间表作为目标表,mid标示中间表)的自定义函数,1=1表示全量,true表示有分区,false表示没有分区;exec_sql_on_remote_master是执行analyse的函数*/
1、同步脚本:
select public.copy_table_between_cluster(
'report.taltbltabl',
'mdp',
'w_r_diff.taltbltabl_mid',
'111.222.333.444',
'5432',
'START_TIME >= ''$begin'' AND start_time < ''$end''',
'true' );
假设从写同步到读
参数1:源表
参数2:目标数据库
参数3:目标数据库的IP
参数4:目标数据库的端口
参数5:where添加(全量1=1)
参数6:true:truncate 目标表,false:不做truncate操作
2、发sql到远程数据库执行
参数1:执行的sql
参数2:目标数据库
参数3:端口号
select public.exec_sql_on_remote_master
('delete from report.taltbltabl
where START_TIME >= ''$begin'' AND start_time < ''$end'';
insert into report.taltbltabl
select * from w_r_diff.taltbltabl_mid;
analyse report.taltbltabl',
'mdp',
'111.222.333.444',
'5432'
);
注意点:
1、分区表不可以直接同步,需要借助中间表:
1.1、需要在目标数据库建一个和源数据库分区表结构一样的非分区表,名字统一是源表名_mid,放在 w_r_diff 这个schemas
1.2、将源表数据同步到目标数据库的mid表
1.3、在目标数据库将mid表插入到目标数据库对应的分区表
2、增量同步时,同步前需要对目标表也执行增量删除后,再增量同步。
3、每次同步后要对表做analyse。如果有truncate也可以在analyse后加 vacuum full
4、为了不影响写集群的写入操作,将同步脚本写在原脚本begin end后面。
4、如果写集群数据异常,需要带参数重跑数据时,也要对读集群的数据维护,保证两边数据一致。
5、如果写集群表结构有改动,读集群的表结构也要做相应调整
同步例子:
/*一:分区表全量同步,从写集群到读集群*/
/*
步骤1:全量将写集群的表同步到读集群的mid表中(对mid表有做truncate)
*/
select public.copy_table_between_cluster(
'report.taltbltabl',
'mdp',
'w_r_diff.taltbltabl_mid',
'111.222.333.444',
'5432',
'1=1',
'true' );
/*
步骤2:在读集群将目标分区表truncate掉,再将mid表数据插入到目标表
*/
select public.exec_sql_on_remote_master
('truncate report.taltbltabl;
insert into report.taltbltabl
select * from w_r_diff.taltbltabl_mid',
'mdp',
'111.222.333.444',
'5432'
);
/*
步骤3:对目标表做analyse
*/
select public.exec_sql_on_remote_master
('analyse report.taltbltabl',
'mdp',
'111.222.333.444',
'5432'
);
/*二:非分区表全量同步,从写集群到读集群*/
/*
步骤1:全量将写集群的表同步到读集群目标表中(对目标表有做truncate)
*/
select public.copy_table_between_cluster(
'report.taltbltabl',
'mdp',
'report.taltbltabl',
'111.222.333.444',
'5432',
'1=1',
'true' );
/*步骤2:对目标表做analyse
*/
select public.exec_sql_on_remote_master
('analyse report.taltbltabl',
'mdp',
'111.222.333.444',
'5432'
);
/*步骤3:对目标表做 vacuum full
*/
select public.exec_sql_on_remote_master
('vacuum full report.taltbltabl',
'mdp',
'111.222.333.444',
'5432'
);
/*三:分区表增量同步,从写集群到读集群*/
/*步骤1:增量将写集群的表同步到读集群的mid表中(对mid表有做truncate)
*/
select public.copy_table_between_cluster(
'report.taltbltabl',
'mdp',
'w_r_diff.taltbltabl_mid',
'111.222.333.444',
'5432',
'START_TIME >= ''$begin'' AND start_time < ''$end''',
'true' );
/*步骤2:在读集群将目标分区表按增量条件delete掉,再将mid表数据插入到目标表
*/
select public.exec_sql_on_remote_master
('delete from report.taltbltabl
where START_TIME >= ''$begin'' AND start_time < ''$end''';
insert into report.taltbltabl
select * from w_r_diff.taltbltabl_mid',
'mdp',
'111.222.333.444',
'5432'
);
/*步骤3:对目标表做analyse
*/
select public.exec_sql_on_remote_master
('analyse report.taltbltabl',
'mdp',
'111.222.333.444',
'5432'
);
/*四:非分区表增量同步,从写集群到读集群*/
/*步骤1:读集群将目标分区表按增量条件delete掉
*/
select public.exec_sql_on_remote_master
('delete from report.taltbltabl
where START_TIME >= ''$begin'' AND start_time < ''$end''',
'mdp',
'111.222.333.444',
'5432'
);
/*步骤2:增量同步,注意:非分区表增量,不带truncate:参数4设置成false
*/
select public.copy_table_between_cluster(
'report.taltbltabl',
'mdp',
'report.taltbltabl',
'111.222.333.444',
'5432',
'START_TIME >= ''$begin'' AND start_time < ''$end''',
'false' );
/*步骤3:对目标表做analyse
*/
select public.exec_sql_on_remote_master
('analyse report.taltbltabl',
'mdp',
'111.222.333.444',
'5432'
);
准备试验数据
create table report.test_hlq_190514(id varchar(3) , pid varchar(3) , name varchar(10));
insert into report.test_hlq_190514 values('002' , 0 , '浙江省');
insert into report.test_hlq_190514 values('001' , 0 , '广东省');
insert into report.test_hlq_190514 values('003' , '002' , '衢州市');
insert into report.test_hlq_190514 values('004' , '002' , '杭州市') ;
insert into report.test_hlq_190514 values('005' , '002' , '湖州市');
insert into report.test_hlq_190514 values('006' , '002' , '嘉兴市') ;
insert into report.test_hlq_190514 values('007' , '002' , '宁波市');
insert into report.test_hlq_190514 values('008' , '002' , '绍兴市') ;
insert into report.test_hlq_190514 values('009' , '002' , '台州市');
insert into report.test_hlq_190514 values('010' , '002' , '温州市') ;
insert into report.test_hlq_190514 values('011' , '002' , '丽水市');
insert into report.test_hlq_190514 values('012' , '002' , '金华市') ;
insert into report.test_hlq_190514 values('013' , '002' , '舟山市');
insert into report.test_hlq_190514 values('014' , '004' , '上城区') ;
insert into report.test_hlq_190514 values('015' , '004' , '下城区');
insert into report.test_hlq_190514 values('016' , '004' , '拱墅区') ;
insert into report.test_hlq_190514 values('017' , '004' , '余杭区') ;
insert into report.test_hlq_190514 values('018' , '011' , '金东区') ;
insert into report.test_hlq_190514 values('019' , '001' , '广州市') ;
insert into report.test_hlq_190514 values('020' , '001' , '深圳市') ;
–上面的sql运行之后,表report.test_hlq_190514中的记录如下,
select * from report.test_hlq_190514 order by pid
id,pid,name
"001";"0";"广东省"
"002";"0";"浙江省"
"020";"001";"深圳市"
"019";"001";"广州市"
"004";"002";"杭州市"
"006";"002";"嘉兴市"
"003";"002";"衢州市"
"008";"002";"绍兴市"
"013";"002";"舟山市"
"005";"002";"湖州市"
"009";"002";"台州市"
"012";"002";"金华市"
"011";"002";"丽水市"
"007";"002";"宁波市"
"010";"002";"温州市"
"016";"004";"拱墅区"
"014";"004";"上城区"
"015";"004";"下城区"
"017";"004";"余杭区"
"018";"011";"金东区"
set gp_recursive_cte_prototype =on;
如果是
with RECURSIVE cte as
(
select a.id,cast(a.name as varchar(100)) from report.test_hlq_190514 a
where id in ('002','001')
union all
select k.id,cast(c.name||'>'||k.name as varchar(100)) as name from report.test_hlq_190514 k inner join cte c on c.id = k.pid
)select * from cte order by id
结果如下:
id,name
"001";"广东省"
"002";"浙江省"
"003";"浙江省>衢州市"
"004";"浙江省>杭州市"
"005";"浙江省>湖州市"
"006";"浙江省>嘉兴市"
"007";"浙江省>宁波市"
"008";"浙江省>绍兴市"
"009";"浙江省>台州市"
"010";"浙江省>温州市"
"011";"浙江省>丽水市"
"012";"浙江省>金华市"
"013";"浙江省>舟山市"
"014";"浙江省>杭州市>上城区"
"015";"浙江省>杭州市>下城区"
"016";"浙江省>杭州市>拱墅区"
"017";"浙江省>杭州市>余杭区"
"018";"浙江省>丽水市>金东区"
"019";"广东省>广州市"
"020";"广东省>深圳市"
而其中
select a.id,cast(a.name as varchar(100)) from report.test_hlq_190514 a
where id in ('002','001')
的结果如下:
id,name
"001";"广东省"
"002";"浙江省"
这就是初始化递归的结果,因为之前cte并没值;
第一次递归便是上面的结果与原表report.test_hlq_190514 的inner join ,得到
"003";"浙江省>衢州市"
"004";"浙江省>杭州市"
"005";"浙江省>湖州市"
"006";"浙江省>嘉兴市"
"007";"浙江省>宁波市"
"008";"浙江省>绍兴市"
"009";"浙江省>台州市"
"010";"浙江省>温州市"
"011";"浙江省>丽水市"
"012";"浙江省>金华市"
"013";"浙江省>舟山市"
"019";"广东省>广州市"
"020";"广东省>深圳市"
第二次递归是上面的结果与report.test_hlq_190514 的inner join ,得到
"014";"浙江省>杭州市>上城区"
"015";"浙江省>杭州市>下城区"
"016";"浙江省>杭州市>拱墅区"
"017";"浙江省>杭州市>余杭区"
"018";"浙江省>丽水市>金东区"
下面的sql只是在上面得到的cte基础上
with RECURSIVE cte as
(
select a.id,cast(a.name as varchar(100)) from report.test_hlq_190514 a
where id in ('002','001')
union all
select k.id,cast(c.name||'>'||k.name as varchar(100)) as name from report.test_hlq_190514 k inner join cte c on c.id = k.pid
)select id,name,split_part(name,'>',1),split_part(name,'>',num+1) ,num from (select id,name,case when length(name)-length(replace(name,'>',''))=0 then 1 else length(name)-length(replace(name,'>','')) end num from cte) a;
id,name,split_part,split_part,num
"001";"广东省";"广东省";"";1
"019";"广东省>广州市";"广东省";"广州市";1
"020";"广东省>深圳市";"广东省";"深圳市";1
"002";"浙江省";"浙江省";"";1
"013";"浙江省>舟山市";"浙江省";"舟山市";1
"012";"浙江省>金华市";"浙江省";"金华市";1
"011";"浙江省>丽水市";"浙江省";"丽水市";1
"010";"浙江省>温州市";"浙江省";"温州市";1
"008";"浙江省>绍兴市";"浙江省";"绍兴市";1
"009";"浙江省>台州市";"浙江省";"台州市";1
"003";"浙江省>衢州市";"浙江省";"衢州市";1
"004";"浙江省>杭州市";"浙江省";"杭州市";1
"005";"浙江省>湖州市";"浙江省";"湖州市";1
"006";"浙江省>嘉兴市";"浙江省";"嘉兴市";1
"007";"浙江省>宁波市";"浙江省";"宁波市";1
"018";"浙江省>丽水市>金东区";"浙江省";"金东区";2
"017";"浙江省>杭州市>余杭区";"浙江省";"余杭区";2
"016";"浙江省>杭州市>拱墅区";"浙江省";"拱墅区";2
"015";"浙江省>杭州市>下城区";"浙江省";"下城区";2
"014";"浙江省>杭州市>上城区";"浙江省";"上城区";2