KingbaseES 如何查看表的创建时间

前言

在oracle数据库中,我们可以查看数据字典dba_objects得到表的创建时间。
在Kingbase数据库中如何查看表的创建时间呢,可以通过以下方法实现。

1、通过查找表和数据库的物理文件方式

TEST=# create table test4 (id int primary key);
CREATE TABLE
TEST=#
TEST=# select now();
now
\-------------------------------
2023-03-09 11:07:52.575930+08
(1 row)

insert into test4 select generate_series(1,1000);

TEST=# \dt+ test4;
List of relations
Schema | Name | Type | Owner | Size | Description
--------+-------+-------+--------+-------+-------------
public | test4 | table | system | 64 kB |
(1 row)

TEST=# \d test4
Table "public.test4"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
id | integer | | not null |
Indexes:
"test4_pkey" PRIMARY KEY, btree (id)

查看表的物理文件位置

TEST=# select pg_relation_filepath('test4');
pg_relation_filepath
\----------------------
base/12145/41214
(1 row)

表test4的创建时间为11:08

[kingbase7@localhost 12145]$ ll 41214
-rw------- 1 kingbase7 kingbase7 40960 Mar 9 11:08 41214

如果表上的relfilenode发生改变,那么我们查看到的表文件创建时间就不准确
例如:

TEST=# cluster verbose test4 using test4_pkey;
INFO: clustering "public.test4" using index scan on "test4_pkey"
INFO: "test4": found 0 removable, 1000 nonremovable row versions in 5 pages
DETAIL: 0 dead row versions cannot be removed yet.
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.
CLUSTER

再查看表的relfilenode改变了,文件的创建时间也变为最新的,这是因为cluster命令根据索引重新组织了表

TEST=# select pg_relation_filepath('test4');
pg_relation_filepath
\----------------------
base/12145/41234
(1 row)

kingbase7@localhost 12145]$ ll 41234
-rw------- 1 kingbase7 kingbase7 40960 Mar 9 11:23 41234

但是通常的alter table 操作不会有表的relfilenode改变这个问题,例如

ALTER TABLE test4 add COLUMN word text;
ALTER TABLE test4 add CHECK (word <> '');
ALTER TABLE test4 rename to test2

查看数据库创建时间

TEST=# create database test_ty;
CREATE DATABASE
TEST=# select now();
now
\-------------------------------
2023-03-08 17:02:15.615326+08
(1 row)

查看数据库oid

TEST=# select oid,datname,dattablespace from pg_database where datname='test_ty';
oid | datname | dattablespace
-------+---------+---------------
41213 | test_ty | 1663
(1 row)

操作系统查看数据库oid 41213创建时间为17:02

[kingbase7@localhost base]$ ll
drwx------ 2 kingbase7 kingbase7 8192 Mar 8 17:02 41213

实际测试以下语法均不会改变数据库的oid,也就是系统查看的数据库最初创建时间不会变

ALTER DATABASE name RENAME TO new_name;
ALTER DATABASE test_ty owner TO u1;
ALTER DATABASE test_ty RESET ALL;

2、通过数据库日志查看表,数据库的创建时间。

在配置文件KINGBASE.CONF中加入 log_statement = 'ddl' # none, ddl, mod, all

创建表

TEST=# select now();
now
\-------------------------------
2023-03-09 11:31:03.686769+08
(1 row)

TEST=# create table test_bak as select * from test4;
SELECT 1000

创建数据库

TEST=# select now();
now
\-------------------------------
2023-03-09 11:32:42.028259+08
(1 row)

TEST=# create database test_tx;
CREATE DATABASE

查看数据库日志记录创建时间

2023-03-09 11:31:04.312 CST [19483] LOG: statement: create table test_bak as select * from test4;
2023-03-09 11:32:42.772 CST [19483] LOG: statement: create database test_tx;

3、从数据库系统表中获取表的创建时间

test=# select o.* from _obj o join  sys_class s on o.objectoid=s.oid and s.relname='members';
 objectoid | objectkind | creator | createdxid | changedxid |           createdts           |           changedts           | createdcsn  | changedcsn
| fbqlimited | minfbqxid |           minfbqts            |  minfbqcsn
-----------+------------+---------+------------+------------+-------------------------------+-------------------------------+-------------+-------------
+------------+-----------+-------------------------------+-------------
     24576 | p          |      10 |       1046 |       1046 | 2023-11-10 14:47:03.590996+08 | 2023-11-10 14:47:03.590996+08 | 65536000000 | 65536000000
| f          |      1046 | 2023-11-10 14:47:03.590996+08 | 65536000000
(1 row)

总结:

以上方法可以查看数据库和表的创建时间,建议使用第三种方法,避免第二种方法频繁的ddl引起日志大小增加。

第一种方法在使用cluster table后会改变表的relfilenode,进而在操作系统上查到的表的创建时间不是原始创建时间。

posted @ 2023-06-06 15:31  KINGBASE研究院  阅读(133)  评论(0编辑  收藏  举报