Flashback Query in MogDB 3.0

闪回查询可以让使用者查询到以往某个时间点上的表中的内容,这对于某些场合是非常有用处的,甚至是救命的功能。比如如果不小心误删除了表中的数据,就可以通过闪回查询查到删除时间点之前的数据,这样可以直接将这些数据再恢复回来。 比如这样一个让人惋惜的场景(delete的SQL请千万不要在生产环境中运行)。 现在你有这么一张表,记录了账户姓名和账户金额。 MogDB=# select * from accounts; name | amount——+——– A   |   100 B   |   100 C   |   100 D   |     99(4 rows) 你本来想执行一条SQL,去删除金额等于99元的账户信息。正常执行的话,应该删除1条记录。为了演示效果,先用select来代替delete。 MogDB=# select * from accounts where amount=99; name | amount——+——– D   |     99(1 row) 但是在键盘上减号“-”和等号“=”紧挨着,你的手指太胖了,误按到了减号,所以现在你给数据库发出去的命令是这样的。 delete from accounts…

How to find the corresponding session in MogDB/openGauss from OS thread ID

诊断需求 当MogDB数据库由于某种原因占用了较大的系统负载,比如CPU占用接近100%,那么如何知道到底是数据库里的哪个会话或者哪些会话占用了资源?在Oracle数据库中,这样的问题诊断,通常都会关联 v$session, v$process, 以及操作系统top命令或者ps命令中查到的操作系统进程ID。但是MogDB本身是线程模型,在操作系统上只能看到一个进程号,那么该如何定位问题? 因为MogDB使用的是线程模型,与PostgreSQL的进程模型不同,在操作系统级别如果用lsof命令查看网络端口的接入,虽然是会看到有多个用户会话接入,但是在PID列只会显示进程ID,无法对应到线程。 如何获取线程ID 可以使用htop,打开htop界面以后,按F5进行进程树形显示,第一个PID是进程号,而树形结构下的每一行的PID都是该进程中对应的线程号。 也可以直接使用ps命令。-L参数表示显示线程,-o参数可以指定显示感兴趣的列。 comm列中显示为woker的都是用户会话的数据库端后台进程,通常占用CPU较高的会是用户会话,因此可以用grep命令来过滤只显示用户会话。 如何将操作系统线程ID跟数据库会话对应 假设在这台服务器上,线程ID=18372的线程占用了大量CPU。 在MogDB里查询pg_os_threads视图,可以获得该线程在数据库中对应的会话ID 。 pg_os_threads视图里记录了轻量级线程号和会话ID的关系,其中lwpid是操作系统线程ID,pid列是数据库会话ID。具体信息可以参考MogDB文档-PG_OS_THREADS。如果具备monadmin权限,也可以查询dbe_perf模式下的os_threads视图,信息是一样的。 找到数据库会话ID之后,就可以为所欲为了,比如可以查询dbe_perf.session_stat_activity视图来获取该会话的应用名,发起的客户端IP地址,还有该会话正在执行的SQL。 也可以查询dbe_perf.thread_wait_status视图来获取会话的当前等待事件。BTW,实际上该视图中有lwtid字段,可以直接对应到线程ID。

How to create a PowerShell alias to connect MogDB

MogDB是云和恩墨发布的基于开源数据库openGauss的企业级发行版。在连接串方面兼容标准的PostgreSQL连接方式,而pgcli是连接PostgreSQL的一个优秀客户端程序。本文描述如何在Windows系统的Powershell中设置alias,来简便地连接到MogDB数据库。 pgcli的安装不再赘述,可以参考pgcli网站中描述的安装方法,比较简单。 使用pgcli连接数据库,并且同时把密码也放在连接串中完成一条命令就直接登录数据库,例子如下: 其中每个部分的含义如下: postgres://是标准的数据库类型提示符,不需要变更; amjith是连接数据库的用户名,passw0rd是用户密码; example.com是数据库所在的服务器hostname,可以直接使用IP地址来替换; 5432是数据库监听的端口; app_db是需要连接的数据库名称。 需要注意的一点是,如果在密码中存在“@”这样的特殊字符,那么需要把@改写成“%40”,比如密码如果是passw0rd@123,则命令行需要写成: 接下来,我们需要设置一个更简单的alias,比如我习惯使用p1,设置完毕以后,在命令行窗口键入p1以后回车,就可以直接连接到目标数据库。 如果是macOS,我们可以直接设置.zshrc文件;如果是Linux,可以设置.bash_profile。那么在Windows操作系统中,如果使用Powershell,该如何设置? 首先,要找到Powershell的配置文件路径,当安装完Powershell之后,进入Powershell命令行。 如果没有该文件,则创建该文件,然后使用任何文本编辑器,在该文件中加入以下行。 Function pgcli_mogdb1 {pgcli –prompt “\u@\d> ” postgres://amjith:passw0rd%40123@example.com:5432/app_db} Set-Alias -Name p1 -Value pgcli_mogdb1 因为Set-Alias命令的限制,一整条pgcli命令算是复杂命令,需要先写入到一个function中,然后再调用该function。 最后的效果如下: