仓酷云 发表于 2015-1-16 20:12:57

绝无经由的懂得MySQl数据库目次

解决方案提供商开始推动DBaaS浪潮之前,他们应该深入了解究竟什么是DBaaS。数据库目次是MySQL数据库服务器寄存数据文件的中央,不但包含有关表的文件,还包含数据文件和MySQL的服务器选项文件。分歧的分发,数据库目次的缺省地位是分歧的。
数据目次的地位
缺省的数据库地位
缺省数据库的地位编译在服务器中。
◆假如您是在一个源程序分发包中安装MySQL,典范的缺省地位多是/usr/local/var;
◆假如在二进制分发包中安装MySQL,则为/usr/local/mysql/data;
◆在RPM文件中安装,为/var/lib/mysql。
◆关于windwos平台上的分发,其地位时BASEDIRdata
数据目次的地位能够在启动服务器时经由过程--datadir=/path/to/dir明白地指定。假如您想将数据目次安排在其他中央而非缺省的地位,则这个选项是有效的。
懂得数据库目次的地位
作为一位MySQL办理员,您应当晓得数据目次在那里。假如运转多个服务器,那末您应当把握一切数据目次的地位。可是,假如不晓得目次的地位(也许您正在取代前一名办理员,而他留下的纪录很糟),有几种办法能够用来查找它:
1、可以使用mysqladmin变量间接从服务器中失掉数据目次路径名。在UNIX中,输入了局相似于以下所示:
$mysqladminvariables
+-------------------------+---------------------------
|Variable_name|Value
+-------------------------+---------------------------
|ansi_mode|OFF
|back_log|50
|basedir|/var/local
|connect_timeout|5
|concurrent_insert|ON
|datadir|/usr/local/var

该输入了局指了然服务器主机中数据目次的地位/usr/local/var。
在Windows中,输入了局相似于以下所示:
c:mysqlin>mysqladminvariables
+-------------------------+---------------------------
|Variable_name|Value
+-------------------------+---------------------------
|ansi_mode|OFF
|back_log|50
|basedir|c:mysql
|connect_timeout|5
|concurrent_insert|ON
假如正在运转多个服务器,它们将监听分歧的TCP/ip端标语和套接字。能够经由过程供应符合的--port或--socket选项毗连到每一个服务器监听的端口和套接字上:
$mysqladminCport=port=port_numvariables
$mysqladminCsocket=/path/to/socketvariables
mysqladmin命令可在您毗连服务器的任何一台主机上运转。假如必要毗连到远程主机上的服务器,则利用--host=host_name选项:
$mysqladminChost=host_namevaribles
2、在Unix平台上,可以使用ps来检察任何以后实行mysql历程的命令行。试一试以下的命令(依据您的体系所撑持的ps版本)并查找显现在输入了局中的这些命令的--datadir:
$psau|grepmysqld
假如体系运转多个服务器(由于一次发明了多个数据目次地位),则ps命令将会出格有效。它的弱点是:ps必需运转在服务器的主机上,而且除非--datadir选项在mysqld命令行中明白指定,不然将发生无用的信息。
3、假如MySQL从源程序分发包中安装,能够反省其设置信息以断定数据目次的地位。比方,在第一流的Makefile中该地位是可用的。可是,要当心:地位是Makefile中的变量localstatedir的值,而不是datadir的值。一样,假如分发包定位在NFS拆卸文件体系中,而且是用于为几个主机创建MySQL的,则设置信息反应比来创建分发包的主机。它大概不显现您感乐趣的主机的数据目次。
4、假如后面的任何办法都不乐成,可以使用find搜刮数据库文件。以下命令将搜刮.frm(形貌)文件,它是MySQL安装程序的构成部分:
$find/-name“*.frm”CPRint
在windows平台上的搜刮十分复杂,本节就不给出例子了。
在本章的这些例子中,笔者将MySQL数据目次的地位暗示为DATADIR。您能够将其注释成为您本人的呆板中的数据目次的地位。


数据库的暗示法
由MySQL办理的每一个数据库都有本人的数据库目次,它们是数据目次的子目次,与所暗示的数据库有不异的称号。比方,数据库my_db对应于数据库目次DATADIR/my_db。
这个暗示法使得几个数据库级的语句的完成长短常简单的。CREATEDATABASEdb_name利用只同意对MySQL服务器用户(服务器运转的UNIX用户)举行会见的一切权和体例,并在数据目次中创立一个空目次db_name。这等价于以服务器主机中的服务器用户的身份经由过程实行以下命令手工创立数据库:
$mkdirDATADIR/db_name创立数据库目次
$chmod700DATADIR/db_name使它仅对MySQL服务器用户可会见
经由过程空目次暗示新数据库的办法与其他数据库体系完整分歧,那些数据库体系乃至要为“空”数据库创立很多把持文件或体系文件。
DROPDATABASE语句也很简单完成。DROPDATABASEdb_name删除数据目次中的db_name目次和个中的一切表文件。这个语句相似于以下命令:
$rm-rfDATADIR/db_name
其区分是,服务器只删除带有表的扩大名的文件。假如已在该数据库目次中创立了其他的文件,服务器将使它们坚持完全,而且不删除该目次自己。
SHOWDATABASE只不外是对应位于数据目次中的子目次称号的一个列表。有些数据库体系必要保存一个列出一切必要保护的数据库的主表,可是,在MySQL中没有如许的布局。因为数据目次布局的复杂性,数据库的列表是隐含在该数据目次的内容中的,像主表如许的表大概会引发不用要的开支。
数据库表的暗示法
数据库中的每一个表在数据库目次中都作为三个文件存在:一个格局(形貌)文件、一个数据文件和一个索引文件。每一个文件的基名是该表名,扩大名指明该文件的范例。扩大名如表5-1所示。数据和索引文件的扩大名指明该表是不是利用较老的ISAM索引或较新的MyISAM索引。

当公布界说一个表布局的CREATETABLEtbl_name语句时,服务器创立tbl_name.frm文件,它包括该布局的外部编码。该语句还创立空的数据文件和索引文件,这些文件的初始信息标明没有纪录和索引(假如CREATETABLE语句包括索引申明,则该索引文件将反应这些索引)。形貌表的文件的一切权和体例被设置为只同意对MySQL服务器用户的会见。
当公布ALTERTABLE语句时,服务器对tbl_name.frm从头编码并修正数据文件和索引文件的内容以反应由该语句标明的布局变更。关于CREATE和DROPINDEX也是云云,由于服务器以为它们等价于ALTERTABLE语句。DROPTABLE删除代表该表的三个文件。
只管能够经由过程删除数据库目次中的对应某个表的三个文件来删除该表,但不克不及手工创立或变动表。比方,假如my_db是以后的数据库,DROPTABLEmy_tbl大抵等价于以下命令:
来自于SHOWTABLESmy_db的输入了局恰是my_db数据库目次中.frm文件基名的一个列表。某些数据库体系保护一个列出了数据库中的一切表的挂号。但MySQL不如许做,由于没有需要,这个“挂号”隐含在了数据目次的布局中。
MySQL的形态文件
除数据库目次外,MySQL数据目次还包括很多形态文件。表10-3归纳综合先容了这些文件。年夜多半形态文件的缺省称号从服务器主机名字中天生,在此表中暗示为HOSTNAME。

服务器在启动时将它的历程ID(PID)写进PID文件,并在封闭时删除该文件。PID文件是一种办法,用这类办法,其他的历程能够找到该服务器。比方,假如您在体系封闭时运转mysql.server剧本来封闭MySQL服务器,则该剧本将反省PID文件以断定它必要哪一个历程来发送一个停止旌旗灯号。
毛病日记由safe_mysqld发生,作为服务器尺度毛病输入了局的重定向,它包括服务器写进stderr的一切动静。这意味着仅当经由过程挪用safe_mysqld启动服务器时,毛病日记才存在(总之,这是启动服务器的首选办法,由于,假如因为一个毛病使毛病日记存在,则safe_mysqld将从头启动服务器)。
惯例日记和更新日记是可选的,能够用--log和--log-update服务器选项开启必要的日记范例。
惯例历程供应有关服务器运作的惯例信息:谁从那里举行了毗连,和他们公布了甚么查询。更新日记也供应查询信息,但仅仅是修正过的数据库内容的查询信息。更新日记的内容是一些SQL语句,这些语句能够经由过程将它们输出到mysql客户机程序来运转。假如呈现溃散且必需转到备份文件时,更新日记将是有效的,由于您可以经由过程将更新日记输出到服务器来反复这些自溃散以来所完成的更新操纵。这将使得数据库恢复到溃散产生时所处的形态上。
上面是一个实例,它是作为一个短客户时机话的了局呈现在惯例日记中的信息中的,这个会话在test数据库中从mytest.pet复制一个表,并拔出一行到该表中,然后删除该表:

注重第二行是一个毛病的语句,可是也被纪录上去。
惯例日记包括日期和工夫、服务器线程ID、事务范例和特定事务信息的列。
统一个会话呈现在以下的更新日记中:
usetest;
createtablemytestselect*frommytest.pet;
insertintomytestsetname=tom,owner=jerry,species=cat,sex=f,birth=2000-01-01;
droptablemytest;

更新记录中没有纪录毛病的语句,因而关于恢复被损坏的数据库内容十分成心义。
关于更新日记,日记的扩大格局是可用的,即便是用--log-long-format选项。扩大的日记供应有关谁什么时候公布查询的信息。固然,这将利用更多的磁盘空间,可是,假如您不将更新日记的内容与惯例日记中的毗连事务相接洽就想晓得谁正在做甚么的话,扩大日记也许是可用的。
确保日记文件的平安且不被用户恣意读取是个好注重。惯例日记和更新日记都包括有诸如口令如许的敏感信息,这是由于它们包括了查询的文本。上面是您不想让任何人都能读取的日记项,由于它显现了root用户的口令:
01020623:30:024Queryupdatemysql.usersetpassWord=password("peking77.")whereUser="root"
有关反省可设置数据目次允许权的信息,数据目次平安的冗长指令由以下命令构成:
$chmod700DATADIR
以具有该数据目次的UNIX用户身份来运转此命令。还要确保服务器以该用户身份运转,不然此命令不但将其他用户排挤在该数据目次以外(您想要的),还将制止服务器会见您的数据库(您不要的)。
形态文件呈现在数据目次的第一流,就像数据库目次一样,因而您大概会想到那些文件的名字是不是会互相搅浑大概被误以为是数据库名(比方,当服务器正在实行SHOWDATABASE语句时)。谜底是:不会的。形态和日记信息存储在文件中,而数据库是目次,因而可实行程序能够将它们与一个复杂的stat()挪用相区分(是服务器告知它们如何辨别的)。假如您正在监督数据目次,则能够经由过程利用ls-l将形态文件从数据库目次中辨别开来,而且反省该形式信息的第一个字符以检察它是‘-’仍是‘d’:
您还能够经由过程检察名字而复杂地告之:一切形态文件名都包括一个句点,可是数据库目次名没有句点(句点不是数据库名的正当字符)。


总结
经由过程本节,读者能够对MySQL的数据保留体例有了必定的熟悉。本节中较为主要的内容有:
1、数据库目次的地位
2、MySQL是怎样暗示数据表的
3、MySQL的形态文件的品种和感化
懂得MySQL怎样保留数据,和形态文件的感化,关于备份数据库是有主要意义的,依据MySQL数据库目次的特性,间接拷贝就是备份数据的主要办法之一。
客户还是可以使用DBaaS系统所能提供的所有能力。数据库云服务消除了组织对专职人员、本地数据库存储设备的需要。他们不必安装、配置和维护任何软硬件。

海妖 发表于 2015-1-18 18:47:59

很多书籍啊,不过个人认为看书太慢,还不如自己学。多做实际的东西,就会遇到很多问题,网上搜下解决问题。不断重复这个过程,在配合sql的F1功能。

admin 发表于 2015-2-5 10:24:36

也可谈一下你是怎么优化存储过程的?

第二个灵魂 发表于 2015-2-11 09:33:35

备份方面可能还是一个老大难的问题。不能单独备份几个表总是感觉不爽。灵活备份的问题不知道什么时候才能解决。

金色的骷髅 发表于 2015-3-2 10:18:46

从项目平台的选择上讲,我们关心的,应该是一款产品能不能满足任务需求,而不是网上怎么说。

透明 发表于 2015-3-11 03:40:32

不过话说回来了,绝大多数的性能优化准则与对sqlserver存储的结构理解息息相关

莫相离 发表于 2015-3-17 20:10:42

发几份SQL课件,以飨阅者

小魔女 发表于 2015-3-25 01:21:48

呵呵,这就是偶想说的
页: [1]
查看完整版本: 绝无经由的懂得MySQl数据库目次