• [问题求助] 高斯数据库 Blob对流不支持问题
    Error  column "job_data " is of type blob but expression is of type bytea.   在做oracle转高斯的时候出现的错误,使用的是springboot框架 ,做定时任务时候出现的错误。blob字段保存上的数据有问题,迁移过去的数据全部被转换成了varchar类型,不能正常读取文件流以及byte类型。
  • [运维管理] Datanode主备不同步或者断连
    周末集群出现大批量告警Datanode主备不同步或者断连,最后导致集群状态失衡,查询后发现集群状态失衡,但是DN主备没有切换,什么原因造成的?查询后发现集群状态失衡,但是DN主备没有切换。
  • [技术干货] OpenGauss中创建唯一索引和创建唯一约束的区别
    今天一个一起搬砖的兄弟同事过来问,为什么他的索引删不掉?我过去看了下:执行脚本:drop index constraint_unique报错如下:执行时出错 确认要继续执行吗? 单击“详细信息”了解详情。   SQL错误码: = 2BP01 ERROR: cannot drop index constraint_unique because constraint constraint_unique on table t1 requires it   Hint: You can drop constraint constraint_unique on table t1 instead.  行号: 19 报错大意是:不能删除索引constraint_unique因为约束constraint_unique在表t1上引用了它。暗示:你可以删除约束constraint_unique在表t1上来代替它。于是我执行drop constraint的语句,删除成功。alter table t1 drop CONSTRAINT  constraint_unique;究其原因,该索引并不是通过create index直接创建的,而是在创建唯一约束的时候顺带创建的。实验发现,OpenGauss在创建唯一约束的时候,同时会创建一个唯一索引,当然在删除唯一约束的同时,也会删除掉创建唯一约束时附带创建的唯一索引;但是在创建唯一索引的时候,并不会同时显式创建一个唯一约束。通过创建索引直接创建的索引,好像有点绕咔咔咔,则可以直接通过drop index的方式删除。再对比下创建唯一索引和唯一约束后,在插入重复数据时的区别:1. 唯一索引:插入重复数据时报错,插入时也报唯一约束冲突(有点奇怪)ERROR: duplicate key value violates unique constraint "idx_unique"   Detail: Key (c1)=(1) already exists.2. 唯一约束:ERROR: duplicate key value violates unique constraint "constraint_unique"   Detail: Key (c1)=(1) already exists.那么约束是否存在呢?我对于增加唯一约束的场景,尝试执行 drop constraint的操作,系统会报错constraint不存在,这说明确实没有创建约束,但还是报唯一约束冲突,有点困惑。执行时出错 确认要继续执行吗? 单击“详细信息”了解详情。   SQL错误码: = 42704 ERROR: constraint "idx_unique" of relation "test" does not exist  行号: 2 请高手方家指正!
  • [Sql迁移] GaussDB 列转行不能用pivot,那该用什么
    列转行,我现在只发现如下两个能用1.  string_to_arraySELECT string_to_array('1,2,3,4,5', ',')2.listaggselect name,string_to_array(listagg(score,',') within group (order by subject), ',') from student group by 1但是像其他数据库的pivot并不能用,求教这个函数应该用什么语法来代替
  • [问题求助] 【香港启德项目】Roma平台接口查询结果显示能否按照脚本中的别命名显示
    1.Roma平台接口查询结果显示能否按照脚本中的别命名显示,不要统一转成小写王斌国/18629429514/wangbinguo@chinasoftinc.com
  • [产品公告] 云数据库GaussDB 混合云部署模式新增可叠加付费特性包公告
    尊敬的华为云客户:首先非常感谢大家对GaussDB数据库的支持与厚爱!为了强化云数据库GaussDB场景化能力,进一步贴近行业,华为云计划对云数据库GaussDB混合云部署模式新增可叠加付费特性包,不同行业的客户可按照行业差异化场景选择叠加特性。具体可叠加的特性包内容如下:序号特性包名称价值1物理灰度升级金融、银行业对数据的安全有着较高的要求,当主数据中心发生故障的情况下,需要保证数据的安全性、业务的连续性,因此需要采取同城跨AZ容灾的方案。主机房灾难的情况下,备机房的数据还具备能继续提供服务的能力。本特性的目的是提供一套支持跨数据中心双集群容灾的解决方案。2多租户面向企业场景及SaaS化软件架构,GaussDB提供相应的多租户能力。支持多个租户共享一个数据库实例,租户资源可通过配置方式管控,实现租户间业务互不影响,租户规格最低可达1U。相比传统方案,可以进一步降低企业使用数据库的成本。3高级压缩高级压缩用于提升数据库存储的资源利用率,是一个全场景的压缩解决方案,包括:TP数据压缩(表、索引)、AP数据压缩、历史数据压缩、REDO/UNDO数据压缩、查询结果集压缩、LOB数据压缩、备份数据压缩等,面向不同场景,提供不同的语义压缩算法支持,相关特性还包括冷热分离、自动负载感知、多存储介质、重删等。高级压缩对业务透明,无需业务进行适配改造,用户仅需针对TP、 AP或历史数据来指定不同的策略即可。数据库会自动维护行级/页面级/表级数据温度,并针对不同温度的数据,使用不同级别语义压缩算法进行数据压缩,大幅度减少空间占用,降低存储成本。4透明数据加密透明数据加密,是数据库在将数据写入存储介质时对数据进行加密,从存储介质中读取数据时自动解密,防止攻击者绕过数据库认证机制直接读取数据文件中的数据,以解决静态数据泄露问题。该功能对于应用层几乎透明无感知,用户可根据需要决定是否启用透明数据加密功能,防止攻击者绕过数据库认证机制直接读取数据文件中的数据,通过透明数据加密功能对数据库的数据文件进行加密,保证用户必须在数据库启动后通过正常途径连接数据库,才可以读取解密后的数据,达到数据保护的目的。5防篡改对用户指定的防篡改表增加校验信息,并记录用户对其数据的操作历史,通过数据和操作历史的一致性校验来保证用户数据无法被恶意篡改。在用户对防篡改表执行DML操作时,系统对防篡改表增加少量额外的行级校验信息,同时记录操作的SQL语句和数据的变化历史。通过特性提供的校验接口,用户可以方便的校验防篡改表中的数据是否与系统记录的操作信息是否一致。账本数据库通过提供对用户数据的操作记录、数据历史变化记录以及易用的一致性的校验接口,方便用户随时校验数据库中的敏感信息是否发生恶意篡改,有效提高数据库防篡改能力。6动态数据脱敏数据脱敏是行之有效的数据库隐私保护方案之一,可以在一定程度上限制非授权用户对隐私数据的窥探。动态数据脱敏机制是一种通过定制化制定脱敏策略从而实现对隐私数据保护的一种技术,可以有效地在保留原始数据的前提下解决非授权用户对敏感信息的访问问题。当管理员指定待脱敏对象和定制数据脱敏策略后,用户所查询的数据库资源如果关联到对应的脱敏策略时,则会根据用户身份和脱敏策略进行数据脱敏,从而限制非授权用户对隐私数据的访问。数据隐私保护是数据库安全所需要具备的安全能力之一,可以在一定程度上限制非授权用户对隐私数据的访问,保证隐私数据安全。动态数据脱敏机制可以通过配置脱敏策略实现对指定数据库资源信息的隐私保护,另一方面,脱敏策略的配置也具有一定的灵活性,可以仅针对特定用户场景实现有针对性的隐私保护能力。规划中的特性包如下:序号特性包名称价值1应用无损切换对于事务来说,在异常情况下(如最常见的宕机),由于应用程序无法感知事务当前的状态,很容易发生重复提交等情况,并且由于宕机,导致数据库会话中断。透明事务能力记录当前事务的状态,在主节点出现故障的时候,该事务不会马上结束而是会暂时缓存,等待新主产生之后,将该事务转接到新主之上,并将前面的操作进行回滚,然后重新执行完整的SQL。从外部视角来看,整个主备切换过程中,应用程序只感知到一条update语句变成了慢SQL,但不会接收到连接报错或事务报错,后续应用层就不需要显式执行连接重连和事务重试。华为云会持续投入研发力量,不断提升GaussDB产品能力,丰富可叠加特性,为客户提供更好的服务。同时在数据迁移、SQL语法转换、SQL开发、流量回放等需求的客户可以选用DRS(数据复制服务)、UGO(数据库和应用迁移)、TPDSS工具和流量回放工具来支持。
  • [认证交流] 职业认证和开发者认证什么区别
    研究不明白,华为云的职业认证和开发者认证什么区别啊,哪个是比较难的、或者说含金量更高的呢
  • [技术干货] GaussDB 事务 —— 从入门到精通
    什么是事务TRANSACTION(事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。数据库事务通常包含了一个序列的对数据库的读/写操作。为什么需要事务事务存在的目的主要有两个为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。事务的执行过程当事务被提交给数据库管理系统(DBMS)后,DBMS 需要确保该事务中的所有操作都成功完成,并且其结果被永久保存在数据库中。如果事务中有操作没有成功完成,则事务中的所有操作都需要回滚,回到事务执行前的状态;同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的环境中运行(互不干扰和影响)。四大特性事务具有以下四个标准属性,通常根据首字母缩写为 ACIDAtomicity(原子性):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失特性的用途特性用途原子性并发控制,故障恢复隔离性并发控制持久性故障恢复一致性SQL的完整性约束(主键约束、外键约束)常用的并发控制技术有基于锁的并发控制和基于时间戳的并发控制,GaussDB数据库针对DDL语句采用两阶段锁技术,而针对DML语句则采用多版本控制技术(Multi-Version Concurrency Control,MVCC)。GaussDB数据库的故障恢复采用WAL日志的方式来实现,目前主要支持Redo日志,通过Redo日志和MVCC可以保证事务读写的一致性。语法讲解BEGIN: 开始一个事务,事务开始后便会一直执行下去,直到遇到 COMMIT 或 ROLLBACK 命令,不过在数据库关闭或发生错误时,事务也会自动回滚(该命令是 BEGIN TRANSACTION 命令的简写)BEGIN TRANSACTION: 开始一个事务(作用同 BEGIN 命令)COMMIT: 把事务调用的更改保存到数据库中,即事务提交(也可以使用 END TRANSACTION 命令)END TRANSACTION: 结束并提交事务ROLLBACK: 事务回滚,用于撤销尚未提交或保存到数据库的事务命令SQL实战虚拟场景例子:某人要在商店使用电子货币购买100元的东西,当中至少包括两个操作:该人账户减少 100 元商店账户增加100元支持事务的数据库管理系统就是要确保以上两个操作(整个"事务")都能完成,或一起取消,否则就会出现 100 元平白消失或出现的情况。数据准备下面创建一个简单的用户金额表CREATE TABLE PERSON_INFO ( NAME VARCHAR(32) PRIMARY KEY, MONEY INTEGER )然后向表中插入数据(假设商户和购买者的账户上各有100元)INSERT INTO PERSON_INFO (name, money) VALUES ('buyer', 100), ('shop', 100); SELECT * FROM PERSON_INFO;恢复初始值下面每个例子执行完,都要将值恢复成初始值,然后再测试下一个例子UPDATE PERSON_INFO SET money=100普通操作(正常模式)现在模拟购买过程,用户先减款50元,商户再加款50元UPDATE PERSON_INFO SET money = money-50 WHERE name IN (SELECT name FROM PERSON_INFO WHERE name = 'buyer'); UPDATE PERSON_INFO SET money = money+50 WHERE name IN (SELECT name FROM PERSON_INFO WHERE name = 'shop'); SELECT * FROM PERSON_INFO;普通操作(异常模式)用户先减款50元,商户发现是假币,终止了后续交易UPDATE PERSON_INFO SET money = money-50 WHERE name IN (SELECT name FROM PERSON_INFO WHERE name = 'buyer'); -- 发现是假币 这里直接报错,不让它继续执行即可 UPDATE PERSON_INFO SET money = money+50 WHERE name IN (SELECT name FROM PERSON_INFO WHERE name = 'shop'); SELECT * FROM PERSON_INFO;DAS会提示你SQL执行过程中遇到错误,是否继续执行。我们这里为了模拟真实场景,选择“终止执行”接着使用 SELECT * FROM PERSON_INFO 查询结果,可以发现顾客已经扣款,但商户没扣款,这里莫名其妙的顾客钱少了50(这里只是商家觉得是假币,但实际不一定是假币,有可能是真币,只是破了点脏了点)因此,如果没有事务,一旦SQL语句中间出现异常,整个账户系统的收支就不平衡了事务回滚下面,我们使用数据库事务,再来模拟一遍整个流程(注意:不要忘记执行UPDATE语句,将金额还原为初始值)BEGIN TRANSACTION; UPDATE PERSON_INFO SET money = money-50 WHERE name IN (SELECT name FROM PERSON_INFO WHERE name = 'buyer'); -- 发现是假币 这里直接报错,不让它继续执行即可 UPDATE PERSON_INFO SET money = money+50 WHERE name IN (SELECT name FROM PERSON_INFO WHERE name = 'shop'); END TRANSACTION; SELECT * FROM PERSON_INFO;这里同样遇到错误,我们还是跟之前一样,终止执行然后查询时报错了:ERROR: current transaction is aborted, commands ignored until end of transaction block意思是:当前事务被终止, 命令被忽略,直到事务结束原因:如果同一事务中如果某次数据库操作出错了,那么当前事务中这个操作以后的所有命令都将出错。这里由于出现错误,我们不能继续用 END TRANSACTION 对事务进行提交,只能使用回滚命令返回事务前的状态。但是GassDB很奇怪的一点是,使用Rollback并不能执行回滚,让报错消失。只能通过关闭DAS,隔一段时间再打开的方式来解决,个人觉得,这应该是个BUG!另外,自动回滚的设置方法,在华为GaussDB官方文档中有提及,官网文档地址如下cid:link_0有两个重要的参数变量设置方法说明ON_ERROR_ROLLBACK\set ON_ERROR_ROLLBACK on | interactive | off如果是on,当一个事务块里的语句产生错误的时候,这个错误将被忽略而事务继续。如果是interactive,这样的错误只是在交互的会话里忽略。如果是off(缺省),事务块里一个语句生成的错误将会回滚整个事务。on_error_rollback-on模式是通过在一个事务块的每个命令前隐含地发出一个SAVEPOINT的方式工作的,在发生错误的时候回滚到该事务块。ON_ERROR_STOP\set ON_ERROR_STOP on | offon:命令执行错误时会立即停止,在交互模式下,gsql会立即返回已执行命令的结果。off(缺省):命令执行错误时将会跳过错误继续执行。注意:设置只能以命令行的方式进行设置,DAS虽然在内网访问,但由于其使用的是HTTP的连接方式,因此无法使用命令行设置上述参数
  • [技术干货] 【FAQ合集贴】GaussDB "常见问题" 及 "解决方案"(内容持续更新中......)
    1. 连接 GaussDB 数据库建议使用什么工具开源免费的DBMS,可以考虑 DBeaver破解收费版的,可以考虑 Navicatdata studio连高斯可能会存在报文异常导致连接无法中断的问题,不建议用(2023-02-24)如果是网页版的,直接用华为云DAS即可(https://www.huaweicloud.com/product/das.html)2. GaussDB的支持哪些hint可以参考开发者指南:分布式:cid:link_0主备版:cid:link_13. 数据库存入空字符串会全部被转成NULL,这个能控制不转吗不能。目前默认都是Oracle兼容性,没有单独的参数开关4. GaussDB create sequence有if not exists 的类似写法吗目前没有。create sequence 的语法格式如下CREATE [LARGE] SEQUENCE name [INCREMENT [ BY ] increment ] [ MINVALUE minvalue | NO MINVALUE | NOMINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE | NOMAXVALUE ] [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE | NOCYCLE ] [ OWNED BY { table_name.column_name | NONE } ];5. GaussDB中的varchar(n)数据类型中的n是字符还是字节?存汉字的时候报错长度过长VARCHAR(n),变长字符串。PG兼容模式下,n是字符长度。其他兼容模式下,n是指字节长度。要存1个汉字用nvarchar2(1)。NVARCHAR2(n)变长字符串。n是指字符长度。6. GausssDB有select * from DBA_INDEXS这样的视图吗可以使用 select * from pg_indexes。GaussDB大部分都是PgSQL的源码,所以有问题不懂,直接查PG的语法即可7. "cache lookup failed for type XXX"报错什么原因自定义类型失败了,需要重新创建8. GaussDB中文排序使用order by好像是不准确的,应该怎么解决用 nlssort(string text, sort_method text)描述:以 sort_method 指定的排序方式返回字符串在该排序模式下的编码值,该编码可用于排序,其决定了string在这种排序模式下的先后位置。目前支持的sort_method为nls_sort=schinese_pinyin_m和nls_sort=generic_m_ci。其中,nls_sort=generic_m_ci仅支持纯英文不区分大小写排序示例:SELECT nlssort('A', 'nls_sort=chinese_pinyin_m');SELECT nlssort('A', 'nls_sort=generic_m_ci');参考SQL:SELECT * FROM <表> ORDER BY NLSSORT(<待排序的列>, 'NLS_SORT = SCHINESE_PINYIN_M');9. 高斯数据库建表的ddl,如果有分区的话为什么看不到了可以使用select pg_get_tabledef(<表名>)语句查看,如果使用DBeaver视图上是看不到的10. 通过sys.db_tables查询到数据库的全量表信息,但是发现有些表的信息(行数、列数)不是当前最新的,请问有什么方法可以实现表信息定时更新吗可以使用vacuum analyze更新表的统计信息cid:link_2table_name 要统计的表的名称(可以有模式修饰)。 取值范围:要清理的表的名称。缺省时为当前数据库中的所有表。也可以尝试下面SQLuse information_schema;select sum(table_rows) from tables where TABLE_SCHEMA = "test" order by table_rows asc;11. 什么场景会触发GaussDB主备切换主机故障会触发主备切换,故障包括进程重启,磁盘故障,服务器掉电,重启,网络故障等等。升级版本时会重启进程,也会主备切换。可以通过CPU的监控指标判断是否主备切换,主备切换时, 两个节点的CPU会交叉。主机CPU一般比较高,切换时,原来的主机CPU降低,备机升主CPU升高。12. opengauss有行转列的函数吗参考unnest描述:扩大一个数组为一组行返回类型:setof anyelement示例:openGauss=# SELECT unnest(ARRAY[1,2]) AS RESULT;result--------12(2 rows)13. openGauss数据库连接串的参考样例jdbc:opengauss://${DNS1}:8000,${DNS2}:8000,${DNS3}:8000/${database}?targetServerType=master&connectTimeout=3&tcpKeepAlive=true14. GaussDB列存支持物化视图吗astore支持,ustore不支持15. 许多表预估行数为0,并且也没有自动分析,怎么解决执行analyze可以分析全库select pg_autovac_status('table_name'::regclass); 可以找一个没分析的表看下为什么没有触发自动分析16. java连接GaussDB的代码范例连接代码如下:public static void main(String[] args){ // 驱动程序名 String driver = "com.mysql.jdbc.Driver"; // URL指向要访问的数据库名scutcs String url = "jdbc:mysql://127.0.0.1:3306/scutcs"; // MySQL配置时的用户名 String user = "root"; // MySQL配置时的密码 String password = "root"; try { // 加载驱动程序 Class.forName(driver); // 连续数据库 Connection conn = DriverManager.getConnection(url, user, password); if(!conn.isClosed()) { //执行你的操作 conn.close(); } } catch(IOException e) { e.printStackTrace(); }}17. 创建索引时报file size exceeds temp_file_limit,怎么处理问题原因SQL查询生成的临时表较大,超过了系统中临时表空间上限(temp_file_limit)104857600KB = 1024102400KB = 102400MB = 1001024MB = 100GBERROR: temporary file size exceeds temp_file_limit (104857600kB)这段错误提示的意思就是:临时文件的大小超出了temp_file_limit字段所设置的大小解决方案查看当前的临时表空间上限并增加该上限1.进入你的DBMS,打开SQL控制台/SQL脚本2.使用 show temp_show_limit 查看当前实例的临时表空间上限(返回结果是以kb为单位的值,就是上面报错时提示的 104857600kB)3.使用 alter role all set temp_file_limit = [$Temp_File_Limit],增加临时表空间上限(单位为kb)4.最后使用 show temp_show_limit 确认修改结果是否生效注意: 如果需要查询的SQL语句只是临时操作,建议您在执行完SQL语句后,将临时表空间上限修改回原始值。否则可能会因为临时表空间过大致使实例磁盘满,进而被锁定。具体还是要根据当前设备的硬件水平、和预估数据量来决定18. 查询JOB用什么办法查询pg_job系统表PG_JOBS系统表存储用户创建的定时任务的任务详细信息,定时任务线程定时轮询pg_jobs系统表中的时间,当任务到期会触发任务的执行。该系统表属于Shared Relation,所有创建的job记录对所有数据库可见。检查定时任务检查数据库定时任务执行情况,确保后台任务正确执行,尤其关心统计信息收集等核心任务。SQL命令如下select job,dbname,log_user,start_date,last_date,this_date,next_date,broken,status,interval,failures,what from user_jobs;查询用户的定时任务(job)信息,确保任务在期望的时间执行成功,这是dba的重要工作之一。SQL命令如下select job_id,dbname,log_user,start_date,last_satrt_date,this_run_date,next_run_date,interval,failure_count from pg_job;19. 已经改了字段类型为date,为什么查询建表语句的时候还是timestamp可以参考下这个文档:cid:link_3A兼容性下,数据库将空字符串作为NULL处理,数据类型DATE会被替换为TIMESTAMP(0) WITHOUT TIME ZONE。例如:4字节(兼容模式A下存储空间大小为8字节)创建数据库时,可通过DBCOMPATIBILITY参数指定兼容的数据库的类型,DBCOMPATIBILITY取值范围:ORA、TD、MySQL。分别表示兼容Oracle、Teradata和MySQL数据库。如果创建数据库时不指定该参数,则默认为ORA,在ORA兼容模式下,date类型会自动转换为timestamp(0)。20. Data studio打开显示同一用户不能打开多个实例官网手册上显示 Data Studio 不支持同时打开多个实例本地datastudio工作空间实例锁未删除,需要手工删除安装目录下的.lock文件(关闭datastudio后再删除,或者删除整个用户空间)21. 执行分区报错执行SQLCREATE TABLE list_list( month_code VARCHAR2 ( 30 ) NOT NULL , dept_code VARCHAR2 ( 30 ) NOT NULL , user_no VARCHAR2 ( 30 ) NOT NULL , sales_amt int)PARTITION BY LIST (month_code) SUBPARTITION BY LIST (dept_code)( PARTITION p_201901 VALUES ( '201902' ) ( SUBPARTITION p_201901_a VALUES ( '1' ), SUBPARTITION p_201901_b VALUES ( '2' ) ), PARTITION p_201902 VALUES ( '201903' ) ( SUBPARTITION p_201902_a VALUES ( '1' ), SUBPARTITION p_201902_b VALUES ( '2' ) ));报错内容SQL 错误 [0A000] ERROR: Un-support feature 详细:The distributed capability is not supported currently.原因:分布式暂时不支持二级分区22. 查询的时候偶尔会出息如下报错org.postgresql.util.PSQLException: [***:30814/***:8000] ERROR: dn_6007_6008_6009: snapshot is not owned by resource owner TopTransaction排查方向:看下pg_log/postgresql-xxx.log打印的内核堆栈原因:自动提交读取的就是快照数据,这里出问题了23. 数据API开发sql语句开启预编译后sql报错在测试api的时候发现语句:(current_date - interval '${num}' day),会因为预编译而导致执行sql出错的问题。gaussdb原语句是(current_date - interval '30' day),因为涉及到多个参数且参数类型不同尝试过cast('${num}' as int)方法不成功也尝试过使用’'两个双引号来转义也不行取消勾选预编译后语句是可以正常运行的请问是否还有其他方法可以在满足预编译的情况下成功执行这句话?答:加强制类型转换24. 如何使用java开发对openguass数据库的应用分布式参考:cid:link_4集中式参考:cid:link_525. 查询的时候报如下错误,怎么处理ERROR: canceling statement due to conflict with recoveryDetail: User query might have needed to see row versions that must be removed.Line Number: 1问题原因当备用服务器在WAL流中获取更新/删除,而且该更新/删除将使正在运行的查询当前正在访问的数据无效,在这种情况下将发生此类错误。这种错误出现的主要场景是:备用服务器有长时间运行的查询来查看主服务器上具有重要活动的表。一个示例是主服务器上的管理员在备用服务器正在查询的表上运行DROP TABLE命令。显然,如果在备用数据库上应用了DROP TABLE命令,则备用服务器上的查询无法继续。当在主服务器上运行DROP TABLE命令时,主服务器并不知道备用服务器上运行了哪些查询,因此它不会等待备用服务器上的任何此类查询。当备用服务器上的查询仍在运行时,WAL的更改记录进入备用数据库,从而导致冲突。当冲突的查询很短时,通常希望通过稍微延迟WAL应用进程来使它完成。但是WAL应用进程的长时间延迟通常是不可取的。因此,取消机制具有max_standby_archive_delay和max_standby_streaming_delay参数,它们定义WAL应用进程中允许的最大延迟。一旦超过max_standby_archive_delay或max_standby_streaming_delay指定的延迟,冲突的查询将被取消。这通常会导致取消错误。备用服务器上的查询和WAL重放之间冲突的最常见原因是“早期清理”。通常,PostgreSQL允许在没有需要查看它们的事务时清除旧的行版本,以确保根据MVCC规则可以正确地查看数据。但是此规则只能应用于在主服务器上执行的事务。因此,主服务器上的清理可能会删除备用数据库上的事务仍然可见的行版本。解决方案有以下两种方案可以避免这种查询取消的情况:在备用数据库上设置hot_standby_feedback=on,它将传递信息给主数据库,表示仍然需要表中的特定行,这可以防止VACUUM操作删除最近的死行,因此不会发生清除冲突。它允许备用服务器上的查询能够可靠地完成,但是将导致主服务器上的膨胀现象,当备用服务器上的查询长时间不结束时,此膨胀现象尤为明显。提高max_standby_archive_delay或者max_standby_streaming_delay参数,它允许备用服务器特意增加复制延迟以允许查询的完成。如果备用服务器会频繁的连接和断开连接,您可能需要进行调整以处理hot_standby_feedback未提供反馈的时间段。例如,可以考虑增加max_standby_archive_delay,因此在断开连接期间WAL归档文件中的冲突不会迅速的将查询取消。您还应该考虑增加max_standby_streaming_delay以避免重新连接后新收到的流式WAL条目的快速取消。但如果将它们的值设置的过大(例如1小时),主服务器和备用服务器的状态可能会出现不一致的情况。当备用服务器在WAL流中获取更新/删除,而且该更新/删除将使正在运行的查询当前正在访问的数据无效,在这种情况下将发生此类错误。这种错误出现的主要场景是:备用服务器有长时间运行的查询来查看主服务器上具有重要活动的表。一个示例是主服务器上的管理员在备用服务器正在查询的表上运行DROP TABLE命令。显然,如果在备用数据库上应用了DROP TABLE命令,则备用服务器上的查询无法继续。当在主服务器上运行DROP TABLE命令时,主服务器并不知道备用服务器上运行了哪些查询,因此它不会等待备用服务器上的任何此类查询。当备用服务器上的查询仍在运行时,WAL的更改记录进入备用数据库,从而导致冲突。当冲突的查询很短时,通常希望通过稍微延迟WAL应用进程来使它完成。但是WAL应用进程的长时间延迟通常是不可取的。因此,取消机制具有max_standby_archive_delay和max_standby_streaming_delay参数,它们定义WAL应用进程中允许的最大延迟。一旦超过max_standby_archive_delay或max_standby_streaming_delay指定的延迟,冲突的查询将被取消。这通常会导致取消错误。备用服务器上的查询和WAL重放之间冲突的最常见原因是“早期清理”。通常,PostgreSQL允许在没有需要查看它们的事务时清除旧的行版本,以确保根据MVCC规则可以正确地查看数据。但是此规则只能应用于在主服务器上执行的事务。因此,主服务器上的清理可能会删除备用数据库上的事务仍然可见的行版本。解决方案有以下两种方案可以避免这种查询取消的情况:在备用数据库上设置hot_standby_feedback=on,它将传递信息给主数据库,表示仍然需要表中的特定行,这可以防止VACUUM操作删除最近的死行,因此不会发生清除冲突。它允许备用服务器上的查询能够可靠地完成,但是将导致主服务器上的膨胀现象,当备用服务器上的查询长时间不结束时,此膨胀现象尤为明显。提高max_standby_archive_delay或者max_standby_streaming_delay参数,它允许备用服务器特意增加复制延迟以允许查询的完成。如果备用服务器会频繁的连接和断开连接,您可能需要进行调整以处理hot_standby_feedback未提供反馈的时间段。例如,可以考虑增加max_standby_archive_delay,因此在断开连接期间WAL归档文件中的冲突不会迅速的将查询取消。您还应该考虑增加max_standby_streaming_delay以避免重新连接后新收到的流式WAL条目的快速取消。但如果将它们的值设置的过大(例如1小时),主服务器和备用服务器的状态可能会出现不一致的情况。26. GaussDB怎么查询分区表的索引信息1.pg_partition里有2.或者用pg_get_tabledef查表定义,包含索引创建语句3.或者查询PG_INDEXES视图示例:分区表上的索引分为:本地(局部)索引(local index) 和 全局索引(global index)SELECT n.nspname AS schemaname, --schema名称 c1.relname AS tablename, -- 表名 c2.relname AS indexname, -- 索引名称 s.conname AS conname, -- 约束名称 pg_get_constraintdef(s.oid) AS constraintdef, -- 如果是约束,输出约束定义 CASE WHEN s.conname IS NULL THEN pg_get_indexdef(x.indexrelid) END AS indexdef -- 如果不是约束,输出索引定义FROM pg_index xINNER JOIN pg_class c1 ON c1.oid = x.indrelidINNER JOIN pg_class c2 ON c2.oid = x.indexrelidINNER JOIN pg_namespace n ON n.oid = c1.relnamespaceLEFT JOIN pg_constraint s ON s.conrelid = x.indrelid AND s.conindid = x.indexrelidWHERE (x.indisprimary = true OR x.indisunique = true)AND c1.relkind = 'r'AND x.indrelid >= 16384 AND x.indexrelid > 16384AND (c1.reloptions IS NULL OR c1.reloptions::text not like '%internal_mask%') -- 排除内置对象ORDER BY schemaname, tablename, indexname27. 自定义的函数,存储过程存在后台哪个目录?误删的数据怎么找回?试下闪回功能openGauss=# SELECT * FROM tpcds.time_table TIMECAPSULE TIMESTAMP to_timestamp('2021-04-25 17:50:22.311176','YYYY-MM-DD HH24:MI:SS.FF'); idx | snaptime | snapcsn | timedesc-----+----------------------------+---------+------------------------------------------------------------------------------------------------------ 1 | 2021-04-25 17:50:05.360326 | 107322 | time1 2 | 2021-04-25 17:50:10.886848 | 107324 | time2 3 | 2021-04-25 17:50:16.12921 | 107327 | time3(3 rows)参考:cid:link_628. 数据库导出的数据会默认省略整数位的0。知会省略0,例如0.11导出以后就变成 .1了,导入导致各种报错这是Oracle兼容性导致的问题。想要显示整数位的0的话,可以试下在应用里调用Java的DecimalFormat接口进行设置29. GaussDB添加索引报错ERROR: temporary file size exceeds temp_file_limit (104857600kB)添加索引要做排序,写临时文件超过了temp_file_limit的限制,可以调大一点,把索引先建上去问题原因SQL查询生成的临时表较大,超过了系统中临时表空间上限(temp_file_limit)104857600KB = 1024102400KB = 102400MB = 1001024MB = 100GBERROR: temporary file size exceeds temp_file_limit (104857600kB)这段错误提示的意思就是:临时文件的大小超出了temp_file_limit字段所设置的大小解决方案查看当前的临时表空间上限并增加该上限进入你的DBMS,打开SQL控制台/SQL脚本使用 show temp_show_limit 查看当前实例的临时表空间上限(返回结果是以kb为单位的值,就是上面报错时提示的 104857600kB)使用 alter role all set temp_file_limit = [$Temp_File_Limit] ,增加临时表空间上限(单位为kb)最后使用 show temp_show_limit 确认修改结果是否生效**注意:**如果需要查询的SQL语句只是临时操作,建议您在执行完SQL语句后,将临时表空间上限修改回原始值。否则可能会因为临时表空间过大致使实例磁盘满,进而被锁定。具体还是要根据当前设备的硬件水平、和预估数据量来决定30. GaussDB的session_timeout参数可以设为0不?我们这边场景需要一个长连接不建议维持长连接,容易导致OOM,每个会话缓存了大量的元数据和执行过的SQL及执行计划信息
  • [Sql迁移] GreenPlum数据迁移DWS代码适配
    官方有没有GreenPlum数据库迁移DWS数据库的迁移工具,手工适配SQL,函数代码这块,双方数据库的差异还是蛮大的,官方有没有什么工具或者指导文档可供参考?
  • [技术干货] 开心档之MySQL 正则表达式
    MySQL 正则表达式在前面的章节我们已经了解到MySQL可以通过 LIKE ...% 来进行模糊匹配。MySQL 同样也支持其他正则表达式的匹配, MySQL中使用 REGEXP 操作符来进行正则表达式匹配。如果您了解PHP或Perl,那么操作起来就非常简单,因为MySQL的正则表达式匹配与这些脚本的类似。下表中的正则模式可应用于 REGEXP 操作符中。模式描述^匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。$匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。.匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用像 '[.\n]' 的模式。[...]字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。[^...]负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。p1|p2|p3匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。*匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。+匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。{n}n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。{n,m}m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。实例了解以上的正则需求后,我们就可以根据自己的需求来编写带有正则表达式的SQL语句。以下我们将列出几个小实例(表名:person_tbl )来加深我们的理解:查找name字段中以'st'为开头的所有数据:mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';查找name字段中以'ok'为结尾的所有数据:mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';查找name字段中包含'mar'字符串的所有数据:mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';查找name字段中以元音字符开头或以'ok'字符串结尾的所有数据:mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';
  • [问题求助] 【GaussDB】连接高斯数据库建议使用什么工具?
    连接高斯数据库建议使用什么工具?
  • [问题求助] 【GaussDB】GaussDB的支持哪些hint?
    GaussDB的支持哪些hint?
  • [其他] 业务报错:UNION types %s and %s cannot be matched
    【问题现象】执行union语句时报错:UNION types %s and %s cannot be matched【问题原因】该报错的原因是union的分支中,相同位置的输出列格式类型不同导致【触发场景】示例:postgres=# create table t1(a int, b timestamp);CREATE TABLEpostgres=# create table t2(a int, b text);CREATE TABLEpostgres=# insert into t1 select 1, current_date;INSERT 0 1postgres=# insert into t2 select 1, current_date;INSERT 0 1postgres=# select * from t1 union select * from t2;ERROR: UNION types timestamp without time zone and text cannot be matchedLINE 1: select * from t1 union select * from t2; ^示例中,t1表和t2表在b列上类型不同,导致在union操作时出现类型不匹配的报错。应保证union各分支相同位置的输出列类型匹配。(注:t2表b列是text类型,插入的数据是current_date,在插入时发生了隐式类型转换,所以插入不报错;但是在查询时,不会自动进行隐式转换,因此会报错。)【解决方法】保证union各分支的输出列类型匹配,不满足要求时可以对输出列强制类型转化:postgres=# select a,b::text from t1 union select a,b from t2; a | b ---+--------------------- 1 | 2023-02-16 1 | 2023-02-16 00:00:00(2 rows)
  • [问题求助] 【GaussDB】数据库存入空字符串会全部被转成NULL,这个能控制不转吗?
    数据库存入空字符串会全部被转成NULL,这个能控制不转吗?
总条数:1518 到第
上滑加载中