MYSQL教程:检查数据表和修复数据表

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些权限表分别user,db,table_priv,columns_priv和host。下面分别介绍一下这些表的结构和内容:

 (1) user权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。


 (2) db权限表:记录各个帐号在各个数据库上的操作权限。


  (3) table_priv权限表:记录数据表级的操作权限。


 (4)  columns_priv权限表:记录数据列级的操作权限。


 (5) host权限表:配合db权限表对给定主机上数据库级操作权限作更细致的控制。这个权限表不受

GRANT和REVOKE语句的影响。


  大家注意到,以上权限没有限制到数据行级的设置。在MySQL只要实现数据行级控制就要通过编写程序(使用GET-LOCK()函数)来实现。

  MySQL的版本很多,所以权限表的结构在不同版本间会有不同。如果出现这种情况,可用mysql_fix_privilege_tables脚本来修正。运行方式如下:

  % mysql_fix_privilege_tables rootpassword            #这里要给出MySQL的root用户密码

  最好一下子升级到MySQL 4.0.4版本,因为4.0.2和4.0.3的db表没有Create_tmp_table_priv和Lock_tables_priv权限。

  MySQL的权限表定义了两部份内容,

一个部份定义权限的范围,即谁(帐户)可以从哪里(客户端主机)访问什么(数据库、数据表、数据列);


另一部份定义权限,即控制用户可以进行的操作。下面是一些常用的权限介绍,可直接在GRANT语句中使用。


  CREATE TEMPORARY TABLES,允许创建临时表的权限。


  EXECUTE,允许执行存储过程的权限,存储过程在MySQL的当前版本中还没实现。


  FILE,允许你通过MySQL服务器去读写服务器主机上的文件。但有一定限制,只能访问对任何用户可读的文件,通过服务器写的文件必须是尚未存在的,以防止服务器写的文件覆盖重要的系统文件。尽管有这些限制,但为了安全,尽量不要把该权限授予普通用户。并且不要以root用户来运行MySQL服务器,因为root用户可在系统任何地方创建文件。


  GRANT OPTION,允许把你自已所拥有的权限再转授给其他用户。


  LOCK TABLES,可以使用LOCK TABLES语句来锁定数据表


  PROCESS,允许你查看和终止任何客户线程。SHOW PROCESSLIST语句或mysqladmin processlist命令可查看线程,KILL语句或mysqladmin kill命令可终止线程。在4.0.2版及以后的版本中,PROCESS权限只剩下查看线程的能力,终止线程的能力由SUPER权限控制。

  RELOAD,允许你进行一些数据库管理操作,如FLUSH,RESET等。它还允许你执行mysqladmin命令:reload,refresh,flush-hosts,flush-logs,flush-privileges,flush-status,flush-tables和flush-threads。

  REPLICATION CLIENT,允许查询镜像机制中主服务器和从服务器的位置。

  REPLICATION SLAVE,允许某个客户连接到镜像机制中的主服务器并请求发送二进制变更日志。该权限应授予从服务器用来连接主服务器的帐号。在4.0.2版这前,从服务器是用FILE权限来连接的。

  SHOW DATABASES,控制用户执行SHOW DATABASES语句的权限。

  SUPER,允许终止线程,使用mysqladmin debug命令,使用CHANGE MASTER,PURGE MASTER LOGS以及修改全局级变量的SET语句。SUPER还允许你根据存放在DES密钥文件里的密钥进行DES解密的工作。

  user权限表中有一个ssl_type数据列,用来说明连接是否使用加密连接以及使用哪种类型的连接,它是一个ENUM类型的数据列,可能的取值有:

  NONE,默认值,表示不需加密连接。

  ANY,表示需要加密连接,可以是任何一种加密连接。由GRANT的REQUIRE SSL子句设置。

  X509,表示需要加密连接,并要求客户提供一份有效的X509证书。由GRANT的REQUIRE X509子句设置。

  SPECIFIED,表示加密连接需满足一定要求,由REQUIRE子句的ISSUER,SUBJECT或CIPHER的值进行设置。只要ssl_type列的值为SPECIFIED,则MySQL会去检查ssl_cipher(加密算法)、x509_issuer(证书签发者)和x509_subject(证书主题)列的值。这几列的列类型是BLOB类型的。


  user权限表里还有几列是设置帐户资源使用情况的,如果以下数据列中的数全为零,则表示没有限制:

  max_connections,每小时可连接服务器的次数。

  max_questions,每小时可发出查询命令数。

  max_updates,每小时可以发出的数据修改类查询命令数。

  设置权限表应注意的事项:

  (1)删除所有匿名用户。

  (2)查出所有没有口令用户,重新设置口令。可用以下命令查询空口令用户:

         mysql> SELECT host,user FROM user WHERE password = '';

  (3)尽量不要在host中使用通配符。

  (4)最好不要用user权限表进行授权,因为该表的权限都是全局级的。

  (5)不要把mysql数据库的权限授予他人,因为该数据库包含权限表。

  (6) 使用GRANT OPTION权限时不要滥用。

   (7)FILE权限可访问文件系统中的文件,所以授权时也要注意。

一个具有FILE权限的用户执行以下语句就可查看服务器上全体可读的文件:

mysql> CREATE TABLE etc_passwd(pwd_entry TEXT);

mysql> LOAD DATA INFILE '/etc/passwd' INTO TABLE etc_passwd;

mysql> SELECT * FROM etc_passwd;

  如果MySQL服务器数据目录上的访问权限设置得不好,就会留下让具有FILE权限的用户进入别人数据库的安全漏洞。所以建议把数据目录设置成只能由MySQL服务器读取。下面演示一个利用具有FILE权限的用户读取数据目录中文件权限设置不严密的数据库数据的过程:

mysql> use test;

mysql> create table temp(b longblob);

mysql> show databases          #显示数据库名清单,--skip-show-database可禁止该功能

mysql> load data infile './db/xxx.frm' into table temp fields escaped by '' lines terminated by '';

mysql> select * from temp into outfile 'xxx.frm' fields escaped by '' lines terminated by '';

mysql> delete from temp;

mysql> load data infile './db/xxx.MYD' into table temp fields escaped by '' lines terminated by '';

mysql> select * from temp into outfile 'xxx.MYD' fields escaped by '' lines terminated by '';

mysql> delete from temp;

mysql> load data infile './db/xxx.MYI' into table temp fields escaped by '' lines terminated by '';

mysql> select * from temp into outfile 'xxx.MYI' fields escaped by '' lines terminated by '';

mysql> delete from temp;


  这样,你的数据库就给人拷贝到本地了。如果服务器是运行在root用户下,那危害就更大了,因为root可在服务器上做任何的操作。所以尽量不要用root用户来运行服务器。

  只把PROCESS权限授予可信用户,该用户可查询其他用户的线程信息

  不要把RELOAD权限授予无关用户,因为该权限可发出FLUSH或RESET语句,这些是数据库管理工具,如果用户不当使用会使数据库管理出现问题。

  ALTER权限也不要授予一般用户,因为该权限可更改数据表。

  GRANT语句对权限表的修改过程:

  当你发送一条GRANT语句时,服务器会在user权限表里创建一个记录项并把你用户名、主机名和口令记录在User、Host和Password列中。如果设置了全局权限,由把该设置记录在相在的权限列中

  如果在GRANT里设置了数据库级权限,你给出的用户名和主机名就会记录到db权限表的User和Host列中,数据库名记录在Db列中,权限记录到相关的权限列中。

  接着是到数据表和数据列级的权限设置,设置方法和上面的一样。服务器会把用户名、主机名、数据库名以及相应的数据表名和数据列名记录到数据表中。

  删除用户权限其实就是把这些权限表中相应的帐号记录全部删除即可










本文转自 chengxuyonghu 51CTO博客,原文链接:http://blog.51cto.com/6226001001/1564046,如需转载请自行联系原作者
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
17天前
|
关系型数据库 MySQL 网络安全
|
21天前
|
SQL 存储 关系型数据库
轻松入门MySQL:玩转数据表的增、删、改、查(4)
轻松入门MySQL:玩转数据表的增、删、改、查(4)
|
1月前
|
SQL 关系型数据库 MySQL
rds教程
rds教程
27 4
|
2月前
|
SQL 关系型数据库 MySQL
(B站动力节点老杜MySQL教程)MySQL课堂笔记-day01.txt
(B站动力节点老杜MySQL教程)MySQL课堂笔记-day01.txt
|
2月前
|
IDE 关系型数据库 MySQL
【Java+MySQL】前后端连接小白教程
【Java+MySQL】前后端连接小白教程
37 0
|
1月前
|
SQL 关系型数据库 MySQL
阿里云MySQL数据库价格、购买、创建账号密码和连接数据库教程
阿里云数据库使用指南:购买MySQL、SQL Server等RDS实例,选择配置和地区,完成支付。创建数据库和账号,设置权限。通过DMS登录数据库,使用账号密码访问。同地域VPC内的ECS需将IP加入白名单以实现内网连接。参考链接提供详细步骤。
369 3
|
1天前
|
关系型数据库 MySQL Windows
windows安装MySQL5.7教程
windows安装MySQL5.7教程
6 0
|
1月前
|
弹性计算 关系型数据库 MySQL
阿里云MySQL云数据库优惠价格、购买和使用教程分享!
阿里云数据库使用流程包括购买和管理。首先,选购支持MySQL、SQL Server、PostgreSQL等的RDS实例,如选择2核2GB的MySQL,设定地域和可用区。购买后,等待实例创建。接着,创建数据库和账号,设置DB名称、字符集及账号权限。最后,通过DMS登录数据库,填写账号和密码。若ECS在同一地域和VPC内,可内网连接,记得将ECS IP加入白名单。
438 2
|
1月前
|
SQL 关系型数据库 MySQL
阿里云mysql数据库价格购买和使用教程
阿里云数据库使用指南:购买MySQL、SQL Server等RDS实例,通过选择配置、地域和可用区完成购买。创建数据库和账号,分配权限。使用DMS登录数据库,进行管理操作。确保ECS与RDS在同一地域的VPC内,配置白名单实现内网连接。详细步骤见官方文档。
631 1
|
1月前
|
SQL 关系型数据库 MySQL
关于MySQL8.0.16压缩包安装配置教程
关于MySQL8.0.16压缩包安装配置教程