关键字:
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 "$FILE" | grep "$SEARCH_FIELD"; then echo "File $FILE contains field: '$SEARCH_FIELD'" else echo "File $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 "$FILE" | grep "$SEARCH_FIELD_second" -3n; then echo "File $FILE contains field: '$SEARCH_FIELD_second'" else echo "File $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 "$SEARCH_FIELD_third"; then echo "File $FILE contains field: '$SEARCH_FIELD_third'" else echo "File $FILE does-not contains field: '$SEARCH_FIELD_third'" fi done |




