下一页 1 2
-update=update
上面的命令启动MySQL服务,并告诉它在服务器的数据目录下(如果你依照第一章中指导配置你的服务器的话,这个目录将是/usr/local/mysql/var)建立名为update.001、update.002……的文件。
一个新的这样的文件将在服务器每一次刷新它的日志文件时被建立(通常,这是指服务每一次重启动时)。如果你想将你的变更日志存储到另一个地方(通常这是一个好主意--如果包含你的数据目录的磁盘出了问题,你肯定不能指望它还能好好保存你的备份!),你可以指定变更日志的路径。
但是,如果你的MySQL服务器是不间断地工作的,在启动MySQL服务时你也许还需要一些系统配置。在这种情况下,增加一个命令行选择可能变得很困难。建立变更日志的另一个简单的方法是在MySQL配置文件中增加相应的选项。
如果你还不清楚"什么是MySQL配置文件",不要担心。事实上,在此之前,我们一直没用到过这样的配置文件。要建立这个文件,以我们在第一章中建立的MySQL用户(如果你是完全根据指导做的,这应该是mysqlusr)登录到Linux。使用你习惯的文本编辑器,在你的MySQL数据目录下(除非你选择了其它地方安装MySQL,这应该是指/usr/local/mysql/var)建立一个名为my.cnf的文件。在这个文件中,输入下面一行:
[mysqld]log-update=/usr/backups/mysql/update
当然,你可以自由地指定你的日志文件所写入的位置。保存这个文件并重启你的MySQL服务。从现在开始,MySQL服务运行的情况将和你在命令行中使用了--log-update选项一样。
很明显,对于一个服务来说,变更日志可能占用大量的空间。因为这个原因以及MySQL不能自动地在建立新的日志文件删除旧的日志文件,你需要自己管理你的变更日志文件。例如,下面的Unix shell脚本,会删除所有一星期以前更改的变更日志文件,然后通知MySQL刷新它的日志文件。
#! /bin/sh
find /usr/backups/mysql/ -name "update.[0-9]*"
-type f -mtime +6 xargs rm -f
/usr/local/mysql/bin/mysqladmin -u root
-ppassword flush-logs
如果当前的日志文件被删除,最后一步(刷新日志文件)将建立一个新的变更日志,这意味着MySQL服务一直在线,而且在过去的一周中,没有收到任何改变数据库内容的查询。
如果你是一个有经验的用户,使用“时钟守护程序”设置一个脚本来定期(比方说,每周一次)执行数据库的备份并删除旧的变更日志应该是相当简单的。如果你还需要一点帮助,请教你当地的Unix权威。'MySQL' by Paul DuBois中的MySQL管理一章中对设置这样的一个系统也有详细的指南。
假定你已经有了一个备份以及在此之后的变更日志的一个拷贝,恢复你的数据库将是非常简单的。在建立一个空数据库后应用我们在上一节中讨论的方法导入备份,然后使用带--one-database命令行选项的mysql命令导入变更日志。这会指示服务器仅仅运行变更日志中与我们想要恢复的数据库(在这个例子中是指dbname)相关的查询:
% mysql -u root -ppassword --one-database dbname < update.100
% mysql -u root -ppassword --one-database dbname < update.102
...
MySQL访问控制
在这个教程的早些时候,我们曾经提到一个叫做mysql的数据库,在每一个MySQL服务中都包含这个数据库,它是用来保存用户的相关信息、他们的口令以及他们的权限的。但是,在此之前,我们一直使用root用户登录到MySQL服务,这个用户可以访问所有的数据库和数据表。
如果你的MySQL服务仅仅被通过PHP访问,而用你对于将root用户的口令告诉什么人很小心,那么root帐号可能已经足够了。但是,如果一个MySQL服务是被许多人共享的,(例如,一个Web主机希望对它的每一个用户提供同一个MySQL服务),为不同的用户设置相应的访问权限就显得很重要了。
在MySQL参考手册的第六章中详细介绍了MySQL的访问控制系统。从原理上来说,用户的访问是由mysql数据库中的五个数据表来管理的:user、db、host、tables_priv和columns_priv。如果你想直接使用INSERT、UPDATE和DELETE语句来编辑这些表,我建议你先阅读一下MySQL指南中的相关章节。而从3.22.11版本开始,MySQL提供了简单的方法来管理用户的访问。使用MySQL提供的非标准的命令GRANT和REVOKE,你可以建立用户并赋予其相应的权限,而不必关心它在前面提到的五个表中的存储形式。
使用GRANT
GRANT命令用来建立新用户,指定用户口令并增加用户权限。其格式如下:
mysql> GRANT
-> TO
-> [WITH GRANT OPTION];
正如你看到的,在这个命令中有许多待填的内容。让我们逐一地对它们进行介绍,并最终给出一些例子以让你对它们的协同工作有一个了解。
数据库/数据表/数据列权限:
ALTER: 修改已存在的数据表(例如增加/删除列)和索引。
CREATE: 建立新的数据库或数据表。
DELETE: 删除表的记录。
DROP: 删除数据表或数据库。
INDEX: 建立或删除索引。
INSERT: 增加表的记录。
SELECT: 显示/搜索表的记录。
UPDATE: 修改表中已存在的记录。
全局管理权限:
FILE: 在MySQL服务器上读写文件。
PROCESS: 显示或杀死属于其它用户的服务线程。
RELOAD: 重载访问控制表,刷新日志等。
SHUTDOWN: 关闭MySQL服务。
特别的权限:
ALL: 允许做任何事(和root一样)。
USAGE: 只允许登录--其它什么也不允许做。
这些权限所涉及到的MySQL的特征,其中的一些我们至今还没看到,而其中的绝大部分是你所熟悉的。
这个命令中可选的WITH GRANT OPTION部分指定了用户可以使用GRANT/REVOKE命令将他拥有的权限赋予其他用户。请小心使用这项功能--虽然这个问题可能不是那么明显!例如,两个都拥有这个功能的用户可能会相互共享他们的权限,这也许不是你当初想看到的。
让我们来看两个例子。建立一个名为dbmanager的用户,他可以使用口令managedb从server.host.net连接MySQL,并仅仅可以访问名为db的数据库的全部内容(并可以将此权限赋予其他用户),这可以使用下面的GRANT命令:
mysql> GRANT ALL ON db.*
-> TO dbmanager@server.host.net
-> IDENTIFIED BY "managedb"
-> WITH GRANT OPTION;
现在改变这个用户的口令为funkychicken,命令格式如下:
mysql> GRANT USAGE ON *.*
-> TO dbmanager@server.host.net
-> IDENTIFIED BY "funkychicken";
请注意我们没有赋予任何另外的权限(the USAGE权限只能允许用户登录),但是用户已经存在的权限不会被改变。
现在让我们建立一个新的名为jessica的用户,他可以从host.net域的任意机器连接到MySQL。他可以更新数据库中用户的姓名和email地址,但是不需要查阅其它数据库的信息。也就是说他对db数据库具有只读的权限(例如,SELECT),但是他可以对Users表的name列和email列执行UPDATE操作。命令如下:
mysql> GRANT SELECT ON db.*
-> TO jessica@%.host.net
-> IDENTIFIED BY "jessrules";
mysql> GRANT UPDATE (name,email) ON db.Users
-> TO jessica@%.host.net;
(未完)