1 安全管理
1.1 访问控制
MySQL服务器的安全基础是: 用户应该对他们需要的数据具有适当的访问权,既不能多也不能少
1.2 管理用户
MySQL用户账号和信息存储在名为mysql的MySQL数据库中。获得所有用户账号列表时,可使用以下代码:
USE mysql;
SELECT user FROM user;
结果如下:
这里只有root一个账户。接下来开始创建账户。
1.2.1 创建用户账号
为了创建一个新用户账号,使用CREATE USER语句,如下所示:
CREATE USER ben IDENTIFIED BY '123456';
结果如下:
指定散列口令 IDENTIFIED BY指定的口令为纯文本, MySQL将在保存到user表之前对其进行加密。为了作为散列值指定口令,使用IDENTIFIED BY PASSWORD。
为重新命名一个用户账号,使用RENAME USER语句,如下所示:
RENAME USER ben TO jerry;
1.2.2 删除用户账号
为了删除一个用户账号(以及相关的权限),使用DROP USER语句,如下所示:
DROP USER jerry;
1.2.3 设置访问权限
为看到赋予用户账号的权限,使用SHOW GRANTS FOR,如下所示:
SHOW GRANTS FOR jerry;
为设置权限,使用GRANT语句,GTANT要求至少给出以下信息:
要授予的权限
被授予访问权限的数据库或表
用户名
GRANT的用法示例如下:
GRANT SELECT ON test.* TO jerry;
这里表示允许用户在test.*(test.*数据库的所有表)上使用SELECT,用户jerry对test数据库中的所有数据具有只读访问权限
结果如下:
每个GRANT添加(或更新)用户的一个权限。 MySQL读取所有授权,并根据它们确定权限
GRANT的反操作为REVOKE,用它来撤销特定的权限。示例如下:
REVOKE SELECT ON test.* FROM jerry;
这条REVOKE语句取消刚赋予用户jerry的SELECT访问权限。 被撤销的访问权限必须存在,否则会出错,结果如下:
GRANT和REVOKE可在几个层次上控制访问权限:
整个服务器,使用GRANT ALL 和REVOKE ALL
整个数据库,使用ON database.*
特定的表,使用ON database.table
特定的列
特定的存储过程
1.2.4 更改口令
为了更改用户口令,可使用SET PASSWORD语句。新口令必须如下加密:
SET PASSWORD FOR jerry = PASSWORD('654321');
SET PASSWORD更新用户口令。新口令必须传递到Password()函数进行加密
2 管理事务处理
2.1 事务处理
事务处理(transaction processing)可以用来维护数据库的完整性,它保证成批的MySQL操作要么完全执行,要么完全不执行。
在使用事务和事务处理时,有几个关键词汇反复出现。下面是关于事务处理需要知道的几个术语:
事务(transaction)指一组SQL语句;
回退(rollback)指撤销指定SQL语句的过程
提交(commit)指将未存储的SQL语句结果写入数据库表
保留点(savepoint)指事务处理设置的临时占位符
2.2 控制事务处理
MySQL使用下面的语句来标识事务的开始:
START TRANSACTION;
2.2.1 使用ROLLBACK
MySQL的ROLLBACK命令用来回退(撤销) MySQL语句,示例如下:
SELECT * FROM table1;
START TRANSACTION;
DELETE FROM table1;
SELECT * FROM table1;
ROLLBACK
SELECT * FROM table1;
结果如下:
上图是第一句SELECT执行的结果,然后依次执行上述语句如下:
首先执行一条SELECT以显示该表不为空。然后开始一个事务处理,用一条DELETE语句删除table1中的所有行。另一条SELECT语句验证ordertotals确实为空。这时用一条ROLLBACK语句回退START TRANSACTION之后的所有语句,最后一条SELECT语句显示该表不为空。ROLLBACK只能在一个事务处理内使用(在执行一条START TRANSACTION命令之后)。
哪些语句可以回退? 事务处理用来管理INSERT、 UPDATE和DELETE语句。你不能回退SELECT语句。(这样做也没有什么意义。)不能回退CREATE或DROP操作。
2.2.2 使用COMMIT
一般的MySQL语句都是直接针对数据库表执行和编写的。这就是所谓的隐含提交(implicit commit),即提交(写或保存)操作是自动进行的。
在事务处理块中,提交不会隐含地进行。为进行明确的提交,使用COMMIT语句,示例如下所示:
START TRANSACTION;
DELETE FROM table1 WHERE id = 1;
COMMIT;
最后的COMMIT语句仅在不出错时写出更改。
隐含事务关闭 当COMMIT或ROLLBACK语句执行后,事务会自 动关闭(将来的更改会隐含提交)。
2.2.3 使用保留点
简单的ROLLBACK和COMMIT语句就可以写入或撤销整个事务处理。但是,只是对简单的事务处理才能这样做,更复杂的事务处理可能需要部分提交或回退。
为了支持回退部分事务处理,必须能在事务处理块中合适的位置放置占位符。这样,如果需要回退,可以回退到某个占位符。
这些占位符称为保留点。为了创建占位符,可如下使用SAVEPOINT语句:
SAVEPOINT delete1;
每个保留点都取标识它的唯一名字,以便在回退时, MySQL知道要回退到何处。为了回退到本例给出的保留点,可如下进行:
ROLLBACK TO delete1;
释放保留点 保留点在事务处理完成(执行一条ROLLBACK或COMMIT)后自动释放。自MySQL 5以来,也可以用RELEASE SAVEPOINT明确地释放保留点。
2.2.3 更改默认的提交行为
由于默认的MySQL行为是自动提交所有更改。换句话说,任何时候你执行一条MySQL语句,该语句实际上都是针对表执行的,而且所做的更改立即生效。为指示MySQL不自动提交更改,需要使用以下语句:
SET autocommit=0;
autocommit标志决定是否自动提交更改,不管有没有COMMIT语句。设置autocommit为0(假)指示MySQL不自动提交更改(直到autocommit被设置为真为止)。
3 数据库维护
3.1 备份数据
使用命令行实用程序mysqldump转储所有数据库内容到某个外部文件。在进行常规备份前这个实用程序应该正常运行,以便能正确地备份转储文件
可用命令行实用程序mysqlhotcopy从一个数据库复制所有数据(并非所有数据库引擎都支持这个实用程序)
可以使用MySQL的BACKUP TABLE或SELECT INTO OUTFILE转储所有数据到某个外部文件。这两条语句都接受将要创建的系统文件名,此系统文件必须不存在,否则会出错。数据可以用RESTORE TABLE来复原
首先刷新未写数据 为了保证所有数据被写到磁盘(包括索引数据),可能需要在进行备份前使用FLUSH TABLES语句
3.2 进行数据库维护
MySQL提供了一系列的语句,可以(应该)用来保证数据库正确和正常运行,一些语句如下:
ANALYZE TABLE用来检查表键是否正确,示例如下:
ANALYZE TABLE table1;
CHECK TABLE用来针对许多问题对表进行检查
ANALYZE TABLE table1;
若MyISAM表访问产生不正确和不一致的结果,可能需要用REPAIR TABLE来修复相应的表
若从一个表中删除大量数据,应该使用OPTIMIZE TABLE来回收所有的空间,从而优化表的性能
3.3 诊断启动问题
在排除系统启动问题时,首先应该尽量用手动启动服务器。 MySQL服务器自身通过在命令行上执行mysqld启动。下面是几个重要的mysqld命令行选项:
--help显示帮助——一个选项列表
--safe-mode装载减去某些最佳配置的服务器
verbose显示全文本消息
--version显示版本信息然后退出
3.4 查看日志文件
MySQL维护管理员依赖的一系列日志文件。主要的日志文件有以下几种:
错误日志。它包含启动和关闭问题以及任意关键错误的细节。此日志通常名为hostname.err,位于data目录中。此日志名可用–log-error命令行选项更改
查询日志。它记录所有MySQL活动,在诊断问题时非常有用。此日志文件可能会很快地变得非常大,因此不应该长期使用它。此日志通常名为hostname.log,位于data目录中。此名字可以用–log命令行选项更改
二进制日志。它记录更新过数据(或者可能更新过数据)的所有语句。此日志通常名为hostname-bin,位于data目录内。此名字可以用–log-bin命令行选项更改。
缓慢查询日志。此日志记录执行缓慢的任何查询。这个日志在确定数据库何处需要优化很有用。此日志通常名为hostname-slow.log, 位 于 data 目 录 中 。 此 名 字 可 以 用–log-slow-queries命令行选项更改
4 改善性能
MySQL一个多用户多线程的DBMS,换言之,它经常同时执行多个任务。如果这些任务中的某一个执行缓慢,则所有请求都会执行缓慢。若遇到显著的性能不良,可使用SHOW PROCESSLIST
显示所有活动进程(以及它们的线程ID和执行时间)。还可以用KILL命令终结某个特定的进(使用这个命令需要作为管理员登录)。
有不止一种方法编写同一条SELECT语句。 应该试验联结、并、子查询等,找出最佳的方法。
使用EXPLAIN语句让MySQL解释它将如何执行一条SELECT语句。
决不要检索比需求还要多的数据。换言之,不要用SELECT *(除非你真正需要每个列)
在导入数据时,应该关闭自动提交。你可能还想删除索引(包括FULLTEXT索引),然后在导入完成后再重建它们