第3章

    MySQL安装和使用

    MySQL是一个开放源码的多用户、多线程SQL数据库服务器软件。开发者为瑞典MySQL AB公司。它能让你通过编程语言如PHP来存储或取回数据。你可以花最少的努力快速而高效地存储多种类型的数据,如布尔类型、文本类型、整数类型、图像类型、二进制数据和BLOB数据。使用数据库对于创建动态网站是十分重要的。

    第1节 下载MySQL

    MySQL的安装可以从源代码或者预编译的二进制文件开始。如果从源代码开始,虽然控制权更大,但所花时间也较长。安装预编译的二进制文件则非常方便,而且还可以找到现成的用于许多操作系统的安装文件。

    不管选择源代码还是二进制文件,都应该访问MySQL主页:http://www.mysql.com了解相关资讯,查阅有关最新开发情况的新闻,找到离自己最近的一个镜像站点。所有的MySQL文件都通过遍布全球的许多服务器提供。选择离自己最近的站点有助于缓解网络负担,同时缩短下载时间。本教材推荐http://mirror.lupaworld.com/mysql。

    第2节 安装MySQL

    1.准备安装

    在开始安装MySQL之前,必须要明白的几个问题:

    1)要安装哪个版本

    这通常需要在最新的稳定版本和最新的开发版本之间、安装在哪个类型的服务器上做选择。一般我们推荐使用最新的稳定版本,当前的最新的稳定版本是MySQL 5.0.X。

    2)准备以超级用户(root)还是以其他用户的身份安装MySQL

    MySQL不需要root权限就可以运行,但是以root身份安装可以为系统中的每位用户提供一个副本。如果没有root访问权,你就必须把它安装在自己的主目录下。但是即使以root用户安装,也应该以不同用户的身份运行。这样,通过将数据文件设置为只能由特定用户读取,就可以使数据库的所有数据都受到保护。此外,如果数据库的安全受到了威胁,攻击者也只能访问MySQL特定的用户账号,而该账号没有超出数据库的权限。

    2.Linux平台安装

    MySQL适用于所有Uinx/Linux平台。这里仅介绍在Linux下安装二进制和源代码版本的一般步骤。这也可以用来指导别的操作系统下的安装。

    1)二进制(Tarball)版本

    例如选择在Linux服务器上安装MySQL 5.0.24请到LUPA镜象下载:

    http://mirror.lupaworld.com/mysql/Downloads/。

    建议为MySQL管理创建一个用户和组,由该用户运行MySQL服务器并执行管理任务,但也可以用超级用户。

    第一步是创建一个用户运行MySQL服务器。在linux下可以用useradd和groupadd实用工具来完成。一般情况下,你需要是root用户才能成功地完成这些任务,所以在做其他事情之前,利用su命令成为root用户。

    第3章MySQL安装和使用 - 图1

    选择MySQL软件要安装的位置,并将当前目录转换到该目录。在这个例子中,我们将安装到/usr/local/,这是MySQL软件的标准安装位置。当然也可以安装到任何你喜欢的目录。

    第3章MySQL安装和使用 - 图2

    现在解开软件包。

    第3章MySQL安装和使用 - 图3

    现在应该查看一下新目录。

    第3章MySQL安装和使用 - 图4

    下一步是创建一个符号链接,以便安装能够指向/usr/local/mysql。

    第3章MySQL安装和使用 - 图5

    现在到MySQL目录查看一下。

    第3章MySQL安装和使用 - 图6

    虽然软件已经安装好,但还有几项配置任务要完成。运行scripts/mysql_install_db创建MySQL许可表。

    第3章MySQL安装和使用 - 图7

    设置二进制文件所有权,从而使之归root所有,并属于在前面创建的MySQL管理员组。

    第3章MySQL安装和使用 - 图8

    将数据目录所有权设置为先前创建的MySQL管理用户。

    第3章MySQL安装和使用 - 图9

    MySQL现在已经安装完成并准备运行。启动服务器并运行safe_mysqld。

    第3章MySQL安装和使用 - 图10

    2)二进制(RPM)版本

    在Linux系统下安装MySQL,推荐通过RedHad包管理程序。

    完整的MySQL RPM版本的文件:

    第3章MySQL安装和使用 - 图11

    安装RPM版本的过程比较方便。首先,获取要安装的RPM。至少要安装服务器和客户软件。其次,使用RPM实用工具安装程序包。

    在这个例子中使用的软件,你可以到http://mirror.lupaworld.com/mysql/downloads/mysql/5.0.html下载RPM文件到/tmp下。

    执行下面的命令序列进行安装:

    第3章MySQL安装和使用 - 图12

    RPM将在/etc/rc.d中创建合适的项,从而在系统引导和关闭时自动启动和停止服务器。RPM也可启动MySQL服务器,所以当RPM安装完成后,就可以使用MySQL了。

    RPM版本将文件放置在不同于tarball版本的位置。检查RPM以确定文件存放的位置,在此使用RPM查询选择。

    第3章MySQL安装和使用 - 图13

    如果忽略RPM文件名,要确定安装的目录,可以查询RPM数据库。

    第3章MySQL安装和使用 - 图14

    还要注意RPM将数据放在/var/lib/data,而不是/usr/local/mysql/data下。

    3)源代码安装

    建议你使用源代码安装,源代码版本安装不同于二进制版本。因为从源代码编译是个复杂的过程,有许多可能出现的错误,具体看你的操作系统、所需配置以及工具集等。

    对于我们的例子,假定mysql-5.0.24.tar.gz已经下载到/root下。

    与二进制安装一样,第一次是创建运行MySQL服务器的用户。

    第3章MySQL安装和使用 - 图15

    解开源文件包。

    第3章MySQL安装和使用 - 图16

    进入新创建的MySQL目录。

    第3章MySQL安装和使用 - 图17

    现在使用configure脚本来配置所建立的MySQL。在这个例子中,我们使用了prefix选项,从而将安装位置设置为/usr/local/mysql。

    第3章MySQL安装和使用 - 图18

    configure实用工具提供了许多选项,要得到可用的选项的更多帮助,请运行:

    第3章MySQL安装和使用 - 图19

    完成就可以构建二进制文件。

    第3章MySQL安装和使用 - 图20

    如果一切顺利,你现在就得到了MySQL的二进制版本,最后需要做的事情是安装它。

    第3章MySQL安装和使用 - 图21

    现在软件安装好,还要几项配置任务要完成,运行mysql_install_db来创建MySQL许可表。

    第3章MySQL安装和使用 - 图22

    启动服务需运行safe_mysqld。

    第3章MySQL安装和使用 - 图23

    停止服务需运行mysqladmin。

    第3章MySQL安装和使用 - 图24

    如果需要开机启动MySQL,则进行如下操作:

    编辑文件rc.local。

    第3章MySQL安装和使用 - 图25

    在配置文件里加入下列一行。

    第3章MySQL安装和使用 - 图26

    保存退出即可。

    第3节 配置MySQL

    MySQL的配置需要MySQL服务器进程、mysqld及其几个客户进程,如MySQL命令实用程序。确切地说,要使用命令行选项、配置文件和环境变量的组合来进行配置。几乎任何配置项都用这三种机制来进行管理。

    因为可以使用多种方式定义选项,所以MySQL提供了一个定义如何解决冲突的内置优选顺序:命令行选项、配置选项、环境变量选项。处理MySQL选项最简单、最常用的方法就是使用配置文件。配置文件可以让你将所有选项写入一个文件中,这样不必每次都运行命令或日志来将它们指定到一台机器中。

    1.配置文件定位

    在Linux系统中,决定MySQL服务器运行特性的MySQL主配置文件可以存放于多个位置。MySQL服务器在启动时会到以下四个位置去查找主配置文件。通常主配置文件名为my.cnf。

    1)/etc/my.cnf文件

    MySQL查找的第一个位置是全局选项文件。

    2)DATADIR/my.cnf文件

    DATADIR是MySQL服务器保存其数据文件的目录。这个配置文件中只应用于给定服务器的配置参数。

    3)通过—defaults-extra-file=filename命令行选项指定的位置

    这个命令行选项使MySQL服务器或客户实用程序在任意指定位置查找配置文件。

    4)$ HOME/.my.cnf文件

    $ HOME是保存当前用户主目录的环境变量。用户主目录下的配置文件用来为各用户保存其特定的选项,即大多数客户选项的位置。

    2.配置文件内容

    下面是一个配置文件的样例。MySQL配置文件:

    第3章MySQL安装和使用 - 图27

    第3章MySQL安装和使用 - 图28

    第3章MySQL安装和使用 - 图29

    第3章MySQL安装和使用 - 图30

    配置文件的一些参数的详解:

    1)back_log

    要求MySQL具有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,它就起作用,然后主线程检查连接并且启动一个新线程。

    back_log值指在MySQL暂时停止回答新请求之前的短时间内,允许有多少个请求可以被存在堆栈中。如果期望在一个短时间内会有很多连接,则需要增加它的值。注意,back_log的值不能高于操作系统的最大值。默认数值是50。

    2)interactive_timeout

    关闭服务器之前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对mysql_real_connect()使用CLIENT_INTERACTIVE选项的客户。默认数值是28800。

    3)key_buffer_size

    索引块为缓冲,并且被所有线程共享。key_buffer_size是用于索引块的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写)。如果该值太大,系统将开始换页并且变慢。默认数值是8388600(8M)。

    4)max_connections

    允许同时访问的数量,即mysqld要求的文件描述符的数量。若访问量超过设定值,我们将会看到Too many connections错误。默认数值是100。

    5)record_buffer

    每个进行顺序扫描的线程,都为其扫描的每张表分配一个缓冲区。默认数值是131072(128K),我把它改为16773120(16M)。

    6)sort_buffer

    为每个需要进行排序的线程分配一个缓冲区,增加这个值可以加速ORDER BY或GROUP BY操作。默认数值是2097144(2M)。

    7)table_cache

    为所有线程打开表的数量。增加该值能增加mysqld要求的文件描述符的数量。MySQL对每个唯一打开的表需要2个文件描述符。默认数值是64。

    8)thread_cache_size

    可以复用的保存在线程中的数量。如果有的话,新的线程会从缓存中取得,当断开连接的时候如果有空间,则客户的线程保留在缓存中。如果有很多新的线程,为了提高性能的话可以改变这个变量。通过比较Connections和Threads_created状态的数据,可以看到这个变量的作用。

    9)MySQL的搜索功能

    用MySQL进行搜索,要求能不分大小写,又能用中文进行搜索。需要启动mysqld时指定—default-character-set=gb2312。

    10)wait_timeout

    服务器在关闭它之前在一个连接上等待行动的秒数。默认数值是28800。

    3.配置MySQL随机启动

    因为MySQL服务器是服务进程,所以应当在机器启动时自动启动,并在计算机关闭时完全关闭。如何达到这些目标很大程度上依赖于操作系统。下面写一个Linux系统下的样例:

    Mysql.server脚本支持MySQL在linux系统上的启动和关闭,在安装目录下的support-files下可以找到这脚本,它通常在/usr/local/mysql/support-files下。

    注意:如果是使用RPM包在Linux上安装MySQL,那么mysql.server可能已经安装到机器上,如存在这个文件/etc/rc.d/init.d/mysql,则说明MySQL可以自动启动和关闭了。将mysql-server安装到Linux系统的过程为:

    第3章MySQL安装和使用 - 图31

    第一行将脚本复制到初始脚本目录/etc/rc.d/init.d。第二条命令创建了到该脚本的链接,使得Linux在系统进入运行级别3时执行该脚本。最后一行为运行级别0创建mysql.server链接。运行级别0执行系统终止。当系统关闭时执行/etc/rc.d/rc0.d脚本。

    4.增加安全性

    MySQL数据库的安全配置必须从两个方面入手,系统内部安全和外部网络安全。

    1)系统内部安全

    MySQL的授权表给数据库的访问提供了灵活的权限控制,但是如果本地用户拥有对库文件的读权限的话,攻击者只需把数据库目录打包,然后拷到自己本机的数据目录下就能访问窃取的数据库。所以MySQL所在的主机的安全性是最首要的问题,如果主机不安全,被攻击者控制,那么MySQL的安全性也无从谈起。其次就是数据目录和数据文件的安全性,也就是权限设置问题。

    数据目录的属性是700,这样就比较好,只有启动数据库的用户可以读写数据库文件,保证了本地数据文件的安全。

    如果启动MySQL数据库的用户是mysql,那么像如下的目录和文件的是安全的,请注意数据目录及下面的属性:

    第3章MySQL安装和使用 - 图32

    第3章MySQL安装和使用 - 图33

    用root用户启动远程服务一直是安全大忌,因为如果服务程序出现问题,远程攻击者极有可能获得主机的完全控制权。MySQL从3.23.15版本开始时作了小小的改动,默认安装后服务器要用mysql用户来启动,不允许root用户启动。如果一定要用root用户来启动,必须加上—user=root的参数(./safe_mysqld—user=root &)。因为MySQL中有LOAD DATA INFILE和SELECT……INTO OUTFILE的SQL语句,如果是root用户启动了MySQL服务器,那么,数据库用户就拥有了root用户的写权限。不过MySQL还是做了一些限制的,比如LOAD DATA INFILE只能读全局可读的文件,SELECT……INTO OUTFILE不能覆盖已经存在的文件。

    本地的日志文件也不能忽视,包括Shell的日志和MySQL自己的日志。有些用户在本地登陆或备份数据库的时候为了图方便,有时会在命令行参数里直接带了数据库的密码,如:

    第3章MySQL安装和使用 - 图34

    这些命令会被shell记录在历史文件里,比如bash会写入用户目录的.bash_history文件,如果这些文件不慎被读,那么数据库的密码就会泄漏。用户登陆数据库后执行的SQL命令也会被MySQL记录在用户目录的.mysql_history文件里。如果数据库用户用SQL语句修改了数据库密码,也会因.mysql_history文件而泄漏。所以我们在Shell登陆及备份的时候不要在-p后直接加密码,而是在提示后再输入数据库密码。

    另外这两个文件我们也应该不让它记录我们的操作,以防万一。

    第3章MySQL安装和使用 - 图35

    这两条命令把这文件链接到/dev/null,那么我们的操作就不会被记录到这两个文件里了。

    2)外部网络安全

    MySQL数据库安装好以后,user表是这样的:

    第3章MySQL安装和使用 - 图36

    其中lupa是试验的机器名,所以实际上MySQL默认只允许本机才能连接数据库。但是缺省root用户口令是空,所以当务之急是给root用户加上口令。给数据库用户加口令有三种方法:

    ●在shell提示符下用mysqladmin命令来改root用户口令:

    第3章MySQL安装和使用 - 图37

    这样,MySQL数据库root用户的口令就被改成lupa了。

    ●用set password修改口令:

    第3章MySQL安装和使用 - 图38

    ●直接修改user表的root用户口令:

    第3章MySQL安装和使用 - 图39

    user表还有空的匿名用户,虽然它在Linux平台下没什么权限,但为了安全起见我们应该删除它:

    第3章MySQL安装和使用 - 图40

    Windows版本MySQL的user表有很大不同,我们看到Host字段除了localhost还有%:

    第3章MySQL安装和使用 - 图41

    MySQL的5个授权表:user,db,host,tables_priv和columns_priv提供非常灵活的安全机制,从MySQL 3.22.11开始引入了两条语句GRANT和REVOKE来创建和删除用户权限,可以方便地限制哪个用户可以连接服务器、从哪里连接以及连接后可以做什么操作。

    授权表使用举例:

    grant用于给增加用户和创建权限,revoke用于删除用户权限。

    下面是一些用grant增加用户和创建权限的例子:

    第3章MySQL安装和使用 - 图42

    这句增加一个本地具有所有权限的lupa用户(超级用户),密码是lupa。ON这句中的.意味着“所有数据库、所有表”。with grant option表示它具有grant权限。

    下面是用revoke删除用户权限的例子:

    第3章MySQL安装和使用 - 图43

    这些只是MySQL授权表的简单使用,更多详细的资料请见MySQL提供的手册。

    3)一些小技巧

    ●如果不慎忘记了MySQL的root密码,我们可以在启动MySQL服务器时加上参数—skip-grant-tables来跳过授权表的验证(./safe_mysqld—skip-grant-tables &),这样我们就可以直接登陆MySQL服务器,然后再修改root用户的口令,重启MySQL就可以用新口令登陆了。

    ●启动MySQL服务器时加上—skip-show-database使一般数据库用户不能浏览其他数据库。

    ●启动MySQL服务器时加上—log-slow-queries[=file]参数,这样mysqld会把SQL命令执行时间超过long_query_time的写入file文件。如果没有指定=file,mysqld默认会写到数据目录下的hostname-slow.log。如果只指定了filename,没有指定路径,那么mysqld也会把filename写到数据目录下。我们通过这个日志文件可以找出执行时间超长的查询语句,然后尽可能的优化它减轻MySQL服务器的负担。

    ●如果我们只需本机使用MySQL服务,那么我们还可以加上—skip-networking启动参数使MySQL不监听任何TCP/IP连接,增加安全性。

    第4节 MySQL管理

    1.使用命令工具

    标准MySQL安装中自带的命令实用程序,这些实用程序大多是二进制可执行文件,有的则是外壳脚本。

    1)myisampack

    这个实用程序创建只读的压缩的数据表,myisamchk这样调用:

    第3章MySQL安装和使用 - 图44

    如果你在一个数据库目录里,你可以这样检查所有数据库表:

    第3章MySQL安装和使用 - 图45

    2)MySQL

    对MySQL用户而言,MySQL命令行实用程序也许是最重要的可执行程序。它允许交互或在批处理模式下查询数据库。

    命令为:

    第3章MySQL安装和使用 - 图46

    连接MySQL

    格式:mysql-h主机地址-u用户名-P用户密码

    假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令:

    第3章MySQL安装和使用 - 图47

    3)mysqladmin

    用于执行管理性操作。语法是:

    第3章MySQL安装和使用 - 图48

    通过执行mysqladmin—help,可以得到mysqladmin版本所支持的一个选项列表。

    目前mysqladmin支持下列命令:

    第3章MySQL安装和使用 - 图49

    第3章MySQL安装和使用 - 图50

    如:再将root的密码改为newpassword。

    第3章MySQL安装和使用 - 图51

    4)mysqlbinlog

    该命令将二进制日志中的项目转换为可读的表单或SQL语句,其命令格式:

    第3章MySQL安装和使用 - 图52

    5)mysqlcheck

    mysqlcheck用于检查及修复数据库或表。

    用法:

    第3章MySQL安装和使用 - 图53

    常用选项

    -a 分析指定的表

    -c 检查库或表

    -r 修复库和表

    -o 优化指定的表

    -h mysqle服务主机

    -u 用户名

    -p 密码

    -auto-repair 当检查表有错误自动修复

    -e 完全检查或修复指定表,时间最长

    -m 检查程序,一般所用时间也最短

    -q 最快的检查或修复表的方法,用的时间最少

    -F 只检查没有正确关闭的表

    -f 如果碰到sql错误,强制执行

    6)mysqldump

    mysqldump实用程序从数据库中抽取数据。

    用法:

    第3章MySQL安装和使用 - 图54

    如:

    第3章MySQL安装和使用 - 图55

    注释:将数据库school备份到school.sql文件,school.sql是一个文本文件,文件名任取,打开看看你会有新发现。

    7)mysqlhotcopy

    mysqlhotcopy用于为活动的数据库执行一个安全备份。

    用法:

    第3章MySQL安装和使用 - 图56

    如:

    第3章MySQL安装和使用 - 图57

    —checkpoint dbinfo.checkpoint这个是指定存放操作记录的数据库/表

    —addtodest增量备份,新的备份自动覆盖原来的

    db_douzi_org要备份的数据库名

    /var/db_backup备份目录

    2.建立和管理数据库

    1)连接服务器

    第3章MySQL安装和使用 - 图58

    输入数据库的密码后,会看到以下界面:

    第3章MySQL安装和使用 - 图59

    2)显示命令

    ●显示数据库列表:

    第3章MySQL安装和使用 - 图60

    ●显示库中的数据表:

    第3章MySQL安装和使用 - 图61

    ●显示数据表的结构:

    第3章MySQL安装和使用 - 图62

    ●建库:

    第3章MySQL安装和使用 - 图63

    ●建表:

    第3章MySQL安装和使用 - 图64

    ●删库和删表:

    第3章MySQL安装和使用 - 图65

    ●将表中记录清空:

    第3章MySQL安装和使用 - 图66

    ●显示表中的记录:

    第3章MySQL安装和使用 - 图67

    3.建立和管理用户

    MySQL 3.22.11开始引入两条语句使得这项工作更容易做:GRANT语句创建MySQL用户并指定其权限,而REVOKE语句删除权限。两条语句扮演了MySQL数据库的前端角色,并提供与直接操作这些表的内容不同的另一种方法。

    GRANT语句的语法看上去像这样:

    第3章MySQL安装和使用 - 图68

    要使用该语句,你需要填写下列部分:

    1)Privileges

    授予用户的权限,下表列出可用于GRANT语句的权限指定符:

    第3章MySQL安装和使用 - 图69

    2)columns

    权限运用的列,它是可选的,并且只能设置列特定的权限。如果命令中有多于一个列,应该用逗号分开它们。

    3)what

    权限运用的级别。权限可以是全局的(适用于所有数据库和所有表)、特定数据库(适用于一个数据库中的所有表)或特定表的。可以通过指定一个columns字段的权限是列特定的。

    4)user

    权限授予的用户,它由一个用户名和主机名组成。在MySQL中,你不仅指定谁能连接,还可指定从哪里连接。这允许你让两个同名用户从不同地方连接。MySQL让你区分他们,并彼此独立地赋予权限。

    MySQL中的一个用户名就是你连接服务器时指定的用户名,该名字不必与你的系统登录名或Windows名联系起来。缺省地,如果不明确指定一个名字,客户程序将使用登录名作为MySQL用户名。这只是一个约定。你可以在授权表中将该名字改为nobody,然后以nobody连接执行需要超级用户权限的操作。

    5)password

    赋予用户的口令,它是可选的。如果对新用户没有指定IDENTIFIED BY子句,该用户不赋给口令(不安全)。对现有用户,任何你指定的口令将代替老口令。如果你不指定口令,老口令保持不变。当你用IDENTIFIED BY时,口令字符串用改用口令的字面含义,GRANT将为你编码口令,不要像SET PASSWORD那样使用password ()函数。

    WITH GRANT OPTION子句是可选的。如果你包含它,用户可以授予权限通过GRANT语句授权给其他用户。你可以用该子句给予其他用户授权的能力。

    用户名、口令、数据库和表名在授权表记录中是大小写敏感的,主机名和列名不是。

    一般地,你可以通过询问几个简单的问题来识别GRANT语句的种类:

    ●谁能连接,从那儿连接?

    ●用户应该有什么级别的权限,他们适用于什么?

    ●用户应该允许管理权限吗?

    下面就讨论一些例子。

    ●谁能连接,从那儿连接?

    你可以允许一个用户从特定的或一系列主机连接。有一个极端,如果你知道将只从一个主机连接,可以将权限局限于单个主机。

    第3章MySQL安装和使用 - 图70

    (samp_db.*意思是samp_db数据库的所有表)。你也可以允许他从无论哪里连接:

    第3章MySQL安装和使用 - 图71

    “%”字符起通配符作用,与LIKE模式匹配的含义相同。在上述语句中,它意味着“任何主机”。所以max和max@%等价。这是建立用户最简单的方法,但也是最不安全的。可以允许一个用户从另一个受限的主机集合访问。例如,要允许test1从test.net域的任何主机连接,用一个%.test.net主机指定符:

    第3章MySQL安装和使用 - 图72

    如果你喜欢,用户标识符的主机部分可以用IP地址而不是一个主机名来给定。你可以指定一个IP地址或一个包含模式字符的地址,而且,从MySQL 3.23,你还可以指定具有指出用于网络号的位数的网络掩码的IP号:

    第3章MySQL安装和使用 - 图73

    第一个例子指出用户能从其连接的特定主机,第二个指定对于C类子网192.168.128的IP模式,而第三条语句中,192.168.128.0/17指定一个17位网络号并匹配具有192.168.128头17位的IP地址。

    如果MySQL抱怨你指定的用户值,你可能需要使用引号(只将用户名和主机名部分分开加引号)。

    第3章MySQL安装和使用 - 图74

    ●用户应该有什么级别的权限和它们应该适用于什么?

    你可以授权不同级别的权限,全局权限是最强大的,因为它们适用于任何数据库。要使test成为可做任何事情的超级用户,包括能授权给其他用户,发出下列语句:

    第3章MySQL安装和使用 - 图75

    ON子句中的.意味着“所有数据库、所有表”。从安全考虑,我们指定test只能从本地连接。限制一个超级用户可以连接的主机通常是明智的,因为它限制了试图破解口令的主机。

    有些权限(FILE、PROCESS、RELOAD和SHUTDOWN)是管理权限并且只能用“ON .”全局权限指定符授权。如果你愿意,你可以授权这些权限,而不授权数据库权限。例如,下列语句设置一个flush用户,他只能发出flush语句。这可能在你需要执行诸如清空日志等的管理脚本中会有用:

    第3章MySQL安装和使用 - 图76

    数据库级权限适用于一个特定数据库中的所有表,它们可通过使用ON db_name. *子句授予:

    第3章MySQL安装和使用 - 图77

    第一条语句向galen授权samp_db数据库中所有表的权限。第二条创建一个严格限制访问的用户ro_user(只读用户),只能访问samp_db数据库中的所有表,但只有读取权限,即用户只能发出SELECT语句。

    你可以列出一系列同时授予的各个权限。例如,如果你想让用户能读取并能修改现有数据库的内容,但不能创建新表或删除表,如下授予这些权限:

    第3章MySQL安装和使用 - 图78

    对于更精确的访问控制,你可以授权在各个表上,或在表的每个列上。当你想给用户隐藏一个表的部分时,或你想让一个用户只能修改特定的列时,列的特定权限非常有用。如:

    第3章MySQL安装和使用 - 图79

    第一条语句授予galen对整个member表的读权限并设置了一个口令。第二条语句增加了UPDATE权限,且只对expiration列。没必要再指定口令,因为第一条语句已经指定了。

    如果你想对多个列授予权限,指定一个用逗号分开的列表。例如,对assistant用户增加member表的地址字段的UPDATE权限,使用如下语句,新权限将加到用户已有的权限中:

    第3章MySQL安装和使用 - 图80

    通常,你不想授予任何比用户确实需要的权限宽的权限。然而,当你想让用户能创建一个临时表以保存中间结果,但又不想让他们在一个他们不应修改内容的数据库中这样做时,发生了要授予在一个数据库上的相对宽松的权限。可以通过建立一个分开的数据库(如tmp)并授予此数据库上的所有权限来进行。例如,如果想让来自test.net域中主机的任何用户使用tmp数据库,你可以发出这样的GRANT语句:

    第3章MySQL安装和使用 - 图81

    在你做完之后,用户可以创建并用tmp.tbl_name形式引用tmp中的表(在用户指定符中的“”创建一个匿名用户,任何用户均匹配空白用户名)。

    ●用户应该被允许管理权限吗?

    你可以允许一个数据库的拥有者通过授予数据库上的所有拥有者权限来控制数据库的访问。在授权时,指定WITH GRANT OPTION。例如:如果你想让alicia能从big.corp.com域的任何主机连接并具有sales数据库中所有表的管理员权限,你可以用如下GRANT语句:

    第3章MySQL安装和使用 - 图82

    在效果上WITH GRANT OPTION子句允许你把访问授权的权利授予另一个用户。要注意,拥有GRANT权限的两个用户可以彼此授权。如果你只给予了第一个用户SELECT权限,而另一个用户有GRANT加上SELECT权限,那么第二个用户就比第一个用户更强大。

    6)撤权并删除用户

    要取消一个用户的权限,使用REVOKE语句。REVOKE的语法非常类似于GRANT语句,除了用FROM取代TO并且没有INDETIFED BY和WITH GRANT OPTION子句:

    第3章MySQL安装和使用 - 图83

    user部分必须匹配原来GRANT语句中的想撤权的用户的user部分。privileges部分不需匹配,你可以用GRANT语句授权,然后用REVOKE语句只撤销部分权限。

    REVOKE语句只删除权限,而不删除用户。即使撤销了所有权限,在user表中的用户记录依然保留,这意味着用户仍然可以连接服务器。要完全删除一个用户,必须用一条DELETE语句明确从user表中删除用户记录:

    第3章MySQL安装和使用 - 图84

    DELETE语句删除用户记录,而FLUSH语句告诉服务器重载授权表。(当你使用GRANT和REVOKE语句时,表自动重载,而直接修改授权表时则不是)

    4.恢复数据

    1)备份

    一个好的备份策略对于管理员来说非常重要。如果系统曾经崩溃过,希望能在数据损失尽量少的情况下恢复数据,那么做好备份将是很有益的。同样,如果偶然删除或者损坏了数据库,可以随时提供备份。

    有些重要问题在备份的时候需要考虑:

    ●可能的话将备份存储在一个设备中而不是数据库中。如果磁盘崩溃了,那么你将会很庆幸在别处还有一个备份。如果有二进制日志,则应存储到备份所在的设备上。

    ●确保有足够的磁盘空间来完成备份。

    ●除备份以外,还要使用二进制日志,这样可以在最小的数据损失下恢复数据库。如果选择不是用二进制日志,你将能把数据库恢复到最后备份的状态。相应于具体的应用,有时没有二进制备份可能是无用的。

    ●保存一定数量的归档备份。

    ●在紧急情况发生前测试备份。

    下面介绍两个备份的MySQL的实用程序:

    ◆mysqldump

    要用mysqldump备份数据库,建议你使用-opt选项。这个选项将提供最快速的数据库转储。

    命令如下:

    第3章MySQL安装和使用 - 图85

    这个命令将测试数据库转储到文件/usr/backups/testdb中。如果正在使用二进制日志,那么还要指定-flush-logs,这样二进制日志将得到一个备份检查点:

    第3章MySQL安装和使用 - 图86

    ◆mysqlhotcopy

    mysqlhotcopy是一个perl脚本,使用LOCK TABLES、FLUSH TABLES和UNIX cp的组合来进行数据库快速备份。

    命令如下:

    第3章MySQL安装和使用 - 图87

    这个命令在/usr/backups目录下创建一个新的目录,将测试数据库的所有数据文件复制到其中。

    2)恢复

    一般情况下需要两样东西来执行数据库恢复:备份文件和二进制日志。

    ●mysqldump恢复

    下面的命令是重新加载数据库:

    第3章MySQL安装和使用 - 图88

    这条命令将运行由mysqldump生成的SQL命令,将数据库带回到最后一次备份时的状态。

    如果你只想恢复一个数据库,那么使用-one-database mysql选项来过滤用于其他数据库的SQL命令。

    命令如下:

    第3章MySQL安装和使用 - 图89

    ●mysqlhotcopy恢复

    从mysqlhotcopy备份恢复,可以通过在服务器不运行时将数据库文件从备份位置复制到mysql数据位置来重新装载数据库。假设数据库备份下/var/backup/test下,而mysql数据位置在/usr/local/mysql/data下,则执行:

    第3章MySQL安装和使用 - 图90

    这个命令将数据库带回最后备份的状态。

    5.phpMyAdmin

    phpMyAdmin是一套以基于php开发,针对MySQL数据库系统的Web界面管理系统。它可以很方便地以图形化界面,来对MySQL数据库的数据表做增删的动作,也可以做数据库本身的增删管理;另外一个好处是,你也可以通过这个界面来学习SQL正确的语法。

    我们可以通过站点http://www.phpmyadmin.net和http://tech.lupaworld.com/lamp下载最新版本的phpMyAdmin。我们选择2.8系列,这里要注意的是2.8版本与早期版本在安装方面有所有不同。安装phpMyAdmin有多种方法,其一是直接改配置文件内容,其二是通过安装文件生成脚本文件。本书介绍是第一种方法,主要是因为简单快速。

    假设这里的版本是phpMyAdmin2.8.2.4.tar.gz,对软件解压:

    第3章MySQL安装和使用 - 图91

    解压后得到目录phpMyAdmin2.8.2.4

    第3章MySQL安装和使用 - 图92

    在配置文件中,找到以下条目:(其他都默认)

    第3章MySQL安装和使用 - 图93

    现在配置文件都设置好了,打开浏览器,输入:http://locahost/pma/,如图:

    第3章MySQL安装和使用 - 图94

    phpMyAdmin可以运行起来了,但默认设置是不安全的,你需要给phpMyAdmin所在的目录加上访问认证,可以参考本书第二章apache使用和安装中访问认证控制这节来实现。