技术开发 频道

网友分享:国产数据库DM6初体验

  【IT168 独家

  编者言:数据显示国内商用数据库市场90%的市场份额由国外品牌占据,日前ITPUB一项关于国产数据库的使用调查结果非常值得深思,数据显示超过50%的网友从未使用过国产数据库软件,甚至有的网友都不知道还有国产数据库。根据小编所查,国产数据库的历史可追溯的至少有十年,经过十余年的发展,国产数据库产品目前到底处于一个什么样的水平?与国外品牌数据库有差距这是不容否认,但差距到底在哪里?十年来又有些什么样的进步?是否能满足目前一般企业的信息化需求?近期ITPUB开通了国产数据库专区,并已经提供了达梦数据库本地下载,不少ITPUB网友已经开始进行首次尝试或者说是体验。俗话说的好,是好还是坏,是骡子还是马还要拉出来溜溜才知道。

  ITPUB网友实战国产数据库系列投稿邮箱:qinli@it168.com

  作者简介:沈刚,网名大头刚,数据库技术爱好者。现任职于北京某互联网公司,提供数据库的规划与运维支持。实践经验丰富,擅长数据库诊断、性能调整等。MySQL技术征文大赛第一名。详情见:http://tech.it168.com/focus/200905/mysql515/index.html

  据称达梦数据管理系统DM是达梦数据库有限公司完全自主开发、具有完全自主知识产权的通用数据库管理系统。下面我将根据对DM的试用,简单介绍一下DM的部分功能。

  首先,就数据库的主要功能将DM与其他主流数据库进行对比,具体情况见表1-1:

  DM与Oracle、Mysql、PostgreSQL功能对比表:1-1

  从表1-1可以看出,达梦数据库(DM6)与ORACLE10、MYSQL5.1、PGSQL8.4等目前主流数据库相比,功能并不比其他数据库少。当然,有了这些功能,也并不一定代表能高效、稳定的使用这些功能,例如集群这个功能,目前除了ORACLE的集群能在正式环境高效、稳定的使用外,其他的数据库虽说都有这个功能,但是目前还没有人敢在正式环境使用。这还需要不断的测试、改进。

  下面我将从用户的角度出发,对DM的分区、全文检索、物理增量热备功能分别进行具体的介绍。

  测试环境:

  [root@test ~]# cat /etc/redhat-release

  Red Hat Enterprise Linux Server release 5.2 (Tikanga)

  [root@test ~]# uname -a

  Linux test 2.6.18-92.el5 #1 SMP Tue Apr 29 13:16:15 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux

  [root@test ~]# free -m

  total used free shared buffers cached

  Mem: 3952 1443 2508 0 173 1101

  -/+ buffers/cache: 169 3783

  Swap: 4000 0 4000

  [root@test ~]# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

  8 Intel(R) Xeon(R) CPU E5310 @ 1.60GHz

  一、安装

  DM的安装相对来说是很简单的,基本就是傻瓜式安装,解压后直接DMInstall安装,这里使用的是静默安装,使用-i参数。

[root@test dmdb]# ./DMInstall.bin -i
Extract install files..........

  欢迎使用达梦数据库安装程序

  请输入Key文件的路径地址[/u01/dmdb/dm.key]:

  有效日期: 无限制

  服务器颁布类型: 开发版

  发布类型: 试用版

  用户名称:

  授权用户数: 1

  并发连接数: 25

  安装类型:

  1 典型安装

  2 服务器

  3 客户端

  4 自定义

  请选择安装类型的数字序号 [1 典型安装]:1

  所需空间: 378M

  请选择达梦数据库安装目录 [/opt/dmdbms]:/u01/dmdb/dmdbms

  可用空间: 144G

  请确认安装路径 (Y/y,N/n) [Y/y]:y

  是否初始化数据库 (Y/y,N/n) [Y/y]:y

  是否安装示例库 (Y/y,N/n) [N/n]:y

  请输入数据文件路径 [/u01/dmdb/dmdbms/data]:

  数据所需空间: 415M

  数据可用空间: 144G

  请确认数据文件路径 (Y/y,N/n) [Y/y]:y

  是否修改数据库初始化参数 (Y/y,N/n) [N/n]:n

  是否修改SYSDBA密码 (Y/y,N/n) [N/n]:n

  是否修改SYSAUDITOR密码 (Y/y,N/n) [N/n]:n

  安装前小结

  安装位置: /u01/dmdb/dmdbms

  数据安装位置: /u01/dmdb/dmdbms/data

  所需空间: 378M

  可用空间: 144G

  数据所需空间: 415M

  数据可用空间: 144G

  版本信息: 开发版

  有效日期: 无限制

  安装类型: 典型安装

  是否确认安装(Y/y,N/n) [Y/y]:y

  安装过程很简单,按照提示一路下来就可以了。

  启动DM数据库。

[root@test data]# /etc/init.d/dmserverd start
Starting dmserverd:                                        
[  OK  ]

[root@ test ~]# ps -ef|grep dmserver
root    
27180     1  0 Mar26 ?        00:00:00 /u01/dmdb/dmdbms/bin/dmserver dm.ini -noconsole
root    
27815 27603  0 18:16 pts/0    00:00:00 grep dmserver

  可以看到,进程已经起来了。

  DM提供了交互式工具ISQL来进行数据库的管理,下面登录数据库。

[root@test log]# rlwrap /u01/dmdb/dmdbms/bin/isql SYSDBA/SYSDBA@localhost
SQL
>desc v$sersion;

  第1行: 'desc'附近有语法错误

SQL>describe v$sersion;
describe v$sersion;
COLNAME        TYPE        LENGTH        NULLABLE        
0 rows got
time used:
47.242(ms).
select * from  v$version;
BANNER        
1    DM Database Server V6.0.2.51-Build(2009.12.23)    
2    DB Version: 0X1022b    
2 rows got
time used:
0.231(ms).

SQL
>create database mytest datafile '/u01/dmdb/dmdbms/data/mytest01.dbf' size 500;
create database mytest datafile '/u01/dmdb/dmdbms/data/mytest01.dbf' size 500;
time used:
3784.885(ms).

SQL
>set current database mytest;
set current database mytest
设置当前数据库为
'mytest'
time used:
0.208(ms).

  DM的isql没有历史回调功能,describe不能简化成desc。Select出来的数据,列没有对齐,多了一个行序号的列。个人感觉这个可以调整一下,毕竟大多数数据库使用者都习惯了通用的数据库命令,这样有利于DM的推广和发展。

  二、分区功能体验

  数据库分区使表和索引能够被划分成更小、更易于管理的部分,这对于任何具有高性能和高可用性需求的大型数据库来说都是一项重要的要求。使查询得以扫描较少的数据,减少I/O量,从而提高查询性能。DM的分区功能分为垂直分区和水平分区。

  DM与Oracle、Mysql、PostgreSQL 分区功能对比 表:2-1

 DM6.0Oracle 10gMysql 5.1PostgreSQL 8.4
范围(Range)支持支持支持支持
哈希(Hash)支持支持支持支持
混合(范围+哈希)不支持支持不支持支持
列表(List)不支持支持支持支持
垂直分区支持不支持不支持不支持

  2.1 水平分区

  DM6对表的水平分区有2种,范围分区(RANGE)和哈希分区(HASH)。

  2.2.1 HASH分区

  DM的HASH分区对分区列值进行HASH计算后,确定实际数据存放的具体位置。主要用来确保数据在预先确定数据的分区中平均分布。我们来看一下表的定义:

SQL>select tabledef('mytest','sysdba','test_part2');
1    CREATE TABLE "test_part2" AT "mytest"
(
"id"
INTEGER,
"t1"
VARCHAR(10),
"t2"
VARCHAR(10),
"t3"
VARCHAR(10),
"t4"
VARCHAR(10),
"t5"
VARCHAR(10),
PRIMARY KEY("id"))PARTITION BY HASH("id") PARTITIONS 5    
1 rows got

  2.2.2 RANGE分区

  DM的范围分区按照分区列的数据范围,确定实际数据存放的位置。通过LEFT或者RIGHT关键字来指定哪个值是第一个分区的上边界,还是第二个分区的下边界。我们来看一下表的定义:

SQL>select tabledef('mytest','sysdba','test_part3');
1    CREATE TABLE "test_part3" AT "mytest"
(
"id"
INTEGER,
"t1"
VARCHAR(10),
"t2"
VARCHAR(10),
"t3"
VARCHAR(10),
"t4"
VARCHAR(10),
"t5"
VARCHAR(10),
PRIMARY KEY("id"))PARTITION BY RANGE("id") LEFT FOR VALUES(5, 10)
1 rows got;

  从以上内容可以看出,DM的水平分区功能与其他传统数据库系统的功能类似,能满足对大数据表的水平分区管理。

  2.2 垂直分区

  垂直分区功能是DM数据库系统在分区上比较特别的一个功能,因为在目前的主流数据库系统中,还没有对这个功能有比较全面的应用,下面重点介绍一下垂直分区。在DM数据库管理系统中,垂直分区的实现方式是:将垂直分区表分拆成多个表,每个表包含较少的列。定义一个垂直分区表,系统将自动为其创建一个分区基表和若干个分区子表。分区基表不保存实际数据,只保存表定义、分区信息,实际数据保存在分区子表中。每个分区子表包含定义的分区子表列和CLUSTER PK列。并且,在所有的分区子表上建立了CLUSTER PK索引。这样拆分后,每个子表只包含较少列数据,通过CLUSTER PK列进行行匹配,各个分区子表中的每个逻辑行与其他分区子表的相同逻辑行匹配,可以方便的还原主表定义的完整数据。

  下面来体验下,创建一个垂直分区表:

create table test_part(
id
int ,
t1
varchar(10),
t2
varchar(10),
t3
varchar(10),
t4
varchar(10),
CLUSTER
PRIMARY KEY(id)
)
partition
by column
((id,t1,t2),
(id,t3,t4)
);

  通过DM的系统表sysparttables 查看当前分区表信息:

SQL>select * from sysparttables;
BASE_TABLE_ID        PART_TABLE_ID        RESVD1        RESVD2        RESVD3        RESVD4        RESVD5        
1    1007        1008        NULL    NULL    NULL    NULL    NULL    
2    1007        1009        NULL    NULL    NULL    NULL    NULL    
2 rows got
time used:
0.268(ms).

  我们能看到基表ID是1007,分区子表ID式1008,1009。那么我们找出1007,1008,1009这三个表。

SQL>select name from systables where id=1007;
name    
1    test_part    
1 rows got
time used:
0.301(ms).
SQL
>select name from systables where id=1008;
name        
1    test_part00DMPART    
1 rows got
time used:
0.236(ms).
SQL
>select name from systables where id=1009;
name        
1    test_part01DMPART    
1 rows got
time used:
0.185(ms).

  我们利用tabledef 函数验证下这三个表的定义。

SQL>select tabledef('mytest','sysdba','test_part');
1    CREATE TABLE "test_part" AT "mytest"
(
"id"
INTEGER,
"t1"
VARCHAR(10),
"t2"
VARCHAR(10),
"t3"
VARCHAR(10),
"t4"
VARCHAR(10),
CLUSTER
PRIMARY KEY("id"))PARTITION BY COLUMN(("id", "t1", "t2"), ("id", "t3", "t4"))
1 rows got
time used:
0.228(ms).

SQL
>select tabledef('mytest','sysdba','test_part00DMPART');
1    CREATE TABLE "test_part00DMPART" AT "mytest"
(
"id"
INTEGER,
"t1"
VARCHAR(10),
"t2"
VARCHAR(10),
CLUSTER
PRIMARY KEY("id"))    
1 rows got
time used:
0.290(ms).

SQL
>select tabledef('mytest','sysdba','test_part01DMPART');
1    CREATE TABLE "test_part01DMPART" AT "mytest"
(
"id"
INTEGER,
"t3"
VARCHAR(10),
"t4"
VARCHAR(10),
CLUSTER
PRIMARY KEY("id"))    
1 rows got
time used:
0.292(ms).

  可以看到系统自动创建的分区子表,都包含了CLUSTER PK列id,t1,t2列位于分区子表test_part00DMPART中,而t3,t4列位于分区子表test_part01DMPART中。

SQL>explain select * from test_part;
#RSET:
[2, 2, 0];
    #XNLP:
[0, 0, 0]; CROSS_JOIN
        #CSEK:
[2, 2, 0]; INDEX33555488(test_part00DMPART), FULL_SCAN
        #CSEK:
[2, 2, 0]; INDEX33555489(test_part01DMPART), INDEX_EQU_SEARCH
time used:
7.339(ms).
SQL
>explain select t1,t2 from test_part;
#RSET:
[2, 2, 0];
    #CSEK:
[2, 2, 0]; INDEX33555488(test_part00DMPART), FULL_SCAN
time used:
0.212(ms).
SQL
>explain select t3,t4 from test_part;
#RSET:
[2, 2, 0];
    #CSEK:
[2, 2, 0]; INDEX33555489(test_part01DMPART), FULL_SCAN
time used:
0.199(ms).

  从执行计划可以明显看出,当全表查询时,其实是把2个子表JOIN得出结果。而当只查询子表所有的列时,只需要查询子表。在实际应有中,遇到类似上面的例子的情况,使用垂直分区将会大大减少了查询数据量,提高了查询效率,以优化系统性能。

  三、全文检索

  DM与Oracle、Mysql、PostgreSQL 全文检索功能对比表:1-3

  DM的全文检索功能是根据其已有词库建立全文索引,然后文本查询完全在索引上进行。我们来测试下

select * from test_context;
id        name        
1    1           Copied 31 empty directories to 4 empty directories under /u01/dmdb/dmdbms/jar/eclipse    
2    2           Replace FILE=/u01/dmdb/dmdbms/desktop/uninstall.desktop    
3    3           达梦数据库DMDBDMS    
3 rows got
time used:
0.265(ms).

  下面在name字段创建全文索引。

SQL>create context index test_name on test_context(name);
time used:
27.519(ms).

SQL
>select a.name,b.name from systables a,syscontextindexes b where a.name='test_context' and a.id=b.tableid;
name        name        
1    test_context    test_name    
1 rows got

SQL
>select * from test_context where contains(name,'empty');
全文索引
'test_name' 无效,需要重新填充.error code = -1453

SQL
>alter context index test_name on test_context rebuild;
time used:
355.452(ms).

SQL
>select * from test_context where contains(name,'empty');
id        name        
1    1           Copied 31 empty directories to 4 empty directories under /u01/dmdb/dmdbms/jar/eclipse    
1 rows got
time used:
0.431(ms).

SQL
>select * from test_context where contains(name,'达梦');
id        name        
1    3           达梦数据库DMDBDMS    
1 rows got
time used:
0.368(ms).

  从上面的测试可以看出,DM的全文检索在创建后不能马上对其进程查询,需要先进行填充,也就是说每次更新后,更新的数据不能马上用全文检索查出来,需要先填充才会出现在全文索引里。不过DM对中文的支持还是很友好的,不需要在多装其他的插件什么的,毕竟是国产的。

  四、物理增量备份恢复

SQL>set current database mytest;
set current database mytest
设置当前数据库为
'mytest'
time used:
0.124(ms).

SQL
>select name,type from systables where type!='S';
name        type        
1    bk_2    U    
2    test_backup    U    
3    test_backupDMBLOB    V    
4    test_context    U    
5    test_contextDMBLOB    V    
6    test_part    V    
7    test_part00DMPART    P    
8    test_part01DMPART    P    
9    test_part2    H    
10    test_part3    R    
10 rows got
time used:
0.169(ms).

  当前MYTEST库下有10个表,那么我们对这个库进行一个完全备份。

SQL>backup database mytest full to "/u01/dmdb/mytest_bak01";
time used:
25.211(ms).

SQL
>create table bk_001(id int);
time used:
0.658(ms).

  完全备份完成后,在创建一个新表bk_001,然后再进行增量备份。

SQL>backup database mytest increment to "/u01/dmdb/mytest_bak02";
time used:
17.266(ms).

SQL
>select name,type from systables where type!='S';
name        type        
1    bk_001    U    
2    bk_2    U    
3    test_backup    U    
4    test_backupDMBLOB    V    
5    test_context    U    
6    test_contextDMBLOB    V    
7    test_part    V    
8    test_part00DMPART    P    
9    test_part01DMPART    P    
10    test_part2    H    
11    test_part3    R    
11 rows got
time used:
0.173(ms).

  可以看到,目前MYTEST库有11张表,然后再删除几张表,把新建的bk_001表也删除。

SQL>drop table bk_001;
SQL
>drop table bk_2;
SQL
>drop table test_backup;
SQL
>exit

  然后对MYTEST库进行完全恢复,利用sf_get_bak_by_name函数找到备份路径,恢复前要把需要恢复的数据脱机。

[root@ test ~]# rlwrap /u01/dmdb/dmdbms/bin/isql SYSDBA/SYSDBA@localhost
isql V6.
0.2.51-Build(2009.12.23)
login success
SQL
>select sf_get_bak_by_name('/u01/dmdb/mytest_bak01','mytest');
1    /u01/dmdb/dmdbms/data/mytest_20100330223956_1.bak    
1 rows got
time used:
0.303(ms).

SQL
>restore database mytest full from '/u01/dmdb/dmdbms/data/mytest_20100330223956_1.bak';
time used:
1787.245(ms).

SQL
>alter database mytest set online;
alter database mytest set online

time used:
1028.146(ms).
SQL
>set current database mytest;
设置当前数据库为
'mytest'
time used:
0.145(ms).

SQL
>select name,type from systables where type!='S';
name        type        
1    bk_2    U    
2    test_backup    U    
3    test_backupDMBLOB    V    
4    test_context    U    
5    test_contextDMBLOB    V    
6    test_part    V    
7    test_part00DMPART    P    
8    test_part01DMPART    P    
9    test_part2    H    
10    test_part3    R    
10 rows got
time used:
0.313(ms).

  可以看到,现在有10张表,已经恢复到了新建bk_001表之前的状态。那么我们在进行增量恢复

SQL>set current database system;
设置当前数据库为
'SYSTEM'
time used:
0.128(ms).
SQL
>alter database mytest set offline;
time used:
1.181(ms).

SQL
>select sf_get_bak_by_name('/u01/dmdb/mytest_bak02','mytest');
1    /u01/dmdb/dmdbms/data/mytest_20100330224024_1.bak    
1 rows got
time used:
0.312(ms).

SQL
>restore database mytest increment from '/u01/dmdb/dmdbms/data/mytest_20100330224024_1.bak';
time used:
11.065(ms).

SQL
>alter database mytest set online;
time used:
1027.506(ms).

SQL
>set current database mytest;
设置当前数据库为
'mytest'
time used:
0.123(ms).

SQL
>select name,type from systables where type!='S';
name        type        
1    bk_001    U    
2    bk_2    U    
3    test_backup    U    
4    test_backupDMBLOB    V    
5    test_context    U    
6    test_contextDMBLOB    V    
7    test_part    V    
8    test_part00DMPART    P    
9    test_part01DMPART    P    
10    test_part2    H    
11    test_part3    R    
11 rows got
time used:
0.304(ms).

  可以看到,已经完全恢复。

  物理增量备份和恢复功能对于大型数据库系统而言是一个具有标志性意义的功能,由以上的备分实例可以看出, DM6的备份和恢复功能还是比较完善的。

  五、总结

  以上是我对DM6的使用体验,通过以上的三个测试可以看出,DM6的功能,总的来说还是比较完善的,在数据库的主要功能方面基本能够满足一般企业级数据库的各种应用。同时还提供了一个比较特别的垂直分区功能,值得大家去关注一下。另外由于本文目的是体验DM6数据库,并没有对DM6的性能和稳定性进行测试,在实际环境中,DM的性能和稳定性到底如何,还需要在实践中不断的摸索和总结。

0
相关文章