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

2016-02-19 16:06 8 1 收藏

今天图老师小编要向大家分享个MYSQL教程:检查数据表和修复数据表教程,过程简单易学,相信聪明的你一定能轻松get!

【 tulaoshi.com - 编程语言 】

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

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

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

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

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

  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,每小时可发出查询命令数。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

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

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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  删除所有匿名用户。

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

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

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

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

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

  使用GRANT OPTION权限时不要滥用。

  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列中,权限记录到相关的权限列中。

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

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

来源:https://www.tulaoshi.com/n/20160219/1611066.html

延伸阅读
正在看的ORACLE教程是:Oracle 数据表分区的策略。本文描述通过统计分析出医院信息系统需分区的表,对需分区的表选择分区键,即找出包括在你的分区键中的列(表的属性),对大型数据的管理比较有意义, 本文的工作在Oracle8.1.6下实现。 Oracle虽然是一个大型的DBMS,但如果不对记录比较多的表进行处理,仍然发挥不了Oracle管理大型数据...
标签: excel
Excel如何批量制作CSV数据表   众所周知,Excel的功能十分强大,而其最核心的功能在于数据处理。熟练驾奴Excel,您的工作将充满快乐和自信。当您仅花上几分钟就完成了别人花上几天功夫才能完成的数据处理工作时,心中的那份喜悦只有您自己才能体会得到!下面给大家展示的是Excel批量制作数据表 目的 1通过数据模板与VBA结...
截断操作的SQL语法如下。 ――――――――――――――――――――――――――――――――――――― TRUNCATE TABLE 用户名.表名 [DROP|REUSE STORAGE] ――――――――――――――――――――――――――――――――――――― 其中,若使用DROP STORAGE子句,显式指明释放数据表和索引的空间。若使用REUSE...
要创建的两个数据表 1. 研究生信息表 表名:scott.student。 表结构如表7.6所示。 3. 两个数据表的关系 导师信息表(scott.director)的主码DIRECTOR_ID是研究生信息表(scott.student)的外码。也就是说,当导师信息表的DIRECTOR_ID字段发生变化时,研究生信息表的字段DIRECTOR_ID也会随之自动发生变化。 ...
标签: Web开发
要解决JSP乱码,首先就要了解JSP乱码的原因 1.架设服务器安装MYSQL时的会让你选择一种编码,如果这种编码与你的网页不一致,可能就会造成JSP页面乱码 2.在PHPMYADMIN或mysql-front等系统 创建数据库时会让你选择一种编码,如果这种编码与你的网页不一致,也有可能造成JSP页面乱码 3.创建表时会让你选择一种编码,如果这种编码与你的...

经验教程

204

收藏

94
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部