MySQL数据库管理

本章内容:

  • 掌握数据库的查看方法
  • 掌握MySQL 库和表的创建和删除方法
  • 掌握MySQL 增删改查常见操作
  • 掌握MySQL 用户权限

1.1使用MySQL数据库

        在熟悉安装及访问MySQL 数据库以后,接下来将学习MySQL 数据库的基本操作,

这也是在服务器运维工作工不可或缺的知识。本节中的所有数据库语句均在 mysql> 操作环境中执行

1.1.2 查看数据库结构

        MySQL 是一套数据库管理系统,在每台MySQL服务器中,均支持运行多个数据库,每个数据库相当于一个容器,其中存放着许多表,如图

下面分别介绍查看数据库,表结构的相关操作语句

1.查看当前服务器中的数据库

        show databases 语句:用于查看当前MySQL 服务器中包含的数据库,MySQL 的每一条操作语句都是以分号(;)结束的。

        经初始化后的 MySQL 服务器,默认建立了四个数据库:test,mysql,information_schema 和 performance_schema (其中 msyql 是 MySQL 服务器正常运行所需的数据库,其中包含了用户认证相关的表),执行以下操作可进行查看

mysql> show databases;    //查看数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

mysql> 
2.查看当前数据库中有哪些表

        show tables 语句;用于查看当前所在的数据库中包含的表。在操作之前,需要先使用 use 语句切换到所使用的数据库。例如,执行以下操作可以显示MySQL数据库中包含的所有表。

mysql> use mysql;    //切换到所使的数据库
Database changed
mysql> show tables;    //查看当前数据库所有表
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| event                     |
| func                      |
| general_log               |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| innodb_index_stats        |
| innodb_table_stats        |

+---------------------------+
28 rows in set (0.00 sec)

mysql> 

        MySQL 数据库的数据文件存放在 /usr/local/mysql/data 目录下。每个数据库对应一个子目录,用于存储数据表文件。每个数据表对应为三个文件,扩展名分别为,"frm",MYD 和 MYI

.frm 文件是于表相关的元数据(meta)信息都存放在 .frm 文件中,包括表结构的定义信息等。不论是什么存储引擎,每一个表都会有一个以表命名的 .frm 所有的 .frm 文件都存放在所属数据库的文件下面

        .MYD 文件是MyISAM 存储引擎专用,存放MyISAM 表数据。每一个MyISAM 表都会有一个 .MYD 文件与之对应,同样存放于所属数据库的文件夹下,和 .frm 文件在一起

        .MYI 文件也是数据MyISAM 存储引擎的,主要存放 MyISAM 表的索引相关信息 ,对于MyISAM 存储来说,可以被cache 的内容主要就是来源于 .MYI 文件中。每一个MyISAM 表对应一个 .MYI 文件,存放于位置和 .frm 以及 .MYD 一样

        MyISAM 存储引擎的表在数据库中,每一个表都被存放为三个以表命名的物理文件(frm,myd,myi)每个表都有且仅有这样三个文件作为MyISAM 存储类型表的存储,也就是说不管这个表有多少个索引,都是存放在同一个 .MYI 文件中。

        另外还有 .ibd 和 ibdata 文件,这两种文件都是用来存放lnnodb 数据的,之所以有两种文件存放lnnodb 的数据(包括索引),是因为 lnnodb 的数据存储方式能够通过配置来决定是使用共享表空间存存放数据,还是独享表空间存放存储数据。独享表空间存储方式使用 .ibd 问价来存放数据,且每个表一个 .ibd ,文件存放在和 MyISAM 数据相同的位置。如果选用共享存储表空间来存放数据,则会使用ibdata 文件来存放,所有表共同使用一个(或者多个,可自行配置)ibdata 文件

3. 查看表的结构

        describe 语句:用于显示表的结构,即组成表的各字段(列)的信息。需要指定 数据库名.表名 作为参数:若只指定表面参数,则需先通过USE 语句切换到目标数据库。例如,执行以下操作可以查看mysql 数据库中的user 表的结构,于直接 describe mysql.user; 语句的效果相同

mysql> USE mysql;    //切换目标数据库
Database changed
mysql> describe user;    //查看表结构
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field                  | Type                              | Null | Key | Default               | Extra |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host                   | char(60)                          | NO   | PRI |                       |       |
| User                   | char(16)                          | NO   | PRI |                       |       |
| Password               | char(41)                          | NO   |     |                       |       |
        SQL 语言主要由以下几部分组成
  • DDL(Data Definition Language,数据定义语言):用来建立数据库,数据库对象和定义字段,如:create,alter,drop
  • DML(Data Manipulation Language,数据操纵语言):用来插入,删除和修改数据库中的数据,如:insert,update,delete
  • DQL(Data Query Language,数据查询语言):用来查询数据库中的数据,如 select
  • DCL (Data Control Language,数据操控语言):用来控制数据库组件的存取许可,存取权限等,如:commit,rollback,grant,revoke

1.1.2  创建及删除数据库和表

        当需要为网站平台提供数据库服务时,如何操作来创建数据库呢?根据一份二维数据表格,如何在现有数据库中创建表?对于废弃的数据表和数据库,又该如何进行删除呢?本小节主要解决这三个问题

1.创建新的数据库

        create database 语句:用于创建一个新的数据库,需要指定数据库名称作为i参数。例如,执行以下操作可以创建一个名为auth的数据库

mysql> create database auth;    //创建数据库
Query OK, 1 row affected (0.00 sec)

mysql> 

        刚创建的数据库还是空的,其中不包含任何表,在 /usr/local/mysql/data 目录下会自动生成一个于新建的数据库名相同的文件夹

2.创建新的表

        create table 语句:用于在当前数据库中创建新的表,需指定数据表名称作为参数,并定义该表格所使用的各字段,基本格式如下

create table 表名 (字段1 名称类型, 字段2 名称类型,........, primary key (主键名))

        创建表之前,应先明确数据表格的结构,各字段的名称和类型等等信息。例如,要创建一个包含用户名,密码字串的用户验证表,该表中保存的记录如表

mysql> select * from user;
+-----------+-------------------------------------------+
| 用户名    | 密码                                      |
+-----------+-------------------------------------------+
| zhangsan  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| lisi      | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| wangwu    | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
3 rows in set (0.00 sec)

mysql> 

        上表中,用户名字段值不超过16字节的字符串,且不能为空:密码字串字段值为不超过48个字符串(插入记录时使用Mysql 的函数加密),默认值为空字符串。考虑到字符集兼容性,最好不要使用中文段名,改用 user_name,user_passwd 分别表示用户名,密码字串。表格中不能拥有同名的用户,因此可将 user_name 作为主键。主键就是一个列或者多个列的组合。其值能唯一的表示表中的每一行。这样的一列或多列称为表的主键。

        针对上述分析结果,可以在auth 数据库中按如下操作创建 user 表。其中,字段定义部分的 DEFAULT 语句用于设置默认的密码字串,PRIMARY 语句用于设置主键字段名

mysql> USE auth;    //切换到数据库
Database changed
mysql> create table users (user_name char(16) not null, user_passwd char(48) default '', primary key(user_name));        
Query OK, 0 rows affected (0.01 sec)

mysql> 
3.删除一个数据表

        DORP TABLE 语句:用于删除数据库中的表,需要指定“数据库名.表名” 作为参数:若只指定表名参数,则需先通过执行“USE”语句切换到目标数据库,执行以下操作也可以删除auth 数据库中的 users表

mysql> drop table auth.users;    //删除数据库中的表
Query OK, 0 rows affected (0.01 sec)

mysql> 
4.删除一个数据库

        DROP DATABASE 语句:用于删除指定的数据库,需要指定数据库作为参数。例如,执行以下操作可以删除名为auth 的数据库

mysql> drop database auth;    //删除指定数据库
Query OK, 1 row affected (0.08 sec)

mysql> 

1.1.3 管理表中的数据记录

        参考上节中的步骤重新创建auth 数据库和 users 表,下面将以 users 表为基础,学习向表中插入,查询,修改及删除数据

1.插入数据记录

INSERT INTO 语句:用于向表中插入新的数据记录,语句格式如下

insert into 表名(字段1,字段2......) values (字段1的值,字段2的值.....)

        执行以下操作将会向auth 数据库中的 users 表插入一条记录:用户名为 ”zhangsan“,对应的密码为”123456“.需要注意的是,values 部分的值应与前面指定的各字段逐一对应。

mysql> insert into auth.users values ('zhangsan', password ('123456'));
Query OK, 1 row affected (0.00 sec)

mysql> 

      

2.查询数据记录

        SELECT 语句:  用于从指定的表中查找符合条件的数据记录。MySQL 数据库支持标准的SQL 查询语句,语句格式如下

 select 字段名1,字段名2..... from 表名 where 条件表达式

        表示所有字段时,可以使用通配符”*“,若要显示所有的数据记录,则可以省略 where 条件子句。例如,执行以下操作可以查看auth 数据库中的 users 表内的所有数据记录,其中由于密码字串以加密,因此不会直接显示出实际的密码内容。

mysql> select * from auth.users;
+-----------+-------------------------------------------+
| user_name | user_passwd                               |
+-----------+-------------------------------------------+
| lisi      | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| wangwu    | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| zhangsan  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
3 rows in set (0.00 sec)

mysql> 

        当需要根据特定的条件查询记录时,where 条件子句时必不可少的。例如,若耀查找 users 表中用户名为lisi 的记录,显示其中用户名,密码字段的信息,可以执行以下操作

mysql> select user_name,user_passwd from auth.users where user_name='lisi';
+-----------+-------------------------------------------+
| user_name | user_passwd                               |
+-----------+-------------------------------------------+
| lisi      | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
1 row in set (0.00 sec)

mysql> 
3. 修改数据记录

UPDATE 语句:用于修改,更新表中的数据记录。语句格式如下所示

update 表名 set 字段名 1=字段值[,字段名2=字段值2] where 条件表达式

        执行以下操作可以修改users 表中用户名为lisi 的记录,将密码字串设置为空值。验证记录内容可以发现lisi用户的密码串值已经变为空白

mysql> update auth.users set user_passwd=password('') where user_name='lisi';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from auth.users;
+-----------+-------------------------------------------+
| user_name | user_passwd                               |
+-----------+-------------------------------------------+
| lisi      |                                           |
| wangwu    | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| zhangsan  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
3 rows in set (0.00 sec)

mysql> 

        在MySQL 数据库服务器中,用于访问数据库的各种用户(如 root)信息都保存在 mysql 数据库的user 表中,管理员可以直接修改其中的数据记录来完成密码修改或权限赋予,但值得注意的是,应当尽量减少人工操作,避免由于操作失误导致数据库无法访问或连接不到数据库等问题。通常都是给对应业务最小权限,某业务用户只负载查询,则需要给赋予 select 权限即可,例如,以下操作可以将数据库用户 root 的密码设置为 ‘123456’,当再次使用 mysql -u root -p 访问MySQL 数据库服务器时,必须使用此密码进行验证。

mysql> update mysql.user set authentication_string=password('123456') where user='root';    //更改root用户密码
Query OK, 5 rows affected (0.00 sec)
Rows matched: 5  Changed: 5  Warnings: 0

mysql> flush privileges;    //刷新权限
Query OK, 0 rows affected (0.00 sec)

mysql> 

        若是在Linux 命令环境中执行,还可以使用 mysqladmin -u root -p'旧密码' password'新密码' 。例如,执行以下操作可以将数据库用户root 的密码设置为 pwd123

[root@mysql ~]# mysqladmin -u root -p'pwd123' password '123456'

4.删除数据记录

DELETE 语句:用于删除表中指定的数据记录,语句格式如下

delete from 表名 where 条件表达式

        执行以下操作可以删除users 表中用户为lisi 的数据记录,验证记录内容可以发现lisi用户的数据记录已经消失

mysql> delete from auth.users where user_name='lisi';    
Query OK, 1 row affected (0.01 sec)

mysql> 

mysql> select * from users;    //验证是否删除
+-----------+-------------------------------------------+
| user_name | user_passwd                               |
+-----------+-------------------------------------------+
| wangwu    | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| zhangsan  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
2 rows in set (0.00 sec)

mysql> 

        需要注意的是,在执行update,delete 语句时,通常都带where 条件,不带条件的update语句和delete 语句会修改或删除所有的记录,是非常危险滴

1.1.4 数据库表高级操作

1.清空表

        清空一个数据表就是删除这个表内的所有数据。前面小结已经学习过 delete from 语句,可以删除表内的数据,除此之外还可以使用 truncate table 语句实现清空表内记录,delete from 语句可以使用where 子句对删除的结果集进行过滤选择,这样更方便,更灵活。truncate table 语句是删除表中所有记录数据,没法定制,灵活性上稍差。清空表的具体操作如下

mysql> create table player like users;    //通过like 方法,复制users 表生成 player表
Query OK, 0 rows affected (0.01 sec)

mysql> insert into player select * from users;    //通过 users 表生成player 表内数据记录
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> delete from player where user_name="wangwu";    //删除player表中的wangwu数据记录
Query OK, 1 row affected (0.00 sec)

mysql> delete from player ;    //清空表
Query OK, 1 row affected (0.00 sec)

mysql> insert into player select * from users;    //再次通过users表生成player数据记录
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> truncate table player;    //清空表
Query OK, 0 rows affected (0.00 sec)

mysql> select count(*) from player;
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

mysql> 

        delete 在不加 where 子句的时候,跟 truncate 是一样的效果,清空整个表在清空表的时候有一点不同,看他们返回的结果,delete 返回的结果内有删除的记录条目,而 truncate 并没有返回被删除的条目

        truncate 工作时将表结构按原样重新建立,而delete 工作时时一行一行的删除记录数据的,在速度上 truncate 会快很多,尤其在数据量比较大的时候,再次添加的记录会从原来最大的记录ID 后面继续自增写入记录。使用 truncate table 清空表内数据后,id 会从1 开始重新记录

2.临时表

        MySQL 的临时表,顾名思义,就是临时建立的表,并不会长期存在,主要用于保存一些临时数据。临时表有个特性,就是只在当前连接可见,当前连接下可执行增删改查等操作,当连接关闭后,临时表就会被 MySQL 删除,相关的资源也会被释放。

        下面创建临时表 mytmp 然后插入数据,之后断开当前连接,最后重新连接到MySQL 查看临时是否还存在,具体操作如下

mysql> select * from mytmp;    //查看 mytmp 表是否存在
ERROR 1146 (42S02): Table 'auth.mytmp' doesn't exist
mysql> create temporary table mytmp (id int(10) not null auto_increment,name varchar(32), level int(10) not null, primary key(id));    //创建临时表
Query OK, 0 rows affected (0.01 sec)

mysql> insert into mytmp(name,level) values ('aa','10');    //插入数据
Query OK, 1 row affected (0.01 sec)

mysql> select * from mytmp;    //查看数据
+----+------+-------+
| id | name | level |
+----+------+-------+
|  1 | aa   |    10 |
+----+------+-------+
1 row in set (0.00 sec)

mysql> quit    //退出
Bye

mysql> select * from auth.mytmp;
ERROR 1146 (42S02): Table 'auth.mytmp' doesn't exist

        临时表创建成功之后,使用show tables 命令是看不到创建的临时表,临时表会在连接退出后被销毁,如果在退出连接之前,也可以手都直接删除 使用 drop table 语句

3. 克隆表

        在MySQL 的开发和维护过程中,会有原样拷贝某个数据表的需求。怎么样才能够哦快速,完整的拷贝数据表呢,先来看一下 create table new_tablename as select 这个语句,具体实现的SQL语句如下所示

mysql> drop table auth.player;
Query OK, 0 rows affected (0.00 sec)

mysql> create table tmp as select * from users;
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select count(*) from tmp;
+----------+
| count(*) |
+----------+
|        2 |
+----------+
1 row in set (0.00 sec)

mysql> 

        as 这里是作为连接语句的操作符,更多是被用来这是别名,这种方法可以实现创建表并且将原表的数据拷贝过来,但是这种方式存在一个问题,就是表的索引,默认值等无法复制过来。本小结就来介绍两种可以实现完整复制的方法

        方法一: 通过like 方式克隆表

        首先,通过在创建表时使用 LIKE 方法,完整复制表结构。LIKE 方法可以将源表完全 一样的复制生成一个新表,包括表的备注、索引、主键、存储引擎等,但是不会复制源表内 数据记录。

     其次,在通过 INSERT INTO...SELECT 方法,将源表内的数据写入新表内。

mysql> create table test like users;    //通过LIKE方式,复制users表生成 test表
Query OK, 0 rows affected (0.00 sec)

mysql> show create table test\G;
*************************** 1. row ***************************
       Table: test
Create Table: CREATE TABLE `test` (
  `user_name` char(16) NOT NULL,
  `user_passwd` char(48) DEFAULT NULL,
  PRIMARY KEY (`user_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

ERROR: 
No query specified

mysql> 
mysql> select * from test;
Empty set (0.00 sec)

mysql> insert into test select * from users;    //将users 表的数据写入test表
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from test;
+-----------+-------------------------------------------+
| user_name | user_passwd                               |
+-----------+-------------------------------------------+
| wangwu    | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| zhangsan  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
2 rows in set (0.00 sec)

mysql> 

方法二:通过创建表的方式克隆表

        首先,使用 show create table 命令来获取原表的结构,索引等信息

        其次,复制原表结构并修改表名为目标名字,然后执行创建新表的语句,通过这步操作,就可以获得一个原表结构的克隆表了

        最后,执行 insert into select 语句,从原表复制数据到新表内

1.2 数据库用户授权

        MySQL 数据库的root 用户账户拥有对所有数据库,表的全部权限,频繁使用root 账号会给数据库服务器带来一定的安全风险。实际工作中,通常会建立一些低级权限的用户,只负责一部分数据库,表的管理和维护操作,甚至可以对查询,修改,删除记录等各种操作系统做进一步细化限制,从而将数据库的风险率降到最低

1.授予权限

        GRANT 语句:专门来设置数据库用户的访问权限。当指定的用户名不存在时,GRANT 语句将会创建新的用户:当指定的用户名存在时,GRANT 语句用于修改用户信息 语句格式如下

GRANT 权限列表 ON 数据库名.表名 TO 用户名@来源地址 [identified by '密码']

使用 GRANT 语句时,需要注意的事项

  • 权限列表:用于列出授权使用的各种数据库操作,以逗号隔开,如 select, insert, update 。使用 all 表示所有权限,可授权二和操作
  • 数据库.表名:用于指定授权操作的数据库和表的名称,其中可以使用通配符 * 例如,使用 auth.* 表示授权操作的对象为auth数据库中的所有表
  • 用户名@来源地址:用于指定用户名称和允许访问的客户机地址,即谁能连接、能从哪里连接。来源地址可以是域名、IP 地址,还可以使用“%”通配符,表示某个区域或网段 内的所有地址,如“%.bdqn.com”“192.168.1.%”等。
  • DENTIFIED BY:用于设置用户连接数据库时所使用的密码字符串。在新建用户时, 若省略“IDENTIFIED BY”部分,则用户的密码将为空

        执行以下操作可以添加一个名为“xiaoqi”的数据库用户,并允许其从本机访问,对 auth 数据库中的所有表具有查询权限,验证密码为“123456”。使用 GRANT 语句授权的用户 记录,会保存到mysql 库的 user、db、host、tables_priv 等相关表中,无须刷新即可生效

mysql> grant select on auth.* to 'xiaoqi'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.01 sec)

mysql> 

        切换到其他 Shell 终端,以用户 xiaoqi 的身份连接数据库。在已授权的数据库上操作将 被允许,否则将被拒绝。例如,允许用户 xiaoqi 查询 auth 数据库中 users 表的数据记录, 但禁止查询其他数据库中的表的记录。

[root@mysql ~]# mysql -u xiaoqi -p
Enter password: 

mysql> 
mysql> select * from auth.users;    //验证授权的访问操作
+-----------+-------------------------------------------+
| user_name | user_passwd                               |
+-----------+-------------------------------------------+
| wangwu    | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| zhangsan  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
2 rows in set (0.00 sec)

mysql> select * from mysql.user;    //验证非授权的访问操作
ERROR 1142 (42000): SELECT command denied to user 'xiaoqi'@'localhost' for table 'user'
mysql> 

        在企业服务器的应用中,数据库与网站服务器有时候是相互独立的。因此在 MySQL 服 务器中,应根据实际情况创建新的用户授权,允许授权用户从网站服务器访问数据库。通常 的做法是,创建一个或几个网站专用的数据库,并授予所有权限,限制访问的来源 IP 地址。 例如,执行以下操作可以新建 bdqn 数据库,并授权从 IP 地址为 192.168.182.104 的主机连接, 用户名为“dbuser”,密码为“pwd@123”,允许在 auth 数据库中执行所有操作

mysql> grant all on *.* to 'dbuser'@'192.168.182.104' identified by 'pwd123';
Query OK, 0 rows affected (0.00 sec)

mysql> 

Web服务器远程登录到MySQL服务器

[root@web02 ~]# mysql -h 192.168.182.102 -u dbuser -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.6.36 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]>

 

2.查看权限

        SHOW GRANT 语句:专门用来查看数据库用户的授权信息,通过 FOR 子句可指定查看的用户对象(必须与授权时的对象名称一致),执行以下操作可以查看  dbuser 从主机 192.168.182.104 访问数据库时的授权信息

MySQL [(none)]> show grants for 'dbuser'@'192.168.182.104';
+------------------------------------------------------------------------------------------------------------------------------+
| Grants for dbuser@192.168.182.104                                                                                            |
+------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'dbuser'@'192.168.182.104' IDENTIFIED BY PASSWORD '*353C33BC20A4B4B2281F3DAAE901DBD0A5224E24' |
+------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

MySQL [(none)]>
3. 撤销权限

        REVOKE 语句:用于撤销指定用户的数据库权限,撤销权限后的用户仍然可以连接到MySQL服务器,但将降至执行对应的数据库操作

执行以下操作可以撤销用户xiaoqi 从本机访问数据库auth的所有权限

mysql> grant all on auth.* to 'xiaoqi'@'localhost' identified by 'pwd123';    //创建xiaoqi用户 授予auth数据库中表的所有权限
Query OK, 0 rows affected (0.00 sec)

mysql> revoke all on auth.* from 'xiaoqi'@'localhost';    //撤销xiaoqi的所有权限
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for 'xiaoqi'@'localhost';    //确认已撤销auth库的权限
+---------------------------------------------------------------------------------------------------------------+
| Grants for xiaoqi@localhost                                                                                   |
+---------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'xiaoqi'@'localhost' IDENTIFIED BY PASSWORD '*353C33BC20A4B4B2281F3DAAE901DBD0A5224E24' |
+---------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/446171.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows使用pyenv

1、前言 虽然anaconda比pyenv相比有更好的python安装体验,但是有一个比较严重的问题的就是,他的python版本跨度不够大,一些老一些的项目的python版本找不到,比如py12306要求的python版本是3.6,在anaconda却找不到这个版…

10.网络文件系统( NFS)使用

网络文件系统( NFS) 使用 NFS 优点: 开发过程中不受开发板空间的限制,直接使用网络文件就像使用本地文件一样;调试过程中避免一一将编译后的应用程序和库文件复制到开发板上。 在开发板中使用网络文件系统可以为开发和…

python 网络库集锦

目录 通用网络库 网络爬虫框架 1.功能齐全的爬虫 2.其他 HTML/XML解析器 1.通用 2.清理 文本处理 自然语言处理 浏览器自动化与仿真 多重处理 异步网络编程库 队列 云计算 网页内容提取 WebSocket DNS解析 计算机视觉 通用网络库 1.urllib -网络库(stdlib)。…

RabbitMQ - 03 - Work消息模型

目录 部署demo项目 什么是Work消息模型 实现Work消息模型 1.创建队列 2.生产者代码 3.消费者代码 4.配置yml 部署demo项目 通过消息队列demo项目进行练习 相关配置看此贴 http://t.csdnimg.cn/hPk2T 注意 生产者消费者的yml文件也要配置好 什么是Work消息模型 工作…

Python实现线性查找算法

Python实现线性查找算法 以下是使用 Python 实现线性查找算法的示例代码: def linear_search(arr, target):"""线性查找算法:param arr: 要搜索的数组:param target: 目标值:return: 如果找到目标值,返回其索引;否则返回 -1…

DJI RONIN 4D摄像机mov无法播放的修复方法

DJI大疆是无人机领域的一哥,最近几年大疆除了巩固无人机方面的技术实力还额外加强了其它领域产品的开发,而RONIN 4D的发布说明了大疆进军影视级的决心和实力。下边来看下DJI RONIN 4D生成的MOV文件无法播放的修复方法。 故障文件: 237.1G MOV文件 故障…

Java高频面试之并发篇

有需要互关的小伙伴,关注一下,有关必回关,争取今年认证早日拿到博客专家 Java高频面试之总纲篇 Java高频面试之集合篇 Java高频面试之异常篇 Java高频面试之并发篇 Java高频面试之SSM篇 Java高频面试之Mysql篇 Java高频面试之Redis篇 Java高频面试之消息队列与分布式篇…

实时工业控制系统的创新整合:PLC4X与CnosDB的高效数据采集与存储

在当代工业自动化系统中,实时监测和数据分析变得至关重要。本文将介绍如何通过集成Apache PLC4X与CnosDB,实现对工业控制系统中的PLC设备进行高效数据采集和存储,为工程师们提供更强大的数据分析和监测工具。 PLC的定义 PLC是可编程逻辑控制…

【前端】vscode快捷键和实用Api整理

vscode的快捷键 创建a.html 生成模板 !回车 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" …

MySQl基础入门⑦

上一章知识内容 分析数据且区分数据类型 看下表分析数据的特征&#xff0c;根据其特征确定相应的数据类型。 分析以上表格特征&#xff0c;确定数据类型&#xff0c;并对数据进行分类。分析数据后按固定长度字符串、可变长度字符串、整数、固定精度小数和日期时间数据类型对数…

稀碎从零算法笔记Day14-LeetCode:同构字符串

题型&#xff1a;字符串、哈希表 链接&#xff1a;205. 同构字符串 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给定两个字符串 s 和 t &#xff0c;判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t &#xff0c;那…

【算法面试题】-04

执行时长 def min_execution_time(n, size, tasks):a 0ans sizei 0while i < size:tmp tasks[i]a tmpif a < n:a 0else:a - ni 1ans a // nif a % n ! 0:ans 1return ans# 读取输入 n int(input()) size int(input()) tasks list(map(int, input().split()))…

Unity使用Addressable热更新

先看热更新的gif: Addressable是Unity推出的打ab包方案。不需要手动写AB打包脚手架了&#xff0c;不需要关心依赖&#xff0c;这也简化了ab热更新的流程。Addressable打包需要先将资源放入group中&#xff0c;按group来打包&#xff0c;每个group对应一个ScriptableObject的配置…

线程-创建线程的方法、线程池

1.创建线程一共有哪几种方法&#xff1f; 继承Thread类创建线程 继承Thread类&#xff0c;重写run()方法&#xff0c;在main()函数中调用子类的strat()方法 实现Runnable接口创建线程 先创建实现Runnable接口的类&#xff0c;重写run()方法&#xff0c;创建类的实例对象&#…

(南京观海微电子)——I3C协议介绍

特点 两线制总线&#xff1a;I2C仅使用两条线——串行数据线&#xff08;SDA&#xff09;和串行时钟线&#xff08;SCL&#xff09;进行通信&#xff0c;有效降低了连接复杂性。多主多从设备支持&#xff1a;I2C支持多个主设备和多个从设备连接到同一总线上。每个设备都有唯一…

靶场:sql-less-18(HTTP头注入)

本文操作环境&#xff1a;Kali-Linux 靶场链接&#xff1a;Less-18 Header Injection- Error Based- string 输入用户名和密码以后&#xff0c;我们发现屏幕上回显了我们的IP地址和我们的User Agent 用hackbar抓取POST包&#xff0c;在用户名和密码的位置判断注入点&#xff0…

【设计模式】(四)设计模式之工厂模式

1. 工厂模式介绍 工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 工厂模式有三种实现方式&#xff1a; 简单工厂模式工厂方法模式抽象工厂模式 2. 工厂方…

自动创建word文档的exe文件,自定义文件名、保存路径

目录 一、exe 二、使用方法 三、代码 四、Python打包exe 一、exe 百度网盘: 链接&#xff1a;https://pan.baidu.com/s/1dyCo_iVv7fb369BHbwGjHg 提取码&#xff1a;2333 夸克网盘: 链接&#xff1a;https://pan.quark.cn/s/36b14a53cccd 二、使用方法 1. 下载完成后双…

排序(7)——非递归快排

前面我们已经写了快排用递归的方法实现&#xff0c;在数据量大的时候&#xff0c;有可能会栈溢出。这里我们尝试一下改为非递归。 区分&#xff1a; 数据结构的栈——利用的是内存中的堆空间内存的栈——利用就是内存中的栈空间——函数创建函数栈帧堆的空间是远远大于栈的空…

突破编程_前端_JS编程实例(目录导航)

1 开发目标 目录导航组件旨在提供一个滚动目录导航功能&#xff0c;使得用户可以方便地通过点击目录条目快速定位到对应的内容标题位置&#xff0c;同时也能够随着滚动条的移动动态显示当前位置在目录中的位置&#xff1a; 2 详细需求 2.1 标题提取与目录生成 组件需要能够自…