金仓数据库KingbaseES 如何查看表的创建时间

250 阅读2分钟

前言

在oracle数据库中,可以通过查看数据字典dba_objects得到表的创建时间。在KingbaseES中如何查看表的创建时间呢?KingbaseES数据库中无法通过数据字典查看有关信息,但可以通过其他方法实现。

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 sys_relation_filepath('test4');  
sys_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 sys_relation_filepath('test4');  
sys_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 sys_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;

总结:

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

第一种方法在使用cluster table后会改变表的relfilenode,进而在操作系统上查到的表的创建时间不是原始创建时间。 更多信息,参见help.kingbase.com.cn/v8/index.ht…