MySQL必知必会笔记(八)安全管理 数据库维护 改善性能
第二十八章 安全管理
访问控制
MySQL服务器的安全基础是:用户应该对他们需要的数据具有适当的访问权,不能多也不能少。换句话说,用户不能对过多的数据有更过的访问权。
访问控制 你需要给用户提供他们所需的访问权,且仅提供他们所需的访问权。
管理访问控制需要创建和管理用户账号
使用MySQL Administrator提供的图形用户界面,可更方便的来管理用户及账号权限。
在非现实的数据库中使用root登录进行调试是对的。不过在现实世界的日常工作中,决不能使用root。而应该创建一系列不同权限的账号,用这些账号来登录对数据库进行操作。
防止无意的错误 访问控制的目的不仅仅是防止用户的恶意企图。数据库更常见的是无意识错误的结果,如错打mysql语句,在不合适的数据库中存储或其他一些错误。通过保证用户不能他们不应该执行的语句,来避免这些情况的发生。
不应在日常生活中使用root
管理用户
MySQL用户账号和信息存储在名为mysql的MySQL数据库中。
USE mysql;
SELECT user FROM user;
实验对用户账号和权限进行更改的最好办法是打开多个数据库客户机(如:mysql命令行实用查询的多个副本),一个作为管理登录,其他作为被测试的用户登录
创建用户账号
为了创建一个新用户账号,使用CREATE USER语句:
CREATE USER lilei IDENTIFIED BY 'p@$$wOrd';
CREATE USER创建了一个新用户账号。在创建用户时不一定需要口令,不过这个例子用IDENTIFIED BY 'p@$$wOrd'给出了一个口令
指定散列口令 IDENTIFIED BY指定的口令为纯文本,MySQL将在保存到user表之前对其进行加密。为了作为散列值指定口令,使用IDENTIFIED BY PASSWORD.
使用GRANT或INSERT GRANT语句,也可以创建用户账号,但一般来说CREATE USER是最清楚和最简单的句子。此外,也可以通过直接出入行到user用户表来增加用户,不过安全起见,一般不建议这样做,MySQL用来存储用户账号信息的表以及表模式极为重要,对它们的任何毁坏都可能严重的伤害到MySQL服务器。因此相对于直接处理来说,最好用标记和汗水来处理这些表。
重命名一个用户账号
使用RENAME USER语句
RENAME USER lilei TO likai;
MySQL5 之前不支持RENAME USER ,以前重命名一个用户使用UPDATE直接更新user表
删除用户账号
为了删除用户账号,使用DROP USER语句。
DROP USER likai;
MySQL5之后,DROP USER删除用户账户和所有相关的账号权限。在MySQL5之前,DROP USER只能用来删除用户账号,不能删除权限。因此使用旧版本的MySQL,需要先用REVOKE删除与账号相关的权限,然后再用DROP USER删除账号。
设置访问权限
在创建用户账号后,必须接着分配访问权限。新创建的用户没有访问权限,它们只能登陆服务器,但不能看到数据,也不能执行任何数据库操作。
查看用户账号的权限
SHOW GRANTS FOR lilei;
用户定义为user@host MySQL的权限用用户名和主机名结合定义,如果不指定主机名,则使用默认的主机名%(授予用户访问权限而不管主机名)
设置权限 可使用GRANT语句,GRANT要求至少给出以下信息:
1 要授予的权限
2 被授予访问呢权限的数据库或表
3 用户名
GRANT SELECT ONcrashcourse . * TO lilei;
//GRANT允许用户在crashcourse .*(crashcourse数据库的所有表)上使用SELECT。通过只授予SELECT访问权限,用户lilei对crashcourse数据库中的所有数据具有只读访问权限。
撤销权限
REVOKE SELECT ONcrashcourse . * FROM lilei;
//取消lilei对crashcourse 表的SELECT访问权限,被撤销的权限必须存在,否则出错
GRANT和REVOKE可在几个层次上控制访问权限
1 整个服务器,使用GRANT ALL和REVOKE ALL
2 整个数据库, 使用ON database . *
3 特定表,使用ON database . Table
4 特定列;
5特定的存储过程
列出可以授予或撤销的每个权限
权限 说明
ALL 除GRANT OPTION外的所有权限
ALTER 使用ALTER TABLE
ALTER ROUTINE 使用ALTER PROCEDURE和DROP PROCEDURE
CREATE 使用CREATE TABLE
CREATE ROUTINE 使用CREATE PROCEDURE
CREATE TEMPORARY 使用CREATE TEMPORARY TABLE
TABLES
CREATE USER 使用CREATE USER、DROP USER、RENAME USER、 使用REVOKE ALLPRIVILEGES
CREATE VIEW 使用CREATE VIEW
DELETE 使用DELETE
DROP 使用DROP TABLE
EXECUTE 使用CALL和存储过程
FILE 使用SELECT INTO OUTFILE和LOAD DATA INFILE
GRANT OPTION 使用GRANThe和REVOKE
INDEX 使用CREATE INDEX 和DROP INDEX
INSERT 使用INSERT
LOCK TABLES 使用LOCK TABLES
PROCESS 使用SHOW FULL PROCESSLIST
PELOAD 使用FLUSH
REPLICATION CLIENT 服务器位置的访问
REPLICATION SLAVE 由复制从属使用
SELECT 使用SELECT
SHOW DATABASES 使用SHOW DATABASES
SHOW VIEW 使用SHOW CREATE VIEW
SHUTDOWN 使用mysqladmin shutdown(用来关闭MySQL)
SUPER 使用CHANGE MASTER、KILL、LOGS、PURGE、MASTER 和SET GLOBAL。还允许mysqladmin调试登录
UPDATE 使用UPDATE
USAGE 无访问权限
简化多次授权
可通过列出各权限并用逗号分隔,将多条GRANT语句串在一起
GRANT SELECT , INSERT ON crahcourse . * TO bfroa;
更改口令
为了更改用户口令,可使用SET PASSWORD语句,新口令必须传递给Password()函数加密:
SET PASSWORD FOR bforta = Password('n3w p@$$wOrd'); //设置bforta的口令
SET PASSWORD = Password('n3w p@$$wOrd'); //设置自己的口令
第二十九章 数据库维护
首先刷新未写数据 为了保证所有数据被写到磁盘(包括索引数据),可能需要在进行备份前使用FLUSH TABLES语句
备份数据库
像所有的数据一样,MySQL的数据也必须经常备份。由于MySQL数据库是基于磁盘的文件,普通的备份系统和例程就能备份MySQL的数据库,但是,由于这些文件总是处于打开和使用状态,普通的文件副本备份不一定总是有效。
下面列出这个问题的可能解决方案:
1 使用命令行实用程序mysqdump转储所有数据库内容到某个外部文件。在进行常规备份前这个实用程序应该正常运行,以便能正确地备份转储文件。
2 可用命令行实用程序mysqlhotcopy从一个数据库复杂所有数据(并非使用数据库引擎都转储这个实用程序)
3 可以使用MySQL的BACKUP TABLE或SELET INTO OUTFILE转储所有数据到某个外部文件。这条语句都能接受将要创建的系统文件名,此系统文件必须不存在,否则会出错。数据可以用RESTORE TABLE来复原
进行数据库维护
MySQL提供了一系列的语句,可以(应该)用来保证数据库正确和正常运行。以下是你应该指定的一些语句:
1 ANALYZE TABLE 用来检查表键知否正确。
2 CHECK TABLE用来针对许多问题对表进行检查。在MyISAM表上还对索引进行检查。CHECK TABLE 支持一系列的用于MyISAM表的方式。
CHANGED 检查最好一次检查yi8lai改动过的表。
EXTENDED 执行最彻底的检查
FAST 做检查为正常关闭的表
MEDIUM 检查所有被删除的链接并进行键校验
QUICK 只进行快速扫描
3 如果MyISAM表访问产生不正确或不一致的结果,可能需要用REPAIR TABLE来修股相应的表。这条语句不应该经常使用,如果需要经常使用,可能会有更大的问题要解决
4 如果一个表中删除大量数据,应该使用OPTIMIZE TABLE来收回所用的空间,从而优化表的性能
诊断启动问题
服务器的启动问题通常在对MySQL配置或服务器本身进行更改时出现。MySQL在这个问题发生时报告错误,但由于多数MySQL服务器是作为系统进程或服务自动启动的,这些消息可能看不到。
在排除系统启动问题时,首先应该尽量用手动启动服务器。MySQL服务器自身通过在命令行上这些mysqld启动。下面是几个重要的mysqld命令行选项:
1 --help显示帮助
2 --safe-mode装载减去某些最佳配置的服务器
3 --verbose显示全文本消息
4 --version显示版本信息然后退出
查看日志文件
MySQL维护管理员依赖的一系列日志文件。主要文件有以下几种:
1 错误日志。它包含启动和关闭问题以及任意根据错误的细节。此日志通常名为hostname.err,位于data目录中。此日志可用--log-error命令行选项更改
2 查询日志。它记录所有MySQL活动,在诊断问题是非常有用。词日志文件可能会很快的变得非常大,因此不应该长期使用它。此日志通常名为hostname.log,.位于data目录中。此名字可以用--log命令行选项更改
3 二进制日志。它记录更新过数据(或者可能更新过数据)的所有语句。此日志通常名为hostname-bin,位于data目录内,此名字可以用--log-bin命令行选项更改,注意:这个日志文件是MySQL5中添加的一切的MySQL版本中使用的是更新日志
4 缓慢查询日志,顾名思义,词日志记录执行 缓慢的任何查询。这个日志在确定数据库何处需要优化很有用。此日志通常名为hostname-slow.log,位于data目录中。此名字可以用--log-slow-queries命令行选项更改
第三十章 改善性能
改善性能
下面内容并不是完全决定MySQL的性能。我们回顾一下前面各章的重点,提供进行性能优化探讨和分析的一个出发点:
1 首先,MySQL(与所有的DBMS一样)具有特定的硬件建议。在学习和研究MySQL时,使用任何旧的计算机作为服务器都可以。但对于生产的服务器来时,应该坚持遵循这些硬件建议
2 一般来说,根据的生产DBMS应该允许在自己的专业服务器上
3 MySQL是用一系列的默认设置预先配置的,从这些设置开始通常是很好的。但过一段时间后你可能需要调整内存分配、缓冲区大小等(为了查看当前配置,可使用SHOW VARIABLES;和 SHOW STATUS;)
4 一个MySQL一个多用户多线程的DBMS,换言之,它经常同时执行多个任务。如果这些任务中的某个执行缓慢,则所有的请求都会执行缓慢。如果你遇到显著的性能不良,可使用SHOW PROCESSLIST显示所有活动进程(以及它们的线程ID和执行时间),你还可以用KILL命令终结某个特定的进程(使用这个命令需要作为管理员登陆)
5 总是不止一种方法编写一条SELECT语句,应该实验联结、并、子查询等,找出最佳的方法
6使用EXPLAIN语句让MySQL解释它将如何执行一条SELECT语句
7 一般来说,存储过程执行的比一条一条执行的其中的各条MySQL语句快
8 应该总是使用正确的数据类型
9 决不要检索比需求还要多的数据,换言之,不要用SELECT * FROM (除非真的需要)
10 有的操作(包括INSERT )支持一个可选的DELAYED关键字,如果使用它,将把控制立即返回给条用程序,并且一旦有可能就现实执行该操作
11 在导入数据时,应该关闭自动提交。你可以还想删除索引(包括FULLTEXT索引),然后再导入完成后再重建它们。
12 必须索引数据库以改善数据检索的性能。确定索引什么不是一个微不足道的任务,需要分析使用的SAELECT语句以找出重复的WHERE和ORDER BY 子句。如果一个简单的WHERE子句返回结果所花的时间太长,则可以断定其中使用的列(或几个列)就需要索引的对象
13 你的SELECT语句中有一系列复杂的OR条件吗?通过使用多条SELECT语句和联结它们的UNION语句,就需要索引的对象
14 索引改善数据检索的性能,但损害数据插入、删除和更新的新能。如果你有一些表,它们世界数据库且不经常被搜索,则在有必要之前不要索引它们。
15 LIKE很慢,一般来说,最好的使用FULLTEXT而不是LIKE
16 数据库是不断变化的实体。一组优化良好的表一会儿后可能就面目全非了。由于表的使用和内容的更改,理想的优化和配置也会发生改变。
17 最重要的规则是,每条规则在某些条件下都会被打破。