|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
MySQL数据库归MySQLAB公司所有,但是这个软件是开源的,有一个MySQL学习教程可以免费下载。稍俱常识的新入门者都可以轻松实现在一个常见硬件上安装和配置MySQL。本文形貌了MySQL,一种使用第三方数据库开辟电子商业和别的庞大、静态网站的无效工具。MySQL是一种疾速、多线程和全功效的SQL服务器。除形貌MySQL体系的基础系统布局之外,本文还供应了以Tcl和C++编写的复杂示例,匡助您开辟撑持数据库的Web使用。 本文形貌了MySQL,一种使用第三方数据库开辟电子商业和别的庞大、静态网站的无效工具。MySQL是一种疾速、多线程和全功效的SQL服务器。除形貌MySQL体系的基础系统布局之外,本文还供应了以Tcl和C++编写的复杂示例,匡助您开辟撑持数据库的Web使用。
一个必需存储或会见大批信息的使用程序能够从利用第三方数据库产物中受益不浅。在对信息的会见必需在程序的多个实例长进行时更是云云。基于Web的使用(包含电子商业)就是它的优秀例证。
为何利用自力数据库?
Web服务器必需使其处置剧本有举措来存储有关供其今后会见的形态信息。只管有大概利用对照原始一些的办法--比方转储到文本文件或开辟便宜的迷你数据库--但只要成熟的数据库使用才干供应更加庞大的Web使用所需的一切服务。由于有一些收费取得的软件包可用于该目标,以是编写定制的特定于使用的数据库引擎并没有太年夜优点。别的,利用第三方数据库还使Web开辟者不用投进到开辟和保护数据库的义务中。
MySQL数据库
经由过程利用剧本言语和编译型体系言语(比方C),将数据库集成到linux使用便可能相称简单。可收费取得的MySQL(在GNUPublicLicense下刊行)数据库供应了一系列庞大的SQL功效,并易于集成到使用中。MySQL是疾速、多线程的,并撑持ANSI和ODBCSQL尺度。加上第三方软件,MySQL就撑持用于事件处置使用的事件平安的表。
注:甚么是事件处置?
事件是必要以原子体例实行的对数据库所做的一系列变动。它们要末必需全体实行,要末一个都不实行。比方,在Web上发卖产物时一切必须的数据库变动构成一个事件。
数据库必要同时减往客户帐户余额和产物库存,不然失利而且一个操纵都不实行。
不管服务器出于何种缘故原由产生溃散都不该该引发事件被部分实行。比方帐单多算、产物没有托付,大概库存不实等都有多是部分完成的事件的了局。
撑持事件处置的数据库能够将一组数据库代码封装在一个事件中,在事件实行时代的任何失利会让数据库回滚到事件入手下手之前的形态。
这是经由过程保护一切数据库操纵的日记,和其原始形态表的正本来完成的,在失利后下一次从头启动服务器时同意回滚操纵。这类工夫和空间上的开支是事件平安数据库体系所必须的一种折中。
单一MySQL服务器把持着一系列数据库,它们都能够经由过程服务器以相似体例来会见。每一个数据库实践上都是一组恣意数目的表,观点与别的SQL数据库的用户相似。每一个表都由带范例的数据列构成。数据能够是整数、实数值、字符串或别的范例,包含原始二进制流。表中的每行都是存储在数据库中的一个纪录。
MySQL被计划和机关成客户机/服务器。服务器mysqld能够在能从因特网会见到的任何呆板上运转(最好与Web服务器在统一台或最靠近的一台呆板上,以确保公道的呼应工夫)。MySQL客户机利用哀求来与MySQL服务器接洽,修正或查询服务器所具有的数据库。在撑持数据库的Web使用程序中,数据库客户机是Web服务器或由Web服务器发生的CGI剧本。这些客户机能够用初级剧本言语或初级体系言语编写,只需存在这类言语的数据库API便可。在Linux中,年夜多半剧本言语是以C完成的,由于存在MySQLCAPI,以是要将MySQL撑持增加就任何现有的剧本言语或工具应当很简单。尽年夜部分剧本言语已完成了这一步。
MySQLAPI
MySQLAPI可用于各类言语,包含几近一切编写网站后端所实践利用的言语。利用这些API,我们能够构建由Web服务器把持的MySQL客户机。
API(用于数据库会见)以基于毗连的形式事情。客户机必需做的第一件事是翻开与MySQL服务器的毗连。这包含得当地利用服务器熟悉的用户名和口令来对毗连举行身份认证。创建了毗连后,服务器选择要利用的特定命据库。断定了初始化后,客户机使用程序(就我们来讲是服务器方CGI剧本)就可以自在地与数据库以两种体例中的一种举行交互:能够运转惯例SQL命令,包含增加和删除表,和向它们增加纪录;也能够对前往了局的数据库运转查询。查询天生一组与查询婚配的纪录,然后,客户机能够一一会见纪录,直到检察完一切纪录,大概客户机作废暂挂的纪录检索。一旦剧本完成了对数据库的操纵后,与服务器的毗连就被封闭。
要构建集成数据库会见的网站,必要编写CGI剧本来依据数据库形态天生静态了局。Web服务器启动CGI剧本,然后将得当格局化的HTML输入到它们的尺度输入流中。Web服务器捕获到HTML后将它发送回客户机,好像哀求是对静态HTML页面举行的那样。在天生HTML的过程当中,剧本能够修正数据库,也能够查询并将了局兼并到它们的输入中。
作为复杂注释上述历程的一个示例,上面的代码(以C和Tcl编写)查询一个包括某公司供发卖的产物清单的数据库。这尽没有利用两种言语MySQLAPI的一切特征,但供应了疾速、浅易扩大的示例,能够对数据库内容实行任何SQL命令。在该例中,剧本显现了低于特订价格的一切产物。在理论中,用户大概在Web扫瞄器中输出该代价,然后将它发给服务器。我们省往了从情况变量中举行读取来断定HTML表单值的细节,由于它与不撑持数据库的CGI剧本中实行的情形没有甚么不同。为明晰起见,我们假定事前设置了特定一些参数(比方要查询的代价)。
以下代码是利用收费取得的TclGenericDatabaseInterface以Tcl完成的。如许一种接口的优点在于Tcl是注释型的,能够对代码举行敏捷开辟和疾速修正。
Tcl示例
#ThiscodePRintsoutallproductsinthedatabase
#thatarebelowaspecifiedprice(assumedtohavebeendetermined
#beforehand,andstoredinthevariabletargetPrice)
#TheoutputisinHTMLtableformat,appropriateforCGIoutput
#loadtheSQLsharedobjectlibrary.theTclinterpretercouldalso
#havebeencompiledwiththelibrary,makingthislineunnecessary
load/home/aroetter/tcl-sql/sql.so
#thesearewelldefinedbeforehand,ortheycould
#bepassedintothescript
setDBNAME"clientWebSite";
setTBLNAME"products";
setDBHOST"backend.company.com"
setDBUSER"mysqluser"
setDBPASSWD"abigsecret"
settargetPrice200;
#connecttothedatabase
sethandle[sqlconnect$DBHOST$DBUSER$DBPASSWD]
sqlselectdb$handle$DBNAME;#gettestdatabase
#runaqueryusingthespecifiedsqlcode
sqlquery$handle"select*from$TBLNAMEwhereprice<=$targetPrice"
#printouthtmltableheader
puts"<tableborder=4>"
puts"<th>ProductId<thwidth=200>Description<th>Price($)"
#outputtablerows-eachfetchrowretrievesoneresult
#fromthesqlquery
while{[setrow[sqlfetchrow$handle]]!=""}{
setprodid[lindex$row0]
setdescrip[lindex$row1]
setprice[lindex$row2]
puts"<tr><td>$prodid<tdalign=center>$descrip<td>$price"
}
puts"</table>"
#emptythequeryresultbuffer-shouldalreadybeemptyinthiscase
sqlendquery$handle
#closethedbconnection-inpracticethissameconnection
#isusedformultiplequeries
sqldisconnect$handle
上面的代码是利用正式MySQLC++APIMySQL++以C++编写的等价剧本。该版本的上风在于它是编译型的,因而比注释言语更快。常常用在特定站点的数据库代码应当以C或C++编写,然后由剧本或间接由Web服务器会见,以改善全体运转工夫。
C++示例
#include
#include
#include
constchar*DBNAME="clientWebSite";
constchar*DBTABLE="products";
constchar*DBHOST="backend.company.com";
constchar*DBUSER="mysqluser";
constchar*DBPASSWD="abigsecret":
intmain(){
try{
//openthedatabaseconnectionandquery
Connectioncon(DBNAME,DBHOST,DBUSER,DBPASSWD);
Queryquery=con.query();
//writevalidsqlcodetothequeryobject
query<<"select*from"<<DBTABLE;
//runthequeryandstoretheresults
Resultres=query.store();
//writeoutthehtmltableheader
cout<<"<tableborder=4>
";
cout<<"<th>ProductId<thwidth=200>Description"
<<"<th>Price($)"<<endl;
Result::iteratorcurResult;
Rowrow;
//iterateovereachresultandputitintoanhtmltable
for(curResult=res.begin();curResult!=res.end();curResult++){
row=*curResult;
cout<<"<tr><tdalign=center>"<<row[0]
<<"<td>"<<row[1]
<<"<td>"<<row[2]<<endl;
}
cout<<"</table>"<<endl;
}catch(BadQueryer){
//handleabadquery(usuallycausedbyasqlsyntaxerror)
cerr<<"Error:"<<er.error<<endl;
return-1;
}catch(BadConversioner){
//handleconversionerrorsoutofthedatabaseaswell
cerr<<"Error:Cantconvert""<<er.data<<""toa""
<<er.type_name<<""."<<endl;
return-1;
}
return0;
}
平安性
在Web上创立以Web撑持的使用有一些开辟者必要思索的成绩。一切有关Web服务器上CGI程序的成绩,比方Web服务器处置允许权和剧本方的输出反省,也仍旧必要思索。
除此以外,保护数据库体系的平安性也很有需要。这触及回护数据库服务器的允许权体系,和使从数据库客户机到服务器的毗连平安。
MySQL供应了深切的平安性体系,有人描述它是“初级但不尺度”。MySQL同意依据用户名、客户机主机和要会见的数据库对客户机举行会见。要创立平安的体系,让一切用户利用强口令,不要给他们任何他们不是相对必要的会见权。这包含外表上有害的特权,比方可让用户检察一切正在运转的历程(包含变动其他用户口令的那些)的处置特权。最好的举措是以无特权的Unix用户运转服务器历程自己,如许假如一个数据库被保守,也不至于击垮全部体系。这与以用户nobody而非root用户运转httpd相似。形貌体系会见的表是作为独自的MySQL数据库存储的,能够由MySQLroot用户更新。请注重,MySQL服务器依据MySQL用户名授与特权,这些用户名与Unix用户名分歧。不外,有一个MySQLroot用户名,它对数据库有全体权限。一旦服务器断定了毗连客户机是谁,和它们在实验毗连甚么以后,就依据给定的一组权限来把持会见权。要避免会见表中主机名被DNS电子棍骗,能够输出一切主机的IP地点,或哀求服务器将IP地点剖析回原始主机名来使其别人截获DNS哀求和回覆更坚苦。
除服务器会见表之外,与服务器的通讯也必需很平安。从客户机登录到服务器上时,口令不以纯文本体例发送;不外一切后续SQL命令将以纯文本体例发送。为到达更高的平安性,利用ssh来设置端口转发。它将服务器和客户机之间的一切通讯举行加密,避免有人在传输中察看它。来自客户机的数据发送到客户机当地呆板中当地ssh服务器所侦听的端口上。它由当地ssh服务器利用,加密后发送给远程ssh服务器,由它举行解密并转发到MySQL服务器端口。
在实践中,最平安的办法是在Web服务器地点的呆板上运转数据库服务器,并让由Web服务器发生的CGI剧本经由过程UNIX(当地)套接字与MySQL服务器举行通讯。该设置可让数据库办理员禁用一切与MySQL服务器的远程毗连。假如Web和数据库服务器必需位于分歧的呆板上,加密它们之间的一切通讯,大概将两台呆板经由过程其本人公用的、物理上断绝的收集毗连。只创立一个由Web服务器利用的用户帐户(除root用户外)以登录到数据库服务器。
由数据库驱动的网站是一些功效壮大的工具,可让开辟者创立供应更新信息的静态站点,并让由客户机倡议的变动在多个会话之间延续。后端数据库的利用关于办理电子商业和别的使用的用户来讲必不成少。经由过程利用可收费取得的软件,有大概创建由数据库驱动的站点,平安地将数据库连通性集成到站点现有的CGI系统布局中。
一些典型的RDBMS功能并不总是在DBaaS系统中可用。例如MySQL学习教程,WindowsAzureSQLDatabase(以前的SQLAzure)是微软的DBaaS产品,提供了一个类似于SQLServer的数据库平台。 |
|