人大金仓数据库多种索引、堆表WAL日志构造方法

43 阅读3分钟

关键字:

sys_waldump、WAL日志、索引、人大金仓

概述

在sys_waldump特性测试过程中需要构造大量不同类型的WAL日志去测试日志记录完整性,本文提供了几种索引、堆表等的WAL日志构造的SQL以及从归档WAL日志筛选所需字段的简便方法。

构造方法

benchmarksql、kast工具中含有大量sql脚本,可以通过这两种方式完成多种rmgr如heap/btree/standby/multixact类型构造,以下为摘取或者手动构造的一些sql用于参考。由于附件不支持上传.sql脚本,上传时改为.txt,执行请手动改为.sql。

B-tree索引

记录B-tree索引新建根节点

验证语句:

create table btree_tall_tbl(id int4, t text);

alter table btree_tall_tbl alter COLUMN t set storage plain;

create index btree_tall_idx on btree_tall_tbl (t, id) with (fillfactor = 10);

insert into btree_tall_tbl select g, repeat('x', 250)

from generate_series(1, 130) g;

记录B-tree索引的元数据清理操作

CREATE TABLE delete_test_table (a bigint, b bigint, c bigint, d bigint);

INSERT INTO delete_test_table SELECT i, 1, 2, 3 FROM generate_series(1,80000) i;

ALTER TABLE delete_test_table ADD PRIMARY KEY (a,b,c,d);

DELETE FROM delete_test_table WHERE a < 79990;

VACUUM delete_test_table

GIN索引

记录对GIN索引meta page所做的任何更改

create table gin_test_tbl(i int4[]) with (autovacuum_enabled = off);

create index gin_test_idx on gin_test_tbl using gin (i)

with (fastupdate = on, gin_pending_list_limit = 4096);

insert into gin_test_tbl select array[1, 2, g] from generate_series(1, 20) g;

GIN索引中删除一个List page 的行为

delete from gin_test_tbl where i @> array[2];

vacuum gin_test_tbl;

位图索引输出变更

对位图索引中LOV项的插入操作

create table test_bitmap(a int ,b text,c timestamp);

create index bitmap_idx1 on test_bitmap using bitmap(a);

对位图索引中元数据的插入操作

create table test_bitmap2(a int ,b text,c timestamp);

create index bitmap_idx2 on test_bitmap using bitmap(a);

HASH页面操作输出变更

记录哈希页面收缩操作

CREATE TABLE HASH_SPLIT (KEYCOL INT);

INSERT INTO HASH_SPLIT SELECT 1 FROM GENERATE_SERIES(1, 500) A;

CREATE INDEX HASH_SPLIT_INDEXX ON HASH_SPLIT USING HASH (KEYCOL);

INSERT INTO HASH_SPLIT SELECT 1 FROM GENERATE_SERIES(1, 5000) A;

DELETE FROM HASH_SPLIT_HEAP WHERE KEYCOL = 1;

INSERT INTO HASH_SPLIT_HEAP SELECT A/2 FROM GENERATE_SERIES(1, 25000) A;

堆表操作输出变更

清理堆表的过程操作

DROP TABLE xxx;

加密列的操作

记录创建加密列的操作

ALTER TABLE encr_rela_tab ADD COLUMN PASS INT ENCRYPTED;

记录删除加密列的操作

ALTER TABLE encr_rela_tab DROP COLUMN PASS;

VACUUM操作

清理SP-GIST索引页节点

create table test_collate (id int,content varchar COLLATE "C");

create index test_collate_idx on test_collate using spgist(content);

insert into test_collate values(1,'constant');

insert into test_collate values(2,'CONSTANT');

insert into test_collate values(generate_series(1,30),'CONSTlllllllANT');

ALTER TABLE test_collate ADD c int;

ALTER TABLE test_collate ADD dddd char;

create index test_dddddte_idx on test_collate using spgist(dddd);

create index test_collate_idx on test_collate using spgist(content);

create index telate_idx on test_collate using spgist(content);

ALTER TABLE test_collate DROP dddd;

insert into test_collate values(generate_series(1,30),'CONSTlllllllANT',555);

VACUUM test_collate;

insert into test_collate values(generate_series(1,355),'CONSTlllllllANT',555);

DELETE test_collate WHERE content='constant';

DELETE test_collate WHERE id<30;

VACUUM test_collate;

DROP TABLE test_collate;

SP-GIST索引在清理过程中的根节点变化

create table test_collate (id int,content varchar COLLATE "C");

create index test_collate_idx on test_collate using spgist(content);

insert into test_collate values(1,'constant');

insert into test_collate values(2,'CONSTANT');

insert into test_collate values(generate_series(1,30),'CONSTlllllllANT');

VACUUM test_collate;

DELETE test_collate WHERE content='CONSTANT';

VACUUM test_collate;

DROP test_collate;

快速筛选WAl日志所需字段方法

由于WAL日志checkpoint特性会把旧wal文件清理,所以需要开启归档功能,能将WAL日志全部保存下来,方便查找。

开启归档

1.新建归档文件夹

2.修改kingbase.conf配置文件, archive_command = 'cp %p 你自己建的文件夹路径/%f

筛选字段

当执行完sql脚本后去查找有无想要的wal日志时,在归档的路径下结合grep命令完成筛选:

./sys_waldump /home/xx/archive/000000010000000000000018 |grep $目标字段

以上这种方式一次只能筛选一个文件,可以利用shell脚本完成批量筛选,以下脚本供参考:

#!/bin/bash

# 定义要搜索的目录

DIR_P="/home/xx/archive"

#需要查找的第一个字段

SEARCH_FIELD="Btree"

#需要查找的第二个字段(根据需要可删减)

SEARCH_FIELD_second="NEW_CID"

#需要查找的第三个字段(根据需要可删减)

SEARCH_FIELD_third="TRUNCATE_ID"

#sys_waldump的工具路径

bin_path='/home/xx/bin/./sys_waldump -b'

#遍历/home/xx/archive目录下的所有文件

find "$DIR_P" -type f ! -name '*.swp'| while read -r FILE; do

#使用sys_waldump查看文件内容,并通过grep搜索目标字段

if bin_path"bin\_path "FILE" | grep "$SEARCH_FIELD"; then

echo "File FILEcontainsfield:FILE contains field: 'SEARCH_FIELD'"

else

echo "File FILEdoesnotcontainsfield:FILE does-not contains field: 'SEARCH_FIELD':"

fi

done

#遍历/home/xx/archive目录下的所有文件

find "$DIR_P" -type f ! -name '*.swp'| while read -r FILE; do

#使用sys_waldump查看文件内容,并通过grep搜索目标字段

if bin_path"bin\_path "FILE" | grep "$SEARCH_FIELD_second" -3n; then

echo "File FILEcontainsfield:FILE contains field: 'SEARCH_FIELD_second'"

else

echo "File FILEdoesnotcontainsfield:FILE does-not contains field: 'SEARCH_FIELD_second'"

fi

done

#遍历/home/xx/archive目录下的所有文件

find "$DIR_P" -type f ! -name '*.swp'| while read -r FILE; do

#使用sys_waldump查看文件内容,并通过grep搜索offsets字段

if /home/xx/bin/./sys_waldump "FILE"grep"FILE" | grep "SEARCH_FIELD_third"; then

echo "File FILEcontainsfield:FILE contains field: 'SEARCH_FIELD_third'"

else

echo "File FILEdoesnotcontainsfield:FILE does-not contains field: 'SEARCH_FIELD_third'"

fi

done

参考资料

KingbaseES数据库概念