MySQL数据库系统
1. MySQL服务基础
MySQL是一个真正的多线程,多用户的SQL数据库服务,凭借其高性能,高可靠和易于使用的特性,成为服务器领域中最受欢迎的开源数据库系统。在2008年以前MySQL项目由MySQL AB公司进行开发、发布和支持,之后历经SUN公司收购MySQL AB,Oracle公司收购SUN过程,目前MySQL项目由oracle公司负责运营和维护。
本节将介绍MySQL的编译安装过程,服务控制方法,以及如何使用客户端工具访问MySQL数据库。
1.1 MySQL的编译安装
为了确保MySQL数据库功能的完整性、可定制性,本小节将采用源代码编译的方式安装MySOL数据库系统。MySOL 5.X系列版本的使用最为广泛。稳定性,兼容性都不错,这里将选用mysql-5.1.55.tar.gz为例,该版本可以从官方站点http://www.mysql.com/下载。
1.准备工作
为了避免发生端口冲突、程序冲突等现象,建议先查询MySQL软件的安装情况,确认没有使用RPM方式安装的mysql-server,mysql软件包,否则建议将其卸载。
[root@MySQL ~]# rpm -q mysql-server mysql |
package mysql-server is not installedpackage mysql is not installed2.源码编译及安装
1)创建运行用户
为了加强数据库服务的权限控制,建议使用专门的运行用户,如mysql。此用户不需要直接登录到系统,可以不创建宿主文件夹。
[root@mysql ~]# useradd -M -u 49 -s /sbin/nologin mysql |
2)解包
将下载的mysql源码包解压释放到/usr/src/目录下,并切换到展开后的源码目录。
[root@mysql home]# tar zxf mysql-5.1.55.tar.gz -C /usr/src/[root@mysql home]# cd /usr/src/mysql-5.1.55/ |
3)配置
在内容丰富,结构庞大的企业网站平台中可能会用到多种字符集的网页,相应地数据库系统也应该支持不同的字符集编码。在配置过程中,可以将默认使用的字符集设置为utf8并添加对gbk、gb2312等其他字符集的支持。
[root@mysql mysql-5.1.55]# yum -y install gcc-c++[root@mysql mysql-5.1.55]# yum -y install ncurses-devel[root@mysql mysql-5.1.55]# ./configure --prefix=/usr/local/mysql --with-charset=utf8 --with-collation=utf8_general_ci --with-extra-charsets=gbk,gb2312上述配置命令中,各选项的含义如下。
➣ --prefix:指定将mysql数据库程序安装到哪个目录,如/usr/local/mysql。
➣ --with-charset:指定默认使用的字符集编码,应与校对规则相对应,如utf8。
➣ --with-collation:指定默认使用的字符集校对规则,utf8_general_ci是适用于UTF-8字符集的通用规则。
➣ --with-extra-charset:指定额外支持的其他字符集编码,如gbk、gb2312等。
在mysql5.1.55版本的源码包中,对于通过--with-extra-charset配置选项添加的其他字符集编码,还需要对其进行一些小调整,才能在编译后获得完整的支持。如修改include子文件夹下的config.h文件,添加相应字符集的编译定义即可。
[root@mysql mysql-5.1.55]# vim include/config.h# define HAVE_CHARSET_gbk 1# define HAVE_CHARSET_gb2312 1 |
4)编译并安装
[root@mysql mysql-5.1.55]# make <==等很久......[root@mysql mysql-5.1.55]# make install |
3.安装后的其他调整
1)建立配置文件
在MySQL源码目录中的support-files文件夹下,提供了适合不同负载数据库的样本配置文件。如果不确定数据库系统的应用规模,一般选择my-medium.cnf文件即可,该文件能够满足大多数企业的中等应用需求。根据样例建立MySQL系统的/etc/my.cnf 配置文件。
[root@mysql mysql-5.1.55]# cp support-files/my-medium.cnf /etc/my.cnf |
2)初始化数据库
为了能够正常使用MySQL数据库系统,应以运行用户mysql的身份执行初始化任务,以便建立用户授权库,表,以及test测试库等。初始化脚本mysql_install_db位于安装目录下的bin文件夹中。此外还应调整用于存放数据库内容的文件夹归属,以便mysql用户有权限对其进行读写操作。
[root@mysql mysql-5.1.55]# cd /usr/local/mysql/bin/[root@mysql bin]# ./mysql_install_db --user=mysql |
[root@mysql bin]# chown -R root:mysql /usr/local/mysql/[root@mysql bin]# chown -R mysql /usr/local/mysql/var/ |
3)优化执行路径程序库路径
为MySQL系统的各种执行程序添加符号链接以方便其使用。另外,建议为MySOL的库文件,头文件也添加符号链接,便于在安装其他的用到这些文件的软件包时能自动搜索。
[root@mysql bin]# ln -s /usr/local/mysql/bin/* /usr/local/bin/[root@mysql bin]# ln -s /usr/local/mysql/bin/mysql/* /usr/lib/[root@mysql bin]# ln -s /usr/local/mysql/include/mysql/* /usr/include/ |
4.添加系统服务
若希望添加mysqld到系统服务,以便通过chkconfig进行管理,可以直接使用源码包中提供的服务脚本。找到support-flies文件夹下的mysql.server脚本文件,将其复制到etc/init.d/目录下,并改名为mysqld,然后再设置执行权限,通过chkconfig命令将其添加为mysqld系统服务。
[root@mysql bin]# cd /usr/src/mysql-5.1.55/[root@mysql mysql-5.1.55]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld[root@mysql mysql-5.1.55]# chmod a+x /etc/rc.d/init.d/mysqld [root@mysql mysql-5.1.55]# chkconfig --add mysqld |
这样以后就可以使用service工具或直接执行/ete/init.d/mysqld脚本来控制MySQL数据库服务了。例如若要启动mysqld服务,并查看其运行状态,可以执行以下操作。
[root@mysql mysql-5.1.55]# /etc/init.d/mysqld startStarting MySQL. [确定][root@mysql mysql-5.1.55]# /etc/init.d/mysqld statusMySQL running (76739) [确定][root@mysql mysql-5.1.55]# netstat -anpt | grep mysqldtcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 76739/mysqld |
MySQL服务器默认通过 TCP 3306端口提供服务。通过编辑/etc/my.cnf配置文件中[mysqld]配置段的port = 3306行,可以更改监听端口。
1.2 访问MySQL数据库
MySQL数据库系统也是一个典型的C/S(客户端/服务器)架构的应用,要访问MySQL数据库需要使用专门的客户端软件,其中在Windows平台中可以选用MySQL Manager,MySQL Front,Navicat Lite等软件;而在Linux系统中最简单易用的MySQL客户端软件是其自带的mysql命令工具。
1.登录到MySQL服务器
经过安装后的初始化过程,MySQL数据库的默认管理员账号为root,密码为空。若要以未设置密码的root用户登录本机的MySQL数据库,可以执行以下操作。
[root@mysql ~]# mysql -u root <==“-u”选项用于指定认证用户 |
当然如果登录的是其他的MySQL服务器,则需要使用”-h“选项来指定目标主机地址;在有密码的情况下,还应使用”-P”选项来进行密码校验。例如若要连接到MySQL服务器192.168.1.10,并以用户adm123进行有密码的验证,可以执行以下操作。
[root@mysql ~]# mysql -h 192.168.1.10 -u adm123 -pEnter password: <==根据提示输入正确密码 |
2.执行MySQL操作语句
验证成功以后将会进入到提示符为“mysql>"的数据库操作环境,用户可以输入各种操作语句对数据库进行管理。每一条MySOL操作语句以分号”;“表示结束,输入时可以不区分大小写,但习惯上将MySQL语句中的关键字部分使用大写。
例如,以root用户登录到“mysql”环境后,执行“SHOW MASTER lOGS;”语句可以查看到当前数据库服务的日志文件信息。
[root@mysql ~]# mysql -u rootWelcome to the MySQL monitor. Commands end with ; or g.Your MySQL connection id is 1Server version: 5.1.55 Source distributionCopyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.This software comes with ABSOLUTELY NO WARRANTY. This is free software,and you are welcome to modify and redistribute it under the GPL v2 licenseType 'help;' or 'h' for help. Type 'c' to clear the current input statement.mysql> SHOW MASTER LOGS;+------------------+-----------+| Log_name | File_size |+------------------+-----------+| mysql-bin.000001 | 19075 || mysql-bin.000002 | 731182 || mysql-bin.000003 | 106 |+------------------+-----------+3 rows in set (0.00 sec)mysql> |
3.退出“mysql”操作环境
在”mysql“操作环境中,执行“EXIT”或”QUIT”可以退出mysql命令工具,返回到原来的Shell环境。
mysql> exitBye[root@mysql ~]# |
2. 使用MySOL数据库
熟悉安装及访问MySQL数据库以后,接下来将学习使用MySQL数据库的基本操作,这也是在服务器运维工作中不可或缺的知识。本节中的所有数据库语句均在”mysql”操作环境中执行。
2. 1 查看数据库结构
MySQL是一套数据库管理系统,在每一台MySQL服务器中,支持运行多个库,每个库相当于一个容器,其中存放着许许多多的表。表中的每一行包含一条具体的数据关系信息(如编号为SW01的交换机的购买时间,价格等情况),这些信息称为数据记录。
1.查看当前服务器中有哪些库
SHOW DATABASES语句:用于列出当前MySOL服务器中包含的库。经初始化后的MySQL服务器,默认建立了三个库,test.mysql和informaton_schema(其中mysql库中包含了用户认证相关的表),执行以下操作可以进行查看。
mysql> SHOW DATABASES;+--------------------+| Database |+--------------------+| information_schema || mysql || test |+--------------------+3 rows in set (0.01 sec)2.查看当前使用的库中有哪些表
SHOW TABLES语句:用于列出当前所在的库中包含的表。在操作之前,需要先使用USE语句切换到所使用的库,例如,以下操作可以列出mysql库中包含的所有表。
mysql> USE mysql;Database changedmysql> SHOW TABLES;+---------------------------+| Tables_in_mysql |+---------------------------+| columns_priv || db || event || user |+---------------------------+23 rows in set (0.00 sec) |
MySQL数据库的数据文件默认存放在/usr/local/mysql/var/目录下,每个数据库对应一个子目录,用于存储数据表文件。每一个数据表对应为三个文件,后缀名分别为“.frm”、”.MYD“和".MYI"。
3. 查看表的结构
DESCRIBE语句:用于显示表的结构,即组成表的各字段(列)的信息。需要指定”库名.表名“作为参数;若只指定表名参数,则需先通过“USE"语句切换到目标库。例如,以下操作可以查看mysql库中的user表的结构,与直接执行”DESCRIBE mysql.user:“语句的效果相同。
mysql> USE mysql;Database changedmysql> DESCRIBE user;+-----------------------+-----------------------------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-----------------------+-----------------------------------+------+-----+---------+-------+| Host | char(60) | NO | PRI | | || User | char(16) | NO | PRI | | || Password | char(41) | NO | | | || Select_priv | enum('N','Y') | NO | | N | |+-----------------------+-----------------------------------+------+-----+---------+-------+39 rows in set (0.00 sec) |
2.2 创建及删除库和表
当需要为网站平台提供数据库服务时,如何操作来创建新的库呢?根据一份二维数据表格,如何在现有的库中创建表?对于废弃的数据表、库又该如何进行删除?本小节主要解决这三个问题。
1.创建新的库
CREATE DATABASE语句:用于创建一个新的库,需指定数据库名称作为参数。例如,执行以下操作可以创建一个名为auth的库。
mysql> CREATE DATABASE auth;Query OK, 1 row affected (0.00 sec) |
刚创建的数据库是空的,其中不包含任何表,在/usr/local/mysql/var/目录下会自动生成一个与新建的库名相同的空文件夹。
2.创建新的表
CREATE TABLE语句:用于在当前库中创建新的表,需指定数据表名称作为参数,并定义该表格所使用的各字段。基本格式如下所示。
CREATE TABLE 表名 (字段1名称 类型,字段2名称 类型, · · · · · · PRIMARY KEY(主键名))
创建表之前,应先明确数据表格的结构,各字段的名称和类型等信息。例如若要创建一个包含用户名,密码字串的用户验证表(如表所示),应先分析表格结构。

上述表格中,"用户名"为不超过16个字节的字符串,不能为空;密码字串为不超过48个字符的字符串(插入记录时使用MySQL的PASSWORD()函数加密),默认值为空字串。考虑到字符集兼容性,最好不要使用中文字段名,改用user_name,user_passwd分别表不用户名,密码字串。表格中不能拥有同名的用户,因此可将user_name作为主键。
针对上述分析结果,可以在auth库中按如下操作创建users表。其中,字段定义部分的DEFAULT用于设置默认的密码字串,PRIMARY用于设置主键字段名。
mysql> USE auth;Database changedmysql> CREATE TABLE users (user_name CHAR(16) NOT NULL, user_passwd CHAR(48) DEFAULT '', PRIMARY KEY (user_name));Query OK, 0 rows affected (0.01 sec) |
3.删除一个数据表
DROP TABLE语句:用于删除库中的表,需要指定“库名.表名"作为参数:若只指定表名参数,则需先通过”USE“语句切换到目标库。例如,执行以下操作可以删除suth库中的users表。
mysql> DROP TABLE auth.users;Query OK, 0 rows affected (0.00 sec) |
4.删除一个数据库
DROP DATABASE语句:用于删除指定的库,需要指定库名作为参数。例如执行以下操作可以删除名为auth的库。
mysql> DROP DATABASE auth;Query OK, 0 rows affected (0.00 sec) |
2. 3 管理表中的数据记录
参考2.2小节中的步骤重新创建auth库和users表,下面将以users表为基础学习向表中插入,查询,修改及删除数据记录的操作。
1.插入数据记录
INSERT INTO语句:用于向表中插入新的数据记录。语句格式如下所示。
INSERT INTO表名(字段1,字段2,......) VALUES(字段1的值,字段2的值,......)
执行以下操作将会向auth库中的user表插入一条记录:用户zhangsan,对应的密码为"123456”。注意VALUES部分的值应与前面指定的各字段逐一对应。
mysql> use auth;Database changedmysql> INSERT INTO users(user_name,user_passwd) VALUES('zhangsan', PASSWORD('123456'));Query OK, 1 row affected (0.00 sec) |
在插入新的数据记录时,如果这条记录完整包括表中所有字段的值则插入语句中指定字段的部分可以省略。例如执行以下操作也可以向auth库中的user表插入一条新的记录,用户"lisi"对应的密码为“654321”。
mysql> INSERT INTO users VALUES('lisi', PASSWORD('654321'));Query OK, 1 row affected (0.00 sec) |
2.查询数据记录
SELECT语句:用于从指定的表中查找符合条件的数据记录。MySQL数据库支持标准的SQL查询语句,语句格式如下所示。
SELECT 字段名1,字段名2,......FROM 表名 WHERE 条件表达式
表示所有字段时可以使用通配符"*",若要到出所有的数据记录则可以省略WHERE条件子句。例如,执行以下操作可以查看auth库中users表内的所有数据记录,其中密码字串因已使用”PASSWORD()”函数加密,因此不会直接显示出实际的密码内容。
mysql> select * from auth.users;+-----------+-------------------------------------------+| user_name | user_passwd |+-----------+-------------------------------------------+| zhangsan | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 || lisi | *2A032F7C5BA932872F0F045E0CF6B53CF702F2C5 |+-----------+-------------------------------------------+2 rows in set (0.00 sec) |
当需要根据特定的条件查找记录时,WHERE条件子句则是必不可少的。例如,若要查找users表中用户名为“zhangsan”的记录,输出其中用户名,密码字段的信息,可以执行以下燥作。
mysql> SELECT user_name,user_passwd FROM auth.users where user_name= 'zhangsan';+-----------+-------------------------------------------+| user_name | user_passwd |+-----------+-------------------------------------------+| zhangsan | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |+-----------+-------------------------------------------+1 row in set (0.00 sec) |
3. 修改数据记录
UPDATE语句:用于修改,更新表中的数据记录。语句格式如下所示。
UPDATE 表名 SET 字段名1=字段值1[,字段名2=字段值2] WHERE条件表达式
执行以下操作可以修改users表中用户名为lisi的记录,将密码字串设为空值。验证记录内容可以发现lisi用户的密码串值已变为空白。
mysql> UPDATE auth.users SET user_passwd=PASSWORD('') WHERE user_name='lisi';Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from auth.users;+-----------+-------------------------------------------+| user_name | user_passwd |+-----------+-------------------------------------------+| zhangsan | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 || lisi | |+-----------+-------------------------------------------+2 rows in set (0.00 sec)在MySQL数据库服务器中,用于访问数据库的各种用户(如root)信息都保存在mysql库的user表中,熟练的管理员可以直接修改其中的数据记录,例如,以下操作可以将数据库用户root的密码设为”123456“,当再次使用”mysql -u root -p”访问MySQL数据库服务器时,必须使用此密码进行验证。
mysql> UPDATE mysql.user SET password=PASSWORD('123456') WHERE user='root';Query OK, 3 rows affected (0.00 sec)Rows matched: 3 Changed: 3 Warnings: 0mysql> FLUSH PRIVILEGES; <==刷新用户授权信息Query OK, 0 rows affected (0.00 sec) |
若是在Linux命令行环境中执行还可以使用mysqladmin工具来设置密码。例如执行以下操作并验证原密码后,也可将数据库用户root的密码设为“123456“。
[root@mysql ~]# mysqladmin -u root -p passwd "123456"Enter password: |
4.删除数据记录
DELETE语句:用于删除表中指定的数据记录。语句格式如下所示。
DELETE FROM 表名 WHERE 条件表达式
执行以下操作可以删除users表用户名为”lisi“的数据记录,验证记录内容可以发现lisi用户的数据记录已经消失。
mysql> DELETE FROM auth.users WHERE user_name='lisi';Query OK, 1 row affected (0.00 sec)mysql> SELECT * FROM auth.users;+-----------+-------------------------------------------+| user_name | user_passwd |+-----------+-------------------------------------------+| zhangsan | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |+-----------+-------------------------------------------+1 row in set (0.00 sec) |
在MySQL数据库服务器中,默认添加了从本机访问数据库的空用户(user,password均为空)。基于数据库安全性考虑,应该删除这些空用户、以下操作列出了user字段为空的用户记录,并用DELETE语句进行空用户记录的删除。
mysql> SELECT user,host,password FROM mysql.user WHERE user='';+------+-----------+----------+| user | host | password |+------+-----------+----------+| | localhost | || | mysql | |+------+-----------+----------+2 rows in set (0.00 sec)mysql> DELETE FROM mysql.user WHERE user='';Query OK, 2 rows affected (0.00 sec) |
3. 维护MySQL数据库
MySQL数据库系统的维护工作主要包括用户权限的设置,数据库的备份与恢复。本节将依次对上述操作进行讲解。
3. 1 数据库的用户授权
MySQL数据库的root用户账号拥有对所有库,表的全部权限,频繁使用root账号会给数据库服务器带来一定的安全风险。实际工作中,通常会建立一些低权限的用户,只负责一部分库、表的管理和维护操作,甚至可以对查询,修改,删除记录等各种操作做进一步的细化限制,从而将数据库的风险降至最低。
1.授予权限
GRANT语句:专门用来设置数据库用户的访问权限。当指定的用户名不存在时GRANT语句将会创建新的用户,否则GRANT语句用于修改用户信息。语句格式如下所示。
GRANT 权限列表 ON 库名.表名 TO 用户名@来源地址 [ IDENTIFIED BY ‘密码’ ]
使用GRANT语句时,需要注意的事项如下。
➣ 权限列表:用于列出授权使用的各种数据库操作,以逗号进行分隔。例如“select,insert,update”。使用“all“表示所有权限,可授权执行任何操作。
➣ 库名.表名:用于指定授权操作的库和表的名称,其中可以使用通配符”*“。例如使用“auth.*”表示授权操作的对象为auth库中的所有表。
➣ 用户名@来源地址:用于指定用户名和允许访问的客户机地址,即谁能连接,能从哪里连接。来源地址可以是域名、IP地址,还可以使用“%”通配符,表示某个区域或网段内的所有地址。例如“%sky.com”、“192. 168.1.%"等。
➣ IDENTIFIED BY:用于设置用户连接数据库时所使用的密码字符串。在新建用户时若省略”IDENTIFIED BY”部分则用户的密码将为空。
执行以下操作可以添加一个名为xiaoqi的数据库用户,并允许其从本机访问,对auth库中的所有表具有查询权限,验证密码为"123456"。使用GRANT语句授权的用户记录会保存到mysql库的user,db,host,tables_priv等相关表中,无需刷新即可生效。
mysql> GRANT select ON auth.* TO 'xiaoqi'@'localhost' IDENTIFIED BY '123456';Query OK, 0 rows affected (0.00 sec) |
切换到其他Shell终端,以用户xiaoqi的身份连接数据库。当执行授权的数据库操作时将被允许,而执行非授权的数据库操作时将被拒绝。例如,允许xiaoqi查询auth库中users表的数据记录,但禁止查询其他库中的表的记录。
[root@mysql ~]# mysql -u xiaoqi -pEnter password: ...... //省略部分信息mysql> SELECT * FROM auth.users; <==验证授权的访问操作+-----------+-------------------------------------------+| user_name | user_passwd |+-----------+-------------------------------------------+| zhangsan | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |+-----------+-------------------------------------------+1 row in set (0.00 sec)mysql> SELECT * FROM mysql.user; <==验证非授权的访问操作ERROR 1142 (42000): SELECT command denied to user 'xiaoqi'@'localhost' for table 'user' |
在企业服务器的应用中,数据库与网站服务器有时候是相互独立的,因此在MySQL服务器中,应根据实际情况创建新的用户授权,允许授权用户从网站服务器访问数据库,通常的做法是,创建一个或几个网站专用的库,并授予所有权限,限制访问的来源IP地址,例如,执行以下操作可以新建aaa库,并授权从IP地址为192.168.1.100的主机连接,用户名为dbuser,密码为"qwe.123",允许在aaa库中执行所有操作。
mysql> CREATE DATABASE aaa;Query OK, 1 row affected (0.00 sec)mysql> GRANT all ON aaa.* TO 'dbuser'@'192.168.1.100' IDENTIFIED BY 'qwe.123';Query OK, 0 rows affected (0.00 sec) |
2.查看权限
SHOW GRANTS语句:专门用来查看数据库用户的授权信息,通过FOR子句可指定查看的用户对象(必须与授权时使用的对象名称一致)。语句格式如下所示。
SHOW GRANTS FOR 用户名@来源地址
执行以下操作可以查看用户dbuser从主机192.168.1.100访问数据库时的授权信息。其中USAGE权限对应的授权记录中包含了用户的连接密码字串。
mysql> SHOW GRANTS FOR 'dbuser'@'192.168.1.100';+-------------------------------------------------------------------------------------------------------------------+| Grants for dbuser@192.168.1.100 |+-------------------------------------------------------------------------------------------------------------------+| GRANT USAGE ON *.* TO 'dbuser'@'192.168.1.100' IDENTIFIED BY PASSWORD '*EB746771CA3A3FE0F7D12C079CAD9B6CD78B7C5B' || GRANT ALL PRIVILEGES ON `aaa`.* TO 'dbuser'@'192.168.1.100' |+-------------------------------------------------------------------------------------------------------------------+2 rows in set (0.00 sec) |
3.撤销权限
REVOKE语句:用于撤销指定用户的数据库权限,撤销权限后的用户仍然可以连接到MySQL服务器,但将被禁止执行对应的数据库操作。语句格式如下所示。
REVOKE 权限列表 ON 数据库名.表名 FROM 用户名@来源地址
执行以下操作可以撤销用户xiaoqi从本机访问数据库auth的所有权限。
mysql> REVOKE all ON auth.* FROM 'xiaoqi'@'localhost';Query OK, 0 rows affected (0.00 sec)mysql> SHOW GRANTS FOR 'xiaoqi'@'localhost'; <==确认已撤销对auth库的权限+---------------------------------------------------------------------------------------------------------------+| Grants for xiaoqi@localhost |+---------------------------------------------------------------------------------------------------------------+| GRANT USAGE ON *.* TO 'xiaoqi'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |+---------------------------------------------------------------------------------------------------------------+1 row in set (0.00 sec) |
3.2 数据库的备份与恢复
及时备份数据库是信息安全管理的重要工作内容之一。MySQL数据库的备份可以采用多种方式,例如直接打包数据库文件夹/var/local/mysql/var/,或者使用专用的导出工具。下面以MySQL自带的倾倒工具mysqldump为例,分别讲解数据库的备份与恢复的操作方法。
1.备份数据库
通过mysqldump命令可以将指定的库,表或全部的库导出为SQL脚本,便于该命令在不同版本的MySQL服务器上使用。例如,当需要升级MySQL服务器时,可以先用mysqldump命令将原有库信息导出,然后直接在升级后的MySQL服务器中导入即可。
1)执行导出操作
使用mysqldump命令导出数据时,默认会直接在终端显示,若要保存到文件,还需要结合Shell的“>”重定向输出操作。命令格式如下所示。
格式1:导出指定库中的部分表。
mysqldump [选项] 库名 [表名1] [表名2] ... > 备份路径/备份文件名
格式2:导出一个或多个完整的库(包括其中所有的表)。
mysqldump [选项] --databases 库名1 [库名2] 备份路径/备份文件名
格式3:备份MySQL服务器中所有的库。
mysqldump [选项] --all-databases > /备份路径/备份文件名
其中常用的选项包括“-u"、”-p“、分别用于指定数据库用户名、密码。倒如,以下操作分别使用格式1、格式2,将msql库中的user表导出为mysql-user.sql文件,将整个auth库导出为auth.sql文件,所有操作均以root用户的身份进行验证。
[root@mysql ~]# mysqldump -u root -p mysql user > mysql-user.sqlEnter password: [root@mysql ~]# mysqldump -u root -p --database auth > auth.sqlEnter password: [root@mysql ~]# |
若需要备份整个MySQL服务器中的所有库,应使用格式3、当导出的数据量较大时可以添加”--opt”选项以优化执行速度。例如,以下操作将创建备份文件all-data.sql,其中包括MySQL服务器中的所有库。
[root@mysql ~]# mysqldump -u root -p --opt --all-databases > all-data.sqlEnter password: |
2)查看备份文件内容
通过mysqldump工具导出的SQL脚本是文本文件,其中“/*...*/”部分或以“--”开头的行表示注释信息。使用grep,less、cat等文本工具可以查看脚本内容,例如执行以下操作可以过滤出auth.sql脚本中的数据库操作语句。
[root@mysql ~]# grep -v "^--" auth.sql | grep -v "^/" | grep -v "^$"CREATE DATABASE /*!32312 IF NOT EXISTS*/ `auth` /*!40100 DEFAULT CHARACTER SET utf8 */;USE `auth`;DROP TABLE IF EXISTS `users`;CREATE TABLE `users` ( `user_name` char(16) NOT NULL, `user_passwd` char(48) DEFAULT '', PRIMARY KEY (`user_name`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;LOCK TABLES `users` WRITE;INSERT INTO `users` VALUES ('zhangsan','*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9');UNLOCK TABLES; |
2.恢复数据库
使用mysqldump命令导出的SQL备份脚本,在需要恢复时可以通过mysql命令对其进行导入操作。命令格式如下所示。
myeql [选项] [库名] [表名] < /备份路径/备份文件名
当备份文件中只包含表的备份,而不包括创建库的语句时,则执行导入操作时必须指定库名且目标库必须存在。例如,以下操作可以从备份文件mysql-user.sql中将表导入到test库。
[root@mysql ~]# mysql -u root -p test < mysql-user.sql Enter password: [root@mysql ~]# mysql -u root -pEnter password: ...... //省略部分内容mysql> USE testReading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql> SHOW TABLES;+----------------+| Tables_in_test |+----------------+| user |+----------------+1 row in set (0.00 sec)mysql> |
若备份文件中已经包括完整的库信息,则执行导入操作时无需指定库名。例如以下操作可以从备份文件all-data.sql恢复其中的所有库。
[root@mysql ~]# cd /var/lib/mysql/[root@mysql mysql]# mv aaa auth/ /tmp/ <==转移部分库,模拟故障[root@mysql mysql]# ls -ld mysql aaa authls: 无法访问aaa: 没有那个文件或目录ls: 无法访问auth: 没有那个文件或目录[root@mysql mysql]# mysql -u root -p < ~/all-data.sql <==执行导入恢复操作Enter password: [root@mysql mysql]# ls -ld aaa auth <==确认恢复后的结果drwx------. 2 mysql mysql 4096 5月 19 15:58 aaadrwx------. 2 mysql mysql 4096 5月 19 15:58 auth |