📄 1840.html
字号:
使两个客户决不能在同一时刻改变同一记录。<br>
在正常的情况下,让服务器作为数据库访问的唯一仲裁者提供了避免可从同时访问数据<br>
库表的多个进程的破坏的保证。管理员应该知道有时服务器没有对数据目录的独裁控制。<br>
当你在一个单个数据目录上运行多个服务器。一般倪云新一个服务器管理主机上的所有<br>
数据库,但是有可能运行多个服务器。如果这完成提供对多个独立数据目录的访问,没有相<br>
互影响的问题,但哟也能启动多个服务器并指向同一个目录。一般地,这不是一个好主意。<br>
如果你试图这样,最好是你的系统提供良好的文件锁定功能,否则服务器将不能正确协作。<br>
如果你将多个服务器同时写入日志文件,你也冒着你的日志文件称为混乱的根源的风险。<br>
在你运行isamchk和myisamchk时。isamchk和myisamchk实用程序用于表的维护、诊错和<br>
修复,就想你想的那样,因为这些程序可以修改表内容,允许它们与服务器正在操作的同时<br>
对表操作,这样能导致表损坏。理解如何限制这种相互影响是很重要的,这样你不会损坏你<br>
的表。<br>
<br>
2.2 数据目表示<br>
每个mysql服务器管理的数据库有自己的数据库表,它是数据目录下的一个子目录, 其<br>
名字与它表示的数据库相同。例如数据库my_db对应于数据库目录DATADIR/my_db。<br>
这种表示允许多个数据库级的语句在其实现中十分简单。 CREATE DATABASE db_name在<br>
数据目录中创建一个db_name空目录,具有只允许mysql服务器用户(运行服务器的Unix用户)<br>
的属主和模式,这等价于下列手工在服务器主机上创建数据库:<br>
%mkdir DATADIR/db_name%chmod 700 DADADIR/db_name<br>
用一个空目录表示一个新数据库的最简单方法与其它数据库甚至为一个空数据库创建大<br>
量的控制文件或系统文件正好相反。<br>
DROP DATABASE语句实现同样简单。 DROP DATABASE db_name删除数据库中的db_name目<br>
录和所有表文件,这几乎与下列命令一样:<br>
%rm -rf DATADIR/db_name<br>
(差别是服务器只删除具有已知用于表的后缀名的文件。 如果你在数据库目录创建了其<br>
它文件。则服务器保留它们,而且目录本身不被删除。<br>
SHOW DATABASE基本上不做什么,只是列出位于数据目录中的目录名。 有些数据库系统<br>
保持一个主表,用于维护所有数据库,但在mysql无此构件。由于赋予数据目录结构的简洁性,数据库列表隐含在数据目录的内容中,而且这样的表不必有额外的开销。<br>
<br>
2.3 数据库表的表示<br>
每个数据库在数据库目录中有3个文件:一个样式(描述文件)、 一个数据文件和一个<br>
索引文件。每个文件的基本名是表名,文件名扩展名代表文件类型。扩展名如下表。数据和<br>
索引文件的扩展名指出表使用老式IASM索引或新式MyISAM索引。表 mysql文件类型<br>
文件类型 文件名扩展名 文件内容<br>
样式文件 .frm 描述表的结构(它的列、列类型、索引等)。<br>
数据文件 .ISD(ISAM)<br>
或.MYD(MyISAM) 包含数据文件上的所有索引的索引树。<br>
索引文件 .ISM(ISAM)<br>
或.MYI(MyISAM) 该索引文件依赖表是否有索引而存在。<br>
当你发出一条CREATE TABLE tbl_name时语句定义表的结构时,服务器创建一个名为<br>
tbl_name.frm的文件,它包括该结构的内部编码,同时也创建一个空数据和索引文件,初始<br>
化为包含指出无记录和无索引的信息(如果CREATE TABLE语句包括索引指定,索引文件反映<br>
出这些索引)。对应于表的文件的属主和模式被设置为只允许mysql服务器用户访问。<br>
当你发出一条ALTER TABLE tbl_name语句时,服务器重新编码tbl_name.frm,并修改数<br>
据和索引文件的内容以反映语句指定的结构改变。对于CREATE INDEX和DROP INDEX也是一样,<br>
因为它们被服务器视为与ALTER TABLE等价。 DROP TABLE通过删除对应于表的三个文件来实<br>
现。<br>
虽然你可以通过删除数据库目录中对应于表的三个文件,但不能手工创建或修改一个表,<br>
如,如果my_db是当前数据库,DROP TABLE my_tbl大概等价于下列命令。<br>
% rm -rf DATADIR/my_db/my_tbl.*<br>
SHOW TABLE my_db的输出只是列出my_db数据库目录中的.frm文件的基文件名。 有些数<br>
据库系统一个注册表,列举所有包含在一个数据库中的表,mysql不是,因为不必要,"注册<br>
表"隐含在数据目录的结构中。<br>
<br>
2.4 操作系统对数据库和表命名的限制<br>
mysql对命名数据库和表有一个原则:名字可以由当前字符集中的任何字母数字字符组成,<br>
下划线和美元符$也可以。名字最长为64个字符。<br>
然而,因为数据库和表的名字对应于目录和文件名,服务器运行的操作系统可能强加额<br>
外的限制。<br>
首先,数据库和表名仅限于对文件名合法的字符,如$在mysql的原则中是允许的,但是<br>
如果你的操作系统不允许,则你不能在目录或表名中使用它。实际上,这对Unix或Windows<br>
不是所担心的,最大的难度是在执行数据库管理时直接在shell中引用名字,例如,如果你<br>
命名一个数据库如$my_db,包含一个美元符,任何从shell中对该名字的引用可能被shell<br>
解释为对一个变量的引用:<br>
%ls $my_db<br>
my_db:undefined variable<br>
对此,你必须转义$字符或用引号禁止其特殊含义:<br>
%ls $my_db<br>
%ls '$my_db'<br>
如果你用引号,一定要用单引号,而双引号并不禁止变量解释。<br>
其次,虽然mysql允许数据库和表名最长到64个字符, 但名字的长度受限于你的操作系<br>
统限定的长度,一般这不是一个问题(虽然老的System V强制14个字符)。在这种情况下,<br>
你数据库名的上限为14个字符,而表名上限为10个字符,因为表示表的文件名有一个点(.)<br>
和三个字符的扩展名。<br>
第三,文件系统的大小写敏感性影响到你如何命名和引用数据库和表名。如果文件系统<br>
是大小写敏感的(如Unix),两个名字my_tbl和MY_TBL是不同的表。如果文件系统不是大小<br>
写敏感的(如Windows),这两个名字指的是相同的表。 如果你用一个Unix服务器开发数据<br>
库,并且如果你有可能转移到Windows,你应该记住这一点。<br>
<br>
2.5 mysql状态文件<br>
除了数据库目录,mysql数据目录还包含很多状态文件,这些文件总结在下表中。 大多<br>
数文件的缺省名从服务器主机名生成,在下表中表示为HOSTNAME。表 mysql状态文件<br>
文件类型 缺省名 文件内容<br>
进程ID HOSTNAME.pid 服务器进程的ID<br>
出错日志 HOSTNAME.err 启动和关闭事件和出错情况<br>
一般日志 HOSTNAME.log 连接/断开事件和查询信息<br>
更新日志 HOSTNAME.nnn 修改表结构级内容的所有查询文本<br>
<br>
当服务器启动时,它将其进程ID写入进程ID(PID)文件中,而在它关闭时,删除该文件。<br>
PID文件是允许服务器本身被其他进程找到的工具。例如,如果你运行mysql.server,在系统<br>
关闭时,关闭mysql服务器的脚本检查PID文件以决定它需要向哪个进程发出一个终止信号。<br>
出错日志由safe_mysqld创建,作为服务器标准出错输出的重定向,它包含任何发到stderr<br>
的消息。这意味着只有你通过调用safe_mysqld启动服务器,出错文件才存在(无论如何,<br>
它是一个启动服务器的最好方法,因为如果它由于出错而退出,safe_mysqld将重启服务器。)。<br>
一般日志和更新日志是可选的。你可以只开启你需要的日志类型,用--log和<br>
--log-update服务器选项。<br>
一般日志提供服务器操作的一般信息:谁从哪里连接服务器和他们发出什么查询。更新<br>
日志提供查询信息,但只有修改数据库内容的查询。更新日志内容被写成SQL语句, 可以将<br>
它们提供给mysql客户程序来执行。如果你遇上崩溃,并且必须倒回备份文件, 更新日志就<br>
很有用,因为你能重复执行自崩溃时的更新,通过将更新日志反馈给服务器,这允许你将数<br>
据库恢复到崩溃发生时的状态。<br>
下面是一个简单的例子,信息出现在一般日志中,它是一个创建一个在数据库test中表,<br>
插入一行,然后删除表的会话:<br>
990509 7:37:09 492 Connect Paul@localhost on test 492 Query show databases <br>
492 Query show tables 492 Field List tbl_1 492 Field List tbl_2 ...990509 <br>
7:34:22 492 Query CREATE TABLE my_tbl (val INT)990509 7:34:34 492 Query <br>
INSERT INTO my_tbl values (1)990509 7:34:38 492 Query DROP TABLE my_tbl <br>
990509 7:34:40 492 Quit<br>
<br>
一般日志包含日期和时间、服务器进程ID、事件类型和事件信息栏目。<br>
同一个会话出现在更新日志中看上去像这样:<br>
use test;CREATE TABLE my_tbl (val int);INSERT INTO my_tbl VALUES(1);<br>
DROP TABLE my_tbl;<br>
<br>
对更新日志,用--log-long-format选项获得一个扩展形式的日志, 扩展日志提供有关<br>
谁何时发出每一条查询,这使用更多的磁盘空间,但如果你想知道谁在做什么,而不用将更<br>
新日志对照一般日志的内容找到连接事件。<br>
对上面的会话,扩展更新日志产生这样的信息:<br>
# Time: 990507 7:32:42# User@Host: paul [paul] @ localhost []use test;<br>
CREATE TABLE my_tbl (val int);# User@Host: paul [paul] @ localhost <br>
[]INSERT INTO my_tbl VALUES(1);# Time: 990507 7:32:43# <br>
User@Host: paul [paul] @ localhost []DROP TABLE my_tbl; <br>
<br>
保证你的日志文件安全并且不让任意用户读取是个好主意。一般日志和更新日志都能包<br>
含诸如口令等的敏感信息,因为它们包含查询文本。如:<br>
990509 7:23:31 4 Query UPDATE user SET Password=PASSWORD("secret") WHERE user="root"<br>
<br>
对于检查和设置数据目录的权限,请见《mysql安全性指南》。 使数据目录安性的指令<br>
包含下列命令:<br>
% chmod 700 DATADIR<br>
以拥有数据目录的Unix用户运行此命令。确保服务器也以此用户运行,否则该命令不仅<br>
将其它人拒之门外,它也阻止服务器访问你的数据库。<br>
状态文件出现在数据目录的顶级目录,就象数据库目录,所以你可能担心这些文件名是<br>
否与数据库名冲突或出错(如在服务器执行SHOW DATABASES语句时)。答案是不。状态和日<br>
志文件信息存储在文件中,而数据库是目录,所以可执行程序能用一个简单的stat()调用区<br>
分它们。如果你看一下数据目录,你可以区分状态文件和数据库目录, 用ls -l并检查模式<br>
的第一个字符是一个"_"还是一个"d"。<br>
你也可以简单地看一下名字,所有状态文件名包含一个点("."),而数据库目录没有<br>
(.在数据库名中是无效字符)。<br>
<br>
MySQL数据目录结构(2)<br>
<br>
3 重定位数据库目录<br>
前面讨论的数据目录结构是缺省配置,所有数据库和状态文件均包含其中,然而,你有<br>
某些自由决定数据目录内容的位置,本节讨论为什么你可能移走部分数据目录(或甚至目录<br>
本身)、你能移走什么以及你如何做这些改变。<br>
MySQL允许你重定位数据目录或其中的成员,由几个原因你为什么要这样做:<br>
你能将数据目录放在你缺省所在的文件系统更大容量的文件系统上。<br>
如果你的数据目录在一个繁忙的硬盘上,你可能把它放在不太忙的磁盘上以均衡磁盘活<br>
动。你可以把数据库和日志文件放在分开的磁盘上或跨磁盘分布。<br>
你可能想运行多个服务器,各自有自己的数据目录,这是解决每个进程文件描述符限制<br>
问题的一种方法,特别是你不能重新配置内核以允许更高的限制。<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -