MySQL服务器的安全基础是:用户应该对他们需要的数据具有适当的访问权限,既不能多也不能少,即用户不能对过多的数据具有过多的访问权限。
1、对于非现实的数据库实验时可以使用root用户进行登录,但是在现实世界的日常工作中,决不能使用root(必须严肃对待root登录的使用,仅在绝对需要使用时才能使用它,如不能登录其他管理账号时使用root),应该创建一系列的账户,对这些账号分配不同的权限(有的用于管理、有的功用户使用、有的功开发人员使用等),限制它们的使用。
2、访问控制的目的不仅仅是防止用户的恶意企图,更常见的是防止无意识错误的结果。
MySQL用户账号和信息存储在名为mysql的MySQL数据库中,一般不需要直接访问mysql数据库和表,但有时需要直接访问,需要直接访问它的时机之一时在需要获得所有用户账号列表时,用法:
USE mysql;
SELECT user FROM user;
//user表是mysql数据库中特有的,它包含所有用户账号,user表中有一个user列,user列存储用户的登录名。
运行结果:
注意:试验对用户账号和权限进行更改的最好办法是打开多个数据库客户机(如mysql命令行实用程序的多个副本),一个座位管理登录,其他作为被测试的用户登录。
创建一个用户账号使用CREATE USER语句,语法:
CREATE USER 用户名 IDENTIFIED BY 密码;
IDENTIFIED BY用于指定散列口令,即指定的口令为纯文本,MySQL将在保存到user表之前对其进行加密。
重命名用户账号使用RENAME USER语句,语法:
RENAME USER 旧的用户账号 TO 新的用户账号;
删除用户账号(包含相关的权限)使用DROP USER 语句,语法:
DROP USER 用户账号;
GRANT(进行授权)和REVOKE(撤销授权)可以在 整个服务器、整个数据库、特定的表、特定的列、特定的存储过程这几个层次上控制访问权限。
1、查看用户账号的权限使用SHOW GRANTS FOR语句,语法:
SHOW GRANTS FOR 用户账号;
注意:MySQL的权限用 用户名和主机名结合定义(如Hern@host,Hern代表用户名),如果不指定主机名则使用默认的主机名%(授予用户访问权限而不管主机名)。
2、为了设置权限,使用GRANT语句,GRANT语句使用的规则:要授予的权限、被授予访问权限的数据库或表、用户名。
语法:
GRANT 要授予的权限 ON 被授予权限的数据库或表 TO 用户名;
//可以通过列出各项权限并用逗号( , )分隔一次性赋予多项权限(简化多次授权)
GRNAT 要授予的权限1,要授予的权限2,要授予的权限3…… ON 被授予权限的数据库或表 TO 用户名;
例如:
GRANT SELECT,DROP,DELETE,INSERT,UPDATE ON test.* TO Hern;
//代表用户Hern对test数据库中的所有数据具有只读访问权限
//Hern 代表用户账号
//test.* 代表test数据库的所有表
//SELECT 代表只授予SELECT访问权限
撤销特定的权限
撤销特定的权限使用REVOKE语句,需要撤销的权限必须存在,否则会报错。语法:
REVOKE 需要撤销的权限 ON 被撤销权限的数据库或表 TO 用户名;
//可以通过列出各项权限并用逗号( , )分隔一次性撤销多项权限(简化多次撤销)
REVOKE 需要撤销的权限1,需要撤销的权限2,需要撤销的权限3…… ON 被撤销权限的数据库或表 TO 用户名;
系统权限表
• 权限存储在mysql库的user,db, tables_priv, columns_priv, and procs_priv这几个系统表中,待MySQL实例启动后就加载到内存中
• User表:存放用户账户信息以及全局级别(所有数据库)权限,决定了 来自哪些主机的哪些用户可以访问数据库实例,如果有全局权限则意味
着对所有数据库都有此权限
• Db表:存放数据库级别的权限,决定了来自哪些主机的哪些用户可以访 问此数据库
• Tables_priv表:存放表级别的权限,决定了来自哪些主机的哪些用户可以 访问数据库的这个表
• Columns_priv表:存放列级别的权限,决定了来自哪些主机的哪些用户可 以访问数据库表的这个字段
• Procs_priv表:存放存储过程和函数级别的权限
• User和db权限表结构
• User权限表结构中的特殊字段
• Plugin,password,authentication_string三个字段存放用户认证信息
• Password_expired设置成’Y’则表明允许DBA将此用户的密码设置成过期而 且过期后要求用户的使用者重置密码(alter user/set password重置密码)
• Password_last_changed作为一个时间戳字段代表密码上次修改时间,执 行create user/alter user/set password/grant等命令创建用户或修改用户密 码时此数值自动更新
• Password_lifetime代表从password_last_changed时间开始此密码过期的天 数
• Account_locked代表此用户被锁住,无法使用
• Tables_priv和columns_priv权限表结构
• Timestamp和grantor两个字段暂时没用
• Tables_priv和columns_priv权限值
• procs_priv权限表结构
• Routine_type是枚举类型,代表是存储过程还是函数
• Timestamp和grantor两个字段暂时没用
• 系统权限表字段长度限制表
• 权限认证中的大小写敏感问题
• 字段user,password,authencation_string,db,table_name大小写敏感
• 字段host,column_name,routine_name大小写不敏感
• User用户大小写敏感
更改用户口令使用SET PASSWORD语句,新口令必须进行如下加密:
SET PASSWORD FOR 用户账号 = Password('口令即密码');
//注意Password函数中的双单引号''
也可以设置自己的口令
SET PASSWORD = Password('口令即密码');
//注意Password()函数中的双单引号''
1、使用命令行实用程序mysqldump转存储所有数据库内容到某个外部文件,在进行常规备份前,这个实用程序应该正常运行,以便能正确地进行备份转存储文件。
2、可以用命令行实用程序mysqlhotcopy从一个数据库复制所有数据(并非所有数据库引擎都支持这个实用程序)。
3、可以使用MySQL的BACKUP TABLE 或 SELECT INTO OUTFILE转存储所有数据到某个外部文件,这两条语句都接受将要创建的系统文件名,此系统文件必须不存在,否则会出错。
例如:
SELECT * FROM world.city
INTO OUTFILE '/temp/back.txt';
4、数据可以使用RESTORE TABLE语句来进行复原。
注意:为了保证所有数据被写到磁盘上(包括索引数据),应该在进行备份前使用FLUSH TABLE语句舒心未写数据。
1、ANALYZE TABLE:用来检查表键是否正确
2、CHECK TABLE:用来针对许多问题对表进行检查,在MyISAM表上还可以对索引进行检查
3、CHANGED:检查自从最后一次检查以后改动过的表
4、MEDIUM:检查所有被删除的链接并进行键检验
5、QUICk:只进行快速扫描
6、FAST:只检查未正常关闭的表
7、EXTENDED:执行最后彻底的检查
8、OPTIMIZE TABLE:当从一个表中删除大量数据时,使用它收回所用的空间
9、REPAIR TABLE:如果MyISAM表访问产生不正确和不一致的结果,可以使用它修复相应的表(这条语句不应该经常使用,如果经常使用可能会有更大的问题要解决)
1、错误日志:包含启动和关闭问题以及任意关键错误的细节,日志位于data目录中,日志文件通常命名为hostname.err。此日志文件名可以通过log-error命令行选项更改
2、查询日志:记录所有MySQL活动,在诊断问题时非常有用,不应该长期使用它,日志位于data目录中,日志文件通常命名为hostname.log。此日志文件名可以通过log命令行选项更改
3、二进制日志:记录更新过数据(或可能更新过数据)的所有语句,日志位于data目录中,日志文件通常命名为hostname-bin。此日志文件名可以通过log-bin命令行选项更改
4、缓慢查询日志:记录执行缓慢的任何查询,这个日志对确定数据库何处需要优化很有用,日志位于data目录中,日志文件通常命名为hostname-slow.log。此日志文件名可以通过log-slow-queries命令行选项更改
5、刷新或重新开始所有日志文件:使用FLUSH LOGS语句
改善性能
1、关键的生产DBMS应该运行在自己的专用服务器上
2、MySQL是用一系列的默认设置预先配置的,这些设置开始通常是很好的,在数据库运行一段时间后可能需要调整内存分配、缓冲区大小等(使用 SHOW VARIABLES; 或 SHOW STAUS; 语句查看当期设置)
3、MySQL是一个多用户多线程的DBMS,经常同时执行多个任务没,如果这些任务中的某个执行缓慢,则所有的请求都会执行缓慢,如果遇到显著的性能不良,可以使用SHOW PROCESSLIST 语句显示所有活动进程(包含它们的线程ID和执行时间),可以使用 KILL 命令终结特定的进程(使用这个命令需要作为管理员登录)
4、总是有不止一种方法编写同一条SELECT语句,应该试验联结、并、子查询等,找出最佳的方法,通过使用多条SELECT语句和连接它们的UNION语句有的时候性能能极大的改进
5、使用EXPLAIN语句让MySQL解释它将如何执行一条SELECT语句
6、一般情况下,存储过程执行比一条一条地执行其中的各条MySQL语句都要快
7、应该总是使用正确的数据类型
8、绝对不要检索比需求还要多的数据
9、在导入数据时应该关闭自动提交
10、有的操作(包括INSERT)支持一个可选的DELAYED关键字,如果使用它,将把控制立即返回给调用程序,并且一旦有可能就实际执行该操作
11、必须索引数据库表以改善数据检索的性能,但是索引损害数据的插入、删除、更新的性能
12、LIKE很慢,一般情况下最好使用FULLTEXT而不是LIKE
13、数据库是不断变化的实体