app开发者平台在数字化时代的重要性与发展趋势解析
563
2023-11-23
作者简介:沈刚,网名大头刚,数据库技术爱好者。现任职于北京某互联网公司,提供数据库的规划与运维支持。实践经验丰富,擅长数据库诊断、性能调整等。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
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
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 gotSQL>select * from test_context where contains(name,empty);
全文索引 test_name 无效,需要重新填充.error code = -1453SQL>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
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 onlinetime 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的性能和稳定性到底如何,还需要在实践中不断的摸索和总结。
文章来自达梦技术社区:
来自 “ ITPUB博客 ” ,链接:http://blog.itpub-/23392679/viewspace-631591/,如需转载,请注明出处,否则将追究法律责任。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~