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@loaclhost;
为设置权限,使用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
使用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
用来针对许多问题对表进行检查
CHECK 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索引),然后在导入完成后再重建它们