嵌入式数据库

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

嵌入式数据库
知识点:
●嵌入式数据库的特点与种类
●mSQL安装与配置
●mSQL数据库基本操作函数
本次课将介绍嵌入式数据库的基础知识。

首先,分析嵌入式系统中的数据库的特点、现状及其发展;然后,重点讨论mSQL在嵌入式Linux中的应用,将详细介绍它的安装、配置及数据库的建立过程,并结合mSQL提供的API函数讨论其数据表的操作;最后,通过一个完整的实例示范如何在用户应用程序中操作mSQL数据库。

1.1嵌入式系统中的数据库
同多数计算系统相似,嵌入式系统也常常需要数据库支持。

虽然很多情况下可以用文件方式实现部分数据库功能,但是当应用程序需要执行一些比较复杂的数据操作(如数据排序或检索)时,文件方式就无能为力了。

正因为如此,越来越多的厂商及个人开发出性能各异的嵌入式数据库产品,并且在实际应用中不断发展完善。

1.1.1嵌入式数据库特点
由于应用环境的特殊限制。

嵌入式数据库相对普通数据库系统而言有其自身特点:
A.支持常用嵌入式系统(如Linux,Windnws CE,Palm OS等多种操作系统)和通
信协议。

内核小,占用内存少。

B.提供数据库功能的自由定制,能够根据具体应用或行业特点定制系统功能。

C.方便的查询功能,支持SQL查询语句。

D.完善的数据管理功能,支持SQL标准的子集,提供数据库及数据表的管理等功
能。

E.操作简单方便,提供简明的API接口,可在高级语言中方便调用。

1.1.2嵌入式数据库现状与发展
数据库技术发展的原动力主要来自于不断扩大的应用需求及其支撑技术的成熟。

嵌入式数据库随着各种移动设备、智能计算设备、嵌入式设备的发展而迅速发展。

随着嵌入式应用对数据管理的要求不断提高,嵌入式数据库技术的地位也日显重要,它将在各个应用领域中扮演越来越重要的角色。

目前国际、国内嵌入式数据库产品及其应用处于一种“百花齐放、百家争鸣”的状态,应用需求多种多样,计算平台也是各有特色,还没有任何一家厂商能够做到一统天下。

随着各种移动设备和嵌入式设备进入普通百姓的日常生活,信息共享及交流己成为人们生活中不可缺少的一部分。

人们每天面对各种瞬息万变的信息资料,如果没有数据库的帮助,这一切都是不可能实现的。

此外.在未来的军事、航空、国土资源管理、移动医疗等领域嵌入式数据库系统也将占据主导作用,嵌入式数据库技术将使得信息在未来生活中无处不在、无时不在。

1.2 mSQL简介
Mini SQL (mSQL )是嵌入式数据库家族中的佼佼者,它由澳大利亚的David J. Hughes开发,目前最新版本是mSQL 3.8。

本章将以.SQL 3.0为例对其进行相应的介绍。

Mini SQL是一种小型的关系数据库管理系统。

说它小,是因为它自身结构紧凑小巧,占用系统资源少,不像大型通用数据库那样动辄数百兆字节。

事实上,mSQL功能十分强大,足以胜任大型数据集的索引、查询任务。

当然,mSQL终究是个小型数据库系统,它的设计初衷是用于资源较少的环境下,所以某些标准SQL的功能它并不支持。

mSQL的1.x版本只能支持有限数目记录的数据集,2,0版本的数据库引擎已经设计为
可以处理大型记录集,可以为有百万笔记录的大型记录集提供快速而一致的存取。

mSQL 2.0还包括了新的w3-mSQL WWW接口套件,通过使用W3-mSQL.应用程序可将mSQL及其他程序结构直接植入HTML源代码而实现快速开发,这样就不必再为每一个具有动态内容的网页编写大量脚本。

但是这些版本在功能可配置方面都做得不是很好,因此不适合在嵌入式系统中使用。

从mSQL 3.0版本开始,mSQL加入了许多新特性,其中最重大的改变是它提供了两种版本的服务器端程序,以适应不同应用需求。

一个是单进程的服务器mrsql3d,另一个是多进程的服务器msql3_broker。

单进程版本服务器与mSQL 2.x的相同,而多进程版本服务器则允许多个客户端同时连上服务器,而且客户端数目可设置。

mSQL 3.0还扩大了对标准SQL 语法的支持范围,并且它对CPU和内存的利用率更高。

这些新特性使得mSQL 3.x无论是在企业级应用还是在系统资源紧张的嵌入式系统中都能轻松胜任。

1.3在Linux上安装和配置mSQL
1.3.1mSQL的安装
SQL以两种形式发布:一种是RpM软件包方式;另一种是用tar压缩的源代码方式。

RPM软件包的安装很简单,命令如下:
rpm -ivh rnsql-3.0-RELEASE.i386.rpm
RPM软件包管理器简化了系统更新的步骤,一个简单的命令就完成所有文件的安装。

以源代码方式发布的mSQL的安装则要麻烦一些。

首先,用tar程序解开压缩包:
tar -xvf msql-3.0.tar.gz
该命令会在当前目录中建立一个新的目录rnsql-3.0-RELEASE,它用于存放所有的发布文件,包括源代码目录src及文档目录doc。

接下来的安装步骤与一般使用autoconf接口的Linux 应用程序的安装步骤有所差异,这里使用setup程序来设置后面的编译选项。

所以,接下来应该调用命令:
./ setup
该命令会将一些编译选项保存在src/site.mm文件中,如果用户需要改变mSQL程序的安装路径以及C编译器的类型,可以修改该文件中的对应内容。

程序的默认安装路径为/usr/local/msql3。

接下来,即可开始编译mSQL的源程序,执行如下命令:
./make all
如果编译完成并且正确,则可以开始安装mSQL,只需简单输入以下命令: ./make install
至此,rnSQL即被正确安装在系统中,可以开始使用。

1.3.2交叉编译mSQL
之前安装mSQL时对src/site.mm文件作了简单说明,交叉编译时需修改此文件。

下面列出了将要修改的地方:
COMPILER= gcc –Wall
修改为COMPILER= /usr/local/arm/2.95.3/bin/arm-linux-gcc –Wall
CPP= gcc –E
修改为CPP= /usr/local/arm/2.95.3/bin/arm-linux-gcc –E
RANLIB= ranlib
修改为RANLIB= /usr/local/arm/2.95.3/bin/arm-linux-ranlib
AR= ar
修改为AR= /usr/local/arm/2.95.3/bin/arm-linux-ar
TARGET= Linux-2.4.20-8-i686
修改为TARGET= arm-linux
修改后即可编译安装了,和本地安装过程是一样的。

在本设计的实现中,移植mSQL时出现了一些问题,特别是目标板上原libc库与mSQL3.0所要求的libc库版本不同。

将移植好的mSQL文件拷贝到目标板根文件系统上后启动mSQL 数据库系统,运行命令:
$ ./msql3_borker &
串口输出错误信息:
$ ./msql3_broker:/lib/libc.so.6:version“GLIBC_2.2.3” not found (required by /lib/libnsl.so.1)
由提示信息可知,是有关glibc库版本的问题,查看开发板文件系统中lib库目录下的glibc 库的版本号,使用命令:
$ string /lib/tls/libc.so.6 | grep GLIBC
在命令终端显示libc库所支持的GLIBC版本:
GLIBC_2.0
GLIBC_2.1.1
GLIBC_2.2.1
GLIBC_2.2.2
GLIBC_PRIVATE
可以看出根文件系统上的libc库最高只支持GLIBC_2.2.2,不能满足mSQL3.0对GLIBC 的要求。

经试验发现,arm-linux-gcc2.95.3和arm-linux-gcc3.4.1两个版本的交叉编译工具链的libc库都支持GLIBC_2.2.3及其以上版本。

经过对比发现了3.4.1版本的libc库大小为3MB,而2.95.3版本的libc库大小为4MB,为了减小根文件系统的大小,使其满足嵌入式系统体积尽可能小的目标,故选用3.4.1版本的libc库。

用命令将arm-linux-gcc3.4.1版本下的ld-2.2.3.so、libc.so.6和ld-linux.so.2拷贝至目标板根文件系统。

然后便能在目标板正常运行mSQL服务器。

1..3.3 mSQL系统配置
mSQL 3.0的系统配置文件名为msql .conf,位于安装目录下(默认为/usr/local/msql3 ) 另外,所有标准mSQL应用程序及公用程序都可以通过在执行时加上-f参数来指定一个非标准的配置文件,以强制改变原有的默认参数值。

这时当应用程序没有找到配置文件(或虽找到但有部分参数未设定),就会自动使用默认值。

1.配置文件格式
配置文件由若干个段(section)组成,可包含空白行及注释,在注释之前应有“#”字符。

每个段落都有一个段落标题,用方括号括起作为段落名称(例如:[general] ) 段落中参数值的设定方法:在参数名称之后跟上一个等号和相应的参数值,等号之后的参数值即为新值,但是每一行只能有一个参数设定项。

如果配置文件中某些参数值未设定,则rnSQL执行时会使用内部默认值。

2.配置文件参数说明
(1)General段。

mSQL运行中使用的一些通用参数,一般在配置文件的general段设定,下面分别介绍各个参数的意义。

●Inst_Dir: mSQL安装路径,默认为/usr/local/msql3。

●DB_Dir:用户建立的数据库文件保存路径,默认为%I/msqldb.这里的%I代表上
面的Inst Dir.即DB_ Dir的默认为/usr/local/msql3/msqldb。

●Msql_User: mSQL服务器当前用户,默认值为daemon。

若有别的用户激活服务
器,则系统的用户号UID会发生改变。

●Admin_User:特权用户,默认值为root。

特权用户可以执行特权操作,如数据库
的建立与关闭等。

●Pid_File: mSQL服务器进程号PID的保存文件完整路径,默认为%I/msql3d.pid
●TCP_Port: rnSQL服务器的TCP服务端口,默认为11140基于TCPIIP网络的客
户端通过这个端口与服务器连接。

●UNIX_Port: mSQL服务器UNIX套接字文件完整路径,默认为%I/msql3.sock。


机客户端通过这个套接字文件与服务器连接。

(2)System段。

MSQL的系统参数在配置文件的system段中设定,下面分别介绍各个参数的意义。

.Msynch _Timer:定义mSQL服务器自动使内存数据与硬盘数据的间隔时间同步,以秒为单位,默认值为30a如果该值设为U,则服务器不自动使内存与硬盘数据同步。

●Hostes_ Lookup:决定是否需要土机IP地址。

默认值为True,表示不符合主机
名称的连接请求将被拒绝。

●Read_only:设置服务器工作模式为只读,拒绝任何修改数据库的操作(只接受
select查询指令)。

默认值为False 。

●Remote_Access:允许基于TCPIIP网络的远端用户访问mSQL服务器,默认值
为False。

●Local_Access:允许本机用户应用程序访问mSQL服务器,默认值为True。

●Query_Log:生成日志文件,以保存服务器接收及处理的所有查询请求,默认值
为False 。

●Query_Log _File:如果Query_Log参数被设为True,则应设置Query_Log _File
为该日志文件的完整路径,一般设置为%I/rnsql.log。

●Force_ Munmap:设置mSQL服务器自己完成同步内存映像文件的任务,而不
依靠操作系统来完成,这样做可以保证在性能不稳定的操作系统中的数据的
完整性。

默认值为False。

●Nurn_Children:设置mSQL多进程服务器可以同时处理的任务数。

默认值为2。

●Table_ Cache:设置数据表缓冲区中容纳的记录数.默认值为8。

这个数值越大,
所占用的内存及文件描述符越多,所以在嵌入式系统中这个数值可以设得小
一些,但不能小于20
●Sortes_Maxes_Mern:设置执行ORDER BY或DISTINCT操作时所占用的最大
内存,默认值为1000。

3.配置文件范例
要配置出合适的mSQL数据库管理系统,所要做的工作就是修改其配置文件msql.conf。

在实际应用中经常需要改动的是Msql_Uer和Admin_User这两个参数。

Msql_USER用于设置运行mSQL数据库服务器程序的用户,而Admin_User用于设置能对mSQL数据库系统执行特权操作的用户。

因此,如果设置Msql_User = dlrman, Admin_User=admin,则表示将由dhman用户运行服务器程序,由admine用户执行特权操作。

配置完成后,以root身份登录,创建dbman用户,命令如下:
Useradd -g sqlusers dhrnan
接下来,将/usr/local/msql3目录下的文件及目录的拥有者改为dhman,执行以下命令:
Chown -R dbrnan
再进/usr/local/msql /bin目录,输入如下命令:
./msql3d&
这样就以后台执行方式启动了mSQL数据库系统,从而开始进行具体的数据库创建、查询等操作了。

以下是一个配置文件的简单范例,文件内容如下:
1.4mSQL工具程序
在用户建立自己的mSQL数据库并在应用程序中调用之前,将首先介绍msQL自身提供的工具程序及其用法,以确保整个数据库管理系统能正确运行。

mSQL软件中包含的使用及管理数据库的工具程序有6个,分别用于完成数据库管理、服务器程序监视,教据阵结构检索、教据转储,数据导出/导入等操作。

接下来,对工具程序作分别介绍。

1.服务器管理想序—msqladmin
rnsqladmin用于对mSQL服务器执行管理操作,如建立新数据库、关闭服务器、数据库复制等。

其调用方祛为:
msqladmin [-h host] [-f confFile] [-q] Command
其中各个可选参数的意义如下:
●-h::指定服务器主机名或IP地址。

默认值为localhost
●.-r:指定一个非默认的配置文件,默认的配置文件是mSQL安装目录下的
msql.conf 。

●-q:用“静态模式”执行msqladrnin。

加上该参数后,rnsqlaclmin将不会要求用户
对较危险的操作(如删除一个数据库)进行确认。

Command参数指明程序要执行的操作,可执行的操作命令如下:
●create db_name:创建一个名为db_name的新数据库。

●drop db_name:删除一个名为db_name的数据库,同时删除该数据库中的所有内
容。

●Shutdown:停止mSQL服务器。

(注意:该命令不能完全停止服务器管理程序,
如果要完全停止,必须先运行ps –e查到msql3_broker或msql3d的进程PID,
然后用kill PID才能完整地停止服务器管理程序)
●Reload强迫服务器重新读取存取列表的ACL设置。

●Version:显示当前服务器的版本及配置信息。

●Stats:显示服务器的统计资料。

●Copy framDB toDB:将frnmDB数据库里的内容复制到toDB中·toDB是一个尚
未存在的数据库,如果toDB已经存在了,那么会返回一个错误代码。

该命令
通常用于进行资料备份。

●move frornDB toDB:将fromDB数据库改名为toDB。

注意:大部分的系统管理操作只能以系统管理者的身份在运行服务器的主机上执行,例如,不能在远程执行关闭服务器的命令。

2. mSQL交互程序msql
rnsql为用户提供一个与mSQL服务器进行对话的界面,用户可以通过它向mSQL 服务器发送标准SQL命令。

msql通常是用来建立数据表或是向服务器传送SQL查询命令,以测试数据库内容是否正确,在用户应用程序中并不使用。

使用方法如下:
rnsql [-h host] [-f confFile] database
参数说明如下:
●-h:指定服务器生机名或IP地址,默认值是localhost
●-f:指定一个非默认的配置文件。

●database:要进行操作的数据库名。

例如,要在数据库mydb中创建一个名为mytable的表,可以这样实现:
首先,以mydb为参数执行msql程序;
./ msql mydb
程序执行后将进入msql对话模式,显示一个提示符mSQL >,这时就可以输入标准SQL命令来建立数据表:
mSQL >create table mytable(narne char(l0) not null,phone_number int)
然后,用\g命令将该SQL语句发送给服务器执行,这样便在mydb数据库中建立了一个mytable数据表。

msql共有4个控制命令,用一个反斜线加一个英文字母表示。

这4个命令分别为:
\q:退出msql程序。

\g:将SQL命令发送给服务器执行。

\e:编辑前面的SQL命令。

\p:显示SQL命令缓存区的内容。

3.数据库结构浏览程序—relshow
relshow用于显示mSQL中数据库的结构。

使用方法如下:
relshow [-h host] [-f confFile] [database [table [index]]]
参数说明如下:
.-h:指定服务器主机名或IP地址,默认值是lncalhost
.-f:指定一个非默认的配置文件。

如果执行relshow时不指定数据库名database,则列出所有已存在的数据库的名称;如果给relshow指定一个数据库名称,则relshow会列出这个数据库中所有的数据表(table);如果进一步指定table的名称,那么relshow会列出该数据表的结构信息(如各字段名称、类型、字段长度等);如果详细提供数据库名称、数据表名称及其索引C index }名称,那么relshow 将会显示所指定索引的结构、索弓}的数据类型以及组成索引的字段。

4.数据库重建程序—msqldump
msqldump用于产生一个包含了标准SQL命令的ASCII文本文件,通过这个文件可以重建数据库。

这个ASCII文本文件包含了重建一个数据库所需的CREA TE TABLE,CREATE INDEX以及CREATE SEQUENCE命令,以确保重新建立的数据库中的资料与原数据库相同。

使用方法如下:
msqldump [-h best] [-f confFile] [-c] [-u] [-t] [-w whereCtause] database [table]
参数说明如下:
.-h:指定服务器卞机名或IP地址,默认值是localhost
.-f:指定一个非默认的配置文件。

.-c:指定转储程序生成INSERT命令时,将各字段名称也一并列出。

._v:指定在执行命令时显示较为详细的信息。

._t:只导出数据表结构,不导出表中的数据。

._w:过滤导出的数据,后面要跟一个标准SQL的WHERE语句。

5.数据导出程序—msqlexport
msqlexport程序以纯文本方式导出指定数据表中的数据,输出的文本数据可以用于其他应用程序,例如产生电子表格。

利用msqlexport程序可以对输出的文本数据格式进行灵活设置。

用户自己可以自定义字段分隔符、数据中的分隔符替换字符、每项数据是否要用引用符号括起来以及用什么
符号作为引用符号等。

使用方法如下:
rnsqlexgort [-h host] [-f confFile] [-V][-s Char] [-q Char] [-a Char] database table
参数说明如下:
-h;指定服务器主机名或IP地址,默认值是localhost
-f:指定一个非默认的配置文件。

-s:用指定字符Char作为字段分隔符,默认为逗号。

-v:指定在执行命令时显示较为详细的信息。

-q:用指定字符Char将每项数据括起来。

-e:用指定字符Char来表示数据中出现的字段分隔符,默认值为一反斜杠(\)。

提示:程序执行结果默认输出到屏幕上显示,如果用户想将结果输出到文件中,可以在后面加上输出定向符”>>”。

例如,执行以下命令会将结果保存到文件backup中。

rnsqlexport mydb rnytable>> backup
6.数据导入程序--msqlimport
msqlirnport程序的作用与msalexport相反。

是将一个纯文本文件内容导入到rnSQL 数据表。

这时文木文件的每行作为数据表的一个记录。

程序根据用户指定的字段分隔符将每行中的数据分为几个字段,为避免数据中的字符被当作分隔符,用户可以先用-e参数来指定一个字符替换它。

用于将各项数据括起来的引用符号也应预先去掉。

msqlimpart程序的使用方法如下:
msqlimport [-h host] [-f confFile] }-}] [-s Char] [-q Char] [-a Char] database table
参数说明如下:
.-h:指定服务器主机名或IP地址,默认值是lacalhost4
.-f:指定一个非默认的配置文件。

-s:指定字段分隔符为Char默认为逗号。

-v:指定在执行命令时显示较为详细的信息。

-q:指定字符Char为数据两头的引用符号,数据导入时将之去掉。

-e:用指定字符Char替换数据中出现的字段分隔符,默认值为一反斜杠(\)。

1.5 rnSQL的 API函数
对嵌入式系统而言,应用程序往往是通过调用mSQL的API数来执行对特定数据库的操作。

API函数使得任何C语言程序都可以与mSQL的数据库引擎进行通信。

mSQL的API数库名称为libsql.a,一般位于mSQL安装路径下的lib目录中,库中的函数在msql.h中定义。

用户在编写应用程序时,应包含该头文件,该文件一般位于mSQL 安装路径下的include目录,如/usr/local/msql3/include中。

另外,在对C程序进行编译链接时,应加上链接参数。

例如,编译链接my_sql_app.c程序,使用如下命令:
cc –c –l /usr/local/msql3/include my_sq1_app.c
cc -o my_sqle_app rny_sql_app.c –L /usr/local/msql3/lib -lmsql
接下来,对mSQL的API函数作简单分类介绍。

1.查询类函数
MiniGUI中没有支持访问数据库的模块,但是可以利用mSQL的C API函数,将由mSQL的API函数编写的数据库操作程序嵌入到MiniGUI程序中。

完成此功能主要是应用到了以下几个API函数
int msqlConnect(host)
用于建立与mSQL服务器的连接。

参数host为服务器所在主机的名IP地址,当host 设为NULL时,表示将连接本机上运行的mSQL服务器。

在MiniGUI程序中host就设置为192.168.1.180,即Linux主机的地址。

int msqlSelectDB(sock,db)
对一个数据库进行查询等操作之前,必须先调用msqlSelectDB()函数选中它。

参数db为要选择的数据库名称。

int msqlQuery(sock,q)
msqlQuery()函数向mSQL服务器提交SQL操作命令,例如select、delete、update 等SQL命令。

参数sock为调用msqlConnect()函数返回的连接句柄,q为标准SQL语句。

当MiniGUI程序中嵌入式数据库mSQL API函数时,需在程序开头包含数据库头文件msql.h。

下面介绍SQL与客户端MiniGUI程序连接的部分代码:
/*连接远端mSQL服务器,192.168.1.180为宿主机IP地址*/
if((sock = msqlConnect("192.168.1.180")) < 0)
{
printf("Couldn't connect to engine!\n%s\n\n", msqlErrMsg);
perror("");
exit(1);
}
printf("connect to engine!\n");
/*选择数据库*/
if (msqlSelectDB(sock,db) < 0)
{
printf("Couldn't select database %s!\n%s\n",db,msqlErrMsg);
}
printf("select db!\n");
/*向服务器发送SQL查询命令*/
sprintf(qbuf,SELECT_QUERY);
if(numrow=msqlQuery(sock,qbuf) < 0)
{
printf("Query failed (%s)\n",msqlErrMsg);
exit(1);
}
printf("query good!\n");
/*获取查询结果*/
res=msqlStoreResult();
printf("get result!\n");
/*查询结果记录数*/
numrow=msqlNumRows(res);
/*移动记录集游标,获取字段信息并显示*/
for(num=0;num<numrow;num++)
{
msqlDataSeek(res,num);
row=msqlFetchRow(res);
printf("%s,%s,%s \n",row[0],row[1],row[2]);
/*保存所查询到的数据*/
scores[n][m].name = row[0];
scores[n][m].scr = row[1];
scores[n][m].remarks = row[2];
m++;
}
msqlClose(sock); /*关闭服务器连接*/。

相关文档
最新文档