接口概述
接口是抽象方法和常量值的定义的集合,从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
接口纯粹是一种表达方式,而类则是设计和实现的混合体。
More …
1、
我们用关键字class声明类,类的声明创建一个类型名(type name)。
2、
类可以有三种类型的成员:
(1)域(field):与类及其他对象相关联的数据变量,其中保存着类或者对象的状态。
(2)方法(method):包含类的可执行代码并定义了对象的行为。
(3)嵌套类(nested class)和嵌套接口(nested interface):嵌套类和嵌套接口是那些嵌套在其他类或者其他接口中的类和接口。
3、
类声明的前面可以有类修饰符以指定类的特定属性:
(1)public:一个public类是可以公共访问的,任何人都可以声明对该类的对象的引用或者访问它的公共成员。如果没有该修饰符,类只能在自己的包内访问。
(2)abstract:一个抽象类被认为是不完整的,不能创建实例。通常,如果类中包含abstract方法,该方法就必须在子类中实现。
(3)final:final类不能有子类。
(4)strict floating point:定义了strictfp的类要求其中所定义的浮点算法都进行精确运算。
4、
类中的变量称为域(field),域的声明包括类型名、域名字和可选的初始化子句(initialization clause),该子句用于给予赋一个初始值。
+—————————-+
|类型名 |域名字 | 初始化子句 |
+—————————-+
|int | i | = 1; |
+—————————-+
5、
域声明的前面可以有如下修饰符:
(1)static
(2)final
(3)transient:与对象的串行化有关。
(4)volatile:与同步和内存模型有关。
6、
如果域没有初始化,那么其会被赋予默认的初始值:
+——————+
#类型 | 初始值 |
+——————+
#boolean | false |
#char | ‘\u0000’|
#btype |0 |
#short |0 |
#int |0 |
#long |0 |
#float |+0.0f |
#double |+0.0 |
#对象引用 |null |
+——————+
7、
有时我们希望一个域的实例被类的所有对象共享,这种域可以声明为static,称为静态域(static field)或类变量(class variable)。
当在类中声明一个static域后,就只存在这个域的一份拷贝,不管这个类创建了多少实例。
在我们自己的类中,static域可以直接访问,但从外部访问就要通过类名。示例如下:
System.out.println(Body.nextID);
其中,Body是一个自定义类,nextID是其中的一个静态域。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2009/08/11补充:
类的所有成员对类自身的代码代码而言,始终是可访问的,为了控制来自其他类的访问,类成员具有四种可能的控制修饰符:
private
private成员只能在自身中可以访问;
package
声明时不带访问修饰符的成员,只有相同包中干的代码可以访问。
proctected
子类、同一包中的类及类内部可以访问声明为protected的成员。
public
在类可以访问的地方,声明为public的成员都是可以访问的。
java是什么?
概括的说,Java是:
(1)一种编程语言;
(2)一种开发环境;
(3)一种应用环境;
(4)一种部署环境。
Java编程语言的风格十分接近C++语言。继承了C++ 语言面向对象技术的内核,Java舍弃了C++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间。在Java SE 1.5版本中Java又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 More …
Chapter 8. MySQL How-To
Table of Contents
8.1. 连接数据库服务器
8.2. 更新用户密码
8.3. MySQL读取配置文件的顺序
8.4. 重设置MySQL管理员密码的方法
8.5. NULL值
8.6. 使用SQL变量
8.7. 改变默认提示符
8.8. 非优化的全数据表DELETE操作
8.9. MySQL事务处理示例
8.1. 连接数据库服务器
$ ./mysql -h host_name -u user_name -p
-h host_name(–host=host_name),连接的数据库主机名,如果在本地主机上则可省略。
-u user_name(–user=user_name),数据库用户名,在unix系统上,如果系统的登录名与数据用户名一样,则可省略。在windows系统中,可通过设置环境变量USER来给出数据库用户名,如set USER=username。
-p(–password),提供数据库用户密码,有该选项mysql就会提示你输入密码。输入的密码以星号显示,以确保安全。也可直接在-p后写上密码(-p和密码间不能有空格),但这不安全,不推荐。
连接成功后,mysql数据库服务器会显示一些欢迎信息。接着就可用mysql>use database_name命令打开指定的数据库。
$ ./mysql -h host_name -u user_name -p database_name命令可直接打开指定数据库。
8.2. 更新用户密码
mysql>update user set password=passowrd(‘your passowrd’) where host=’%’;
刷新权限设置:mysql>flush privileges;
8.3. MySQL读取配置文件的顺序
my.cnf是MySQL数据库的配置文件,它存在多个地方,在/etc目录,数据目录和用户主目录都有。放在不同位置,里面的选项有不同的作用范围,下面是MySQL读取配置文件的顺序和作用。
mysql 读取配置文件的顺序:
/etc/my.cnf Global options.
DATADIR/my.cnf Server-specific options.
defaults-extra-file The file specified with the –defaults-extra-file option.
~/.my.cnf User-specific options.
8.4. 重设置MySQL管理员密码的方法
有时我们会因为设置原因或时间长了忘记了数据库管理员的密码,使得我们被关在MySQL服务器外。MySQL服务器提供了一种方法可使我们在服务器上重设密码。在windows和linux/unix平台上操作稍有不同,下面分别介绍:
Linux/Unix平台下:
用 % kill -TERM PID关闭服务器,用-TERM信息可使服务器在关闭前把内存中的数据写入磁盘。如果服务器没有响应,我们可用% kill -9 PID来强制删除进程,但不建议这样做。这时内存中的数据不会写入磁盘,造成数据不完整。如果你是用mysql_safe脚本启动MySQL服务器的,这个脚本会监控服务器的运行情况并在它被终止时重启服务器,所以如需关闭服务器,要先终止该进程,然后再真正终止mysqld进程。
使用–skip-grant-tables参数启动MySQL Server,这时MySQL服务器将不使用权限表对连接操作进行验证。你就可在不提供root密码的情况下连接上服务器,并获得root的权限。
% mysqld_safe –skip-grant-tables &
用以下命令登录服务器,并重设密码:
% mysql -u root #不用密码就可连接到服务器
mysql> use mysql
mysql> set password for ‘root’@’localhost’ = password(‘password’);
修改MySQL服务器帐户密码有三种方式,你可参考本笔记中数据库日常管理一章中的相关内容。在这种环境下,使用mysaladmin修改密码好象不行,还是提示要输入密码。
关闭服务器,再用正常方式启动服务器。
windows平台下:
用管理员帐号登录服务器,关闭MySQL数据库服务器。
使用–skip-grant-tables参数启动服务器:
c:\mysql\bin>mysqld-nt –skip-grant-tables
重新打开一个console窗口,用mysql命令登录服务器设置root的新密码:
c:\mysql\bin>mysql
mysql> use mysql
mysql> set password for ‘root’@’localhost’ = password(‘password’);
关闭服务器,再用正常方式启动服务器。
8.5. NULL值
NULL是空值,代表什么也没有。它不能与值进行比较操作和算术操作,也不能和NULL进行比较,因为两个空值比较是没有意义的。我们可用“is NULL” 或 “is not NULL”来判断是不空值。如:
mysql> select * from test where mytest is NULL;
mysql> select * from test where mytest is not NULL;
在MySQL3.23以后的版本有一个新的比较操作符“<=>”,它可对NULL值进行相等比较。如:
mysql> select * from test where mytest <=> UNLL;
mysql> select * from test where not (mytest <=>);
如果查询后排序中的数据中包含NULL,则从MySQL4.0.2开始,有NULL值的数据行总是出现在查询结果的开头,即使设置的desc参数。4.0.2以前版本,如果设置了asc,则出在查询结果的开头,如果设置了desc,则出现在查询结果的结尾。
8.6. 使用SQL变量
MySQL3.23.6以后的版本允许通过查询结果来设置变量,设置好的变量可在以后使用。变量用@name定义,赋值方式用@name:=value。下面是一个在查询语句中进行赋值和使用变量的例子:
mysql> select @name:=id from test where mytest=”test”;
mysql> select * from test where mytest=@name
8.7. 改变默认提示符
用mysql登录进数据库后,MySQL数据的默认提示符是“mysql”,我们可设置它根据用户打开的数据库名而变化,如:
mysql>prompt \d>\_
none>use test
test>use mysql
mysql>
prompt为设置命令,\d代表当前数据库,\_代表一个空格。
8.8. 非优化的全数据表DELETE操作
为了清空数据表,又需知道删除的行数和保持AUTO_INCREMENT序列的值,需用以下的删除语句:
# delete from table_name where 1;
8.9. MySQL事务处理示例
MYSQL高级特性 — 事务处理下面以两个银行账户之间的转账为例子进行演示。要使用MySQL中的事务处理,首先需要创建使用事务表类型(如BDB = Berkeley DB或InnoDB)的表。
CREATE TABLE account (
account_id BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
balance DOUBLE
) TYPE = InnoDB;
要在事务表上使用事务处理,必须要首先关闭自动提交:
SET AUTOCOMMIT = 0;
事务处理以BEGIN命令开始:
BEGIN;
现在mysql客户处在于服务器相关的事物上下文中。任何对事务表所做的改变在提交之前不会成为永久性的改变。
UPDATE ACCOUNT SET balance = 50.25 WHERE account_id = 1;
UPDATE ACCOUNT SET balance = 100.25 WHERE account_id = 2;
在做出所有的改变之后,使用COMMIT命令完成事务处理:
COMMIT;
当然,事务处理的真正优点是在执行第二条语句发生错误时体现出来的,若在提交前终止整个事务,可以进行回滚操作:
ROLLBACK;
下面是另一个例子,通过MYSQL直接进行数学运算:
SELECT @first := balance FROM account WHERE account_id = 1;
SELECT @second := balance FROM account WHERE account_id = 2;
UPDATE account SET balance = @first – 25.00 WHERE account_id = 1;
UPDATE account SET balance = @second + 25.00 WHERE account_id = 2;
除了COMMIT命令外,下列命令也会自动结束当前事务:
ALTER TABLE
BEGIN
CREATE INDEX
DROP DATABASE
DROP TABLE
LOCK TABLES
RENAME TABLE
TRUNCATE
UNLOCK TABLES
1:
第一范式的表遵循如下规则:
(1)没有重复的组;
(2)全部的键属性都定义了;
(3)全部的属性都依赖于键。
2:
第二范式的表遵循如下规则:
(1)是第一范式;
(2)不存在部分依赖(属性只依赖于主键的一部分)。
3:
第三范式的表遵循如下规则:
(1)是第二范式;
(2)不包含传递依赖(非键属性通过另一个非键属性依赖于主键)。
1:
数据库模型是一个关于如何表示数据的逻辑逻辑模型。数据库设计员不需要担心数据的物理存储,数据库模型容许他们站在一个更高的角度或者更概念性的级别上,以减少应用开发针对的现实世界的问题与技术实现之间的鸿沟。
2:
常见的数据库模型有:分层数据库模型、网络数据库模型、关系数据库模型。
3:
在1970年,当E.F.Codd开发出关系数据模型的时候,它被认为是一个不切实际的模型。增加到易用性来自于效率的极大损失,而且当时的硬件技术还不能实现这个模型。
4:
关系数据库使用某种术语来描述它的部件:
(1)Data(数据)是保存在数据库中的值。
(2)Information(信息)是处理过的数据。
(3)Database(数据库)是表的集合。
(4)表由记录(表中的水平行,也叫tuples)构成。
(5)记录是由域(表中的垂直列,也叫做属性)组成的。
(6)域可以有各种各样的类型type。
(7)一个域的容许值叫做域的范围,也叫做域的规格。
(8)如果域不包含任何东西,就说这个域包含null值。
(9)键存取表的指定记录。
(10)索引index是提高数据库性能的机制。索引是物理结构的一部分,键是逻辑结构的一部分。
(11)视图是由实际表的子集构成的虚表。
(12)一对一(1:1)关系就是:在关系中的第一张表的实例,在第二张表中也只有一个实例与之对应。
(13)一对多(1:n)关系就是:在关系中的第一张表的实例,在第二张表中有多个实例与之对应。
(14)多对多(n:n)关系就是:在关系中,第一张表的实例在第二张表中有多个实例对应,在第二张表中的实例在第一张表中也有多个实例与之对应。
(15)强制关系是指在关系中,第一张表中每个实例在第二张表中都必须有一个或多个实例存在。
(16)可选关系是指在关系中,第一张表中每个实例在第二张表中可以有实例存在。
(17)一对一(1:1)关系就是:在关系中的第一张表的实例,在第二张表中也只有一个实例与之对应。
5:
候选键是一个唯一区分记录的域或域的联合。它不能包含null值,而且必须是唯一的。
主键是一个被指定为在数据库结构中区分唯一记录的候选键。
外键 (FK) 是用于建立和加强两个表数据之间连接的一个域或者多个域。通过将一张表中主键添加到另一个表中作为其域使用,可创建两个表之间的连接。这个域就成为第二个表的外键。
6:
视图是虚拟的表。它们只是一个结构而不包含数据。它们的目的是让用户看到实际数据的一个子集。
Chapter 6. 数据库的备份、维护和修复
Table of Contents
6.1. 检查/修复数据表
6.2. 备份数据库
6.3. 使用备份恢复数据
数据库在运行中,会因为人为因素或一些不可抗力因素造成数据损坏。所以为了保护数据的安全和最小停机时间,我们需制定详细的备份/恢复计划,并定期对计划的有效性进行测试。本章结合MySQL服务器的运行机制和所提供的工具,介绍如何进行数据库的备份、维护和修复。
以下是几点防范的措施:
制定一份数据库备份/恢复计划,并对计划进行仔细测试。
启动数据库服务器的二进制变更日志,该功能的系统开销很小(约为1%),我们没有理由不这样做。
定期检查数据表,防范于未燃。
定期对备份文件进行备份,以防备份文件失效。
把MySQL的数据目录和备份文件分别放到两个不同的驱动器中,以平衡磁盘I/O和增加数据的安全。
6.1. 检查/修复数据表
对数据表进行维护最好通过发出CHECK TABLE(检查数据表)或REPAIRE TABLE(修复数据表)命令来做,这样MySQL服务器自动进行表锁定以协调数据表中数据的读写一致性问题。也可用myisamchk工具来做数据表的维护,但它直接访问有关的数据表文件,不通过服务器,所以需人为地协调数据表数据的读写一致性问题。使用myisamchk检查数据表的具体操作步骤如下:
以mysql客户端程序连接服务器,并发出LOCK TABLE命令,以只读方式锁住数据表。
% mysql
mysql> use db
mysql> LOCK TABLE table_name READ; #以只读方式锁定表
mysql> FLUSH TABLE table_name; #关闭数据表文件,并把内存中的信息写入磁盘
保持上面的状态不退出,另开一个shell窗口,用以下命令维护(检查)数据表。
% myisamchk table_name
如果不保持上面状态,退出mysql会话,则表锁定会自动取消。
维护完成,切换回mysql状态的shell窗口,发出以下命令解除表锁定。
mysql> UNLOCK TABLES;
使用myisamchk修复数据表的具体操作步骤如下:
进行修复操作需以读/写方式锁定数据表,命令如下:
% mysql
mysql> use db
mysql> LOCK TABLE table_name WRITE; #以读/写方式锁定数据表
mysql> FLUSH TABLE table_name;
保持mysql客户端连接状态,切换到第二个shell窗口,运行修复命令:
% myisamchk –recover table_name
运行修复命令前最好先备份一下数据文件。
修复完成后,切换回mysql客户端连接窗口,运行以下命令解除数据表锁定:
mysql> FLUSH TABLE table_name; #使服务器觉察新产生的索引文件
mysql> UNLOCK TABLE;
还可用以下命令锁定所有表,锁定后,所有用户就只能读不能写数据,这样就可使我们能安全地拷贝数据文件。
mysql> FLUSH TABLES WITH READ LOCK;
下面是解除锁语句:
mysql> UNLOCK TABLES;
6.2. 备份数据库
定期的备份可使我们数据库崩溃造成的损失大大降低。在MySQL中进行数据备份的方法有两种,一种是使用mysqldump程序,一种是使用mysqlhotcopy、cp、tar或cpio等打包程序直接拷贝数据库文件。mysqldump程序备份数据库较慢,但它生成的文本文件便于移植。使用mysqlhotcopy等程序备份速度快,因为它直接对系统文件进行操作,需人为协调数据库数据的备份前后一致性。
使用mysqldump备份数据库其实就是把数据库转储成一系列CREATE TABLE和INSERT语句,通过这些语句我们就可重新生成数据库。使用mysqldump的方法如下:
% mysqldump –opt testdb | gzip > /data/backup/testdb.bak
#–opt选项会对转储过程进行优化,生成的备份文件会小一点,后的管道操作会进行数据压缩
% mysqldump –opt testdb mytable1,mytable2 | gzip > /data/backup/testdb_mytable.bak
#可在数据库后接数据表名,只导出指定的数据表,多个数据表可用逗号分隔
–opt选项还可激活–add-drop-table选项,它将会在备份文件的每条CREATE TABLE前加上一条DROP TABLE IF EXISTS语句。这可方便进行数据表的更新,而不会发生“数据表已存在”的错误。
用mysqldump命令还可直接把数据库转移到另外一台服务器上,不用生成备份文件。重复执行可定期更新远程数据库。
% mysqladmin -h remote_host create testdb
% mysqldump –opt testdb | mysql -h remote_host testdb
另外还可通过ssh远程调用服务器上的程序,如:
% ssh remote_host mysqladmin create testdb
% mysqldump –opt testdb | ssh remote_host mysql testdb
通过直接拷贝系统文件的方式备份数据库,在备份时,要确保没有人对数据库进行修改操作。要做到这点,最好关闭服务器。如果不能关闭的,要以只读方试锁定有关数据表。下面是一些示例:
% cp -r db /backup/db #备份db数据库到/backup/db目录
% cp table_name.* /backup/db #只备份table_name数据表
% scp -r db remotehot:/usr/local/mysql/data #用scp把数据库直接拷贝到远程服务器
在把数据库直接拷贝到远程主机时,应注意两台机器必须有同样的硬件结构,或者将拷贝的数据表全部是可移植数据表类型。
使用mysqlhotcopy工具,它是一个Perl DBI脚本,可在不关闭服务器的情况下备份数据库,它主要的优点是:
它直接拷贝文件,所以它比mysqldump快。
可自动完成数据锁定工作,备份时不用关闭服务器。
能刷新日志,使备份文件和日志文件的检查点能保持同步。
下面是该工具的使用示例:
% mysqlhotcopy db /bakcup/ #把db数据库备份到backup/db目录里,会自动创建一个db目录
使用BACKUP TABLE语句进行备份,该语句最早出现在MySQL 3.23.25版本中,仅适用于MyISAM数据表。用法如下:
mysql> BACKUP TABLE mytable TO ‘/backup/db’; #把mytable数据表备份到/backup/db目录下
为了执行该语句,你必须拥有那些表的FILE权限和SELECT权限,备份目录还必须是服务器可写的。该语句执行时,会先把内存中的数据写入磁盘,再把各个数据表的.frm(表结构定义文件)、.MYD(数据)文件从数据目录拷贝到备份目录。它不拷贝.MYI(索引)文件,因为它能用另外两个文件重建。BACKUP TABLE语句备份时,依次锁定数据表,当同时备份多个数据表时,数据表可能会被修改,所以备份0完成时,备份文件中的数据和现时数据表中的数据可能会有差异,为了消除该差异,我们可用只读方式锁定数据表,在备份完成后再解锁。如:
mysql> LOCK TABLES tb1 READ,tb2 READ;
mysql> BACKUP TABLE tb1,tb2 TO ‘backup/db’;
mysql> UNLOCK TABLES;
使用BACKUP TABLE语句备份的数据表可用RESTORE TABLE重新加载到服务器。
InnoDB和BDB数据库也可用mysqldump和直接拷贝法进行备份。使用直接拷贝法时应注意需把组成InnoDB和BDB数据库的所有文件都拷贝下来,如InnoDB的.frm文件、日志文件和表空间配置文件;BDB的数据文件、日志文件等。
使用镜像机制进行备份,我们可用SLAVE STOP语句挂起从服务器的镜像,在从服务器上通过直接拷贝法或其它工具制作备份。备份完成,用SLAVE START重新启动镜像,从服务器重新与主服务器同步,接收备份时主服务器所做的修改。
在MySQL中没有为数据库重命名的命令,但我们可用mysqldump转储数据库,再创建一个新的空数据库,把转储文件加载到该新数据库,这样就完成数据库重命名的工作。如:
% mysqldump old_db >db.sql #转储db数据库数据
% mysqladmin create new_db #新建一个空的数据库
% mysql new_db < db.sql #把db数据库的数据加载到新的数据库中
% mysqladmin drop old_db #删除旧的数据库
一个更简单的重命名数据库的方法是直接修改数据库目录名,但该方法不适用于InnoDB和BDB数据库。注意,在更名后,需在权限表中更新相关数据表信息,需执行以下语句:
mysql> UPDATE db SET db=’new_db’ WHERE db=’old_db’;
mysql> UPDATE tables_priv SET db=’new_db’ WHERE db=’old_db’;
mysql> UPDATE columns_priv SET db=’new_db’ WHERE db=’old_db’;
mysql> UPDATE host SET db=’new_db’ WHERE db=’old_db’;
6.3. 使用备份恢复数据
恢复过程包括两个信息源—备份文件和二进制日志,备份文件可使用数据恢复到执行备份时的状态,而二进制日志可恢复到发生故障时的状态。下面分别介绍如何利用这两个文件恢复一个数据库或恢复单个数据表。
恢复整个数据库的步骤:
把需恢复的数据库的整个目录的内容拷贝到其它地方,以备用。
使用最近的备份文件重载数据库。如果使用mysqldump生成的备份,则可使用它们作为mysql的输入重载;如果是通过拷贝数据库目录来备份的,则要关闭数据库服务器,再把备份重新拷贝到数据目录,再重启数据库服务器。
通过二进制日志重做事务,恢复到出错点的数据。具体操作是这样的,用mysqlbinlog把日志转换成ASCII格式,再把它作为mysql的输入,并指定–one-database选项,以便mysql只执行你指定的数据库恢复。如:
% ls -t -r -l binlog.[0-9]* | xargs mysqlbinlog | mysql –one-database db_name
但上面命令只适合所有日志文件名具有相同长度的情况。否则需用下面的Perl代码来处理:
#!/usr/bin/perl -w
# sort_num.pl
use strict;
my @files = <>; #read all input file
@files = sort { my $anum = $1 if $a =~/\.(\d+)$/; #sort them by numeric extension
my $bnum = $1 if $b =~/\.(\d+)$/;
$anum <=> $bnum;
} @files;
print @files; #print them
exit(0);
如下使用该脚本:
% ls -l binlog.[0-9]* | sort_num.pl | xargs mysqlbinlog | mysql –one-database db_name
上面讨论的是需所有日志文件的情况,但多数情况下我们只需备份后生成的几个日志文件,这时,可用以下命令来重做。
% mysqlbinlog binlog.1234 | mysql –one-database db_name
% mysqlbinlog binlog.1235 | mysql –one_database db_name
…
如果我们需恢复因执行DROP DATABASE,DROP TABLE或DELETE语句而损坏的数据库,就需在日志文件中删除该语句,否则重做后结果还是一样。所以需把日志转换成ASCII格式并保存起来,再用编辑器打开该文件,删除这些语句后再重做。
如果使用文本变更日志,则不需使用mysqlbinlog程序,因为该日志文件本身就是ASCII格式。
恢复使用BACKUP TABLE命令备份的数据表可用RESTORE TABLE语句:
备份语句:
mysql> BACKUP TABLE table_name1,table_name2 TO ‘/backup/table_backup’;
恢复语句:
mysql> RESTORE TABLE table_name1,table_name2 FROM ‘/backup/table_backup’;
恢复有外键的数据表,可用SET FOREIGN_KEY_CHECK = 0;语句先关闭键字检查,导入表后再重启它,赋值为1表示检查有效。
恢复InnoDB表空间,当服务器重启时,InnoDB处理程序会执行自动恢复工作,通过选项文件[mysqld]段中的set-variable=innodb_force_recovery=level设置自动恢复的级别,推荐典型的启动值为4。如果需从备份文件恢复,则和上面介绍的方法一样。BDB数据表的恢复也一样,启动服务器时它会进行自动恢复。
来源:http://hi.baidu.com/silentseason/blog/item/0d4c4066bd88a424aa184c34.html
http://hi.baidu.com/silentseason/blog/item/ee4aa0fb8488c0224e4aea35.html
Chapter 7. MySQL程序介绍
安装完MySQL后,在MySQL的安装目录下会生成很多有用的程序,下面对这些程序进行一一介绍。
libmysqld—-嵌入式MySQL服务器,它不能独立运行,它是一个函数库,可嵌入到其它程序中,使程序具有MySQL服务器的功能。
myisamchk和isamchk—-检查和修复数据表、分析键值的分布情况、禁止或启用数据表索引的工具。
myisampack和pack_isam—-压缩数据表并生成只读数据表。
mysql—-最常用的一个与服务器交互的命令行客户端程序。
mysqlaccess—-一个用来测试数据库访问权限的脚本。
mysqladmin—-一个用来执行各种系统维护和管理工作的工具。
mysqlbinlog—-一个以ASCII格式显示二进制变更日志内容的工具。
mysqlbug—-一个用来生成程序漏洞报告的脚本。
mysql_config—-当准备编译基于MySQL的程序时,可以利用这个工具程序来确定该程序的编译选项和标志。
mysqld—-MySQL服务器程序,MySQL数据的核心。
mysqld_multi—-一个用来同时启动和关闭多个MySQL服务器的脚本。
mysql_safe—-一个用来启动和监控MySQL服务器的脚本。
mysqldump—-一个用来导出数据表内容的工具。
mysqlhotcopy—-数据库备份工具。
mysqlimport—-一个对数据表批量加载数据的工具。
mysql_install_db—-一个初始化系统权限表和数据目录的脚本。
mysql.server—-一个用来启动和关闭MySQL服务器的脚本。
mysqlshow—-一个用来显示数据库中数据表的工具。
http://hi.baidu.com/silentseason/blog/item/171e3cddab52d1d98c102934.html
Chapter 5. 数据库安全
Table of Contents
5.1. 保护MySQL安装程序文件
5.2. 权限表
5.3. 建立加密连接
安全是一个过程,而不是一个方法,它贯穿在我们使用和维护MySQL数据库的过程中。这不单是系统管理员工作,用户也要有安全的意识,使安全问题得到有效控制。MySQL服务器的安全问题可分为内部安全和外部安全两部份。内部安全问题大都与系统文件有关,我们需确保MySQL程序文件和数据文件的安全。外部安全是指通过网络连接到服务器的安全问题,应该只允许合法用户访问数据库,在一些情况下还可用SSL加密信息传输通道。下分别介绍内部安全和外部安全的防范措施。
5.1. 保护MySQL安装程序文件
在重设置文件权限时,请先关闭数据库服务器。
用以下命令把MySQL安装程序目录的属主和所属组设置为MySQL管理员帐号的用户名和用户组名。
% chown -R mysql.mysql /usr/local/mysql
另外一种方法是把除数据目录外的所有目录属主设置为root所有,如:
% chown -R root.mysql /usr/local/mysql
% chown -R mysql.mysql /usr/local/mysql/data
设置安装目录及各有关子目录的权限,允许管理员进行所有操作,只允许其他人进行读和执行访问,设置命令如下:
#设置mysql目录
% chmod 755 /usr/local/mysql
or
% chmod u=rwx,go=rx /usr/local/mysql
#设置mysql/bin目录
% chmod 755 /usr/local/mysql/bin
or
% chmod u=rwx,go=rx /usr/local/mysql/bin
#设置mysql/libexec目录
% chmod 700 /usr/local/mysql/libexec
or
% chmod u=rwx,go-rwx /usr/local/mysql/libexec
把数据目录及目录中的所有子目录和文件设置为只允许MySQL管理员访问。
% chmod -R go-rwx /usr/local/mysql/data
如果数据目录下有选项文件或套接字文件,并一些客户需访问这些文件,则可用以下的权限设置,使客户在没有读权限的前提下使用这些文件:
% chmod go+x /usr/local/mysql/data
mysql.sock套接字文件一般放以/tmp目录下,要确保该目录设置了粘着位,使自户只能删除自已创建的文件,不能删除其他用户创建的文件。/etc/my.cnf中公共选项文件,是对所有用户可读的,所以不应把一些敏感信息保存在里面。.my.cnf是用户专用选项文件,要确保只有该用户有权访问。
这样设置以后,只有MySQL管理员才能启动服务器。
5.2. 权限表
MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些权限表分别user,db,table_priv,columns_priv和host。下面分别介绍一下这些表的结构和内容:
user权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。
db权限表:记录各个帐号在各个数据库上的操作权限。
table_priv权限表:记录数据表级的操作权限。
columns_priv权限表:记录数据列级的操作权限。
host权限表:配合db权限表对给定主机上数据库级操作权限作更细致的控制。这个权限表不受GRANT和REVOKE语句的影响。
大家注意到,以上权限没有限制到数据行级的设置。在MySQL只要实现数据行级控制就要通过编写程序(使用GET-LOCK()函数)来实现。
MySQL的版本很多,所以权限表的结构在不同版本间会有不同。如果出现这种情况,可用mysql_fix_privilege_tables脚本来修正。运行方式如下:
% mysql_fix_privilege_tables rootpassword #这里要给出MySQL的root用户密码
最好一下子升级到MySQL 4.0.4版本,因为4.0.2和4.0.3的db表没有Create_tmp_table_priv和Lock_tables_priv权限。
MySQL的权限表定义了两部份内容,一个部份定义权限的范围,即谁(帐户)可以从哪里(客户端主机)访问什么(数据库、数据表、数据列);另一部份定义权限,即控制用户可以进行的操作。下面是一些常用的权限介绍,可直接在GRANT语句中使用。
CREATE TEMPORARY TABLES,允许创建临时表的权限。
EXECUTE,允许执行存储过程的权限,存储过程在MySQL的当前版本中还没实现。
FILE,允许你通过MySQL服务器去读写服务器主机上的文件。但有一定限制,只能访问对任何用户可读的文件,通过服务器写的文件必须是尚未存在的,以防止服务器写的文件覆盖重要的系统文件。尽管有这些限制,但为了安全,尽量不要把该权限授予普通用户。并且不要以root用户来运行MySQL服务器,因为root用户可在系统任何地方创建文件。
GRANT OPTION,允许把你自已所拥有的权限再转授给其他用户。
LOCK TABLES,可以使用LOCK TABLES语句来锁定数据表
PROCESS,允许你查看和终止任何客户线程。SHOW PROCESSLIST语句或mysqladmin processlist命令可查看线程,KILL语句或mysqladmin kill命令可终止线程。在4.0.2版及以后的版本中,PROCESS权限只剩下查看线程的能力,终止线程的能力由SUPER权限控制。
RELOAD,允许你进行一些数据库管理操作,如FLUSH,RESET等。它还允许你执行mysqladmin命令:reload,refresh,flush-hosts,flush-logs,flush-privileges,flush-status,flush-tables和flush-threads。
REPLICATION CLIENT,允许查询镜像机制中主服务器和从服务器的位置。
REPLICATION SLAVE,允许某个客户连接到镜像机制中的主服务器并请求发送二进制变更日志。该权限应授予从服务器用来连接主服务器的帐号。在4.0.2版这前,从服务器是用FILE权限来连接的。
SHOW DATABASES,控制用户执行SHOW DATABASES语句的权限。
SUPER,允许终止线程,使用mysqladmin debug命令,使用CHANGE MASTER,PURGE MASTER LOGS以及修改全局级变量的SET语句。SUPER还允许你根据存放在DES密钥文件里的密钥进行DES解密的工作。
user权限表中有一个ssl_type数据列,用来说明连接是否使用加密连接以及使用哪种类型的连接,它是一个ENUM类型的数据列,可能的取值有:
NONE,默认值,表示不需加密连接。
ANY,表示需要加密连接,可以是任何一种加密连接。由GRANT的REQUIRE SSL子句设置。
X509,表示需要加密连接,并要求客户提供一份有效的X509证书。由GRANT的REQUIRE X509子句设置。
SPECIFIED,表示加密连接需满足一定要求,由REQUIRE子句的ISSUER,SUBJECT或CIPHER的值进行设置。只要ssl_type列的值为SPECIFIED,则MySQL会去检查ssl_cipher(加密算法)、x509_issuer(证书签发者)和x509_subject(证书主题)列的值。这几列的列类型是BLOB类型的。
user权限表里还有几列是设置帐户资源使用情况的,如果以下数据列中的数全为零,则表示没有限制:
max_connections,每小时可连接服务器的次数。
max_questions,每小时可发出查询命令数。
max_updates,每小时可以发出的数据修改类查询命令数。
设置权限表应注意的事项:
删除所有匿名用户。
查出所有没有口令用户,重新设置口令。可用以下命令查询空口令用户:
mysql> SELECT host,user FROM user WHERE password = ”;
尽量不要在host中使用通配符。
最好不要用user权限表进行授权,因为该表的权限都是全局级的。
不要把mysql数据库的权限授予他人,因为该数据库包含权限表。
使用GRANT OPTION权限时不要滥用。
FILE权限可访问文件系统中的文件,所以授权时也要注意。一个具有FILE权限的用户执行以下语句就可查看服务器上全体可读的文件:
mysql> CREATE TABLE etc_passwd(pwd_entry TEXT);
mysql> LOAD DATA INFILE ‘/etc/passwd’ INTO TABLE etc_passwd;
mysql> SELECT * FROM etc_passwd;
如果MySQL服务器数据目录上的访问权限设置得不好,就会留下让具有FILE权限的用户进入别人数据库的安全漏洞。所以建议把数据目录设置成只能由MySQL服务器读取。下面演示一个利用具有FILE权限的用户读取数据目录中文件权限设置不严密的数据库数据的过程:
mysql> use test;
mysql> create table temp(b longblob);
mysql> show databases #显示数据库名清单,–skip-show-database可禁止该功能
mysql> load data infile ‘./db/xxx.frm’ into table temp fields escaped by ” lines terminated by ”;
mysql> select * from temp into outfile ‘xxx.frm’ fields escaped by ” lines terminated by ”;
mysql> delete from temp;
mysql> load data infile ‘./db/xxx.MYD’ into table temp fields escaped by ” lines terminated by ”;
mysql> select * from temp into outfile ‘xxx.MYD’ fields escaped by ” lines terminated by ”;
mysql> delete from temp;
mysql> load data infile ‘./db/xxx.MYI’ into table temp fields escaped by ” lines terminated by ”;
mysql> select * from temp into outfile ‘xxx.MYI’ fields escaped by ” lines terminated by ”;
mysql> delete from temp;
这样,你的数据库就给人拷贝到本地了。如果服务器是运行在root用户下,那危害就更大了,因为root可在服务器上做任何的操作。所以尽量不要用root用户来运行服务器。
只把PROCESS权限授予可信用户,该用户可查询其他用户的线程信息。
不要把RELOAD权限授予无关用户,因为该权限可发出FLUSH或RESET语句,这些是数据库管理工具,如果用户不当使用会使数据库管理出现问题。
ALTER权限也不要授予一般用户,因为该权限可更改数据表。
GRANT语句对权限表的修改过程:
当你发送一条GRANT语句时,服务器会在user权限表里创建一个记录项并把你用户名、主机名和口令记录在User、Host和Password列中。如果设置了全局权限,由把该设置记录在相在的权限列中。
如果在GRANT里设置了数据库级权限,你给出的用户名和主机名就会记录到db权限表的User和Host列中,数据库名记录在Db列中,权限记录到相关的权限列中。
接着是到数据表和数据列级的权限设置,设置方法和上面的一样。服务器会把用户名、主机名、数据库名以及相应的数据表名和数据列名记录到数据表中。
删除用户权限其实就是把这些权限表中相应的帐号记录全部删除即可。
5.3. 建立加密连接
加密连接可提高数据的安全性,但会降低性能。要进行加密连接,必须满足以下要求:
user权限表里要有相关的SSL数据列。如果安装的MySQL服务器是4.0.0版的,user权限表已包含相关的SSL数据列,否则,我们也可用mysql_fix_privilege_tables脚本升级权限表。
服务器和客户程序都已经编译有OpenSSL支持。首先要安装openssl,在编译时MySQL服务器时加–with-vio和–with-openssl选项加上openssl支持。可用以下语句查询服务器是否支持SSL:
mysql> show variables like ‘have_openssl’;
在启动服务器时用有关选项指明证书文件和密钥文件的位置。在建立加密连接前,要准备三个文件,一个CA证书,是由可信赖第三方出具的证书,用来验证客户端和服务器端提供的证书。CA证书可向商业机构购买,也可自行生成。第二个文件是证书文件,用于在连接时向对方证明自已身份的文件。第三个文件是密钥文件,用来对在加密连接上传输数据的加密和解密。MySQL服务器端的证书文件和密钥文件必须首先安装,在sampdb发行版本的ssl目录里有几个供参考的样本文件:ca-cert.pem(CA证书),server-cert.pem(服务器证书),server-key.pem(服务器公共密钥)。把这几个文件拷贝到服务器的数据目录中,再在选项文件里加上以下内容:
[mysqld]
ssl-ca=/usr/local/mysql/data/ca-cert.pem
ssl-cert=/usr/local/mysql/data/server-cert.pem
ssl-key=/usr/local/mysql/data/server-key.pem
重启服务器,使配置生效。
要想让某个客户程序建立加密连接,必须在调用这个客户程序时用有关选项告诉它在哪里能找到其证书文件和密钥文件。在sampdb发行版的ssl目录中提供了client-cert.pem(客户证书文件),client-key.pem(客户密钥文件),CA证书与服务器使用同样的ca-cert.pem。把他们拷贝到个人目录下,并在.my.cnf选项文件中指出文件位置,如:
[mysql]
ssl-ca=/home/mysql/ca-cert.pem
ssl-cert=/home/mysql/client-cert.pem
ssl-key=/home/mysql/client-key.pem
配置完成后,调用mysql程序运行\s或SHOW STATUS LIKE ‘SSL%’命令,如果看到SSL:的信息行就说明是加密连接了。如果把SSL相关的配置写进选项文件,则默认是加密连接的。也可用mysql程序的–skip-ssl选项取消加密连接。如果用命令行方式启用加密连接可以这样写:
% mysql –ssl-ca=ca-cert.pem –ssl-cert=client-cert.pem –ssl-key=client-key.pem
可用GRANT语句的REQUIRE SSL选项来强制用户使用加密连接。
使用sampdb发行版的证书可以建立一个加密连接,但由于该文件已公开,所以安全性不好,我们可以在测试成功后自行建立证书或购买商业证书,以提高安全性。如何自行建立SSL证书的文档在sampdb发行版的ssl/README文件里有说明。
http://hi.baidu.com/silentseason/blog/item/5ca082ef6d5b0aefcf1b3e2b.html
Chapter 3. 数据库管理
Table of Contents
3.1. 数据目录
3.2. MySQL数据表在系统中表现形式
3.3. 数据表最大尺寸限制
3.4. 状态文件和日志文件
3.5. 调整MySQL数据目录位置
数据库是一个复杂而又关键的系统,为确保系统安全、高效运行,需熟悉数据库内部的运作机制,掌握各种维护工具,并做好日常的管理工作。下面列举几项主要工作职责:
服务器的关闭和启动;
管理用户帐号;
管理日志文件;
数据库备份恢复;
数据库优化;
确保数据库数据安全;
数据库软件升级。
3.1. 数据目录
数据目录是用来存放数据表和相关信息的地方,是数据库的核心。在MySQL中的数据目录根据不同平台的有一些差异:
在UNIX/Linux系统上,如果用源码编译安装,数据目录的位置默认是在/usr/local/mysql/var中;
在UNIX/Linux系统上,如果用二进制发行版安装,数据目录的位置默认是在/usr/local/mysql/data中;
在WINDOWS系统上,数据目录的位置默认是在c:/mysql/data中;
在服务器启动时,可用–datadir=dir_name来指定数据目录,也可把它写到配置文件中。
我们还可用命令向服务器查询数据目录的位置,数据目录的变量名是datadir,如:
% mysqladmin variables
如果在一台机器上同时运行多个服务器,则可根据端口的不时来查询每个服务器的数据目录,如:
% mysqladmin –host=127.0.0.1 –port=port_number variables
如果–host是localhost,系统则会用一个UNIX套接字去连接数据库服务器,这时要使用–socket选项,所以查询语句变成:
% mysqladmin –host=localhost –socket=/path/to/socket variables
mysql> SHOW VARIABLES LIKE ‘datadir’;
在windows NT平台上可以使用“.”作为一条命名管道连接的主机名,用–socket选项给出命名管道的名字,如:
c:\ mysqladmin –host=. –socket=pipe_name variables
配置文件的中[mysqld]段中的datadir=/path/to/datadir设置也可查询到数据目录。
在mysqld程序的帮助信息里也有程序编译时默认的数据目录信息,可用以下命令显示:
% mysqld –help
数据目录是存放数据文件的地方,每个数据库对应目录的不同文件。InnoDB数据表由于用表空间来管理数据库,所以就没这种对应关系。但也是保存在数据目录中的,在数据目录除保存数据库文件外,还可能会保存以下几类文件:
服务器的配置文件,my.cnf;
服务器的进程ID(PID)文件;
服务器的日志文件和状态文件,这些文件对管理数据库有重要的价值;
DES密钥文件或服务器的SSL证书与密钥文件。
数据目录中的所有数据库全部由服务器(mysqld)来管理,客户端不直接操作数据。服务器是客户使用数据的唯一通道。
在MySQL中,每个数据库其实就是在数据目录下一个子目录,show databases命令相当于列出数据目录中的目录清单。create database db_name命令会在数据目录下新建一个db_name的目录,以存放数据库的数据文件。所以我们也可下面的shell命令方式来建立一个空数据库:
% cd datadir
% mkdir db_name
% chmod u=rwx,go-rwx db_name
同理,删除数据库drop database db_name也就是删除数据目录中一个名为db_name的目录及目录中的数据表文件。我们也可用shell这进行操作:
% cd datadir
% rm -rf db_name
比较shell方式与drop database方式,drop database db_name命令不能删除db_name目录中创建的其它非数据表文件;由于InnoDB是表空间来管理数据表,所以不能用rm或del命令删除InnoDB的数据表。
3.2. MySQL数据表在系统中表现形式
MySQL数据表类型有:ISAM、MyISAM、MERGE、BDB、InnoDB和HEAP。每种数据表在文件系统中都有不同的表示方式,有一个共同点就是每种数据表至少有一个存放数据表结构定义的.frm文件。下面介绍每种数据表文件:
ISAM数据表是最原始的数据表,有三个文件,分别是:
.frm,存放数据表的结构定义;
.ISD,数据文件,存放数据表中的各个数据行的内空;
.ISM,索引文件,存放数据表的所有索引信息。
MyISAM数据表是ISAM数据表的继承者,也有三个文件,分别是:
.frm,结构定义文件;
.MYD,数据文件;
.MYI,索引文件。
MERGE数据表是一个逻辑结构,代表一组结构完全相同的MyISAM数据表构成的集合。它在文件系统中有二个文件,分别是:
.frm,结构定义文件;
.MRG,构成MERGE表的MyISAM数据表清单,每个MyISAM数据表名占一行。也就是说可通过改变该表的内容来改变MERGE数据表的结构。修改前请先刷新缓存(flush tables),但不建议这样修改MERGE数据表。
BDB数据表用两个文件来表示,分别是:
.frm,结构定义文件;
.db,数据表数据和索引文件
InnoDB由于采用表空间的概念来管理数据表,所以它只有一个与数据表对应.frm文件,同一目录下的其它文件表示为表空间,存储数据表的数据和索引。
HEAP数据表是一个存在于内存中的表,所以它的数据和索引都存在于内存中,文件系统中只有一个.frm文件,以定义结构。
了解MySQL数据表在文件系统中表现形式后,我们可知道,创建、修改或删除数据表,其实就是对这些文件进行操作。例如一些数据表(除InnoDB和HEAP数据表外),我们可直接在文件系统中删除相应的文件来删除数据表。
% cd datadir
% rm -f mydb/mydb.*
以上命令可删除mydb数据库中的mydb数据表。
3.3. 数据表最大尺寸限制
在MySQL中影响数据表尺寸的因素有很多,下面分别进行介绍:
MySQL数据表类型的不同对数据表尺寸的限制:
ISAM数据表中单个.ISD和.ISM文件的最大尺寸为4G;
MyISAM数据表中单个.MYD和.MYI文件的默认最大尺寸也是4G,但可在创建数据表时用AVG_ROW_LENGTH和MAX_ROWS选项把这个最值扩大到800万TB。
MERGE数据表的最大尺寸是它的各组成MyISAM数据表的最大尺寸之和。
BDB数据表的尺寸受限于BDB处理程序所允许的.db文件的最大尺寸。这个最大尺寸随着数据表页面尺寸(编译时确定)而变化,但即使是最小的页面尺寸(512字节),.db文件的最大尺寸也可达2TB。
InnoDB数据表的表空间的最大尺寸是40亿个页面,默认的页面尺寸是16K,该值可在8K到64K之间,在编译时确定。InnoDB数据表的最大尺寸也就是表空间的最大尺寸。
操作系统对文件的尺寸限制,一般文件系统都对单个文件不得超过2G的限制。该约束会对数据库文件造成限制。InnoDB数据表可通过利用未格式化硬盘作为表空间来绕过该限制。
对于数据和索引分开两个文件存放的数据表,其中任何一个文件达到操作系统文件的最大限制,数据库表也就达到最大尺寸。
包含AUTO_INCREMENT数据列的表受到该数据列类型最大上限值的限制。
由于InnoDB数据表用表空间来管理,一个表空间可同时空纳多个数据表,所以数据表的最大尺寸受系统文件和同一表空间中数据表空间的约束。
3.4. 状态文件和日志文件
在MySQL数据目录中还包含着许多状态文件和日志文件,这些文件的文件名都是以主机名加上相关后缀来命名的。下面是这些文件的一个说明列表:
Table 3.1. 状态文件和日志文件
文件类型 默认名 文件内容
进程ID文件 hostname.pid MySQL服务器进程的ID
常规查询日志 hostname.log 连接/断开连接事件和查询信息
慢查询日志 hostname-slow.log 记录查询时间很长的命令信息
变更日志 hostname.nnn 创建或修改数据表结构和内容的查询命令信息
二进制变更日志 hostname-bin.nnn 创建或修改数据表结构和内容的查询命令的二进制表示法
二进制变更日志的索引文件 hostname-bin.index 使用中的“二进制变更日志”列表
错误日志 hostname.err 记录“启动/关闭”事件和异常情况
变更日志和二进制变更日志主要用于MySQL数据库服务器的崩溃恢复中,由于变更日志记录了数据库的所有变更操作,所以可以进行事件重放。具体操作请参考相关数据库备份恢复章节。对于变更日志,我们可用–log-long-format选项来让它以扩展方式记录有关事件。扩展方式可记录谁发出查询和什么时候发出查询的信息。可使我们更好地掌握客户端的操作情况。日志记录着查询命令的所有操作,里面可能会有一些敏感信息。所以我们要确保日志文件的安全。
3.5. 调整MySQL数据目录位置
MySQL数据库的数据目录位置,包括目录里的各种文件的位置)可根据实际情况进行调整。调整的方法有两种,一种是使用符号链接;一种用服务器启动选项。下面一个列表说明了数据目录及目录中文件各自适宜采用的方法:
Table 3.2. MySQL数据目录及目录中文件位置的调整方法
调整对象 适用方法
整个数据目录 启动选项和符号链接
数据库目录 符号链接
数据表 符号链接
InnoDB数据表空间 启动选项
PID文件 启动选项
日志文件 启动选项
下面是各种调整方法的具体操作过程:
在调整MySQL的数据目录时,要先停止服务器,再把数据目录移动到新的位置。接着,我们可选择在原来目录下创建一个符号链接指向新的位置,或者用启动选择–datadir指向新的数据目录。推荐用创建符号链接的方法,因为如果那个数据目录中有my.cnf文件,相应的服务器还能找到它。
数据库只能存在于MySQL数据目录中,所以只能使用符号链接的方法调整它的位置。在Linux系统的操作步骤如:
关闭服务器;
把数据库目录拷贝到新的位置;
删除原来的数据库目录;
在原来的MySQL数据目录中创建一个同名符号链接指向新的位置;
重新启动服务器。
在windows下的操作方法不些不同,操作方法如下:
关闭服务器;
把数据库目录移动新的位置;
删除原来的数据库目录;
在原来数据目录下建一个同名的.sym文件,在文件中输入数据库新目录的全路径,如c:\mysql\newdir\mydb。这个文件就相当于Linux下的符号链接;
重启服务器。
为了支持符号链接功能,必须用–use-symbolic-links选项启动服务器;或在选项文件的[mysqld]节中添加use-symbolic-links选项。
MySQL必须是3.23.16以上版本且是max服务器(mysqld-max或mysqld-max-nt)。
要移动数据表,必须满足以下所有条件才行:
MySQL的版本必须是4.0或以上的版本;
操作系统必须有一个可用的realpath()调用;
移动的数据表必须是MyISAM类型的数据表。
在满足以上所有条件后,我们就可把.MYD数据文件和MYI索引文件移到新位置,再在原来位置创建两个同名符号链接指定新的位置。注意,.frm定义文件仍需留在原来的数据库目录中。
如以上条件不能全部满足,最好不要移动数据表文件。否则一旦你运行ALTER TABLE、OPTIMIZE TABLE、REPAIR TABLE语句对移动过的数据表进行优化或修改,这样数据表就会回到原来的位置,使移动操作失效。因为这些命令的执行过程是这样的:它会先在数据目录中创建一个临时数据表并对这个临时数据表进行优化或修改,然后删除原来的数据表(这里是你为了移动数据表而创建的一个符号链接),再把临时数据表更名为原来的数据表名称。这样一来,你移走的数据表就和这个数据库完全没有关系了。基于以下的不稳定因素,如无特殊必要,不建议移动数据表。
InnoDB表空间是通过在选项文件中使用innodb_data_home_dir和innodb_data_file_path选项列出InnoDB表空间组成文件清单的方法来配置的,所以我们可通过修改这些选项来重新安置InnoDB表空间的组成文件。步骤如下:
关闭服务器;
移动组成表空间的文件;
修改选项文件,指出组成表空间的文件的新位置;
重启服务器。
状态文件和日志文件的位置可通过选项文件或启动服务器时指定。