mysql查看数据库表数量
概述前面已经介绍了Oracle如何去获取某用户下的所有表的行数,所以就不介绍了,今天主要分享的是怎么去获取mysql数据库下所有表的数据行数,主要介绍3个方法。1、估算某个数据库下的所有表的记录数可以...
2024.11.12前段时间,开发人员找我咨询一个MySQL数据库的问题,问题大概是这样的,在MySQL数据库里创建一个应用访问用户,可是命令执行一直失败,创建用户的语法没有问题,从mysql.user表里查询,要创建的用户也不存在,很诡异,于是就找到了我。
这个问题其实很简单,不难,但是比较有意思,在这里写出来给大家分享一下
问题复盘这个问题原因就是,在MySQL数据库的mysql.user表里的记录,与MySQL数据库实例内存中的acl_users数组数据不一致,而引起的问题。
那么在这里,先创建一个测试应用用户
[root@localhost] 14:58:26 [(none)]>select user,host from mysql.user;+---------------+---------------+| user| host|+---------------+---------------+| monitor| % || repl| % || tony| % || mha| 192.168.112.% || mysql.session | localhost || mysql.sys | localhost || root| localhost |+---------------+---------------+7 rows in set (0.00 sec)[root@localhost] 15:01:49 [(none)]>create user ‘tim‘@‘%‘ identified by ‘tim1234‘;Query OK, 0 rows affected (0.28 sec)[root@localhost] 15:03:15 [(none)]>grant ALL PRIVILEGES ON *.* TO ‘tim‘@‘%‘;Query OK, 0 rows affected (0.00 sec)[root@localhost] 15:03:20 [(none)]>select user,host from mysql.user;+---------------+---------------+| user| host|+---------------+---------------+| monitor| % || repl| % || tim| % || tony| % || mha| 192.168.112.% || mysql.session | localhost || mysql.sys | localhost || root| localhost |+---------------+---------------+8 rows in set (0.00 sec)[root@localhost] 15:03:31 [(none)]>flush privileges;在这里,测试用户tim已经创建好了,而且可以正常连接MySQL数据库。
删除测试用户tim好了,到了关键步骤了,在这里要用delete语句来删除用户tim
[root@localhost] 15:05:07 [(none)]>delete from mysql.user where user=‘tim‘ and host=‘%‘;Query OK, 1 row affected (0.09 sec)[root@localhost] 15:05:17 [(none)]>select user,host from mysql.user;+---------------+---------------+| user| host|+---------------+---------------+| monitor| % || repl| % || tony| % || mha| 192.168.112.% || mysql.session | localhost || mysql.sys | localhost || root| localhost |+---------------+---------------+7 rows in set (0.00 sec)可以看到tim用户已经从mysql.user表里删除了,那么这里有一个猜想,这个时候tim用户还能正常登录吗?
[root@localhost] 15:22:06 [(none)]>delete from mysql.user where user=‘tim‘ and host=‘%‘;Query OK, 1 row affected (0.00 sec)[root@localhost] 15:24:22 [(none)]>quitBye[mysql@node131 ~]$ mysql -utim -ptim1234 --socket=/data/mysql/run/3306/mysql.sockmysql: [Warning] Using a password on the command line interface can be insecure.Welcome to the MySQL monitor.Commands end with ; or \g.Your MySQL connection id is 74Server version: 5.7.26-log MySQL Community Server (GPL)Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.[tim@localhost] 15:24:47 [(none)]>神奇吧,居然还能登录,这是因为MySQL数据库这个时候的用户权限验证,是从acl_users数组取的,而不是读取mysql.user表。
下面来验证一下能再次创建tim用户
[root@localhost] 15:05:21 [(none)]>create user ‘tim‘@‘%‘ identified by ‘tim1234‘;ERROR 1396 (HY000): Operation CREATE USER failed for ‘tim‘@‘%‘此时,创建tim用户失败,这个报错也是开发人员创建用户失败的报错。
那如何能解决这个问题呢,其实很简单,用flush privileges即可解决。
flush privileges作用该命令会清空acl_users数组,然后从mysql.user表中读取数据重新加载,重新构造一个acl_user数组。
总结删除MySQL数据库用户时,不推荐使用delete方式,推荐使用drop user方式,drop user会自动重新加载mysql.user表中记录到acl_user数组中。
概述前面已经介绍了Oracle如何去获取某用户下的所有表的行数,所以就不介绍了,今天主要分享的是怎么去获取mysql数据库下所有表的数据行数,主要介绍3个方法。1、估算某个数据库下的所有表的记录数可以...
2024.11.12在建表之前要对数据进行认真分析,字段名是数据的抽象名称,字段属性是数据的类型与约束。建表时要把关联度极高的数据放在一张表中,假设该表中某些字段存在大量重复的情况就应该考虑分开建表,减少冗余数据。学前准...
2024.11.06“在这个时代,太慢你是要被淘汰的。可问题是你怎样能快起来。”“把最基础的环节打通之后,再有新的知识就能在这个基础上生长。”上面这两句话是我在成甲的书里读到的。当你看到一个知识点,又能想到曾经学过的哪些...
2024.11.13创建MySQL数据表需要以下信息:表名表字段名定义每个表字段 语法 以下为创建MySQL数据表的SQL通用语法:CREATE TABLE table_name (column_name column...
2024.11.13我们可以在登陆 MySQL 服务后,使用 create 命令创建数据库,语法如下:CREATE DATABASE 数据库名;以下命令简单的演示了创建数据库的过程,数据名为 RUNOOB:[root@h...
2024.11.15