MySQL数据库的配置与管理 一.MySQL服务的安装与启动 Linux几乎所有的发行版本都内置了MySQL数据库。RHEL5也自带了MySQL服务。对于已经安装了MySQL的RHEL5可以执行以下命令查看: #rpm -qa | grep mysql 与MySQL相关的软件包 mysql-5.0.22-2.1.i386.rpm(第二盘光张)―――――――――――MySQL客户端程序和共享库 mysql-connector-odbc-3.51.12-2.2.i386.rpm(第二盘光张)――MySQL的ODBC驱动程序 MySQL-python-1.2.1-1.i386.rpm (第二盘光张)―――――――一个到MySQL的界面 mysql-server-5.0.22-2.1.i386.rpm (第二盘光张) ――――――MySQL服务器和相关文件 libdbi-dbd-mysql-0.8.1a-1.2.2.i386.rpm (第二盘光张) perl-DBD-MySQL-3.0007-1.fc6.i386.rpm(第二盘光张) freeradius-mysql-1.1.3-1.1.el5.i386.rpm (第三张光盘) mysql-devel-5.0.22-2.1.i386.rpm(第三张光盘)――――――――库和包含文件,若需要编译其他MySQL客户端,如Perl模块,则需安装 mod_auth_mysql-3.0.0-3.1.i386.rpm (第三张光盘) mysql-test-5.0.22-2.1.i386.rpm(第三张光盘) mysql-bench-5.0.22-2.1.i386.rpm (第三张光盘)―――――――性能测试工具和基准,需要Perl和DBD::mysql模块 php-mysql-5.1.6-5.el5.i386.rpm(第三张光盘)------------------一个用于使用MySQL数据库的PHP程序的模块 qt-MySQL-3.3.6-20.el5.i386.rpm(第三张光盘) 1.手工安装MySQL软件包: 在www.mysql.com上下载需要的mysql版本的软件包,也可以在RHEL5的光盘中找到需要安装的rpm软件包,然后进行安装 若用光盘安装,需依次安装以下软件包 #rpm -ivh perl-DBI-1.52-1.fc6.i386.rpm(第二张光盘) #rpm -ivh perl-DBD-MySQL-3.0007-1.fc6.i386.rpm(第二张光盘) #rpm -ivh mysql-5.0.22-2.1.i386.rpm(第二张光盘) #rpm -ivh mysql-server-5.0.22-2.1.i386.rpm (第二张光盘) 安装完成后,在Linux下的安装布局如下表: linux rpm包安装布局 目录 目录内容 /usr/bin 客户端程序和脚本 /usr/sbin mysqld服务器 /var/lib/mysql 日志文件,数据库 /usr/share/doc/packages 文档 /usr/include/mysql 包含(头)文件 /usr/lib/mysql 库 /usr/share/mysql 错误消息和字符集文件 /usr/share/sql-bench 基准程序 2.根据源代码编译安装: 如果需要变更MySQL的某些功能或进行定制安装,则可以下载源代码,通过编译完成安装。 以下载MySQL-community-5.0.45-0.rhel5.src.rpm为例: 检查是否存在mysql用户可用如下命令: #grep "^mysql: " /etc/passwd -i 如果没有,则需要创建该用户: #useradd mysql /opt/mysql 安装源文件: #rpm -ivh MySQL-community-5.0.45-0.rhel5.src.rpm 在/usr/src/redhat/SOURCES/目录中,找到mysql-5.0.45a.tar.gz,然后解包: #tar -zxvf mysql-5.0.45.tar.gz 解开该压缩包,生成mysql-5.0.45目录,在该目录下能够看到bin和scripts子目录。bin目录包含客户程序和服务器,scripts目录 包含mysql_install_db脚本,用于初始化服务器的存取权限。 在进行编译前,需要注意几个重要的配置参数: ·--prefix=PREFIX该参数是与目录结构无关的文件的安装前缀,一般指根据搜索路径或绝对路径引用文件,不必与执行文件放在 一起,默认为/usr/local。 ·--exec-prefix=EPREFIX该参数是与执行文件目录相关文件的安装前缀,文件执行时,根据相对目录进行引用,这些文件要与 执行文件放在一起。默认与PREFIX放在一起。 将MySQL安装到/opt/mysql目录下: #./configure --prefix /opt/mysql 需要注意的是,编译参数可以设置多次,以最后一次设置为准。 最后,执行以下命令编译并安装MySQL: #make #make check #su mysql #make install #cd scripts #./mysql_install_db 测试安装是否成功可以用以下命令,看到mysql>提示符后,则表明MySQLP安装成功。 #/opt/mysql/bin/mysql_safe & #/opt/mysql/bin/mysql -u root 3.用命令行方式启动停止MySQL服务 在RHEL5中,MySQL可能是系统自带的,也可能是用户根据需要编译安装的,因此,在通过命令行方式启动和停止MySQL服务时, 使用的命令也有所不同。 1如果是RHEL5自带的MySQL,则使用如下命令: #service mysqld start =#/etc/init.d/mysqld start //启动MySQL服务; #service mysqld stop =#/etc/init.d/mysqld stop //停止MySQL服务; #service mysqld restart =/etc/init.d/mysqld restart //重新启动MySQL服务; #mysqladmin status //检查MySQL服务状态; 2如果不是系统自带的MySQL服务,则使用如下方法: 在默认的情况下,没有设置为系统服务的形式,需要通过以下方式启动,&表示后台运行: #/opt/mysql/bin/mysqld_safe & 类似地,停止MySQL服务时应使用如下命令: #/opt/mysql /bin/mysqladmin shutdown 4.自动启动MySQL服务 1对于系统自带的MySQL服务: #ntsysv 2对于手工安装的MySQL服务 通过在/etc/rc.local文件的尾部追加启动MySQL的命令来实现自动启动。 3图形界面下-系统-管理-服务器设置-服务-服务配置-mysqld-选中复选框,同样可以实现系统启动自运行mysqld。 二.MySQL数据库的管理 MySQL数据库的管理和使用包括客户端的启动,客户端操作,修改管理员口令,通过配置文件管理MySQL服务器等。 1.启动MySQL客户端 当第一次安装MySQL时,访问数据库服务器的用户只能是MySQL管理员,即root用户。但该root用户与Linux系统的root用户不 同。默认情况下,root用户的初始密码为空。通过“mysql”命令可以启动MySQLP客户端: #mysql mysql> 当成功连接后,则可以在mysql>提示符下键入“quit”或“/q”断开客户端与服务器的连接: mysql>quit Bye 也可以输入Ctrl+d断开连接。 2.修改管理员口令 上面提到,由于MySQL默认root用户的密码为空,因此,应该尽快地修改MySQL管理员的密码。要修改root用户的密码,则需要先 退出连接状态,然后使用以下格式的“mysqladmin”命令: #mysqladmin -u root password 密码字符串 命令执行后,root用户的密码就改为密码字符串的内容了。 例如:要将root用户密码改为123456:#mysqladmin -u root password 123456 修改root用户密码后,如若再次连接服务器,则需要使用以下格式的命令: #mysql -h 主机名或IP地址 -u 用户名 -p 例如:#mysql -h localhost -root -p 在Enter passsword:后输入正确的密码则可正常连接。 若root用户已经重新设置了密码,如若需要再次修改其密码时,则应使用以下格式的语句: #mysqladmin -u root -p password 密码字符串 例如:将MySQL的root用户密码由原来设置的123456改为654321: #mysqladmin -u root -p password 654321 Enter password:(123456)。 需要注意:在Enter password:后先输入的是原密码123456,这样root用户的密码才会变更为654321。 3.MySQL的配置文件 在RHEL5中,MySQL的应用程序将其配置信息存放到my.cnf文件中,MySQL的各应用程序在执行时,都会试图从my.cnf文件中读 取配置文件,其搜索的顺序为: 首先试图读取/etc/my.cnf,如果存在,则采用/etc/my.cnf中的配置信息; 若没有发现/etc/my.cnf文件,则试图查找MySQL的var安装路径/my.cnf,即/var/lib/mysql/,如果存在,则采用其配置信息; 若没有发现MySQL的var安装路径/my.cnf,则试图读取(用户主目录)/my.cnf,如果读取到,则采用其配置信息; 在Linux中,MySQL的参数是区分大小写的。多数MySQL的应用程序,都支持以下共同的参数,示例如下: --no-defaults:不读取任何配置文件。 --defaults-file=#:读取指定的配置文件#。 --defaults-extra-file=#:读取系统默认的配置文件后,再读取指定的配置文件#。 -h host_name,--host=host_name:连接给定主机上的MySQL服务器。 -u user_name,--user=user_name:与服务器连接时,MySQL使用的用户名。默认是登录名。 -p you_pass,--password[=your_pass]:与服务器连接时使用的口令。 -P port_num,--port=port_num:与另一台主机连接时使用的TCP/IP端口号。 -S /path/to/socket,--socket=/path/to/socket:与localhost连接时(默认主机)使用的套接字文件。 4.管理MySQL服务器 Mysqladmin可以用来执行MySQL数据库中的管理操作。语法是: #mysqladmin [OPTIONS] command [command-option] command ... 如果执行mysqladmin -help ,可以得到mysqladmin所支持的一个选项列表。mysqladmin支持下列命令,如下表: (以下所有的命令可以被缩短为其唯一前缀。例如“status”可以缩为“stat”,以此类推。) mysqladmin支持的命令 命令 功能 create databasename 创建新数据库 debug 将debug信息写入日志 drop databasename 删除数据库及数据库中的所有表 extended-status 服务器扩展状态信息 flush-hosts 刷新所有主机 flush-logs 刷新日志 flush-status 清除状态变量 flush-tables 刷新表 flush-threads 消除缓冲线程 flush-privileges 重载授权表 kill id,id,.... 按进程id杀掉mysql的进程 password new-password 设置为4.1格式的口令 old-password new-password 设置为4.1之前旧格式的口令 ping 检查mysqld是否运行 processlist 显示服务器中活跃进程列表 reload 重载授权表 refresh 更新所有表,关闭日志后再次打开 shutdown 关闭服务器 status 显示服务器状态信息 start-slave 启动从属服务 stop-slave 停止从属服务 variables 打印可用变量 version 输出服务器版本 5.MySQL客户端操作 用户登录后,可以在MySQL命令提示符(mysql>)后使用SQL语言,进行MySQL客户端操作。 每个SQL语句都应以“;”或“/g”结束,并且是不区分大小写的。 (1)数据库操作 【查看数据库】 使用以下命令可以查看MySQL当前所有可用的数据库: mysql>show databases; 从执行的结果可见,MySQL已经创建了三个数据库,information_schema,mysql,test。这三个数据库是MySQL安装程序自 动创建的。其中,mysql库中包含的是5个MySQL授权表,information_schema库中是相关信息,而test库是供用户练习使用的。 【创建数据库】 在MySQL中创建数据库的语名格式为: mysql>create database 数据库名; 例如:要创建一个名为e_learning的在线学习数据库,可以输入以下命令: mysql>create database e_learning; 默认情况下,所创建的数据库将以目录的形式保存在/var/lib/mysql中,例如,上面创建的e_learning数据库将保存在目录 /var/lib/mysql/e_learning中。系统不允许有同名的数据库存在。 【选择数据库】 所谓选择数据库,就是选定某个数据库成为当前处理所有事务的数据库,可以使用以下SQL语句: mysql>use 数据库名; 例如:选择e_learning数据库的命令为: mysql>use e_learning; 【删除数据库】 当执行删除数据库的命令时,数据库及其所有的表和表中的数据都将被删除,所使用的SQL命令为: mysql>drop database 数据库名; 例如:若要删除e_learning数据库,则使用以下命令: mysql>drop database e_learning; (2)数据表操作 在关系型数据库中,数据库由多个数据表有机构成。每个数据表由行和列组成,每一行是一条记录,每个记录可以包含多个列(字段)。 常见的数据表操作包手创建,删除,复制,修改等。 【创建表】 MySQL使用以下格式的SQL语句创建表: mysql>create table 表名 (字段1,字段2,...字段n, [表级约束]) [Type|Engine =表类型|存储引擎]; 其中,字段的格式为:字段名 字段类型 [字段约束] ·字段类型:又称列类型,规定了某个字段所允许输入的数据类型,常用的字段类型如下: INT,INTEGER--------整型,4个字节 FLOAT------------------浮点型,4个字节 DOUBLE----------------双精度浮点型,8个字节 DATE-------------------日期型,3个字节 CHAR(M)---------------字符型,M个字节,0alter table 表名 操作1[,操作2,....]; 这些操作包括add,change,modify,drop,rename等。下面通过举例说明 例如:在teacher表中增加一个字段email,可以使用add命令: mysql>alter table teacher add email varcher(20); mysql>describe teacher; 例如:将teacher表中的email字段改名为fax,并把类型设置为text,可以使用change命令: mysql>alter table teacher change email fax text; mysql>describe teacher; 例如:将teacher表中的department字段名称改为dept,同样可以使用change命令: mysql>alter table teacher change department dept char(20); mysql>describe teacher; 例如:将teacher表中的dept字段的类型改为varchar,可以使用modify命令: mysql>alter table teacher modify dept varchar(20); mysql>describe teacher; 例如:将teacher表中的fax字段删除,可以使用以下drop命令: mysql>alter table teacher drop fax; mysql>describe teacher; 例如:将teacher表的表名改为teacher_info,可以使用rename命令: mysql>alter table teacher rename to teacher_info; mysql>show tables; (3)处理表的数据 在创建了数据库和表之后,需要对表中存储的数据进行进一步的处理,常见的SQL操作包括插入,删除,修改表中的记录。 【插入记录】 在MySQL中,向表中插入/添加记录应使用以下格式的SQL语句: mysql>insert into 表名(字段名1,字段名2,....) values (字段1的值,字段2的值,....); 例如:向teacher表中插入/添加一条记录可以使用如下的命令: mysql>insert into teacher(teacherID,name,sex,birthday,dept) values ('1001','Kelly','m',' 1964-11-26','computer'); mysql>select * from teacher; 在使用insert语句时,应注意以下几个问题: ·如果在insert语句中给出了要插入记录的各个字段名,那么字段值的顺序要与所给出的字段名的顺序相同,但可以与表中实际的字段 顺序不同。但如果insert语句中没有给出各个字段名,则字段值的顺序就应该与表中字段的顺序相同。 ·对于在insert语句中既没有给出字段名,也没有给出字段值的字段,在插入表时,该字段的值自动设置为默认值。 ·当在一个独立的insert语句中使用多个values子句时,表示插入多条记录。 例如:向teacher表中再插入一条记录,但没有给出sex字段名,其字段值将自动设置为默认值: mysql>insert into teacher(teacherID,name,birthday,dept) values ('1002','Sullivan','1976-1-18','computer'); mysql>select * from teacher; 例如:向teacher表中插入多条记录,在insert语句中使用多个values子句,中间用逗号隔开即可: mysql>insert into teacher(teacherID,name,sex,birthday,dept) values ('1003','tjj1','m','1981-11-26','computer'),('1004','tjj2','m','1982-10-12','computer'), ('1005','tjj3','m','1983-01-21','computer'); mysql>select * from teacher; 【修改记录】 修改记录是更新表中数据的手段,MySQL使用update语句修改记录,基本格式为: mysql>update 表名 set 字段名1=字段值1 [,字段名2=字段值2,....] 例如:将teacher表中的name字段值为‘Kelly’的记录,将其sex字段值改为‘f’,可以使用如下SQL语句: mysql>update teacher set sex=‘f’ where name=‘Kelly’; 【删除记录】 在MySQL中,用以下格式的SQL语句从表中删除记录: mysql>delete from 表名 where 条件表达式; 使用where子句的delete语句可以删除与指定条件相匹配的一条或多条记录。 例如:要删除teacher表中teacherID为‘1002’的记录,SQL语句为: mysql>delete from teacher where teacherID=‘1002’; 如果要删除表中的所有记录,可使用不带where子句的delete语句,SQL语句为: mysql>delete from teacher; 此外,truncate语句也可以完成删除表中所有记录的功能,SQL语句为: mysql>truncate table teacher; 注意:delete语句与truncate语句两者的区别在于,delete语句依次删除表中的每条记录,而truncate语句先删除表结构再新建表, 因此,在删除包含大量数据的表时,truncate语句的处理速度更快。 (4)建立索引 建立索引的目的是为了加快数据据查询的速度。MySQL允许用户为一个表的特定字段设置索引。可以在创建表时直接建立索引,也可以 通过create index语句向已存在的表中添加索引。 【在创建表时建立索引】 在创建表时,可以使用index子句或unique子句创建索引。 例如:创建一个表名为schedule的日程表,并将日程编号sno字段定义为主键,同时为日程名称sname字段创建一个名为 index_sname的索引。 mysql>create table schedule ( sno varchar(10) not null, sname varchar(20) not null, book varchar(20), primary key(sno), index index_sname(sname) ); 若将index语句换为unique语句,则创建的索引类型为unique,此索引要求索引字段中的值必须是唯一的,也就是说,表中各个 记录中该字段的值不能相同。(可防止某字段有重复的记录出现) 【向已存在的表中添加索引】 向已存在的表中添加索引应使用create index语句,其基本格式如下: mysql>create [unique] index 索引名 on 表名 (字段名1 [(长度),....]); 例如:为teacher表中的name字段创建名为index_name的索引,可以使用以下命令: mysql>create index index_name on teacher (name); 如果在创建索引时没有指定索引名,则MySQL会自动使用索引所在字段的字段名作为索引名。 【删除索引】 要删除索引,可以使用drop index语句,其基本格式为: mysql>drop index 索引名 on 表名; 例如:要删除teacher表中索引名为index_name的索引,可以使用以下命令: mysql>drop index index_name on teacher; (5)创建用户 首次安装MySQL时,MySQL自动授予任何用户都可以从本地连接MySQL服务器,但是,只有MySQL管理员(root用户)能够完全访 问系统中所有数据库,而其他用户只能访问test数据库。这是因为MySQL安装程序在mysql这个数据库中设置了5个授权表,这5 个授权表决定用户连接服务器及操作的权限。 mysql数据库中5个授权表的功能 表名 说明 user 定义了能够连接到数据库服务器的用户和主机,以及这些用户的密码和访问权限 db 定义了连接到数据库服务器上的用户可以使用的数据库,以及在这些数据库中能够执行的操作 host 当表db中的Host字段为空时,由表 host定义用户可以从哪些主机连接到数据库服务器,并且不同的主机对指定的数据库可以具有不同的权限 tables_priv 定义了连接到数据库服务器上的用户可以访问的表,以及在这些表中可以执行的操作 columns_priv 定义了连接到数据库服务器上的用户可以访问的字段,以及在这些字段中可以执行的操作 查看user表的内容,可以使用如下命令: mysql>use mysql; mysql>select host ,user,password,select_priv from user; +-----------------------+------+------------------+-----------------+ | host | user | password | select_priv | +-----------------------+------+------------------+-----------------+ | localhost | root | 565491d704013245 | Y | | localhost.localdomain | root | | Y | | localhost.localdomain | | | N | | localhost | | | N | +-----------------------+------+------------------+----------------+ 4 rows in set (0.00 sec) 从查询结果可以看到:第1,2条记录表明,MySQL允许用户root可以从本地连接到数据库服务器,并对服务器中的所有数据库都具 有完全控制权限,从结果记录中第4个字段开始,所有的字段值均为“Y”,表示用户具有完全控制权限;第3,4条记录表明,任何用 户都可以从本地连接到数据库服务器中,但对所有数据库都没有访问权限,记录中user字段的值为空表示所有用户,而记录中的第4 个字段开始,所有的字段值均为“N”,表示对所有数据库都没有访问权限。 查看db表中的内容,可以使用如下命令: mysql>select host,db,user,select_priv from mysql.db +------+---------+------+-------------+ | host | db | user | select_priv | +------+---------+------+-------------+ | % | test | | Y | | % | test/_% | | Y | +------+---------+------+-------------+ 2 rows in set (0.01 sec) 从查询结果可以看到:db表中定义了任何用户都可以从任何主机访问test数据库,或以test开头的数据库,并且对该数据库拥有完全 控制权限。因为host字段的值为%通配符,即代表所有主机,db字段的值为test和test/_%表示test数据库或以test开头的数据 库(“/_”是转义字符,“%”是通配符),而从表中第4个字段开始,所有的字段值均为“Y”,表示具有完全控制权限。 注意:尽管在db表中定义了任何用户都可以从任何主机访问test数据库,但在user表中已经做了限制,要求任何用户只可以从本地 连接到数据库服务器,因此,两个表的共同作用使得MySQL最终的设置是对于任何用户只能从本地连接数据库服务器。 根据以上分析,可以利用mysql数据库中的授权表在MsSQL中进行用户的管理: 【创建新用户】 例如:创建一个test用户,并为其设置密码,使其能够从任何一台主机上连接到数据库服务器,可以使用以下SQL语句实现: mysql>use mysql; //选择mysql数据库// mysql>insert into user (host,user,password) values (‘%’,‘test’,password(‘test’)); //添加新记录// mysql>flush privileges; //对授权表进行重载// 再让test用户从其他任何主机上连接到数据库服务器后,对e_learning数据库能完全控制,可以使用以下SQL语句: mysql>insert into db (host,db,user,select_priv)values(‘%’,‘e_learning’,‘test’,‘Y’); mysql>flush privileges; 【更改用户密码】 更改用户密码实际就是用update语句对授权表进行更新,例如,将test用户的密码改为123456,可以使用以下语句: mysql>update user set password=password(‘123456’); mysql>flush privileges; 【删除用户】 删除用户的语句是delete,例如,删除test用户可以使用以下语句: mysql>delete from user where user=‘test’; mysql>flush privileges; (6)用户权限设置 若要进行用户权限的设置,首先需要了解在数据库mysql的以下5个授权表中,具体哪些字段是用来设置权限的: user,db,host表中可设置的权限 字段名 权限名 select_priv select查询 insert_priv insert插入 update_priv update更新 delete_priv delete删除 create_priv create创建 drop_priv drop删除 reload_priv reload重载 shutdown_priv shutdown关闭 process_priv process跟踪 file_priv file文件读写 grant_priv grant授权 references_priv references引用 index_priv index索引 alter_priv alter修改 show_db_priv show databases查看数据库 super_priv super执行管理命令 create_tmp_table_priv create temporary tables创建临时表 lock_tables_priv lock tables锁定表 execute_priv execute执行被保护程序 repl_slave_priv replication slave 备份slave repl_client_priv replication client 备份client tables_priv,columns_priv表中的权限字段和可设置的权限 表名 字段名 权限集合 columns_priv column_priv Insert,Reference,Select,Update tables_priv columv_priv Insert,Reference,Select,Update table_priv Alter,Create,Delete,Drop,Grant,Index,Insert,Reference,Select,Update MySQL提供了两种修改授权表中访问权限的方法:一种是使用insert,update等SQL语句直接修改授权表中的信息;另一种是使 用GRANT和REVOKE语句。相比起来,GRANT和REVOKE语句要比前一种方法更为简单,清晰。 【Grant语句】 Grant语句的基本格式: mysql>grant 权限列表 [(字段列表)] on 数据库名.表名 to 用户名@域名或IP地址 [identified by '密码值'] [with grant option]; ·简单的授权 简单的授权可以设置哪些用户可以从哪些主机连接到数据库服务器。 例如:可以使用以下命令为用户test设置从任意主机连接到服务器的权限,并能完全访问news数据库。 mysql>grant all on news.* to [email=test@]test@'%'[/email] identified by 'test'; 需要注意的是: ·不同级别的授权 不同级别的授权可以为同一个用户在对不同数据库操作时授予不同的权限。 例如:可以使用以下命令创建一个新用户Kelly,使其能够从192.168.10.0子网中任何一台主机连接到服务器,具有读取e_learning 数据库,并能修改teacher表中name字段的值: mysql>grant select on e_learning.* to [email=Kelly@]Kelly@'192.168.10.%'[/email] indentified by '123456'; mysql>grant update (name) on e_learning.teacher to [email=Kelly@]Kelly@'192.168.10.%'[/email]; ·管理权限的授权 管理权限的授权可以为用户设置某个数据库的完全访问权限,能够管理数据库中的所有表。 例如:授予用户Sullivan能够从本地连接到服务器,并对e_learning数据库具有完全访问权限,并可以将其拥有的权限授予其他用 户,可以使用以下语句: mysql>grant all on e_learning.* to [email=Sullivan@localhost]Sullivan@localhost[/email] identified by '123456' with grant option; 【Revoke语句】 Revoke语句的基本格式: mysql>revoke 权限列表 [(字段列表)] on 数据库.表名 from 用户名@域名或IP地址; 例如:MySQL管理员撤销用户[email=Kelly@localhost]Kelly@localhost[/email]对数据库e_learning的create,delete数据库和表的权限,并撤销该用户将自己 所拥有的权限授予他人的权限,可以使用以下语句: mysql>revoke create,drop on e_learning.* from [email=Kelly@localhost]Kelly@localhost[/email]; mysql>revoke grant option on e_learning.* from [email=Kelly@localhost]Kelly@localhost[/email]; 三.MySQL数据库的备份和修复 数据库的备份和修复是确保数据完整性,安全性的重要功能,MySQL数据库提供了以下备份和修复的工具。 1.MySQL数据库备份和恢复 在数据库数据丢失或损坏的情况下,备份数据库是很重要的。当发生系统崩溃时,需要尽可能使损失的数据最少,并且把数据库恢复到 崩溃前的状态。根据备份时是否停止MySQL数据库服务,备份数据库分为在线备份与离线备份: (1)在线备份与恢复的命令与用法 【select into outfile | dumpfile】 利用select语句的into outfile或dumpfile子句,可以将查询的结果导出到一个文件。其语法格式为: mysql>select ... into {outfile | dumpfile} 'file_name' [fields [terminated by '/t'] [optionally] enclosed by ''] [lines terminated by '/n' 【load data infile恢复文件】 其语法格式为: mysql>load data infile 'file_name.txt' [replace| ignore] into table tbl_name [fields [terminated by '/t'] [optionally] enclosed by ''] [lines terminated by '/n'] 【mysqldump备份】 由于利用select into语句导出数据时,只能导出数据的值,导出之后,就失去了数据与数据结构之间的关联。再导入数据时,只 能依据自然序将各数据项(字段)对应起来,如果用户在导出数据之后修改了数据结构或数据项的位置,那么导入的数据就会发生错误。 使用mysqldump能实现带结构的备份,从而克服了上述问题。mysqldump是一个MySQL自带的标准在线导出工具,导出后的 数据将以SQL语句的形式存在,可以选择导出数据结构(建表SQL语句)或数据(数据插入SQL语句)。 利用mysqldump(带-c或-complete_insert选项)可避免使用select-into/load data结构与数据分离所带来的问题 mysqldump存在于/usr/bin/目录下(通过rpm包安装mysql)。其使用方法有三种: 1导出指定数据库的表,如果不指定tables,将导出整个数据库的所有表: #mysqldump [options] database [tables] 例如:导出e_learning数据库的teacher表到文本文件teacher.sql中 #mysqldump e_learning teacher -h localhost -u root -p >teacher.sql 2同时导出多个数据库: #mysqldump [options] --database [options] db1 [db2 db3....] 3导出当前服务器内的所有数据库: #mysqldump [options] -all-database [options] 通过#mysqldump -help可以得到当前mysqldump版本所支持的所有选项。 【mysqlhotcopy备份】 对于MyISAM型数据表,mysqlhotcopy是备份数据库或单个表的最快的途径,但只能运行在数据库目录所在的机器上。 mysqlhotcopy是一个Perl脚本,使用LOCK TABLES,FLUSH TABLES和cp或scp来快速备份数据库。 mysqlhotcopy可方便地将某个数据库复制为另外一个数据库,而不中止服务。其语法格式为: #mysqlhotcopy db_name 例如:执行以下命令 #mysqlhotcopy e_learning -h localhost -u root -p 123456 mysql>show databases; 可以看到备份后多出了一个mysql_copy数据库,说明mysqlhotcopy命令执行成功。利用这种方法可以很快地进行整个数据库的 在线备份。 (2).离线备份 除了在线备份以外,还可以通过离线方式备份数据库,就是将MySQL数据库关闭后,直接利用命令行复制数据。这样做的优点在于一 定会保持备份前的数据的一致性。可用如下命令将/var/lib/mysql目录下的数据库采用gzip方式压缩到/tmp/mysql.tgz文件中进行 备份: #tar cvfz /tmp/mysql.tgz /var/lib/mysql 2.MySQL数据库的故障修复 数据库文件的损坏有很多原因,而且损坏的程度不同,但无论数据库损坏的原因如何,都应当在损坏后进行故障的修复。MySQL提供 了myisamchk语句用以检查和修复MyISAM表,isamchk语句则用来检查和修复ISAM表。为防止myisamchk恢复数据库时 产生不一致,在使用myisamchk命令时最好停止mysqld服务。 Myisamchk基本语法如下: #myisamchk [OPTIONS] tables[.MYI] tables[.MYI]是指数据表所在的文件名,可以采用相对路径或绝对路径和采用通配符指示,例如: #myisamchk f*.MYI 使用以下命令可以查看myisamchk的选项内容: #myisamckh --help 使用myisamchk命令还可以查看表的信息。通过以下命令可以以描述模式运行myisamchk,生成表的描述: #myisachk -d [-v] 表名 以下是一个myisamchk -d的输入例子: #myisamchk -d -v func.MYI 而如果只需要显示表的重要信息,则可使用以下命令: #myisamchk -ei[s|v] 表名 例如: #myisamchk -eiv func.MYI 在故障恢复的过程中,myisamchk一行一行地创建一个MYD(数据)文件的副本,通过删除目的MYD文件,并且用原来的文件名重命 名新文件。 表文件发生损坏,通常会体现在发生查询意外中断的情况。同时,还可能出现以下错误,如: ·.FRM文件被锁定 ·无法找到.MYI文件 ·文件意外结束 ·记录文件毁坏等 若遇到以上情况,则需要进行表修复的过程。通过myisamchk命令通常可以修复大多数错误,修复的一般步骤包括: ·确保MySQL用户及当前用户有权访问,修改需要修复的数据表文件,并能进入相关的数据库文件目录。 ·运行myisamchk *.MYI检查表,并根据检查表的结果作出不同的处理。 若检查结果错误情况简单,则可以使用-q 快速恢复命令: #myisamchk -r -q tbl_name 若快速恢复命令不能恢复,则采用直接恢复,命令为: #myisamchk |
|Archiver|手机版|小黑屋|创星网络
( 苏ICP备11027519号 )
|网站地图
GMT+8, 2025-2-22 16:55 , Processed in 0.065059 second(s), 21 queries .
Powered by Discuz! X3
© 2001-2013 Comsenz Inc.