8.1 安装
无论你喜欢使用的是哪种Linux套件,你的Linux套件很可能已提供了预编译的MySQL版本进行安装。例如,Red Hat、SUSE和Ubuntu都在它们的当前发行版中提供了预编译的MySQL软件包。一般来说,我们建议读者使用预编译的版本,因为它提供了一种最简单的快速建立并运行MySQL的方法。如果你的发行版未提供MySQL软件包,或者你想使用最新的MySQL版本,那么你可以从MySQL的网站上下载二进制包和源代码包。
在本章中,我们只介绍如何安装预编译的MySQL版本。
8.1.1 MySQL软件包
如果你因故需要下载MySQL而不是使用与Linux套件捆绑的版本,对本书而言,你应该使用MySQL社区版中的标准软件包。你会看到还有Max和Debug软件包可以使用。其中Max软件包包含一些额外的功能,如支持更多不常见的存储文件类型和一些高级功能(如集群)。Debug软件包在被编译时包含了一些额外调试代码和信息,希望你不需要使用这么底层的调试。
不要在正规场合使用Debug版本,因为额外的调试支持会降低软件的性能。
为了开发MySQL应用程序,你不仅需要安装MySQL服务器,还需要安装MySQL开发库。通常情况下,软件包管理器都会有一个MySQL选项,你只需要确认开发库已被选择安装。在图8-1中,你可以看到Fedora的软件包管理器选择了额外的开发软件包以安装MySQL。
图 8-1
在其他Linux发行版中,软件包的安排可能略有不同。例如,图8-2显示了Ubuntu的synaptic软件包管理器选择MySQL软件包的界面。
图 8-2
MySQL在安装时还会创建用户“mysql”,该用户是MySQL服务器守护进程运行时所使用的默认用户名。
在安装完MySQL软件包之后,你需要检查MySQL是否已自动启动了。在写作本书的时候,有些Linux发行版如Ubuntu是这么做的,但也有一些Linux发行版如Fedora没有这么做。幸运的是,检查MySQL服务器是否正在运行是一件非常容易的事情:
$ ps -el | grep mysqld
如果你看到有一个或多个mysqld进程正在运行,那么表示MySQL服务器已启动了。在许多Linux系统中,你还会看到存在一个safe_mysqld进程,它是一个以正确的用户id启动真正的mysqld进程的工具。
如果需要启动(或重启、停止)MySQL服务器,你可以使用GUI界面的服务控制面板。Fedora的服务配置面板如图8-3所示。
图 8-3
你还可以使用服务配置编辑器,来确定你是否想要MySQL服务器在每次Linux启动时自动运行。
8.1.2 安装后的配置
假设一切运行正常,现在MySQL已经安装完成并以默认选项集启动了。下面让我们来测试这一假设是否正确:
$ mysql -u root mysql
如果看到“Welcome to the MySQL monitor”信息和一个mysql>提示符,就表示服务器正在运行了。当然,现在任何人都能连接到服务器并拥有管理员权限,我们将在稍后解决这个问题。试着输入\s来得到更多关于服务器的信息。看完后,输入quit或者\q退出控制台。
使用命令mysql-?可以获得更多有关服务器的信息。在该命令的输出中,有一条重要信息值得注意。在该命令输出参数列表之后,你通常将看到类似Default options are read from the following files in the given order:这样的一句话。它告诉你在哪里可以找到配置文件,如果需要配置MySQL服务器,你就需要用到该文件。配置文件通常是/etc/my.cnf,也有一些发行版(如Ubuntu)使用的是/etc/mysql/my.cnf。
你也可以使用mysqladmin命令来查看正在运行的服务器状态:
$ mysqladmin -u root version
这个命令的输出不仅将确认服务器是否正在运行,而且还将告知正在使用的服务器的版本号。
mysqladmin命令还可以借助使用variables选项检查一个正在运行的服务器中的所有配置选项:
$ mysqladmin variables
上面的命令将输出一长串变量设置。其中两个特别有用的变量是:datadir和have_innodb,前者告诉你MySQL在哪里存储它的数据,后者的值通常是YES,表明MySQL服务器支持InnoDB存储引擎。MySQL支持好几种存储引擎,即用于数据存储的底层实现程序。最常见(也是最有用)的两个存储引擎是InnoDB和MyISAM,但也有一些其他的存储引擎,如memory引擎,它根本不使用永久存储,而CSV引擎则使用逗号分隔的变量文件。不同的引擎有着不同的功能和性能。对于通用数据库来说,我们目前建议使用InnoDB存储引擎,因为它在性能和对加强不同数据元素之间关系的支持上取得了一个很好的折中。如果服务器没有启用对InnoDB的支持,请检查配置文件/etc/my.cnf,在skip-innodb一行的开头加上#号以注释掉该行,然后使用服务编辑器重启MySQL。如果这样做不行,那么你使用的MySQL版本可能在编译时没有包含InnoDB的支持。如果这对你很重要,那么请检查MySQL网站以找到一个支持InnoDB的版本。对于本章来说,即使你使用的是MyISAM存储引擎也没有关系,许多发行版默认使用的就是这个引擎。
一旦知道服务器二进制代码中已包括了对InnoDB的支持,为了将其设置为默认存储引擎,你必须按如下方法修改/etc/my.cnf文件,否则服务器默认使用的就是MyISAM引擎。修改方法非常简单,在/etc/my.cnf文件的mysqld一节中添加default-storage-engine=INNODB一行内容。如下所示文件的开头:
在本章的剩余部分,我们假设默认的存储引擎已被设置为InnoDB。
在实际的应用环境中,你通常还会想改变由datadir变量设置的默认存储位置。这也是通过编辑/etc/my.cnf配置文件中的mysqld一节来完成的。例如,如果你使用的是InnoDB存储引擎,准备将数据文件放在/vo102目录中,将日志文件放在/vol03目录中,设置数据文件的初始大小为10M,并允许它自扩充,你可以使用如下的配置行:
你可以在www.mysql.com网站上的在线手册中了解更多信息。
如果服务器不能启动或服务器启动后你无法连接到数据库,请阅读下一节来诊断安装中的问题。
好的,还记得之前我们提到的那个巨大的安全漏洞吗?它允许任何人以root用户身份进行连接而不需要输入密码。现在是时候提高服务器的安全性了。你千万不要被MySQL安装中所使用的root用户名搞糊涂了,MySQL的root用户和系统的root用户毫无关系。MySQL只不过默认使用一个称为“root”的用户作为管理用户,就像Linux操作系统一样。MySQL数据库的用户和Linux系统的用户ID没有关系,MySQL有它自己的内置用户和权限管理。在默认情况下,只要在Linux系统中有账号的用户都可以以MySQL管理员的身份登录进MySQL服务器。一旦你收紧了MySQL中root用户的权限,如只允许本地用户以root用户身份登录并设置了访问密码,你就可以只添加对你的应用程序正常工作绝对必要的用户和权限了。
有很多设定root用户密码的方法,最简单的方法是使用如下命令:
$ mysqladmin -u root password newpassword
这将设定初始密码为newpassword。
但是,这个方法会引发问题,因为明文密码将会留在shell的历史记录中,并且当命令正在执行时,其他人可以使用ps命令看到该密码,或者通过你的命令历史记录重现该密码。一个更好的方法是再次使用MySQL控制台,这次是发送一些SQL语句来修改你的密码。
当然,你需要选择一个只有你自己知道的密码,而不是例子中的“secretpassword”,这个密码只是用来显示你自己的密码应该输入的位置。如果你又想要删除这个密码,你只需用一个空字符串代替“secretpassword”即可。
请注意,我们使用一个分号(;)来结束SQL命令。严格来说,分号并不是实际SQL命令的一部分,它只是告诉MySQL客户端程序我们的SQL语句已准备好被执行了。我们还为SQL关键字使用了大写字母,如SET。这并不是必需的,因为实际的MySQL语法允许关键字使用大写或小写字母,但我们在本书中以及在日常的工作中都习惯于使用大写的关键字,因为这样会使得SQL语句更容易阅读。
现在检查一下权限表以确认密码已被设置。首先使用use命令切换到mysql数据库,然后查询内部表:
注意观察,我们为从localhost建立连接的root用户创建了一个密码。MySQL不仅能为用户保存不同的权限,也能为基于主机名的连接类保存不同的特权。确保安装安全的下一步将是去除那些由MySQL默认安装的不需要的用户。下面的命令将会从权限表中删除所有非root用户:
从上面的输出可以看出,我们现在只有一个仅能从localhost连接的登录。
现在是验证事实的时刻了:我们仍能使用设定的密码来登录吗?注意,这次我们给出-p参数,它要求MySQL必须给出询问密码的提示:
现在,我们有了一个正在运行的MySQL版本,它已经被限制为只有使用我们设定密码的root用户才能连接到数据库服务器,并且这个root用户只能从本地机器连接。我们还可以在命令行上提供密码以连接到MySQL。你可以使用参数—password,如—password=secretpassword,或使用-psecretpassword,但显然这是不太安全的,因为密码可能被ps命令或通过命令历史记录看到。然而,如果你正在编写一个需要连接到MySQL的脚本,那么在命令行上提供密码又是必要的。
下一步是添加需要的用户。对于Linux系统来说,除非绝对必需,否则最好使用root账号来登录MySQL,所以你应该为日常使用创建一个普通用户。
正如我们之前提示的,你可以针对不同的机器来创建用户,并给他们分配不同的连接权限。特别地,出于安全考虑,我们只允许root用户通过本地机器连接。在本章中,我们将创建一个拥有相当广泛权限的新用户rick。rick将能使用3种不同的方法进行连接。
❑ 从本地机器连接。
❑ 从IP地址在192.168.0.0~192.168.0.255范围内的任何机器连接。
❑ 从wiley.com域中的任何机器连接。
最安全最简单的方法是创建3个不同的用户,他们分别从3个不同的地点进行连接。如果愿意,我们甚至可以根据他们从何处连接给他们分别设置3个不同的密码。
我们通过使用grant命令来创建用户并赋予权限。这里,我们使用上面列出的3个不同的连接起点来创建用户。IDENTIFIED BY是一个有点古怪的设定初始密码的语法。请注意引号的使用方法,如下面显示的那样正确使用单引号是很重要的,否则我们将不能按照我们期望的那样创建用户。
以root用户身份连接到MySQL,然后依次执行如下操作。
(1)为rick创建一个本地登录:
(2)然后创建一个来自C类子网192.168.0的登录。注意,我们必须用单引号来保护IP范围,并使用掩码/255.255.255.0来确定允许的IP地址范围:
(3)最后,创建一个登录,让rick能从wiley.com域中的任何机器登录(同样也需要注意单引号的使用):
(4)现在我们再次查看user表来核对条目:
当然,你需要调整上面的命令和密码来适应你的本地配置。你将注意到,我们使用的是GRANT ALLON .命令,正如你可能猜测的那样,这给了用户rick非常广泛的权限。对于权力很大的用户这样做当然很好,但是对于创建受限用户就不适用了。我们将在本章的8.2.2节中更详细地介绍grant命令。在那里,我们将讲解如何创建一个受限用户。
至此我们已经安装并运行了MySQL(如果还没有,请阅读下一节),提高了服务器的安全性,并且创建了一个非root用户来准备完成一些工作。接下来我们将首先讨论安装后的故障修复,然后回过头来快速地浏览一下MySQL数据库管理的要素。
8.1.3 安装后的故障修复
如果使用mysql进行连接失败,你可以使用系统的ps命令来检查服务器进程是否正在运行。如果不能在ps命令的输出列表中找到它,则可以尝试执行命令mysql_safed-log。它会将一些额外信息写入位于MySQL日志目录中的文件。还可以尝试直接启动mysqld进程,也可以使用命令mysqld—ver-bose—help以获得完整的命令行选项列表。
也有可能是服务器正在运行,但却拒绝了你的连接。如果是这样,下一个需要检查的就是数据库是否存在,特别是默认的MySQL权限数据库是否存在。Red Hat发行版通常默认使用的数据库目录是/var/lib/mysql,但其他发行版可能使用不同的目录位置。请检查MySQL的启动脚本(例如,在/etc/init.d目录中)和配置文件/etc/my.cnf来找到数据库目录位置,你也可以使用mysqld-verbose -help命令直接调用mysqld程序,并查找命令输出中的变量datadir来找到数据库目录位置。一旦你找到了数据库目录,请确认它至少包含一个默认的权限数据库(称为mysql),并且服务器守护进程正在使用这个位置(通过文件my.cnf来指定)。
如果你还是无法连接,请使用服务编辑器停止服务器,检查并确认已没有mysqld进程正在运行,然后重启服务器并再次尝试连接。如果这样做你还是无法连接,你可以尝试完全卸载MySQL并重新安装它。MySQL网站上的MySQL文档也是非常有用的资源(它总是比本地的手册页要新,而且它还会包含一些用户编辑的提示和建议以及一个论坛),你可以通常浏览该文档来找到一些更深层次的信息。