|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
理解网站这一概念之后不难看出,任何网站都是由网页组成的,也就是说想完成网站,必须先学会做网页,因此必须要掌握了HTML,才能为今后制作网站打下基础。mysql|数据|数据目次 MySQL数据目次布局(1)
[晏子]
从概念上讲,大多半关系数据库体系是类似的:它们有一系列数据库构成,每一个数据库包括一系列数据库表,但每一个体系有各自组织其办理的数据体例,MySQL也不破例。
缺省地,一切由MySQL办事器mysqld办理的数据存储在一个称为MySQL数据目次的中央,一切数据库都寄存在哪儿,也包含供应办事器操作信息的形态文件。假如你对一个MySQl装置履行办理义务,你应当熟知数据目次的结构及用处。
本文引见以下专题:
- 若何肯定数据目次的地位。
- 办事器若何组织并供应对数据库和它办理的表的会见。
- 在哪里找到由办事器生成的形态文件记忆它们包括甚么内容。
- 若何改动缺省地址或数据目次或独自数据库的组织布局。
1、数据目次的地位
一个缺省数据目次被编译进了办事器,假如你从一个源代码分发装置MySQL,典范的缺省目次为/usr/local/var,假如从RPM文件装置则为/var/lib/mysql,假如从一个二进制分发装置则是/usr/local/mysql/data。
在你启动办事器,经由过程利用一个--datadir=/path/to/dir选项可以明白指定命据目次地位。假如你想把数据目次置于其它缺省地位外的某处,这很有效。
作为一位MySQL办理员,你应当晓得你的数据目次在哪里。假如你运转多个办事器,你应当是到一切数据目次在哪里,然而假如你不晓得切实的地位,由多种办法找到它:
- 利用mysqladmin variables从你的办事器直接取得数据目次途径名。查找datadir变量的值,在Unix上,其输入相似于:
%mysqladmin variables- +----------------------+----------------------+| variable_name | Value |+----------------------+----------------------+| back_log | 5 || connect_timeout | 5 || basedir | /var/local/ || datadir | /usr/local/var/ |....
复制代码 在Windows上,输入能够看上去像如许:
c:\mysqladmin variables- +----------------------+----------------------+| variable_name | Value |+----------------------+----------------------+| back_log | 5 || connect_timeout | 5 || basedir | c:\mysql\ || datadir | c:\mysql\data\ |....
复制代码 假如你有多个办事器在运转,它们将在分歧的TCP/IP端口或套接字上监听,经由过程供应毗连办事器正在监听的端口或套接字的--port或--socket选项,你可以轮番取得它们每个的数据目次信息:
%msqladmin --port=port_name variables
%mysqladmin --socket=/path/to/socket variables
mysqladmin号令可运转在任何你能从其毗连办事器的主机上,假如你想在一个近程主机毗连办事器,利用一个--host=host_name选项:
%mysqladmin --host=host_name variables
在Windows上,你可以经由过程利用--pipe强迫一个号令管道毗连和--socket=pipe_name指定管道名来毗连监听一个号令管道的NT办事器:
c:\mysqladmin --pipe --socket=pipe_name variables
- 你可使用ps号令检查任何正在运转mysqld 历程的号令行。
试一下以下号令之一并寻觅--datadir:
%ps axww | grep mysql BSD作风
%ps -ef | grep mysqld System V作风
假如你的体系运转多个办事器,ps号令能够出格有效,由于你能即刻发明多个数据目次地位,弱点是必需在办事器上运转,并且能够没有有效的信息发生,除非在mysqld号令行上明白指定了--datadir选项。
- 假如MySQL是从一个源代码分发装置的,你可以反省其设置装备摆设信息肯定数据目次地位。例如,地位可从顶级Makefile中取得,然而注重,地位是Makefile中的localstatedir值,不是datadir,并且,假如分发位于一个NFS挂载的文件体系并用来为多个主机构建MySQL,设置装备摆设信息反应了分发被最新构建的主机,这能够不克不及供应你感乐趣的主机的数据目次信息。
- 假如上述体例掉败,你可以用find寻觅数据库文件,以下号令寻觅“.frm”文件,它是任何MySQL装置的一局部:
% find / -name ".frm" -print
鄙人文各例中,用DATADIR暗示MySQL数据目次地位。
2、数据目次布局
MySQL数据目次包括了办事器办理的一切数据目次,这些文件被组织成一个树状布局,经由过程使用Unix或Windows文件体系的条理布局直接完成。
- 每一个数据库对应于数据目次下的一个目次。
- 在一个数据库中的表对应于数据目次下的文件。
数据目次也包括由办事器发生的几个形态文件,如日记文件。这些文件供应了关于办事器操作的主要信息。对办理出格在出了成绩而试图肯定成绩缘由时很有价值。例如,假如某个特定查询杀逝世办事器,你可以经由过程反省日记文件辨别扰乱的查询。2.1 MySQL办事器如何供应对数据的会见
在数据目次下的一切由一个独自的实体-MySQL办事器mysqld办理,客户法式毫不直接操作数据。相反,办事器供应数据可会见的切入点,它是客户法式与它们想利用的数据之间的中介。
当办事器启动时,假如有需求,它翻开日记文件,然后经由过程监听收集毗连位数据目次出现一个收集接口。要会见数据,客户法式创立对办事器的一个毗连,然后以MySQL查询传输恳求来履行但愿的操作。办事器履行每个操作并将了局发还用户。办事器是多线程的并能办事多个同时的客户毗连。但是,由于修正操作一个履行一个,实践后果是按次化恳求,以使两个客户决不克不及在统一时辰改动统一纪录。
在正常的情形下,让办事器作为数据库会见的独一仲裁者供应了防止可从同时会见数据库表的多个历程的损坏的包管。办理员应当晓得有时办事器没有对数据目次的专制掌握。
- 当你在一个单个数据目次上运转多个办事器。普通倪云新一个办事器办理主机上的一切数据库,然而有能够运转多个办事器。假如这完成供应对多个自力数据目次的会见,没有互相影响的成绩,但哟也能启动多个办事器并指向统一个目次。普通地,这不是一个好主张。假如你试图如许,最好是你的体系供应优秀的文件锁定功效,不然办事器将不克不及准确协作。假如你将多个办事器同时写入日记文件,你也冒着你的日记文件称为凌乱的本源的风险。
- 在你运转isamchk和myisamchk时。isamchk和myisamchk适用法式用于表的保护、诊错和修复,就想你想的那样,由于这些法式可以修正表内容,答应它们与办事器正在操作的同时对表操作,如许能招致表破坏。了解若何限制这类互相影响是很主要的,如许你不会破坏你的表。
2.2 数据目暗示
每一个MySQL办事器办理的数据库有本人的数据库表,它是数据目次下的一个子目次,其名字与它暗示的数据库不异。例如数据库my_db对应于数据库目次DATADIR/my_db。
这类暗示答应多个数据库级的语句在其完成中非常复杂。CREATE DATABASE db_name在数据目次中创立一个db_name空目次,具有只答应MySQL办事器用户(运转办事器的Unix用户)的属主和形式,这等价于以下手工在办事器主机上创立数据库:- %mkdir DATADIR/db_name%chmod 700 DADADIR/db_name
复制代码 用一个空目次暗示一个新数据库的最复杂办法与其它数据库乃至为一个空数据库创立大批的掌握文件或体系文件正好相反。
DROP DATABASE语句完成一样复杂。DROP DATABASE db_name删除数据库中的db_name目次和一切表文件,这几近与以下号令一样:(不同是办事器只删除具有已知用于表的后缀名的文件。假如你在数据库目次创立了其它文件。则办事器保存它们,并且目次自己不被删除。
SHOW DATABASE根基上不做甚么,只是列出位于数据目次中的目次名。有些数据库体系坚持一个主表,用于保护一切数据库,但在MySQL无此构件。因为付与数据目次布局的简约性,数据库列表隐含在数据目次的内容中,并且如许的表不用有额定的开支。2.3 数据库表的暗示
每一个数据库在数据库目次中有3个文件:一个款式(描写文件)、一个数据文件和一个索引文件。每一个文件的根基名是表名,文件名扩大名代表文件类型。扩大名以下表。数据和索引文件的扩大名指出表利用老式IASM索引或旧式MyISAM索引。表 MySQL文件类型文件类型文件名扩大名文件内容款式文件.frm描写表的布局(它的列、列类型、索引等)。数据文件.ISD(ISAM)
或.MYD(MyISAM)包括数据文件上的一切索引的索引树。索引文件.ISM(ISAM)
或.MYI(MyISAM)该索引文件依附表是不是有索引而存在。
当你收回一条CREATE TABLE tbl_name时语句界说表的布局时,办事器创立一个名为tbl_name.frm的文件,它包含该布局的外部编码,同时也创立一个空数据和索引文件,初始化为包括指出无纪录和无索引的信息(假如CREATE TABLE语句包含索引指定,索引文件反应出这些索引)。对应于表的文件的属主和形式被设置为只答应MySQL办事器用户会见。
当你收回一条ALTER TABLE tbl_name语句时,办事重视新编码tbl_name.frm,并修正数据和索引文件的内容以反应语句指定的布局改动。关于CREATE INDEX和DROP INDEX也是一样,由于它们被办事器视为与ALTER TABLE等价。DROP TABLE经由过程删除对应于表的三个文件来完成。
固然你可以经由过程删除数据库目次中对应于表的三个文件,但不克不及手工创立或修正一个表,如,假如my_db是以后数据库,DROP TABLE my_tbl也许等价于以下号令。
% rm -rf DATADIR/my_db/my_tbl.*
SHOW TABLE my_db的输入只是列出my_db数据库目次中的.frm文件的基文件名。有些数据库体系一个注册表,罗列一切包括在一个数据库中的表,MySQL不是,由于不用要,“注册表”隐含在数据目次的布局中。2.4 操作体系对数据库和表定名的限制
MySQL对定名数据库和表有一个准绳:
- 名字可以由以后字符集中的任何字母数字字符构成,下划线和美元符$也能够。
- 名字最长为64个字符。
但是,由于数据库和表的名字对应于目次和文件名,办事器运转的操作体系能够强加额定的限制。
起首,数据库和表名仅限于对文件名正当的字符,如$在MySQL的准绳中是答应的,然而假如你的操作体系不答应,则你不克不及在目次或表名中利用它。实践上,这对Unix或Windows不是所忧虑的,最大的难度是在履行数据库办理时直接在shell中援用名字,例如,假如你定名一个数据库如$my_db,包括一个美元符,任何从shell中对该名字的援用能够被shell注释为对一个变量的援用:
%ls $my_db
my_db:undefined variable
对此,你必需本义$字符或用引号制止其特别寄义:
%ls \$my_db
%ls '$my_db'
假如你用引号,必定要用单引号,而双引号其实不制止变量注释。
其次,固然MySQL答应数据库和表名最长到64个字符,但名字的长度受限于你的操作体系限制的长度,普通这不是一个成绩(固然老的System V强迫14个字符)。在这类情形下,你数据库名的下限为14个字符,而表名下限为10个字符,由于暗示表的文件名有一个点(.)和三个字符的扩大名。
第三,文件体系的巨细写敏理性影响到你若何定名和援用数据库和表名。假如文件体系是巨细写敏感的(如Unix),两个名字my_tbl和MY_TBL是分歧的表。假如文件体系不是巨细写敏感的(如Windows),这两个名字指的是不异的表。假如你用一个Unix办事器开辟数据库,而且假如你有能够转移到Windows,你应当记住这一点。2.5 MySQL形态文件
除数据库目次,MySQL数据目次还包括良多形态文件,这些文件总结鄙人表中。大多半文件的缺省名从办事器主机名生成,鄙人表中暗示为HOSTNAME。表 MySQL形态文件文件类型缺省名文件内容历程IDHOSTNAME.pid办事器历程的ID失足日记HOSTNAME.err启动和封闭事务和失足情形普通日记HOSTNAME.log毗连/断开事务和查询信息更新日记HOSTNAME.nnn修正表布局级内容的一切查询文本
当办事器启动时,它将其历程ID写入历程ID(PID)文件中,而在它封闭时,删除该文件。PID文件是答应办事器自己被其他历程找到的东西。例如,假如你运转mysql.server,在体系封闭时,封闭MySQL办事器的剧本反省PID文件以决意它需求向哪一个历程收回一个终止旌旗灯号。
失足日记由safe_mysqld创立,作为办事器尺度失足输入的重定向,它包括任何邪到stderr的动静。这意味着只要你经由过程挪用safe_mysqld启动办事器,失足文件才存在(不管若何,它是一个启动办事器的最好办法,由于假如它因为失足而加入,safe_mysqld将重启办事器。)。
普通日记和更新日记是可选的。你可以只开启你需求的日记类型,用--log和--log-update办事器选项。
普通日记供应办事器操作的普通信息:谁从哪里毗连办事器和他们收回甚么查询。更新日记供应查询信息,但只要修正数据库内容的查询。更新日记内容被写成SQL语句,可以将它们供应给mysql客户法式来履行。假如你赶上溃散,而且必需倒回备份文件,更新日记就很有效,由于你能反复履行自溃散时的更新,经由过程将更新日记反应给办事器,这答应你将数据库恢复到溃散产生时的形态。
上面是一个复杂的例子,信息呈现在普通日记中,它是一个创立一个在数据库test中表,拔出一行,然后删除表的会话:- 990509 7:37:09 492 Connect Paul@localhost on test 492 Query show databases 492 Query show tables 492 Field List tbl_1 492 Field List tbl_2 ...990509 7:34:22 492 Query CREATE TABLE my_tbl (val INT)990509 7:34:34 492 Query INSERT INTO my_tbl values (1)990509 7:34:38 492 Query DROP TABLE my_tbl 990509 7:34:40 492 Quit
复制代码 普通日记包括日期和工夫、办事器历程ID、事务类型和事务信息栏目。
统一个会话呈现在更新日记中看上去像如许:- use test;CREATE TABLE my_tbl (val int);INSERT INTO my_tbl VALUES(1);DROP TABLE my_tbl;
复制代码 对更新日记,用--log-long-format选项取得一个扩大模式的日记,扩大日记供应有关谁什么时候收回每条查询,这利用更多的磁盘空间,但假如你想晓得谁在做甚么,而不必将更新日记对比普通日记的内容找到毗连事务。
对下面的会话,扩大更新日记发生如许的信息:- # Time: 990507 7:32:42# User@Host: paul [paul] @ localhost []use test;CREATE TABLE my_tbl (val int);# User@Host: paul [paul] @ localhost []INSERT INTO my_tbl VALUES(1);# Time: 990507 7:32:43# User@Host: paul [paul] @ localhost []DROP TABLE my_tbl;
复制代码 包管你的日记文件平安而且不让恣意用户读取是个好主张。普通日记和更新日记都能包括诸如口令等的敏感信息,由于它们包括查询文本。如:- 990509 7:23:31 4 Query UPDATE user SET Password=PASSWORD("secret") WHERE user="root"
复制代码 关于反省和设置数据目次的权限,请见《MySQL平安性指南》。使数据目次安性的指令包括以下号令:
% chmod 700 DATADIR
以具有数据目次的Unix用户运转此号令。确保办事器也以此用户运转,不然该号令不但将其它人拒之门外,它也禁止办事器会见你的数据库。
形态文件呈现在数据目次的顶级目次,就象数据库目次,所以你能够忧虑这些文件名是不是与数据库名抵触或失足(如在办事器履行SHOW DATABASES语句时)。谜底是不。形态和日记文件信息存储在文件中,而数据库是目次,所以可履行法式能用一个复杂的stat()挪用辨别它们。假如你看一下数据目次,你可以辨别形态文件和数据库目次,用ls -l并反省形式的第一个字符是一个"_"仍是一个"d"。
你也能够复杂地看一下名字,一切形态文件名包括一个点("."),而数据库目次没有(.在数据库名中是有效字符)。
大部分语言的基础,不是说c有多好,而是c相对起手容易学,让你认为这个是编程语言, |
|