11级_Java_曹建波6.13 备份与恢复 & 用户和数据安全性

备份与恢复

备份和恢复需求分析

数据库中的数据丢失或被破坏可能是由于以下原因:

(1)计算机硬件故障。由于使用不当或产品质量等原因,计算机硬件可能会出现故障,不能使用。如硬盘损坏会使得存储于其上的数据丢失。

(2)软件故障。由于软件设计上的失误或用户使用的不当,软件系统可能会误操作数据引起数据破坏。

(3)病毒。破坏性病毒会破坏系统软件、硬件和数据。

(4)误操作。如用户误使用了诸如DELETE、UPDATE等命令而引起数据丢失或破坏。

(5)自然灾害。如火灾、洪水或地震等,它们会造成极大的破坏,会毁坏计算机系统及其数据。

(6)。一些重要数据可能会遭窃。

因此,必须制作数据库的复本,即进行数据库备份,在数据库遭到破坏时能够修复数据库,即进行数据库恢复,数据库恢复就是把数据库从错误状态恢复到某一正确状态。

备份和恢复数据库也可以用于其他目的,如可以通过备份与恢复将数据库从一个服务器移动或复制到另一个服务器。

有多种可能会导致数据表的丢失或者服务器的崩溃,一个简单的DROP TABLE或者DROPDATABASE的语句,就会让数据表化为乌有。更危险的是DELETE * FROM table_name,可以轻易地清空数据表,而这样的错误是很容易发生的。

因此,拥有能够恢复的数据对于一个数据库系统来说是非常重要的。MySQL有三种保证数据安全的方法。

(1)数据库备份:通过导出数据或者表文件的拷贝来保护数据。

(2)二进制日志文件:保存更新数据的所有语句。

(3)数据库复制:MySQL内部复制功能建立在两个或两个以上服务器之间,通过设定它们之间的主从关系来实现的。其中一个作为主服务器,其他的作为从服务器。

本章主要介绍前两种方法。

数据库恢复就是当数据库出现故障时,将备份的数据库加载到系统,从而使数据库恢复到备份时的正确状态。

恢复是与备份相对应的系统维护和管理操作,系统进行恢复操作时,先执行一些系统安全性的检查,包括检查所要恢复的数据库是否存在、数据库是否变化及数据库文件是否兼容等,然后根据所采用的数据库备份类型采取相应的恢复措施。

使用SQL语句备份和恢复表数据

用户可以使用SELECT INTO…OUTFILE语句把表数据导出到一个文本文件中,并用LOAD DATA …INFILE语句恢复数据。但是这种方法只能导出或导入数据的内容,不包括表的结构,如果表的结构文件损坏,则必须先恢复原来的表的结构。

SELECT INTO…OUTFILE格式:

SELECT * INTOOUTFILE 'file_name' export_options

| DUMPFILE'file_name'

其中,export_options为:

[FIELDS

[TERMINATED BY 'string']

[[OPTIONALLY] ENCLOSED BY 'char']

[ESCAPED BY 'char' ]

]

[LINES TERMINATED BY 'string' ]

说明:

这个语句的作用是将表中SELECT语句选中的行写入到一个文件中,file_name是文件的名称。文件默认在服务器主机上创建,并且文件名不能是已经存在的(这可能将原文件覆盖)。如果要将该文件写入到一个特定的位置,则要在文件名前加上具体的路径。在文件中,数据行以一定的形式存放,空值用“\N”表示。

使用OUTFILE时,可以在export_options中加入以下两个自选的子句,它们的作用是决定数据行在文件中存放的格式:

●FIELDS子句:在FIELDS子句中有三个亚子句:TERMINATEDBY、 [OPTIONALLY] ENCLOSED BY和ESCAPED BY。如果指定了FIELDS子句,则这三个亚子句中至少要指定一个。

(1)TERMINATEDBY用来指定字段值之间的符号,例如,“TERMINATED BY ','”指定了逗号作为两个字段值之间的标志。

(2)ENCLOSED BY子句用来指定包裹文件中字符值的符号,例如,“ENCLOSED BY ' " '”表示文件中字符值放在双引号之间,若加上关键字OPTIONALLY表示所有的值都放在双引号之间。

(3)ESCAPED BY子句用来指定转义字符,例如,“ESCAPED BY '*'”将“*”指定为转义字符,取代“\”,如空格将表示为“*N”。

●LINES子句:在LINES子句中使用TERMINATEDBY指定一行结束的标志,如“LINES TERMINATED BY '?'”表示一行以“?”作为结束标志。

如果FIELDS和LINES子句都不指定,则默认声明以下子句:

FIELDS TERMINATEDBY '\t' ENCLOSED BY '' ESCAPED BY '\\'

LINES TERMINATED BY'\n'

如果使用DUMPFILE而不是使用OUTFILE,导出的文件里所有的行都彼此紧挨着放置,值和行之间没有任何标记,成了一个长长的值。

LOAD DATA …INFILE语句是SELECT INTO…OUTFILE语句的补语,该语句可以将一个文件中的数据导入到数据库中。

LOAD DATA …INFILE格式:

LOAD DATA[LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'

[REPLACE | IGNORE]

INTO TABLE tbl_name

[FIELDS

[TERMINATED BY 'string']

[[OPTIONALLY] ENCLOSED BY 'char']

[ESCAPED BY 'char' ]

]

[LINES

[STARTING BY 'string']

[TERMINATED BY 'string']

]

[IGNORE number LINES]

[(col_name_or_user_var,...)]

[SET col_name = expr,...)]

说明:

●LOW_PRIORITY | CONCURRENT:若指定LOW_PRIORITY,则延迟语句的执行。若指定CONCURRENT,则当LOAD DATA正在执行的时候,其他线程可以同时使用该表的数据。

LOCAL:若指定了LOCAL,则文件会被客户主机上的客户端读取,并被发送到服务器。文件会被给予一个完整的路径名称,以指定确切的位置。如果给定的是一个相对的路径名称,则此名称会被理解为相对于启动客户端时所在的目录。若未指定LOCAL,则文件必须位于服务器主机上,并且被服务器直接读取。与让服务器直接读取文件相比,使用LOCAL速度略慢,这是因为文件的内容必须通过客户端发送到服务器上。

●file_name:待载入的文件名,文件中保存了待存入数据库的数据行。输入文件可以手动创建,也可以使用其他的程序创建。载入文件时可以指定文件的绝对路径,如“D:/file/myfile.txt”,则服务器根据该路径搜索文件。若不指定路径,如“myfile.txt”,则服务器在默认数据库的数据库目录中读取。若文件为“./myfile.txt”,则服务器直接在数据目录下读取,即MySQL的data目录。出于安全原因,当读取位于服务器中的文本文件时,文件必须位于数据库目录中,或者是全体可读的。

注意:这里使用正斜杠指定Windows路径名称,而不是使用反斜杠。

●tb_name:需要导入数据的表名,该表在数据库中必须存在,表结构必须与导入文件的数据行一致。

●REPLACE | IGNORE:如果指定了REPLACE,则当文件中出现与原有行相同的唯一关键字值时,输入行会替换原有行。如果指定了IGNORE,则把与原有行有相同的唯一关键字值的输入行跳过。

FIELDS子句:此处的FIELDS子句和SELECT..INTO OUTFILE语句中类似。用于判断字段之间和数据行之间的符号。

●LINES子句:TERMINATED BY亚子句用来指定一行结束的标志。STARTING BY亚子句则指定一个前缀,导入数据行时,忽略行中的该前缀和前缀之前的内容。如果某行不包括该前缀,则整个行被跳过。例如,文件myfile.txt中有以下内容:

xxx"row",1

somethingxxx"row",2

导入数据时添加以下子句:

STARTING BY 'xxx'

最后只得到数据("row",1)和("row",2)。

● IGNORE number LINES:这个选项可以用于忽略文件的前几行。例如,可以使用IGNORE 1 LINES来跳过第一行。

●col_name_or_user_var:如果需要载入一个表的部分列或文件中字段值顺序与表中列的顺序不同,就必须指定一个列清单,其中可以包含列名或用户变量。如以下语句:

LOAD DATA INFILE'myfile.txt'

INTO TABLE myfile (学号,姓名,性别);

SET子句:SET子句可以在导入数据时修改表中列的值。

MySQL提供了很多免费的客户端程序和实用工具,不同的MySQL客户端程序可以连接服务器以访问数据库或执行不同的管理任务。这些程序不与服务器进行通信,但可以执行MySQL相关的操作。在MySQL目录下的BIN子目录中存储着这些客户端程序。本节简单介绍一下mysqldump程序和mysqlimport程序。

使用客户端的方法如下。

打开DOS终端,进入BIN目录,路径为:C:\Program Files\MySQL\MySQL Server 5.1\bin,后面介绍的客户端命令都在此处输入,界面如图8.2所示。

1. 使用mysqldump备份数据

mysqldump客户端也可用于备份数据,它比SQL语句多做的工作是可以在导出的文件中包含表结构的SQL语句,因此可以备份数据库表的结构,而且可以备份一个数据库,甚至整个数据库系统。

(1)备份表

命令格式:

mysqldump [options]db_name [tables] > filename

说明:options是mysqldump命令支持的选项,可以通过执行mysqldump -help命令得到mysqldump选项表及帮助信息,这里不详细列出。db_name是数据库名,后面可以跟需要备份的表名。Filename为最后备份的文件名,如果该语句中有多个表,则都保存在这个文件中,文件默认的保存地址是MySQL的bin目录下。如果要保存在特定位置,可以指定其具体路径。注意,文件名在目录中不能已经存在,否则新的备份文件将会将原文件覆盖,造成不必要的麻烦。

同其他客户端程序一样,备份数据时需要使用一个用户账号连接到服务器,这需要用户手工提供参数或在选项文件中修改有关值。参数格式为:

-h[hostname]-u[username] -p[password]

其中,-h后是主机名,-u后是用户名,-p是用户密码,-p选项和密码之间不能有空格。

使用mysqldump备份XS表和KC表。具体命令如下:

mysqldump -hlocalhost -u root -p123456 XSCJ XS KC > twotables.sql

说明:如果是本地服务器,-h选项可以省略。在MySQL的bin目录下可以看到,已经保存了一个.sql格式的文件,文件中存储了创建XS表和KC表的一系列SQL语句。

注意:若在命令中没有表名,则备份整个数据库。

(2)备份数据库

mysqldump程序还可以将一个或多个数据库备份到一个文件中。

命令格式:

mysqldump [options]--databases DB1 [DB2 DB3...] > filename

备份XSCJ数据库和mysql数据库到D盘FILE文件夹下。命令如下

mysqldump -uroot-p123456 --databases XSCJ mysql>D:/FILE/data.sql

说明:命令执行完后,在FILE文件夹下的data.sql文件被创建了,其中存储了XSCJ数据库和mysql数据库的全部SQL语句。

mysql还能备份整个数据库系统,即系统中的所有数据库。

备份MySQL服务器上的所有数据库。使用如下命令:

mysqldump -uroot-p123456 --all-databases>all.sql

虽然用mysqldump导出表的结构很有用,但是在恢复数据时,如果数据量很大,众多SQL语句将使恢复的效率降低。可以通过使用--tab=选项,分开数据和创建表的SQL语句。--tab=选项会在选项中“=”后面指定的目录里,分别创建存储数据内容的.txt格式文件和包含创建表结构的SQL语句的.sql格式文件。该选项不能与--databases或--all-databases同时使用,并且mysqldump必须运行在服务器主机上。

将XSCJ数据库中所有表的表结构和数据都分别备份到D盘FILE文件夹下。命令如下:

mysqldump -uroot-p123456 --tab=D:/FILE/ XSCJ

其效果是在目录FILE中生成6个文件,分别是xs.txt、xs.sql、kc.txt、kc.sql、xs_kc.txt和xs_kc.sql。

(3)恢复数据库

mysqldump程序备份的文件中存储的是SQL语句的集合,用户可以将这些语句还原到服务器中以恢复一个损坏的数据库。

假设XSCJ数据库损坏,用备份文件将其恢复。

备份XSCJ数据库的命令为:

mysqldump -uroot-p123456 XSCJ>XSCJ.sql

恢复命令为:

mysql -uroot-p123456 XSCJ<XSCJ.sql

如果表的结构损坏,也可以恢复,但是表中原有的数据将全部被清空。

假设XS表结构损坏,备份文件在D盘FILE目录下,现将包含XS表结构的.sql文件恢复到服务器中。命令如下:

mysql -uroot -p123456XSCJ<D:/FILE/xs.sql

如果只恢复表中的数据,就要使用mysqlimport客户端。

2. 使用mysqlimport恢复数据

mysqlimport客户端可以用来恢复表中的数据,它提供了LOAD DATA INFILE语句的一个命令行接口,发送一个LOAD DATA INFILE命令到服务器来运作。它大多数选项直接对应LOAD DATA INFILE语句。

mysqlimport命令格式为:

mysqlimport[options] db_name filename ...

说明:options是mysqlimport命令的选项,使用mysqlimport -help即可查看这些选项的内容和作用。常用的选项为:

-d,--delete:在导入文本文件前清空表格。

--lock-tables:在处理任何文本文件前锁定所有的表。这保证所有的表在服务器上同步。而对于InnoDB类型的表则不必进行锁定。

--low-priority,--local,--replace,--ignore:分别对应LOAD DATA INFILE语句的LOW_PRIORITY,LOCAL,REPLACE,IGNORE关键字。

对于在命令行上命名的每个文本文件,mysqlimport剥去文件名的扩展名,并使用它决定向哪个表导入文件的内容。例如,“patient.txt”、“patient.sql”和“patient”都会被导入名为patient的表中。所以备份的文件名应根据需要恢复表命名。

恢复XSCJ数据库中表XS的数据,保存数据的文件为XS.txt,命令如下:

mysqlimport -uroot-p123456 --low-priority --replace XSCJ XS.txt

mysqlimport也需要提供-u、-p选项来连接服务器。值得注意的是,mysqlimport是通过执行LOAD DATA INFILE语句来恢复数据库的,所以上例中备份文件未指定位置的默认是在MySQL的DATA目录中。如果不在则要指定文件的具体路径。

用户和数据安全性

添加用户

可以使用CREATE USER语法添加一个或多个用户,并设置相应的密码。

语法格式:

CREATE USER user[IDENTIFIED BY [PASSWORD] 'password']

GRANT语句的最后可以使用WITH子句。如果指定为WITH GRANT OPTION,则表示TO子句中指定的所有用户都有把自己所拥有的权限授予其他用户的权利,而不管其他用户是否拥有该权限。

授予David在XS表上的SELECT权限,并允许其将该权限授予其他用户。

首先在ROOT用户下授予David用户SELECT权限:

GRANT SELECT

ONXSCJ.XS

TODavid@localhost IDENTIFIED BY '123456'

WITH GRANT OPTION;

接着,以David用户身份登录MySQL,登录方式为:

(1)打开DOS窗口,然后进入mysql安装目录下的bin目录,默认安装的路径为:C:\ProgramFiles\MySQL\MySQL Server 5.1\bin。

(2)输入命令:mysql-hlocalhost -uDavid -p123456。其中-h后为主机名,-u后为用户名,-p后为用户密码。登录后界面如图9.1所示。

[, user [IDENTIFIED BY [PASSWORD]'password']] ...

其中,user的格式为:

'user_name'@ 'hostname'

说明:

user_name为用户名,host_name为主机名,password为该用户的密码。在大多数SQL产品中,用户名和密码只由字母和数字组成。

使用自选的IDENTIFIED BY子句,可以为账户给定一个密码。特别是要在纯文本中指定密码,需忽略PASSWORD关键词。如果不想以明文发送密码,而且知道PASSWORD()函数返回给密码的混编值,则可以指定该混编值,但要加关键字PASSWORD。

CREATE USER用于创建新的MySQL账户。CREATE USER会在系统本身的mysql数据库的user表中添加一个新记录。要使用CREATE USER,必须拥有mysql数据库的全局CREATE USER权限或INSERT权限。如果账户已经存在,则出现错误。

添加两个新的用户,king的密码为queen,palo的密码为530415。

CREATE USER

'king'@'localhost' IDENTIFIED BY 'queen',

'palo'@'localhost' IDENTIFIED BY '530415';

说明:

在用户名的后面声明了关键字localhost。这个关键字指定了用户创建的使用MySQL的连接所来自的主机。如果一个用户名和主机名中包含特殊符号如“_”,或通配符如“%”,则需要用单引号将其括起。“%”表示一组主机。

如果两个用户具有相同的用户名但主机不同,MySQL将其视为不同的用户,允许为这两个用户分配不同的权限集合。

如果没有输入密码,那么MySQL允许相关的用户不使用密码登录。但是从安全的角度并不推荐这种做法。

刚刚创建的用户还没有很多权限。它们可以登录到MySQL,但是它们不能使用USE语句来让用户已经创建的任何数据库成为当前数据库,因此,它们无法访问那些数据库的表,只允许进行不需要权限的操作,例如,用一条SHOW语句查询所有存储引擎和字符集的列表。

语法格式:

DROP USER user [,user_name] ...

DROP USER语句用于删除一个或多个MySQL账户,并取消其权限。要使用DROP USER,必须拥有mysql数据库的全局CREATE USER权限或DELETE权限。

删除用户TOM。

DROP USERTOM@localhost;

如果删除的用户已经创建了表、索引或其他的数据库对象,它们将继续保留,因为MySQL并没有记录是谁创建了这些对象。

可以使用RENAME USER语句来修改一个已经存在的SQL用户的名字。

语法格式:

RENAME USERold_user TO new_user,

[, old_user TO new_user] ...

说明:

old_user为已经存在的SQL用户。new_user为新的SQL用户。

RENAME USER语句用于对原有MySQL账户进行重命名。要使用RENAME USER,必须拥有全局CREATEUSER权限或mysql数据库UPDATE权限。如果旧账户不存在或者新账户已存在,则会出现错误。

将用户king1和king2的名字分别修改为ken1和ken2。

RENAME USER

'king1'@'localhost' TO 'ken1'@'localhost',

'king2'@'localhost' TO 'ken2'@'localhost';

要修改某个用户的登录密码,可以使用SET PASSWORD语句。

语法格式:

SET PASSWORD [FOR user]= PASSWORD('newpassword')

说明:

如果不加FOR user,表示修改当前用户的密码。加了FOR user则是修改当前主机上的特定用户的密码,user为用户名。user的值必须以'user_name'@'host_name'的格式给定。

将用户king的密码修改为queen1。

SET PASSWORD FOR'king'@'localhost' = PASSWORD('queen1');

授予权限

新的SQL用户不允许访问属于其他SQL用户的表,也不能立即创建自己的表,它必须被授权。可以授予的权限有以下几组。

(1)列权限:和表中的一个具体列相关。例如,使用UPDATE语句更新表XS学号列的值的权限。

(2)表权限:和一个具体表中的所有数据相关。例如,使用SELECT语句查询表XS的所有数据的权限。

(3)数据库权限:和一个具体的数据库中的所有表相关。例如,在已有的XSCJ数据库中创建新表的权限。

(4)用户权限:和MySQL所有的数据库相关。例如,删除已有的数据库或者创建一个新的数据库的权限。

给某用户授予权限可以使用GRANT语句。使用SHOWGRANTS语句可以查看当前账户拥有什么权限。

GRANT语法格式:

GRANT priv_type [(column_list)] [, priv_type[(column_list)]] ...

ON [object_type] {tbl_name | * | *.* |db_name.*}

TO user [IDENTIFIED BY [PASSWORD]'password']

[, user [IDENTIFIED BY [PASSWORD]'password']] ...

[WITH with_option [with_option] ...]

其中,object_type:

TABLE

| FUNCTION

| PROCEDURE

with_option :

GRANT OPTION

|MAX_QUERIES_PER_HOUR count

|MAX_UPDATES_PER_HOUR count

|MAX_CONNECTIONS_PER_HOUR count

|MAX_USER_CONNECTIONS count

说明:priv_type为权限的名称,如SELECT、UPDATE等,给不同的对象授予权限priv_type的值也不相同。TO子句用来设定用户的密码。ON关键字后面给出的是要授予权限的数据库或表名,下面将一一介绍。

(1)授予表权限和列权限

授予表权限时,priv_type可以是以下值:

●SELECT:给予用户使用SELECT语句访问特定的表的权力。用户也可以在一个视图公式中包含表。然而,用户必须对视图公式中指定的每个表(或视图)都有SELECT权限。

●INSERT:给予用户使用INSERT语句向一个特定表中添加行的权力。

●DELETE:给予用户使用DELETE语句向一个特定表中删除行的权力。

●UPDATE:给予用户使用UPDATE语句修改特定表中值的权力。

●REFERENCES:给予用户创建一个外键来参照特定的表的权力。

●CREATE:给予用户使用特定的名字创建一个表的权力。

●ALTER:给予用户使用ALTER TABLE语句修改表的权力。

●INDEX:给予用户在表上定义索引的权力。

● DROP:给予用户删除表的权力。

● ALL或ALL PRIVILEGES:表示所有权限名。

在授予表权限时,ON关键字后面跟tb1_name,tb1_name为表名或视图名。

授予用户king在XS表上的SELECT权限。

USE XSCJ;

GRANT SELECT

ONXS

TO king@localhost;

说明:

这里假设是在ROOT用户中输入了这些语句,这样用户king就可以使用SELECT语句来查询XS表,而不管是谁创建的这个表。

若在TO子句中给存在的用户指定密码,则新密码将原密码覆盖。如果权限授予了一个不存在的用户,MySQL会自动执行一条CREATEUSER语句来创建这个用户,但必须为该用户指定密码。

用户liu和zhang不存在,授予它们在XS表上的SELECT和UPDATE权限。

GRANT SELECT,UPDATE

ON XS

TOliu@localhost IDENTIFIED BY 'LPWD',

zhang@localhost IDENTIFIED BY 'ZPWD';

对于列权限,priv_type的值只能取SELECT、INSERT和UPDATE。权限的后面需要加上列名column_list。

授予king在XS表上的学号列和姓名列的UPDATE权限。

GRANT UPDATE(姓名, 学号)

ONXS

TOking@localhost;

(2)授予数据库权限

表权限适用于一个特定的表。MySQL还支持针对整个数据库的权限。例如,在一个特定的数据库中创建表和视图的权限。

授予数据库权限时,priv_type可以是以下值:

●SELECT:给予用户使用SELECT语句访问特定数据库中所有表和视图的权力。

●INSERT:给予用户使用INSERT语句向特定数据库中所有表添加行的权力。

●DELETE:给予用户使用DELETE语句删除特定数据库中所有表的行的权力。

●UPDATE:给予用户使用UPDATE语句更新特定数据库中所有表的值的权力。

●REFERENCES:给予用户创建指向特定的数据库中的表外键的权力。

●CREATE:给予用户使用CREATE TABLE语句在特定数据库中创建新表的权力。

●ALTER:给予用户使用ALTER TABLE语句修改特定数据库中所有表的权力。

●INDEX:给予用户在特定数据库中的所有表上定义和删除索引的权力。

● DROP:给予用户删除特定数据库中所有表和视图的权力。

●CREATE TEMPORARY TABLES:给予用户在特定数据库中创建临时表的权力。

●CREATE VIEW:给予用户在特定数据库中创建新的视图的权力。

● SHOWVIEW:给予用户查看特定数据库中已有视图的视图定义的权力。

●CREATE ROUTINE:给予用户为特定的数据库创建存储过程和存储函数等权力。

●ALTER ROUTINE:给予用户更新和删除数据库中已有的存储过程和存储函数等权力。

●EXECUTE ROUTINE:给予用户调用特定数据库的存储过程和存储函数的权力。

● LOCKTABLES:给予用户锁定特定数据库的已有表的权力。

● ALL或ALL PRIVILEGES:表示以上所有权限名。

在GRANT语法格式中,授予数据库权限时ON关键字后面跟“*”和“db_name.*”。“*”表示当前数据库中的所有表;“db_name.*”表示某个数据库中的所有表。

授予king在XSCJ数据库中的所有表的SELECT权限。

GRANT SELECT

ONXSCJ.*

TOking@localhost;

说明:

这个权限适用于所有已有的表,以及此后添加到XSCJ数据库中的任何表。

授予king在XSCJ数据库中所有的数据库权限。

USE XSCJ;

GRANT ALL

ON *

TOking@localhost;

和表权限类似,授予一个数据库权限也不意味着拥有另一个权限。如果用户被授予可以创建新表和视图,但是还不能访问它们。要访问它们,它还需要单独被授予SELECT权限或更多权限。

(3)授予用户权限

最有效率的权限就是用户权限,对于需要授予数据库权限的所有语句,也可以定义在用户权限上。例如,在用户级别上授予某人CREATE权限,这个用户可以创建一个新的数据库,也可以在所有的数据库(而不是特定的数据库)中创建新表。

MySQL授予用户权限时priv_type还可以是以下值。

●CREATE USER:给予用户创建和删除新用户的权力。

● SHOWDATABASES:给予用户使用SHOW DATABASES语句查看所有已有的数据库的定义的权利。

在GRANT语法格式中,授予用户权限时ON子句中使用“*.*”,表示所有数据库的所 有表。

授予Peter对所有数据库中的所有表的CREATE、ALTERT和DROP权限。

GRANT CREATE ,ALTER ,DROP

ON*.*

TOPeter@localhost IDENTIFIED BY 'ppwd';

授予Peter创建新用户的权力。

GRANT CREATEUSER

ON*.*

TOPeter@localhost;

登录后,David用户只有查询XSCJ数据库中XS表的权利,它可以把这个权限传递给其他用户,这里假设用户Jim已经创建:

GRANT SELECT

ONXSCJ.XS

TO Jim@localhost;

说明:使用了WITH GRANT OPTION子句后,如果David在该表上还拥有其他权限,他可以将其他权限也授予Jim而不仅限于SELECT。

WITH子句也可以对一个用户授予使用限制,其中,MAX_QUERIES_PER_HOUR count表示每小时可以查询数据库的次数;MAX_CONNECTIONS_PER_HOUR count表示每小时可以连接数据库的次数;MAX_UPDATES_PER_HOUR count表示每小时可以修改数据库的次数。例如,某人每小时可以查询数据库多少次。MAX_USER_CONNECTIONS count表示同时连接MySQL的最大用户数。count是一个数值,对于前三个指定,count如果为0则表示不起限制作用。

授予Jim每小时只能处理一条SELECT语句的权限。

GRANT SELECT

ON XS

TOJim@localhost

WITH MAX_QUERIES_PER_HOUR 1;

除了MAX_QUERIES_PER_HOUR,还可以指定MAX_CONNECTIONS_PER_HOUR、MAX_UPDATES_PER_HOUR和MAX_USER_CONNECTIONS。对于前3个指定,如果值等于0,就没有限制会起作用。

要从一个用户回收权限,但不从USER表中删除该用户,可以使用REVOKE语句,这条语句和GRANT语句格式相似,但具有相反的效果。要使用REVOKE,用户必须拥有mysql数据库的全局CREATE USER权限或UPDATE权限。

语法格式:

REVOKE priv_type[(column_list)] [, priv_type [(column_list)]] ...

ON{tbl_name | * | *.* | db_name.*}

FROM user [, user] ...

或者:

REVOKE ALLPRIVILEGES, GRANT OPTION FROM user [, user] ...

说明:第一种格式用来回收某些特定的权限,第二种格式回收所有该用户的权限。

回收用户David在XS表上的SELECT权限。

REVOKE SELECT

ON XS

FROMDavid@localhost;

由于David用户对XS表的SELECT权限被回收了,那么包括直接或间接地依赖于它的所有权限也回收了,在这个例子中,Jim也失去了对XS表的SELECT权限。但以上语句执行之后WITH GRANT OPTION还保留,当再次授予David对于同一个表的表权限时,它会立刻把这个权限传递给Jim。

ANALYZE TABLE语句

在一个定义了索引的列上,该列上不同值的数目被称为该索引列的可压缩性,可以使用SHOW INDEX FROM tb_name语句来显示它。

一个索引列的可压缩性不是自动更新的。就是说,用户在某列创建了一个索引,而该列的可压缩性是不会立即计算出来的。这时需要使用ANALYZE TABLE语句来更新它。

语法格式:

ANALYZE [LOCAL |NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

在MySQL上执行的所有更新都将写入到一个二进制日志文件中。这里如果直接使用ANALYZE TABLE语句,结果数据也会写入日志文件中。如果指定了NO_ERITE_TO_BINLOG选项,则关闭这个功能(LOCAL是NO_ERITE_TO_BINLOG的同义词),这样ANALYZETABLE语句也将会更快完成。

更新表XS的索引的可压缩性,并随后显示。

ANALYZE TABLE XS;

SHOW INDEX FROM XS;

这条语句用来检查一个或多个表是否有错误,只对MyISAM和InnoDB表起作用。

语法格式:

CHECK TABLEtbl_name [, tbl_name] ... [option] ...

其中,option为:

QUICK | FAST |MEDIUM | EXTENDED | CHANGED

说明:

使用该语句有多个选项。

●QUICK:不扫描行,不检查错误的链接,这是最快的方法。

● FAST:检查表是否已经正确关闭。

●CHANGED:检查上次检查后被更改的表,以及没有被正确关闭的表。

●MEDIUM:扫描行,以验证被删除的链接是有效的。也可以计算各行的关键字校验和,并使用计算出的校验和验证这一点。

●EXTENDED:对每行的所有关键字进行全面的关键字查找。这可以确保表是100%一致的,但是花的时间较长。

对于数据库中的每一个表,都可以使用CHECKSUM TABLE语句获得一个校验和。

语法格式:

CHECKSUM TABLEtbl_name [, tbl_name] ... [ QUICK | EXTENDED ]

说明:如果表是MyISAM表,如果指定了QUICK,则报告表校验和,否则报告NULL。指定EXTENDED则表示无论表是否是MyISAM表,都只计算检验和。

如果用户不断地使用DELETE、INSERT和UPDATE语句更新一个表,那么表的内部结构就会出现很多碎片和未利用的空间。这时可以使用OPTIMIZE TABLE语句来重新利用未使用的空间,并整理数据文件的碎片。OPTIMIZE TABLE语句只对MyISAM、BDB和InnoDB表起作用。

语法格式:

OPTIMIZE [LOCAL |NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

如果一个表或索引已经损坏,可以使用REPAIR TABLE语句尝试修复它。REPAIRTABLE只对MyISAM和ARCHIVE表起作用。

REPAIR [LOCAL |NO_WRITE_TO_BINLOG] TABLE

tbl_name [, tbl_name] ... [QUICK][EXTENDED] [USE_FRM]

说明:

REPAIR TABLE语句支持以下选项:

●QUICK:如果指定了该选项,则REPAIR TABLE会尝试只修复索引树。

●EXTENDED:使用该选项,则MySQL会一行一行地创建索引行,代替使用分类一次创建一个索引。

●USE_FRM:如果MYI索引文件缺失或标题被破坏,则必须使用此选项。

另外,还有两个表维护语句:BACKUP TABLE和RESTORETABLE语句。

使用BACKUP TABLE语句可以对一个或多个MyISAM表备份。

语法格式为:

BACKUP TABLEtbl_name [, tbl_name] ... TO '/path/to/backup/directory'

使用RESTORE TABLE语句可以获取BACKUPTABLE创建的一个或多个表的备份,将数据读取到数据库中。

语法格式为:

RESTORE TABLEtbl_name [, tbl_name] ... FROM '/path/to/backup/directory'

但是这两条语句不是很理想,已经不推荐使用了,这里只是大概了解一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值