天津南大通用数据技术股份有限公司(GBASE)成立于2004年,始终坚持国产数据库的自主研发和推广,为用户提供全栈国产数据库产品和服务。
南大通用是国家级高新技术企业、国家规划布局内重点软件企业、信创工委会成员企业(0084)。
南大通用是目前国内唯一一家专注于数据库产品研发,并且在金融、电信行业得到规模化应用的独立数据库服务商。
-
在传统交易领域,南大通用事务型数据库GBase 8s作为一款成熟稳定的安全事务型数据库,已经在中国人民银行、兴业银行、北京农商行、国家电网、12306、国家信息中心、某水电站、国防某部等关键领域的核心业务系统上实现规模化应用。
-
在项目实际应用中,如果客户数据库的应用场景是数据量增长较快,如果空间规划不够,可能会出现数据空间满的情况,基于多次遇到此问题,现进行GBase 8s数据库空间自动扩展测试,在这个测试之前,我们先来了解一下物理存储单元的知识点。
-
存储结构介绍(包括物理存储单元、逻辑存储单元、大对象存储)
一个GBase 8s实例Instance可以创建多个dbspace,一个dbspace可以包含多个物理chunk,一个chunk分成多个连续扩展区extent,一个表或者索引占用的空间被称为一个tablespace,一个extent包含多个物理页page。
其中,dbspace、tablespace和extent属于逻辑存储单元;chunk和page属于物理存储单元。
-
chunk
chunk就是用于存储数据的连续磁盘空间,也就是存储数据库数据的文件或者裸设备。
一个chunk可以是一个裸设备(Raw Device)或者一个UNIX文件(Cooked File)。
一个chunk最大可以是4TB,最多可以有32767个chunk。
root chunk包含整个数据库保留页及系统表等信息。一般将物理日志、逻辑日志迁移到单独的dbspace上。
一个非root chunk主要存储表、索引的数据(Tablespace),划分为多个连续的extent。
- page
数据页page是最基本的存储单元,是最小的I/O单元。磁盘的一个数据页读取到内存就会分配一个
同样大小的内存page来存储。
- 设置数据库空间自动拓展操作步骤(注意:适用于数据空间要求远低于操作系统空间的情境下使用):
1、新建数据空间文件datadbs2_2,加权限:
cd /opt/dbs/
touch datadbs2_2
chmod 660 datadbs2_2
2、在数据库用命令新增datadbs2空间:
onspaces -c -d datadbs2 -p /opt/dbs/datadbs2_2 -o 0 -s 102400 -k 16k
查询:
onstat -d
4c43e880 7 0x60001 7 1 16384 N BA gbasedbt datadbs2
4e8b2028 7 7 0 6400 6347 PO-B-D /opt/dbs/datadbs2_2
- 数据库数据空间自动拓展设置:
3、命令行格式设置:
dbaccess sysadmin -
execute function task (“modify chunk extendable”,7);
onstat -d
4e8b2028 7 7 0 6400 6347 PO-BED /opt/dbs/datadbs2_2
4、在datadbs2创建测试库,并使用测试表并生成大量数据
dbaccess - -
create database testdb in datadbs2 with log;
dbaccess testdb -
create table test2 (id serial,c char(1000));
insert into test2(id) values(1);
insert into test2(id) values(2);
insert into test2(id) values(3);
insert into test2(id) values(4);
insert into test2(id) values(5);
insert into test2(id) values(6);
insert into test2(id) values(7);
insert into test2(id) values(8);
insert into test2(id) values(9);
insert into test2(id) values(10);
5、反复执行至datadbs2的free空间为0(或者很小):
insert into test2 select * from test2;
onstat -d
4e8b2028 7 7 0 6400 181 PO-BED /opt/dbs/datadbs2_2
6、当chunk空间使用完时,继续insert记录,将自动拓展chunk的大小,前提是裸设备有剩余空间。
insert into test2 select first 20000* from test2;
通过onstat -d查询,发现总空间大小增加,已实现空间的自动拓展:
4e8b2028 7 7 0 7424 0 PO-BED /opt/dbs/datadbs2_2
- 另外建表的时候可指定extent大小
如extent size 1000000 next size 500000 lock mode row;
onstat -d查询:
4c507028 7 7 0 38674 0 PO-BED /opt/dbs/datadbs2_2
即自动扩展空间大小为:38674-7424=31250
验证空间增量乘页大小16K正好与next size500000是一致的:500000=31250*16
- 设置chunk可扩展后,也可指定chunk扩展增加指定大小:
如设置编号为7的chunk自动扩展:
execute function task (‘modify chunk extendable’,7);
如chunk增加2G:
execute function task(‘modify chunk extend’,1,2000000);
- pagesize对应rowsize大小关系:
pagesize rowsize
2K 3Byte
4K 11Byte
8K 28Byte
16K 60Byte
- GBase 8s存储限制情况
当我们在向表中insert记录时,提示如下信息,可能原因有3个:
1、空间不足
2、extents最大上限
3、最大数据页上限
271:Could not insert new row into the table.
136:ISAM error:no more extents
- 此时,我们可以根据实际情况的原因,通过如下措施来解决该问题:
1、空间不足→扩大空间;
2、extents上限→重建表,使用较大的extend size和next size或者删除表中的部分记录;
3、最大数据页上限→使用分片表或者使用更大的数据页