暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

原创 数据猿 2024-04-19
703


关键字:

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

http://wiki.kingbase.com/actionImg/Publoadimg.do?id=4028848781c12f6f018ed0158c6c1c18&type=max

筛选字段

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

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

http://wiki.kingbase.com/actionImg/Publoadimg.do?id=4028848781c12f6f018ed107d1ed1c99&type=max

以上这种方式一次只能筛选一个文件,可以利用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

参考资料

KingbaseES数据库概念

最后修改时间:2024-04-25 11:10:23
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论