关键字:
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 FILE" | grep "$SEARCH_FIELD"; then
echo "File SEARCH_FIELD'"
else
echo "File SEARCH_FIELD':"
fi
done
#遍历/home/xx/archive目录下的所有文件
find "$DIR_P" -type f ! -name '*.swp'| while read -r FILE; do
#使用sys_waldump查看文件内容,并通过grep搜索目标字段
if FILE" | grep "$SEARCH_FIELD_second" -3n; then
echo "File SEARCH_FIELD_second'"
else
echo "File 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 "SEARCH_FIELD_third"; then
echo "File SEARCH_FIELD_third'"
else
echo "File SEARCH_FIELD_third'"
fi
done