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