zoukankan      html  css  js  c++  java
  • MySQL安全管理、数据库维护及改善性能

    一、安全管理

    1、访问控制

    MySQL服务器的安全基础:用户对他们需要的数据有适当的访问权。

    访问控制:给用户所需的权限且仅提供所需的访问权。它需要创建和管理用户账号。

    PS严肃对待root登陆的使用,仅在绝对需要时使用它。日常的MySQL操作中,不应该使用root。

     

    2、管理用户(下面3点)

    MySQL用户账号和信息存储在名为mysql的MySQL数据库中。

    一般不需要直接访问,但有时需要直接访问(如需要获得所有用户账号列表),代码如下:

    USE mysql;

    select user from user;

    PSmysql数据库中有个user表,它包含所有用户账号;user表有个名为user的列,它存储用户登录名。

    3、用户账号

    A、创建用户账号:

    create user ben identified by 'p@$$wOrd';

    create user创建一个新用户账号。identified by用来指定口令,它指定的口令为纯文本,MySQL将在保存到user表之前对其进行加密;为了作为散列值指定口令。

    PS创建用户账号时不一定需要口令。

    grant和insert into的区别:

    grant也可以用来创建用户账号,但一般来说使用create user是最清楚和简单的;

    也可通过插入行到user表来增加用户,但为安全起见,不建议这么做。MySQL用来存储用户账号信息的表极为重要,因此相对于直接处理,使用标记和函数来处理这些表更好。

    B、重新命名用户账号:

    rename user ben to bforta;

    C、删除用户账号:

    删除用户账号(以及相关的权限),使用drop user语句,如下:

    drop user bforta;

    4、设置访问权限

    创建用户账号后,必须分配访问权限。新建的用户账号没有任何访问权限,可以登录但无法读写;

    1、查看某账号权限:show grants for bforta@%;

    结果为:grant usage on crashcourse.* to bforta; 权限USAGE ON *.*表示在任意数据库和任意表上对任何东西没有权限。

    MySQL的权限用:用户名和主机名结合定义user@host,如果不指定主机名,则使用默认主机名%(授予用户访问权限而不管主机名)。

    2、设置权限使用grants时,要求至少给出以下信息:1要授予的权限;2被授予访问权限的数据库或表;3用户名。

    grant select on crashcourse.* to bforta;

    此grant允许用户在crashcourse.*(crashcourse数据库的所有表)上使用select,用户bforta对crashcourse数据库中所有数据拥有只读权限。

    每个grant添加(更新)用户的一个权限,MySQL读取所有授权,并根据它们确定权限。

    3、grant的反操作为revoke,用它撤销特定的权限,例如:

    revoke select on crashcourse.* from bforta;

    这条revoke语句取消上面的赋予用户的select权限;被撤销的权限必须存在,否则会出错。

    PSgrant和revoke可在以下几个层次上控制访问权限:

    ·整个服务器,使用grant all和revoke all;

    ·整个数据库,使用on database.*;

    ·特定的表,使用on database.table;

    ·特定的列;

    ·特定的存储过程;

    可授予或撤销的MySQL权限,请自行查看文档;

    4、使用grant和revoke时,用户账号必须存在,但对所涉及的对象没有这个要求。

    好处:允许管理员在创建数据库和表之前设计和实现安全措施;

    缺点:当某个数据库或表被删除时,相关访问权限仍然存在,且如果将来重新创建数据库或表时,这些权限仍然起作用。

    简化多次授权:通过列出各权限并用逗号分隔,将多余的grant语句串联,如下所示:

    grant select,insert on crashcourse.* to bforta;

    5、更改口令

    1、更改用户口令,可使用set password语句,新口令必须如下加密:

    set password for bforta = password('n3w p@$$w0rd');

    set password更新用户口令,新口令必须传到password()函数进行加密。

    2、set password还可以设置自己的口令,比如:

    set password = password('n3w p@$$w0rd');

    PS:不指定用户名时,set password更新当前登录用户的口令。

    二、数据库维护

    1、备份数据

    由于MySQL数据库基于磁盘文件,普通的备份系统和例程就能备份MySQL数据,但由于这些文件总是处于打开和使用状态,普通的文件副本备份不一定有效。

    可行的解决方案:

    A、使用命令行实用程序mysqldump转储所有数据库内容到某个外部文件;在进行常规备份前该程序应该正常运行,以便能正确备份转储文件;

    B、使用命令行实用程序mysqlhotcopy从一个数据库复制所有数据(并非所有数据库引擎都支持该程序);

    C、使用MySQL的backup table或select into outfile转储所有数据到某个外部文件;这两条语句都接受将要创建的系统文件名,此系统文件必须不存在,否则会报错。数据可用restoretable来复原。

    PS为保证所有数据被写入磁盘(包括索引数据),需要在备份前使用flush tables语句,刷新未写数据。

    2、进行数据库维护

    MySQL提供了一系列的语句,可用来保证数据库正确和正常运行,如下:

    1、analyze table orders;

    此语句用来检查表键是否正确。

    2、check table orders,orderitems;

    check table用来针对许多问题进行检查,在MyISAM表上还对索引进行检查。check table支持一系列的用语MyISAM表的方式,如下:

    changed检查自最后一次检查以来改动过的表;

    extended执行最彻底的检查;fast只检查未正常关闭的表;

    medium检查所有被删除的链接并进行键检验;

    quick只进行快速扫描。

    3、optimize table orders;

    当从一个表删除大量数据,使用此语句来收回所用的空间,从而优化表的性能。

    3、诊断启动问题

    服务器启动问题通常在对MySQL配置或服务器本身进行更改时出现,MySQL在这个问题发生时报告错误,但由于多数MySQL服务器是作 为系统进程或服务自动启动的,这些消息可能看不到。

    在排除系统启动问题时,首先应尽量手动启动服务器;MySQL服务器自身通过在命令行上执行mysqld启动。下面是几个重要的mysqld 命令行选项:

    - -help显示帮助(一个选项列表);

    - -safe-mode装载减去某些最佳配置的服务器;

    - -verbose显示全文本消息(为获得更详细的帮助消息与- -help联合使用);

    - -version显示版本信息然后退出。

    4、查看日志文件

    MySQL管理员依赖的一系列日志文件,主要的日志文件如下:

    1、错误日志:包含启动和关闭问题以及任意关键错误的细节。此日志通常名为hostname.err,位于data目录中;此日志名可用- -log-error命令行选项更改;

    2、查询日志:记录所有的mysql活动,诊断问题时非常有用;可能会很快地变得非常大,因此不应长时间使用它;日志名通常为hostname.log,位于data目录中,此名字可用- -log命令行选项更改;

    3、二进制日志:记录更新过数据的所有语句。通常名为hostname-bin,位于data目录内,此名字可用- -log-bin命令行选项修改;

    4、缓慢查询日志:记录执行缓慢的任何查询。在确定数据库何处需要优化很有用,通常名为hostname-slow.log,位于data目录中,可使用- -log-slow-querier命令行更改。

    PS使用日志时,可使用flush logs语句来刷新和重新开始所有日志文件。

    三、改善性能

    改善数据库性能需要知道的一些关键点:

    1、关键的生产DBMS应该运行在自己专用的服务器上;

    2、MySQL是用一系列默认设置预先配置的,但后期可能需要调整内存分配、缓冲区大小等;(为查看当前设置,可使用SHOW VARIABLES;和SHOW STATUS;)

    3、MySQL是一个多用户多线程的DBMS,经常同时执行多个任务。如果这些任务中某个执行缓慢,则所有请求都会执行缓慢,如果遇到显著的性能不良,可使用show processlist显示所有活动进程(以及它们的线程ID和执行时间,还可以用kill命令终结某个特定进程);

    4、编写同一条select语句的方法很多,应多尝试联结、并、子查询等,找出最佳方法;

    5、使用explain语句让MySQL解释它将如何执行一条select语句;

    6、一般情况下,存储过程执行的比一条一条的执行其中的各条MySQL语句要快;

    7、总是使用正确的数据类型;

    8、绝不要检索比需要的还多的数据,即:不要使用select *(除非真正需要);

    9、有的操作(包括insert)支持一个可选的delayed关键字,如果使用它,将把控制立即返回给调用程序,并且一旦有可能就实际执行该操作;

    10、导入数据时,应关闭自动提交;

    11、必须索引数据库表以改善数据库性能,分析使用select语句以找出重复的where和order by子句(如果一个简单的where子句返回结果花费时间过长,则可以断定其中使用的列就是需要索引的对象)

    12、SELECT语句中有一系列复杂的OR条件,可使用多条select语句和连接它们的union语句,可以极大的改善性能;

    13、索引改善数据检索的性能,但损害数据插入、删除和更新的性能。如果有些表收集数据但不经常被搜索,则在有必要之前不要索引它们(索引可根据需要添加和删除);

    14、like很慢,一般建议使用fulltext;

    15、数据库是不断变化的实体;一组优化良好的表一会儿后可能就面 目全非了

    16、最重要的规则:每条规则在某些条件下都会被打破。

  • 相关阅读:
    Codeforces Round #251 (Div. 2) A
    topcoder SRM 623 DIV2 CatAndRat
    topcoder SRM 623 DIV2 CatchTheBeatEasy
    topcoder SRM 622 DIV2 FibonacciDiv2
    topcoder SRM 622 DIV2 BoxesDiv2
    Leetcode Linked List Cycle II
    leetcode Linked List Cycle
    Leetcode Search Insert Position
    关于vim插件
    Codeforces Round #248 (Div. 2) B. Kuriyama Mirai's Stones
  • 原文地址:https://www.cnblogs.com/mind18/p/14274940.html
Copyright © 2011-2022 走看看