如何修复损坏的数据库 PostgreSQL?

在PostgreSQL有可能因为硬件(磁盘控制器或某些内存)或bug等未知原因,导致数据文件的page corrupted损坏,只限于少数页面,有没有办法从部分损坏的 Postgres DB 中恢复数据?
psql: FATAL: could not read block 0 in file “base/xxxx/xxxx”: read only 0 of 8192 bytes.

ERROR: invalid page in block xxxxxx of relation base/xxxx/xxxx

,

聊聊Oceanbase的悬挂事务

在OceanBase数据库中, 数据库事务分为普通事务和分布式事务。长事务和悬挂事务会导致资源长时间不释放,等待会话长时间被阻塞,“悬挂事务”通常指的是那些未能正常结束的事务,即事务既没有被成功提交(COMMIT),也没有被回滚(ROLLBACK),如同oracle数据库中的dba_2pc_pending两阶段的分布式事务。 这类事务处于未完成状态,可能会占用数据库资源,并对后续的事务处理产生影响。需要重点关注这类异常的事务。

,

Oceanbase 存储空间使用率高统计分析方法

在Oceanbase数据库日常运维中,像oracle一样数据库的存储空间当到在上限时会在日志或ocp中提示预警,可能磁盘空间物理大小限制或DB参数限制, 分析空间不足的原因在分布式数据库OCEANBASE中相比ORACLE要复杂一些, 如何查看当前的使用大小? 是哪一类文件占用较大? 如果是temp文件是DDL 还是SQL 查询产生的? 有没有可能temp文件泄露没有释放?如何定位temp使用高? 本篇仅记录一些方法

,

在PostgreSQL中主键使用 UUIDs vs. bigserial

在关系型数据库中做为主键使用UUID还是整数序列是一直有人讨论的话题,在oracle、Postgresq、MySQL、Sql Server(GUID) 都有类似的对象, 那应该使用整数( serials, sequences)还是 UUID 作为主键?在大数据集时性能上存在一些差异,同时还有一些安全因素。

,

坑: openGauss/GaussDB CM管理文件系统使用率超过85% 进入事务只读

最近,一位使用 openGauss 数据库的客户遇到了一个突发情况:应用程序突然无法处理事务,并在应用日志中报错: ERROR: cannot execute CREATE TABLE in a read-only transaction, 经过分析,发现这是由于数据库的 CM(Cluster Manager)集群管理软件触发了某种保护机制所致。这种情况令人费解,在 Oracle 数据库中即使文件存储空间耗尽也仅在alert log中打印错误信息,或有些OS资源使用高在RAC时会在LMHB日志中提示, 而不是直接将业务置为只读模式,从而广泛影响应用。

,

Migrate oracle to openGauss/oceanbase/达梦/kingbase: md5 function

在十年前简单测试过oracle 9i 的加密解密用法之dbms_obfuscation_toolkit(二),其中有md5单向加密, 最近在oracle迁移到opengauss项目中用到了md5, 这里简单记录替换方案,在pg或og中直接就有md5 function. 在mysql及Mysql系的产品和ocenabse, 达梦一样存在该函数md5。

openGauss ERROR: current user does not have privilege to role XXX 解决方案

在openGauss 数据库中如果存在多个用户如A和B, 希望B用户可以在用户A的同名schema下创建table对象,需要授权给用户B,在oracle中如create any table的系统权限或者是user Proxy 高级用法,在我之前的笔记Oracle 23c 几个开发相关新特性中,在oracle 23c 才引入grant xx ON SCHEMA xx to xx的语法,就是这样的功能在openGauss中有不同的用法。今天在一个项目遇到了这个问题,下面演示一下这个情况。

Migrate oracle to openGauss: dbms_crypto.encrypt /decrypt functions

在oracle迁移opengauss数据库时,可能会遇到在oracle数据库中使用dbms_crypto 加密的数据 ,在目标数据库opengauss有时也不需要完全等同,仅实现加密功能即可,需要我们改写对应的存储过程,或自定义包装function, 也需要合理规划数据迁移的一些方法,比如需要先解密,在目标库重新加密,尤其是加密方法不同,避免迁移源加密数据到目标库后无法解密,当然如果应用层能实现加密功能那是极好的

Migrate oracle to openGauss: cast_to_raw/cast_to_varchar2 & base64_encode/base64_decode functions

我和我们的团队最近在迁移oracle到openGauss(postgresql)时现在有一些存储过程中使用了加密函数,其中有一些涉及到编码的package 如utl_i18、utl_raw、utl_encode,对一些明文数值进行raw或base64编码,这里记录一下oracle到opengauss后对应的函数实现, 基本也适用于postgresql,下一篇会记录加密函数。

,

Oracle迁移openGauss/PostgreSQL注意事项:java代码中的setDouble、setFloat会导致全表扫描

近几年XC的快速推荐,我和我的团队一直在努力做从 Oracle 迁移到国产数据库的工作, 其中国产数据库像基于postgreSQL的kingbase/highgo等,还是opengauss等下游发行版产品,因为得于pg的优化器或对oracle的兼容性,在传统企业也广泛应用,企业应用程序像java开发的颇多,而java代码中对于数字的变量赋值的数据类型有多种,在postgresql/openGauss系的数据库与oracle存在差异,可能会导致PostgreSQL JDBC 驱动程序不像 Oracle JDBC 驱动程序那样转换该数据类型。数据类型不匹配的结果最终在 PostgreSQL系中是全表扫描,而不像oracle中的使用索引,导致SQL性能变差,下面做个演示

,

Kingbase( PostgreSQL) 使用 “ON CONFLICT” /Merge 减少vacuum死元组量

我们的一位客户的计费系统大量依赖于Oracle数据库的主键(PK)进行去重操作,且其事务频率极高。基于ORA-1报错的编程习惯,这种业务逻辑在Oracle环境下虽然运作尚可,但并不理想。近年来,我一直从事Oracle数据库迁移到国产数据库的咨询、评估及实施工作。在此过程中,我习惯考虑各种场景,这就像在使用一些老品牌的汽车时,虽然耐用性强,但如果换成国产汽车,可能就会遇到不同的问题。若前期考虑不周,类似的场景切换到国产数据库后,可能会出现意想不到的困难。

,

v$active_session_history slow, 如何查询v$fixed_view_definition中的全文本?

最近一个客户oracle数据库中大量的活动会话在查询v$active_session_history, 原因是一个监控软件的刷新ASH数据,但是该SQL正常也都是秒回,该数据库一次查询近6分钟,好奇要分析一下这个案例,但因为客户环境无法远程,所以无分析过程,这里记录我的分析思路,同时在分析v$active_session_history 发现取完整的SQL定义并不是很容易,记录oradebug peek , objdump, gdb等方式读取内存中FIXED VIEW定义的方法。

,

MySQL Estimate of the duration of a rollback operation(估算rollback事务回滚剩余时间)

很久以前记录过一篇 Oracle Estimate of the duration of a rollback operation (估算rollback事务回滚剩余时间) ,oracle的大事务cancel或kill后的回滚操作,rollback所花费的时间通常比原来的操作还要长,而且在回滚完成前有可能会堵塞其它事务,在PostgreSQL中因为没有使用undo而是多版本,所以忽略rollback的时间,这是PG的强项,但是在MySQL中和oracle一样同样存在回滚问题,这里简单记录如何估算MySQL中的事务回滚时间。

,

openGauss Connecting to database FATAL : no pg_hba.conf entry for host”x.x.x.x”, user”xxx”, database”postgres”, SSL off

一个客户应用原来直接使用opengauss 驱动连接正常,但是出于加密的应用需求,外包了一层增加了应用驱动,在连接串不变前提下,连接数据库报错:
Error Connecting to database FATAL : no pg_hba.conf entry for host”x.x.x.x”, user”weejar”, database”postgres”, SSL off

Troubleshooting Oracle RAC hang due to DBreplay capture write wcr file on NFS

我之前写过一篇关于的文章。在将 Oracle 迁移到国产数据库的过程中,为了进行负载重演,一些国产数据库需要在 Oracle 源库上进行 DBReplay 的 capture。然而,这种操作对源生产环境会带来一定风险,不仅有 license 商务风险,还存在可用性风险,比如空间或性能问题。在之前的文档中,我建议将 capture 产生的 WCR rec 文件存储在高吞吐量且稳定的文件系统设备上。然而还是因为没有足够的重视wcr文件存储,最近还是因为 WCR 文件存放在NFS写入问题,导致了源数据库的全库 hang 死等重大故障。这里简单记录一下这个事件。

, , ,

“ERROR: cannot alter type of a column used by a view or rule” openGauss(MogDB)已支持

IEW dependencies in Oracle、MySQL、PostGreSQL(数据库比较系列十一)之前一文记录了postgresql对于table上创建了view以后,修改表列长度时会报错””ERROR: cannot alter type of a column used by a view or rule””, 最近一套就应用需要开启加密功能,大量的表字段需要增加长度,但又有大量的view, 如果view全删修改后再创建确实不少的工作量,基于postgresql的opengauss新开源分支的部分发型版已经支持了该修改,这里是指mogdb,另一个流行商业版vb还存在一些缺陷。这里演示mogdb V5该功能支持

Oracle 19c RAC(19.11) ‘crsctl stop crs’ without -f Terminated Database Another node Instances, and more about Flex ASM

最近,在对一套Oracle 19c RAC(Real Application Clusters)进行计划内的维护操作时,遇到了一个预料之外的问题。原本打算通过一个常规的滚动停实例操作来维护其中一个节点,即通过执行 crsctl stop crs 命令来停止节点1的实例。然而,在执行此命令后,意外地发现节点2的实例也随之自动终止了。这一情况发生在Oracle 19.11版本中,如果此类问题频发,无疑会对未来的维护操作带来不确定性。

在去年《Troubleshooting Oracle RAC node OS shutdown (‘crsctl stop crs -f’) cause db instance stop on another node》我们也曾遇到过类似的问题,当时使用的版本是19.10。

,

Troubleshooting Oracle 12c/19c logon and DML fail with ORA-00604 &ORA-00904: “DECL_OBJ#”: invalid identifier

最近在Oracle 12C环境中,一个用户在尝试登录备用数据库(standby)时失败。在修复主数据库(primary db)并执行datapatch之后,发现大量包(package)失效,导致正常业务运行也出现错误。特别是在递归调用一个触发器(trigger)时,出现了错误:ORA-00904: “DECL_OBJ#”。此外,尝试禁用或删除该触发器时也失败。这是一个需要重点记录的问题。

, ,

Troubleshooting Oracle 19c real-time statistics row cache lock(dc_realtime_tabst)

Recently, a customer’s Oracle database encountered a performance problem, waiting for “row cache lock”. Analysis showed that the cache# p1 value pointed to the dc_realtime_tabst 。

, ,

How to fixed Oracle RAC Apache Tomcat CVE-2024-21733 issue?

Starting from 12.2.0.1 Grid infrastructure home does have tomcat installed on the GI_HOME. A security scan may find Tomcat security vulnerability CVE-2024-21733 in your Oracle RAC environment. How do I fix it ?