• [问题求助] 数据API开发sql语句开启预编译后sql报错
    如题,在测试api的时候发现语句:(current_date - interval '${num}' day),会因为预编译而导致执行sql出错的问题。gaussdb原语句是(current_date - interval '30' day),因为涉及到多个参数且参数类型不同,尝试过cast('${num}' as int)方法不成功。也尝试过使用''两个双引号来转义也不行。取消勾选预编译后语句是可以正常运行的,请问是否还有其他方法可以在满足预编译的情况下成功执行这句话?
  • 数据库未来发展趋势
    新应用驱动的数据库(5G、车、终端云)从数据库诞生开始,新的应用领域就不断为数据库带来新诉求,例如巨大的数据量、更短的数据处理时间、更高的可靠性、新的数据类型,而数据库也在满足这些新的诉求的同时得到不断的发展与更新。一、 及其相关应用对数据库系统带来的挑战与机遇从历史上看,通信技术对数据库发展起到了至关重要的作用:1980—1990年,TCP/IP网络协议出现,大中型企业内部开始规模部署局域网,甚至通过卫星技术将地域上分散的局域网互联互通,这推动了企业IT系统从主机时代走向客户端/服务端(Client/Server,C/S)时代。Oracle数据库抓住C/S架构下数据库系统需要应对更高并发、更多客户端连接的挑战,加大C/S架构数据库研发,在数据库市场上取得了决定性胜利,市场份额甚至接近当时企业IT 霸主IBM 的DB2数据库。上分散的局域网互联互通,这推动了企业IT系统从主机时代走向客户端/服务端(Client/Server,C/S)时代。Oracle数据库抓住C/S架构下数据库系统需要应对更高并发、更多客户端连接的挑战,加大C/S架构数据库研发,在数据库市场上取得了决定性胜利,市场份额甚至接近当时企业IT 霸主IBM 的DB2数据库。1990—2000年,互联网和万维网普及,对运营电子商务和在线购物公司的数据库系统提出更为艰巨的挑战,单一服务器无法满足运营公司对处理能力、数据容量等的诉求,且在线业务对服务的持续可用性也提出了更高的要求。Oracle公司抓住市场机会,推出了Oracle RAC集群数据库,在这一时期最终成为数据库市场的老大。2000年至今,移动互联网和智能手机兴起,用户从过去固定时间和地点接入互联网,到随时随地进行网络社交活动、在线支付和购物,即使集群数据库系统也无法满足性能、扩展性和服务可用性的诉求,必须从过去垂直扩展Scale-up(通过升级硬件配置提升性能)走向横向扩展Scale-out(通过增加新的服务器硬件提升系统整体性能)。分布式数据库系统从研究走入商用,这一时期的典型代表是谷歌公司于2012年发表的论文中阐述的Google Spanner分布式数据库系统。维基百科对5G(5th generation mobile networks or 5th generation wireless systems,第五代移动通信技术)的定义: 是最新一代蜂窝移动通信技术,是4G(LTEA、WiMAX-A)系统后的延伸。5G 的性能目标是具有高数据传输速率、减少延迟、节省能源、降低成本、提高系统容量和连接大规模设备。5G作为最新移动通信技术,其高带宽(吉比特每秒级)、极低延迟(毫秒级)的特征使其主要潜在应用于AR(Augmented Reality,增强现实)/VR(Virtual Reality,虚拟现实)、云游戏、实时视频通信、无人机、工业互联网等。这将对数据库系统带来新的挑战,体现在:终端设备到云端网络延迟通常上百毫秒,不利于充分利用5G 的低延迟特性,考虑在终端设备与云端之间部署中小型计算中心,这种部署称为边缘计算。如何将计算和数据在终端-边缘-云之间进行高效的协同,是新型数据库系统的研究方向。5G网络下,视频和计算机视觉相关应用将成为杀手级应用,如何解决图像的实时查询和分析等问题,也会成为新型数据库系统的热点话题。二、自动驾驶汽车对数据库系统带来的挑战与机遇根据维基百科对自动驾驶汽车的定义: 自动驾驶汽车能通过雷达、光学雷达、GPS(Global Positioning System,全球定位系统)及计算机视觉等技术感测其环境。先进的控制系统能将感测资料转换成适当的导航道路以及障碍与相关标志。根据定义,自动驾驶汽车能透过感测输入的资料,更新其地图信息,让交通工具可以持续追踪其位置。当前业界研发自动驾驶需要采集大量数据,包含来自车载传感器的各类时序数据(上百种)、激光雷达的点云(Point Cloud)数据、毫米波雷达数据、GPS定位数据、车载摄像头的视频数据等。自动驾驶汽车会产生海量数据,厂商会采集并在云端存储某些车辆数据,用于研发。典型数据量如下:600GB/h-radar;140GB/h-lidar;3.2TB/h-camera;40GB/h-sonar;6GB/h-CANbus。厂商一般在云端需要存储和管理数十PB(1PB=1000000GB)甚至更多数据量,如何高效地存储、管理和查询这些海量、异构、多模的数据,是当前自动驾驶领域面临的严峻挑战。三、终端云对数据库系统带来的挑战与机遇智能手机厂家为了给用户提供优良的体验,一般都构筑终端云服务,为用户提供云存储备份(如相册、短信、通讯录等),这极大方便了用户更换手机,即使用户手机丢失,但手机中数据无损。同时,如何保证用户数据隐私和安全是一个重大的技术挑战。2016年欧盟专门为数据隐私和安全提出新的法案《通用数据保护条例》(General Data Protection Regulation,GDPR,欧盟法规编号为(EU) 2016/679),是在欧盟法律中对所有欧盟个人关于数据保护和隐私的规范,涉及了欧洲境外的个人资料出口。GDPR主要目标为取回公民以及居民对于个人资料的控制,以及为了国际商务而简化在欧盟内的统一规范。当前数据库缺乏原生对用户数据隐私和安全的保障机制,这对终端云数据库提出新的挑战,例如:数据主体(Data Subject)有被遗忘权(Right to be Forgotten),即可以要求控制资料的一方,删除所有个人资料的任何连接、副本或复制品。数据库系统如何保证数据主体所产生的数据按照要求,正确、一致、稳妥地进行删除,这涉及数据主体所产生数据在不同子系统中流转的跟踪、所产生数据副本的管控与追溯、存储介质的擦除等难题。GDPR要求执行安全防护(Security Safeguards Principle),即个人资料应受到合理的安全保护,以防止丢失或未经授权的访问、破坏、使用、修改或披露数据等风险。这对数据库系统提出数据需要在存储、传输和计算中均保证安全、可信,不因为被攻击而产生数据泄露等难题。
  • [云服务] 【数据使能】RDS for PostgreSQL能力项
    分类文档链接备注最新动态cid:link_4特性清单cid:link_3原子APIcid:link_2FAQcid:link_1华为云在线课程(免费)7天玩转PostgreSQL基础训练营cid:link_0本课程主要是PostgreSQL基础内容的介绍,快速了解PostgreSQL特性及应用。华为云开发者网云数据库 RDS开放能力cid:link_5
  • [实践系列] DWS获取当前日期在当月的自然周数(周一开始)的自定义函数
    RT.  有业务需求需要获取当前日期在当月的周数,且是按周一为一周的开始的。搜索网上postgres或者oracle的办法,都没有直接获取的办法,于是自建一个自定义函数获取。  to_char(日期,'W')能返回类似的周数,但一周的开始是按当月1日的周几开始,即select to_char('2022-10-08'::date,'W');等当月8日的结果永远返回2(第2周),因此无法使用to_char直接使用。 此处提供简单的逻辑办法创建自定义函数 逻辑如下,以2022年10月为例,1,2日为第1周,而3号周一为第2周的开始。 在减去第1周的2天后,每7天为1周;假设当前日期是2022-10-08 周六,此处的公式为向上取整数((8号 - 2天)/ 7天) + 1 ,结果是2,意思是8号是本月的第二周。  最后根据当月1号是周几,得出以下办法: 向上取整数((当前几号 - (7 - 1号周几 + 1))/ 7) + 1SQL如下:CREATE OR REPLACE FUNCTION public.weekofmonth(varchar) RETURNS int LANGUAGE sql STRICT NOT FENCED SHIPPABLE AS $$ /* 向上取整((当前几号-(7- 1日周几 + 1)) / 7 ) + 1 */ select ceil((extract(day from $1::date) - (7 - (case when extract(dow from (to_char($1::date,'YYYY-MM')||'-01')::date) = 0 then 7 else extract(dow from (to_char($1::date,'YYYY-MM')||'-01')::date) end) + 1)) / 7)::int + 1; $$ ; 使用样例: postgres=# select weekofmonth('2022-05-01'::date);  weekofmonth  -------------            1 (1 row)  postgres=# select weekofmonth('2022-10-31'::date);  weekofmonth  -------------            6 (1 row) 
  • [SQL] GaussDB(DWS)如何交换分区
    基本语法:ALTER TABLE Tab1 EXCHANGE PARTITION PartitionName WITH Tab2;问题场景:--创建分区表 drop table if exists tab_partition; CREATE TABLE tab_partition ( prod_key int, prod_code character varying(50) ) WITH (orientation=column, compression=middle) DISTRIBUTE BY HASH(prod_key) PARTITION BY RANGE (prod_key) ( PARTITION p201901_r01 VALUES LESS THAN (100) TABLESPACE pg_default, PARTITION p201901_r02 VALUES LESS THAN (200) TABLESPACE pg_default, PARTITION p201901_r03 VALUES LESS THAN (300) TABLESPACE pg_default ); --创建普通表 drop table if exists tab_tmp; CREATE TABLE tab_tmp ( prod_key int, prod_code character varying(50) ) WITH (orientation=column, compression=middle) DISTRIBUTE BY HASH(prod_key); alter table tab_partition add column xxxxx character varying(200); alter table tab_partition drop column xxxxx; alter table tab_partition exchange partition (p201901_r02) with table tab_tmp; --报错 --ERROR: tables in ALTER TABLE EXCHANGE PARTITION must have the same number of columns问题根因:交换分区基本原理是将两个表的物理文件直接进行交换,要求两个表的列能一一对应。目标表的列经过增减后,两个表的表定义(由于删除列)无法一一对应,因此表的物理文件无法直接交换。解决办法:建普通表时,使用create table like语句,且带上dropcolumsdrop table if exists tab_tmp2; create table tab_tmp2(like tab_partition INCLUDING DROPCOLUMNS INCLUDING DISTRIBUTION INCLUDING STORAGE INCLUDING RELOPTIONS); --具体需要INCLUDING哪些参数需要结合业务实际需要 alter table tab_partition exchange partition (p201901_r02) with table tab_tmp2; --交换成功
  • [技术干货] 业界其他数据库到PostgreSQL复制工具
    1 Ora2pg:基于perl开发的从Oracle迁移到PostgreSQL的工具,最好用的工具之一。高度配置的参数很详细的迁移报告支持并行导入表,job和索引支持字符集转换支持lob迁移相关网址:cid:link_19cid:link_21cid:link_02 pgloader:基于lisp语言开发,核心是调用copy命令实现。支持:MySQL to PostgreSQLSQLite to PostgreSQLMS SQL Server® to PostgreSQL支持并行导入相关网址:cid:link_23cid:link_183 HVR:通过CDC机制来复制 CDC (Change Data Capture) 支持事物,实时复制复制架构支持多种数据库的异构复制相关网址:cid:link_4cid:link_11cid:link_12cid:link_14 pg_chameleon:A replication tool from MySQL to PostgreSQL,基于Python3开发的。通过读取MySQL的binlog,提供实时在线复制的功能。支持从多个MySQL schema读取数据,并将其恢复到目标openGauss数据库中。源schema和目标schema可以使用不同的名称。目前也支持MySQL到OpenGauss。工具使用mysql-replication库从MySQL中提取row images,这些row images将以jsonb格式被存储到openGauss中。在openGauss中会执行一个pl/pgsql函数,解码jsonb并将更改重演到openGauss。相关网站:cid:link_10cid:link_22cid:link_9cid:link_75 ora_migrator基于ora-fdw开发的插件。ora_migrator是一个插件,提供了一系列内置函数,使用这些函数接口以及oracle_fdw插件(PostgreSQL访问oracle的fdw接口),可以将Oracle的schema(包括table,view,sequence,function,procedure, trigger,等)连同数据,迁移到Oracle到PostgreSQLCybertec tool based on oracle_fdw (part of a higher level tool called cybertec migrator)This is a PostgreSQL extension.TL;DR: quite complete, very promising.Written in plpgsql.相关网站: cid:link_8cid:link_13cid:link_26 比较Tool DBMSSCF/PTV/MVUGTeFDWALL✔ ✘✘✘✘✘✘✘PgloaderAll but Oracle✔✔✘✔✔✘✘✘PgChameleonMySQL✔✔✘✘✘✘✘✘Ora2pgOracle✔✔✔✔✔✔✔✔ora_migratorOracle✔✔✔✔✔✘✔✔S: Schema, C: Constraints, F/P: Functions/Procedures, T: Triggers, V/MV: Views/materialized views, U: users, G: Grants, Te: Migration testing相关网站cid:link_20cid:link_16cid:link_6cid:link_14cid:link_15cid:link_3cid:link_17cid:link_5
  • [交流分享] pg数据库性能调优
    pg数据库家里摸底的时候性能一直在2200左右徘徊,后面经过分析,是由于两个数据库实例没有分开numa启动。需要numactl 分开两个节点跑,分别对应两个cpu,性能可以达到3300左右。同时数据库相关的配置按照文档优化即可
  • [技术干货] pg数据库性能
    pg数据库家里摸底的时候性能一直在2200左右徘徊,后面经过分析,是由于两个数据库实例没有分开numa启动。需要numactl 分开两个节点跑,分别对应两个cpu,性能可以达到3300左右。同时数据库相关的配置按照文档优化即可
  • [问题求助] 【香港启德项目】【数据平台】用工具登录DWS库,需要把IP地址添加至白名单
    问题一:开通白名单内网:192.168.88.28公网:118.140.112.6
  • [优秀博文] 技术创新+开放共赢 华为云GaussDB加速企业数字化转型
    文/陶然云、AI、5G等技术驱动,数据库行业迎来新的需求,云数据库也在不断演进升级。依托华为云与华为云Stack,通过全栈软硬件优化,华为云GaussDB进行了进阶与革新,以统一的架构,支持关系型与非关系型的数据库引擎。近日,在第十二届中国数据库技术大会上,笔者有幸采访到了华为云数据库CTO庄乾锋,庄老师向我们详细解读了GaussDB如何从产品架构革新,做到支持全场景全业务,并从解决方案与案例的维度分享了华为云数据库的优秀实践。华为云数据库CTO 庄乾锋华为云GaussDB打造全场景数据库云服务如今,数字化转型已从“以资源为中心”转换成“以应用为中心”,数字化转型进入新阶段。华为云GaussDB紧随时代发展潮流,紧密结合客户业务场景,不断进行自主创新,积极打造极致性能、高可用的数据库服务。 据庄乾锋介绍,华为云GaussDB数据库在2020年升级为全场景云服务以来,取得了一系列的突出进展: 首先,华为云在今年4月份的华为开发者大会上正式发布了GaussDB新品,主打金融政企核心业务场景,是能满足最严苛金融级需求的分布式数据库。 庄老师进一步表示,今年的新版本具备应对海量并发事务处理与复杂查询混合负载的能力,通过技术与全并行架构创新,性能大幅领先对手,并具备超过1000+节点的弹性扩展能力。 同时我们还推出全球首款纯软全密态技术,保障数据传输、计算、存储全链路的安全。并且通过将AI技术植入到数据库内核的架构和算法中,让数据库管理更加智能与高效。 不仅如此,华为云并没有停止前进的步伐。据介绍,在8月份,我们又重磅推出了两个内核新特性:Ustore存储引擎和基于Paxos协议的DCF高可用组件。 Ustore存储引擎是GaussDB内核新增的一种存储模式,这种数据存储能带来更高性能、更高效率,空间利用更充分,整体系统运行更加平稳,适应更多业务场景和工作负载。 而DCF组件则使得GaussDB在保证数据一致性的同时,在高可用方面可进一步得到增强,用户不仅可以免去系统脑裂的风险,还可以提升可用性。 其次,在9月份的2021华为全联接大会上,发布了GaussDB(for MySQL)2.0全新版本及三大核心技术,在原有基础上深度整合了华为云计算全栈的独特能力,在性能、可用性、扩展性等方面都进行了创新,实现了云栈垂直集成力量的最大化,让算力更快更猛,也能更好解决客户海量数据负载场景难点,助力企业客户业务创新。 最后,今年我们在公有云上也上线了数据库和应用迁移工具UGO,这是一款专注于传统数据库的结构迁移与语法转换的利器。未来我们还将在五大技术方向上持续创新,包括云原生多主、基于Memory Pool的HTAP、云原生Serverless、AI Native、全密态。打造一个有技术、更懂客户的数据库,与客户一起深耕数字化转型。 华为云GaussDB携手伙伴共建数据库生态 华为一直坚持合作开放共赢的生态理念。一个能使能客户成功的商业产品,不仅产品要做好,还需要一个成熟健康的生态。 据庄老师介绍,华为云GaussDB积极拥抱并完全兼容和支持业界主流的关系型数据库生态,如MySQL、PostgreSQL及非关系型数据库MongoDB、Redis等生态,另一方面华为公司2020年6月30日宣布开源的openGauss也是开放的生态。 华为云GaussDB对外开源,做到架构开放、代码开放、技术开放和社区开放,不会让客户从封闭的数据库走向另外一个封闭的数据库, openGauss这种方式,能让更多的“同道中人”一起来解决缺陷,一起来理解这个架构,从而维护起来更加方便。 在人才生态方面,华为致力于培养数据库人才,发起高校人才培养计划,计划3年投入5亿人民币,通过智能基座、教育部新工科项目,持续与高校联合开课,截止目前已经投入2亿多,有80+所合作高校,每年覆盖23000多名学生。未来一年计划覆盖200所高校,8万学生。 如今,GaussDB已经广泛应用在1500+政企大客户,涵盖金融、税务、医保、能源、交通、电信运营商、互联网、电商、物流等行业。 在对数据库要求最为苛刻的金融行业,6大国有大型银行中有4家银行已经选择了GaussDB,包括工行,农行,建行,邮储,以及多家股份制银行和保险证券机构。 在财政、税务、医保、自然资源等泛政府行业,GaussDB已和22+省级,100+市级单位开展合作,支持效率提升更好服务社会。 根据国际数据公司(IDC)最新发布了《2020年下半年中国关系型数据库软件市场数据跟踪报告》。报告显示,华为云数据库凭借GaussDB以9.8%的市场份额,占据本地部署市场国产数据库份额第一,同时公有云市场数据库份额增速第一。 面向未来,华为坚持做持续创新的数据库,数据库的持续创新离不开产学研的通力合作,一方面,与合作伙伴、高校以及开发者共建开源生态,鼓励有能力的合作伙伴发展基于openGauss的自有品牌数据库产品,为上层应用提供更多数据库选择,和业界共同繁荣数据库产业生态。 另一方面,华为也基于openGauss的生态,增强分布式内核能力,发布GaussDB商业版本,通过华为云和华为云Stack,满足金融政企客户、华为消费者云、流程IT以及运营商业务对分布式数据库的高性能、高可靠、高安全的需求。目标是打造世界级的国产数据库,为客户提供更优秀、更有竞争力的产品。
  • [技术干货] PostgreSQL插件之pg_dirtyread "闪回查询"
    Oracle数据库有时候不小心删除掉数据,想查询这些数据,或者恢复数据,就可以使用带有as of子句的select语句进行闪回查询。PG粉有福了,下面介绍一种类似“闪回查询”插件 pg_dirtyread,可以读取未被vacuum的dead数据。github主页:https://github.com/df7cb/pg_dirtyread1.2 released:https://www.postgresql.org/message-id/20170923211004.uh27ncpjarkucrhd%40msg.credativ.de一、我们一起看下官网的3个例子:语法:SELECT * FROM pg_dirtyread('tablename') AS t(col1 type1, col2 type2, ...);样例1: 删除找回  CREATE EXTENSION pg_dirtyread;     -- Create table and disable autovacuum   CREATE TABLE foo (bar bigint, baz text);        ALTER TABLE foo SET (     autovacuum_enabled = false, toast.autovacuum_enabled = false   );  --测试方便,先把自动vacuum关闭掉。      INSERT INTO foo VALUES (1, 'Test'), (2, 'New Test');     DELETE FROM foo WHERE bar = 1;        SELECT * FROM pg_dirtyread('foo') as t(bar bigint, baz text);    bar   │   baz   ─────┼──────────        1     │ Test        2     │ New Test  可以看到, 被删除的记录(1, 'Test')已经可以查询到。样例2:列被drop的情况  CREATE TABLE ab(a text, b text);     INSERT INTO ab VALUES ('Hello', 'World');        ALTER TABLE ab DROP COLUMN b;     DELETE FROM ab;        SELECT * FROM pg_dirtyread('ab') ab(a text, dropped_2 text);      a   │ dropped_2   ───────┼───────────    Hello │ World    可以看到,虽然b列被drop掉了,但是仍然可以读取到数据。    如何指定列:这里使用dropped_N来访问第N列,从1开始计数。    局限:由于PG删除了原始列的元数据信息,因此需要在表列名中指定正确的类型,这样才能进行少量的完整性检查。包括类型长度、类型对齐、类型修饰符,并且采取的是按值传递。样例3:系统列 SELECT * FROM pg_dirtyread('foo')            AS t(tableoid oid, ctid tid, xmin xid, xmax xid, cmin cid, cmax cid, dead boolean,            bar bigint, baz text);    tableoid │ ctid  │ xmin │ xmax │ cmin │ cmax │ dead │ bar │        baz   ──────────┼───────┼──────┼──────┼──────┼──────┼──────┼─────┼───────────────────         41823 │ (0,1) │ 1484 │ 1485 │    0 │    0 │ t    │   1 │ Delete   41823 │ (0,2) │ 1484 │    0 │    0 │    0 │ f    │   2 │ Insert         41823 │ (0,3) │ 1484 │ 1486 │    0 │    0 │ t    │   3 │ Update   41823 │ (0,4) │ 1484 │ 1488 │    0 │    0 │ f    │   4 │ Not deleted         41823 │ (0,5) │ 1484 │ 1489 │    1 │    1 │ f    │   5 │ Not updated         41823 │ (0,6) │ 1486 │    0 │    0 │    0 │ f    │   3 │ Updated         41823 │ (0,7) │ 1489 │    0 │    1 │    1 │ t    │   5 │ Not quite updated         41823 │ (0,8) │ 1490 │    0 │    2 │    2 │ t    │   6 │ Not inserted可以看到,xmax和ctid可以被恢复了。 oid只在11以及更早的版本中才能被恢复。二、支持的版本10和11已经支持,2.0以后的版本已经支持12和13,社区还是很活跃。三、实现分析核心代码有2部分:1、dirtyread_tupconvert.c 主要实现了dirtyread_convert_tuples_by_name,通过列名进行元组转换,处理列原信息被清理以及存在表继承的情况,关键部分是数组:attrMap[],下标从1开始。重点分析下dirtyread_do_convert_tupleHeapTuple dirtyread_do_convert_tuple(HeapTuple tuple, TupleConversionMap *map, TransactionId oldest_xmin) { /*  * Extract all the values of the old tuple, offsetting the arrays so that  * invalues[0] is left NULL and invalues[1] is the first source attribute;  * this exactly matches the numbering convention in attrMap.  */ heap_deform_tuple(tuple, map->indesc, invalues + 1, inisnull + 1); //+1是因为是从下标1开始,从旧的元组中把数据的值获取到 /*  * Transpose into proper fields of the new tuple. 这部分是重点,在这里完成转换  */ for (i = 0; i < outnatts; i++) { int j = attrMap; if (j == DeadFakeAttributeNumber)  //场景1:明确是dead,直接调用内核的函数HeapTupleIsSurelyDead即可, //定义在tqual.c中,其它场景可以使用HeapTupleSatisfiesVacuum、HeapTupleSatisfiesMVCC等等,这里明确是dead,所以使用HeapTupleIsSurelyDead { outvalues = HeapTupleIsSurelyDead(tuple , oldest_xmin); outisnull = false; } else if (j < 0) //场景2:系统列,交给函数heap_getsysattr来处理。 outvalues = heap_getsysattr(tuple, j, map->indesc, &outisnull); else {   //场景3:最常见的场景,直接获取即可。 outvalues = invalues[j]; outisnull = inisnull[j]; } } return heap_form_tuple(map->outdesc, outvalues, outisnull); //重新包装为tuple格式 }2、pg_dirtyread.c 面向客户的接口在这里实现。重点分析下 Datum pg_dirtyread(PG_FUNCTION_ARGS)第1部分    if (SRF_IS_FIRSTCALL()),这部分比较套路化     {         superuser校验         PG_GETARG_OID获取表的oid         heap_open打开表         get_call_result_type计算结果校验,不支持复合类型         BlessTupleDesc(tupdesc) 拿到表结构         usr_ctx->map = dirtyread_convert_tuples_by_name(usr_ctx->reltupdesc,                         funcctx->tuple_desc, "Error converting tuple descriptors!");  //关键的一步,这里使用dirtyread_convert_tuples_by_name函数,。         heap_beginscan(usr_ctx->rel, SnapshotAny...),开始启动表扫描,这里使用了SnapshotAny            }第2部分,不断的获取每一行,然后对每一行进行转换,直到扫描结束。     if ((tuplein = heap_getnext(usr_ctx->scan, ForwardScanDirection)) != NULL)     {         if (usr_ctx->map != NULL)         {             tuplein = dirtyread_do_convert_tuple(tuplein, usr_ctx->map, usr_ctx->oldest_xmin);             SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuplein));         }         else             SRF_RETURN_NEXT(funcctx, heap_copy_tuple_as_datum(tuplein, usr_ctx->reltupdesc));     }     else     {         heap_endscan(usr_ctx->scan); //结束扫描         heap_close(usr_ctx->rel, AccessShareLock); //关闭表         SRF_RETURN_DONE(funcctx);     }整体上实现并不是很复杂,理解了这些后,就可以在此基础上增加自己的功能了。 而PG的魅力就在于此--架构的开放性,可以让开发者迅速地开发自己的“小程序”出来。
  • [技术干货] PostgreSQL插件之citext 大小写不敏感
    我们知道,PG对于大小写是敏感的,那有什么办法不敏感呢?可以使用lower函数,例如:SELECT * FROM table1 WHERE lower(col) = LOWER(?);但是存在一些问题:它让你的 SQL 语句冗长,并且你必须总是要记住在列和查询值上使用lower。它不会使用一个索引,除非你使用lower创建一个函数索引。如果你声明一个列为UNIQUE或PRIMARY KEY,隐式生成的索引是大小写敏感的。因此,它对于大小写不敏感的搜索是没有用处的,并且它不会强制大小写不敏感的唯一性。测试了一番:postgres=# create extension citext; CREATE EXTENSION postgres=# CREATE TABLE users ( postgres(#     nick CITEXT PRIMARY KEY, postgres(#     pass TEXT   NOT NULL postgres(# ); CREATE TABLE postgres=# INSERT INTO users VALUES ( 'larry',  sha256(random()::text::bytea) ); ndom()::text::bytea) ); INSERT INTO users VALUES ( 'Bjørn',  sha256(random()::text::bytea) );INSERT 0 1 postgres=# INSERT INTO users VALUES ( 'Tom',    sha256(random()::text::bytea) ); INSERT 0 1 postgres=# INSERT INTO users VALUES ( 'Damian', sha256(random()::text::bytea) ); INSERT 0 1 postgres=# INSERT INTO users VALUES ( 'NEAL',   sha256(random()::text::bytea) ); INSERT 0 1 postgres=# INSERT INTO users VALUES ( 'Bjørn',  sha256(random()::text::bytea) ); INSERT 0 1 postgres=# SELECT * FROM users WHERE nick = 'Larry';  nick  |                                pass                                 -------+--------------------------------------------------------------------  larry | \x479d5f5b2834ea4ee06c545965a828e0933365f3b35ad7d8bd93bdc996636627 (1 row)即使nick列被设置为larry而查询是Larry,SELECT语句也将只返回一个元组。使用了CITEXT类型后,PG的自带函数将以不敏感的方式匹配,例如regexp_*, replace等。限制citext的大小写折叠行为取决于你的数据库的LC_CTYPE设置。因此它如何比较值是在数据库被创建时决定的。在 Unicode 标准定义的术语中没有真正的大小写不敏感。实际上,它的含义是,只要你对你的排序规则满意,你就应该对citext的比较满意。但是如果在你的数据库中存储有不同语言的数据,当排序规则是用于一种语言时,另一种语言的用户可能会发现他们的查询结果并不是所期待的。自PostgreSQL 9.1 其,你可以为citext列或数据值附加一个COLLATE说明。当前,在比较大小写折叠过的字符串时,citext操作符将尊重一种非默认的COLLATE说明,但是最初到小写形式的折叠是根据数据库的 LC_CTYPE设置完成的(就是说,尽管给出了COLLATE "default")。这可能在未来的发行中被改变,这样两步都能遵循输入的COLLATE说明。citext的效率不如text,因为操作符函数和 B 树比较函数必须创建数据的拷贝并且将它转换为小写形式来进行比较。不过,它比使用lower进行大小写不敏感的匹配的效率要略高。如果你在某些环境下需要以大小写敏感的方式比较数据并且在另一些环境下需要以大小写不敏感的方式比较数据,citext就帮不上什么忙。标准的答案是使用text类型并且在你需要以大小写不敏感的方式比较时手工使用lower函数。如果大小写不敏感的比较需求不频繁,这会工作得不错。如果你大部分时间需要大小写不敏感的行为,考虑将数据存储为citext并且在进行大小写敏感比较时显式地将列造型为text。不管在那种情况下,你都需要两个索引来让两种类型的搜索更快。包含citext操作符的模式必须在当前的search_path(通常是public)中。如果它不在搜索路径中,普通的大小写敏感的text操作符将会取而代之。参考:http://www.postgres.cn/docs/11/citext.html
  • [技术干货] PostgreSQL如何实现特定列脱敏
    1      需求有些情况下,有些表的特定列含有敏感数据(如用户信息表中,用户手机号),自然,我们只想让“管理员”用户看到这些敏感数据,其他用户我们希望其看到“处理后的”—— 脱敏的数据。2      实现方案介绍方案1: 使用pg匿名化插件postgresql_anonymizer;方案2: 使用视图进行脱敏;2.1      方案1: 使用pg匿名化插件postgresql_anonymizer(示例来自插件官方文档)-- 修改配置文件:   shared_preload_libraries = 'pg_stat_statements, anon'-- 1. 创建并激活插件CREATE   EXTENSION IF NOT EXISTS anon CASCADE;SELECT   anon.mask_init();-- 2.声明屏蔽的用户CREATE ROLE   skynet;COMMENT ON   ROLE skynet IS 'MASKED';-- 3.声明屏蔽规则COMMENT ON   COLUMN people.name IS 'MASKED WITH FUNCTION anon.random_last_name()';COMMENT ON   COLUMN people.phone IS 'MASKED WITH FUNCTION   anon.partial(phone,2,$$******$$,2)';-- 4. 查询屏蔽敏感信息的用户\! psql test   -U skynet -c 'SELECT * FROM people;' id    |   name   |     phone-----+----------+------------T800 |   n3xtchen | 13******112.2      方案2: 使用视图进行脱敏(示例来自本地开发环境)-- 1. 创建测试用户create user   root;create user   normal_user;-- 2. 切换到root建表 & 视图set role root;create table user_phone_number(id   int, user_name name, phone_number name);insert into   user_phone_number values(1, '张三', '12345678');insert into   user_phone_number values(1, '李四', '56781234');create or   replace view member_phone_number as    SELECT            S.id,            S.user_name,            substring(S.phone_number, 1,1) ||   '******' ||substring(S.phone_number, 8,8) as phone_number    FROM user_phone_number AS S;-- 3. 回收表的权限,授予普通用户view权限revoke all on   user_phone_number from public;grant all on   member_phone_number to normal_user;-- 4. 使用普通用户测试reset role;set role   normal_user;select * from   user_phone_number;select * from   member_phone_number;结果如下:3      优缺点比较总的来看,喜欢“偷懒”、喜欢尝鲜的话,可以使用 postgresql_anonymizer 插件;但如果追求稳定,建议使用视图来实现。4      参考1.         PostgreSQL: 匿名化(Anonymizer)工具 官网:https://labs.dalibo.com/postgresql_anonymizer2.         PostgreSQL: 匿名化(Anonymizer)工具 官方文档: https://postgresql-anonymizer.readthedocs.io/en/stable/
  • [技术干货] 什么是云数据库RDS?云数据库RDS有什么用?
    下面以华为云数据库RDS为例,来了解一下云数据库RDS是什么,云数据库RDS有什么用?云数据库RDS(ApsaraDB for RDS,简称RDS)是一种稳定可靠、可弹性伸缩的在线数据库服务。基于飞天分布式系统和全SSD盘高性能存储,支持MySQL、SQL Server、PostgreSQL和PPAS(高度兼容Oracle)引擎,默认部署主备架构且提供了容灾、备份、恢复、监控、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼!云数据库RDS的价格因市场走势而实时变动,要了解华为云数据库RDS的实时价格,请进入华为云数据库RDS详情页面(页面直达链接:9i0i.cn/huaweicloud)了解。为什么选择云数据库RDS:选择云数据库RDS,您可以快速搭建稳定可靠的数据库服务,相比自建数据库有如下优势:便宜易用,具有灵活计费、按需变配、即开即用等优点。高性能,包括参数优化、SQL优化建议等。高可用架构和多种容灾方案。高安全性,提供多种安全措施保障数据安全。在性价比、可用性、可靠性、易用性、性能等方面,云数据库RDS都有很大优势,价格相比ECS自建数据库,仅需约1/3,相比自购服务器搭建数据库,仅需约1/10。云数据库RDS都有哪些应用场景?云数据库RDS可以在数据上和华为云诸多云产品打通,实现多样化的能力扩展数据异地容灾场景:通过数据传输服务,用户可以将自建机房的数据库实时同步到公有云上任一地域的RDS实例里面。即使发生机房损毁的灾难,数据永远在华为云有一个备份。 读写分离场景:应用读取请求较高,或是需要应对短期内读取流量高峰,可在RDS for MySQL实例下挂载只读实例,每个只读实例拥有独立的链接地址,由应用端自行实现读取压力分配。多结构数据存储:在数据类型多样的应用中,可将高热存取数据存储于缓存产品,如云数据库Memcached版 、云数据库Redis版,将图片等非结构化资源存储于对象存储 OSS,而将链接等结构化数据存储于RDS,实现对业务数据高效存取,并相应降低成本投入。搜索引擎场景:针对应用数据量较大,且有较多复杂关键词搜索场景,可搭配使用开放搜索,对亿级别数据实现百毫秒内搜索。大数据计算:云数据库RDS搭配E-MapReduce,运行Hadoop、Spark分析RDS中数据,满足如日志分析、数据仓库、商业智能、机器学习、科学模拟等业务需求。
  • [技术干货] Postgres社区版本策略
    总有同事问我社区的版本计划,以及如何选择版本,今天就把这个事情说明白下。一、主版本策略Major Version(DBA习惯叫大版本):每年1个版本,且每个版本只维护5年。所以去年新出版本12,今天13,后年就是14。在10之前,版本是2位,例如,以9.2,9.5,9.6 这样的方式命名,其中9.6是最后一个。VersionCurrent minorSupportedFirst ReleaseFinal Release1212.4YesOctober 3, 2019November 14, 20241111.9YesOctober 18, 2018November 9, 20231010.14YesOctober 5, 2017November 10, 20229.69.6.19YesSeptember 29, 2016November 11, 20219.59.5.23YesJanuary 7, 2016February 11, 20219.49.4.26NoDecember 18, 2014February 13, 20209.39.3.25NoSeptember 9, 2013November 8, 20189.29.2.24NoSeptember 10, 2012November 9, 20179.19.1.24NoSeptember 12, 2011October 27, 20169.09.0.23NoSeptember 20, 2010October 8, 20158.48.4.22NoJuly 1, 2009July 24, 20148.38.3.23NoFebruary 4, 2008February 7, 20138.28.2.23NoDecember 5, 2006December 5, 20118.18.1.23NoNovember 8, 2005November 8, 20108.08.0.26NoJanuary 19, 2005October 1, 20107.47.4.30NoNovember 17, 2003October 1, 20107.37.3.21NoNovember 27, 2002November 27, 20077.27.2.8NoFebruary 4, 2002February 4, 20077.17.1.3NoApril 13, 2001April 13, 20067.07.0.3NoMay 8, 2000May 8, 20056.56.5.3NoJune 9, 1999June 9, 20046.46.4.2NoOctober 30, 1998October 30, 20036.36.3.2NoMarch 1, 1998March 1, 2003参考:https://www.postgresql.org/support/versioning/二、Minor Version (小版本策略)每个季度一个,否则这些发行版的目标日期是2月,5月,8月和11月的第二个星期四。当前即将发布的时间表是:November 12th, 2020February 11th, 2021May 13th, 2021August 12th, 2020参考:https://www.postgresql.org/developer/roadmap/三、版本选择PG的版本稳定、质量可靠,新增应用,可以放心的选择最新版本。保守点的话,就选择上一年的吧,再往前就不推荐了。
总条数:38 到第
上滑加载中