数据库管理
一、数据库操作命令
在熟悉安装及访问 MySQL 数据库以后,接下来将学习使用 MySQL 数据库的基本操作, 这也是在服务器运维工作中不可或缺的知识
1、查看数据库结构
MySQL 是一套数据库管理系统,在每台 MySQL 服务器中,均支持运行多个数据库, 每个数据库相当于一个容器,其中存放着许多表,如图所示
2、查看数据库
SHOW DATABASES 语句:用于查看当前 MySQL 服务器中包含的数据库,MySQL 的 每一条操作语句默认都是以分号(;)结束的经初始化的 MySQL 服务器 , 默认建立了四个数据库(mysql 5.7) :sys 、 mysql 、 information_schema 和 performance_schema(其中 mysql 是 MySQL 服务正常运行所需的数据库,其中包含了用户认证相关的表),执行以下操作可以进行查看
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
3、查看数据库中有哪些表
SHOW TABLES 语句:用于查看当前所在的数据库中包含的表。在操作之前,需要先使用 USE 语句切换到所使用的数据库。例如,执行以下操作可以显示school数据库中包含的所有表。
mysql> use school;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| Test |
| hob |
| hobby |
| info |
| infos |
| new |
| newtable |
| t1 |
| testtime |
| tm |
| tmp |
| tt |
| user |
| user1 |
+------------------+
14 rows in set (0.00 sec)
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”一样。
4、查看表结构
DESCRIBE 语句:用于显示表的结构,即组成表的各字段(列)的信息。需要指定“数 据库名.表名”作为参数;若只指定表名参数,则需先通过 USE 语句切换到目标数据库
查看info表的表结构
mysql> desc info;
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| name | varchar(10) | NO | UNI | NULL | |
| score | decimal(5,2) | YES | | NULL | |
| address | varchar(50) | YES | | 未知 | |
| hobby | int(3) | YES | | NULL | |
+---------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
mysql> desc school.info;
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| name | varchar(10) | NO | UNI | NULL | |
| score | decimal(5,2) | YES | | NULL | |
| address | varchar(50) | YES | | 未知 | |
| hobby | int(3) | YES | | NULL | |
+---------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
二、SQL语言
数据库目前标准的指令集是 SQL。
SQL 是 Structured Query Language 的缩写,即结 构化查询语言。它是 1974 年由 Boyce 和 Chamberlin 提出来的,1975~1979 年 IBM 公司 研制的关系数据库管理系统原型 System R 实现了这种语言。经过多年的发展,SQL 语言 得到了广泛的应用。
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、DDL数据定义语言
(1)创建新数据库
CREATE DATABASE 语句:用于创建一个新的数据库,需指定数据库名称作为参数。
创建school数据库
mysql> CREATE DATABASE school;
Query OK, 1 row affected (0.00 sec)
刚创建的数据库是空的,其中不包含任何表,在/usr/local/mysql/data 目录下会自动生成一个与新建的数据库名相同的文件夹。
(2)创建新表
CREATE TABLE 语句:用于在当前数据库中创建新的表,需指定数据表名称作为参数, 并定义该表格所使用的各字段,创建表之前,应先明确数据表格的结构、各字段的名称和类型等信息。
语法:
CREATE TABLE 表名 (字段 1 名称类型, 字段 2 名称类型, …, PRIMARY KEY (主键名))
创建info表,定义id为整数型,主键,自增长,名字:字符类型,不能为空,分数:小数类型,地址:可变长字符类型,默认值为未知
mysql> create table info(id int(3) primary key auto_increment,name varchar(10) not null,score decimal(5,2),address varchar(50) default '未知');
Query OK, 0 rows affected (0.02 sec)
mysql> desc info;
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| name | varchar(10) | NO | | NULL | |
| score | decimal(5,2) | YES | | NULL | |
| address | varchar(50) | YES | | 未知 | |
+---------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
(3)删除表
DROP TABLE 语句:用于删除数据库中的表,需要指定“数据库名.表名”作为参数;若 只指定表名参数,则需先通过执行“USE”语句切换到目标数据库
mysql> drop table info;
Query OK, 0 rows affected (0.01 sec)
(4)删除数据库
DROP DATABASE 语句:用于删除指定的数据库,需要指定数据库名作为参数
mysql> drop database auth;
Query OK, 0 rows affected (0.00 sec)
2、DML数据操纵语言
(1)插入数据记录
INSERT INTO 语句:用于向表中插入新的数据记录
语法:
INSERT INTO 表名(字段 1, 字段 2,…) VALUES(字段 1 的值, 字段 2 的值,…)
执行以下操作将会向info表里插入一条记录,id为1,name为“shengjie”,score为80,address为“nanjing”。char和varchar类型的数据需要加上单引号,数值型的不需要
mysql> insert into info(name,score,address) values('shengjie',80,'nanjing');
Query OK, 1 row affected (0.02 sec)
mysql> select * from info;
+----+----------+-------+---------+
| id | name | score | address |
+----+----------+-------+---------+
| 1 | shengjie | 80.00 | nanjing |
+----+----------+-------+---------+
1 row in set (0.00 sec)
需注意的是,VALUES 部分的值应与前面指定的各字段逐一对应,这里因为id字段定义了auto_increment自增约束,所以可以直接不用写id的值,它自己会加一
mysql> desc info;
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| name | varchar(10) | NO | | NULL | |
| score | decimal(5,2) | YES | | NULL | |
| address | varchar(50) | YES | | 未知 | |
+---------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
在插入新的数据记录时,如果这条记录完整包括表中所有字段的值,则插入语句中指定字段的部分可以省略,但是自增字段的值也要写
向info表中插入第二条记录
mysql> insert into info values(2,'shangzhen',82,'beijing');
Query OK, 1 row affected (0.00 sec)
mysql> select * from info;
+----+-----------+-------+---------+
| id | name | score | address |
+----+-----------+-------+---------+
| 1 | shengjie | 80.00 | nanjing |
| 2 | shangzhen | 82.00 | beijing |
+----+-----------+-------+---------+
2 rows in set (0.00 sec)
(2)删除数据记录
DELETE 语句:用于删除表中指定的数据记录
语法:
DELETE FROM 表名 WHERE 条件表达式
mysql> delete from info where name='shengjie';
Query OK, 1 row affected (0.00 sec)
mysql> select * from info;
+----+-----------+-------+---------+
| id | name | score | address |
+----+-----------+-------+---------+
| 2 | shangzhen | 85.00 | beijing |
+----+-----------+-------+---------+
1 row in set (0.00 sec)
需要注意的是,在执行 UPDATE、DELETE 语句时,通常都带 WHERE 条件,不带条件的 UPDATE 语句和 DELETE 语句会修改或删除所有的记录,是非常危险的操作。
(3)删除整个表
mysql> delete from info;
Query OK, 1 row affected (0.00 sec)
mysql> select * from info;
Empty set (0.00 sec)
delete 只能删除表中的数据,表结构还在
3、DQL数据查询语言
(1)查询数据记录
SELECT 语句:用于从指定的表中查找符合条件的数据记录。MySQL 数据库支持标准 的 SQL 查询语句
语法:
SELECT 字段名 1,字段名 2,… FROM 表名 WHERE 条件表达式
表示所有字段时,可以使用通配符“*”,若要显示所有的数据记录,则可以省略 WHERE 条件子句
查询info表的所有记录
mysql> select * from info;
+----+-----------+-------+---------+
| id | name | score | address |
+----+-----------+-------+---------+
| 1 | shengjie | 80.00 | nanjing |
| 2 | shangzhen | 82.00 | beijing |
+----+-----------+-------+---------+
2 rows in set (0.00 sec)
当需要根据特定的条件查找记录时,WHERE 条件子句是必不可少的
查询info表中分数大于等于82的记录
mysql> select * from info where score>=82;
+----+-----------+-------+---------+
| id | name | score | address |
+----+-----------+-------+---------+
| 2 | shangzhen | 82.00 | beijing |
+----+-----------+-------+---------+
1 row in set (0.00 sec)
查询info表中分数大于等于82的记录的人名
mysql> select name from info where score>=82;
+-----------+
| name |
+-----------+
| shangzhen |
+-----------+
1 row in set (0.00 sec)
(2)修改数据记录
UPDATE 语句:用于修改、更新表中的数据记录
语法:
UPDATE 表名 SET 字段名 1=字段值 1[,字段名 2=字段值 2] WHERE 条件表达式
修改shagnzhen的分数等于85
mysql> update info set score=85 where name='shangzhen';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from info;
+----+-----------+-------+---------+
| id | name | score | address |
+----+-----------+-------+---------+
| 1 | shengjie | 80.00 | nanjing |
| 2 | shangzhen | 85.00 | beijing |
+----+-----------+-------+---------+
2 rows in set (0.00 sec)
以下操作可以将数据库用户 root 的密码设为“12345”,当再次使用“mysql -u root -p”访问 MySQL 数据库服务器时,必须使用此密码进行验证
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql>
mysql> update user set authentication_string=password('123456');
Query OK, 3 rows affected, 1 warning (0.00 sec)
Rows matched: 3 Changed: 3 Warnings: 1
若是在 Linux 命令行环境中执行,还可以使用 mysqladmin 工具来设置密码。命令格式 为“mysqladmin -u root –p‘旧密码’password‘新密码’”。
[root@localhost ~]# mysqladmin -uroot -p123456 password 'abc123';
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.
4、DCL数据控制语言
在 MySQL 数据库服务器中,用于访问数据库的各种用户(如 root)信息都保存在 mysql 数据库的 user 表中,管理员可以直接修改其中的数据记录来完成密码修改或权限赋予,但值得注意的是,应当尽量减少人工操作,避免由于操作失误导致数据库无法访问或连接不到数据库等问题。通常都是给对应业务最小权限,某业务用户只负责查询,则只需要给赋予 SELECT 权限即可。
事务的begin、commit以及权限的grant、revoke都属于DCL语言,后面会有详细介绍。
三、数据库高级操作
1、清空表
清空一个数据表就是删除这个表内的所有数据。前面已经学习过 DELETE FROM 语句,可以删除表内的数据,除此之外还可以使用 TRUNCATE TABLE 语句实现清空表内记录。
DELETE FROM 语句可以使用 WHERE 子句对删除的结果集进行过滤选择, 这样更方便、更灵活。TRUNCATE TABLE 语句是删除表中所有记录数据,没法定制,灵活性上稍差。
mysql> select * from info;
+----+-----------+-------+---------+
| id | name | score | address |
+----+-----------+-------+---------+
| 1 | shengjie | 80.00 | nanjing |
| 2 | shangzhen | 82.00 | beijing |
+----+-----------+-------+---------+
2 rows in set (0.00 sec)
mysql> truncate table info;
Query OK, 0 rows affected (0.01 sec)
mysql> select * from info;
Empty set (0.00 sec)
DELETE 在不加 WHERE 子句的时候,跟 TRUNCATE 是一样的效果,清空整个表。 在清空表的时候有一点不同,看他们返回的结果,DELETE 返回的结果内有删除的记录条目,而 TRUNCATE 并没有返回被删除的条目。
mysql> select * from info;
+----+-----------+-------+---------+
| id | name | score | address |
+----+-----------+-------+---------+
| 2 | shangzhen | 85.00 | beijing |
+----+-----------+-------+---------+
1 row in set (0.00 sec)
mysql> delete from info;
Query OK, 1 row affected (0.00 sec)
mysql> select * from info;
Empty set (0.00 sec)
TRUNCATE 工作时是将表结构按原样重新建立,而 DELETE 工作时是一行一行的删除 记录数据的,在速度上 TRUNCATE 会快很多,尤其在数据量比较大的时候,表现更为明显。 另外如果一个表中有自增字段时,使用 DELETE FROM 删除所有记录后,再次新添加的记录会从原来最大的记录 ID 后面继续自增写入记录。使用 TRUNCATE TABLE 清空表内数据后,ID 会从 1 开始重新记录。
mysql> truncate table info;
Query OK, 0 rows affected (0.01 sec)
mysql> select * from info;
Empty set (0.00 sec)
mysql> insert into info(name,score,address) values('shengjie',80,'nanjing');
Query OK, 1 row affected (0.00 sec)
mysql> insert into info values(2,'shangzhen',82,'beijing');
Query OK, 1 row affected (0.01 sec)
mysql> select * from info;
+----+-----------+-------+---------+
| id | name | score | address |
+----+-----------+-------+---------+
| 1 | shengjie | 80.00 | nanjing | <----id还是从1开始
| 2 | shangzhen | 82.00 | beijing |
+----+-----------+-------+---------+
2 rows in set (0.00 sec)
mysql> delete table info;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'table info' at line 1
mysql> delete from info;
Query OK, 2 rows affected (0.00 sec)
mysql> select * from info;
Empty set (0.00 sec)
mysql> insert into info(name,score,address) values('shengjie',80,'nanjing');
Query OK, 1 row affected (0.00 sec)
mysql> select * from info;
+----+----------+-------+---------+
| id | name | score | address |
+----+----------+-------+---------+
| 3 | shengjie | 80.00 | nanjing | <----id字段从3开始了
+----+----------+-------+---------+
1 row in set (0.00 sec)
总结:delete和truncate的不同
1、delete可以配合where来进行条件筛选选择具体要删除的记录,而truncate的是删除真个表里的内容,不可以按记录删除
2、如果表里存在自增字段的话,delete之后,再次新添加的记录会从原来最大的记录 ID 后面继续自增写入记录。使用 TRUNCATE 清空表内数据后,ID 会从 1 开始重新记录。
2、临时表
MySQL 的临时表,顾名思义,就是临时建立的表,并不会长期存在,主要用于保存一 些临时数据。临时表有个特性,就是只在当前连接可见,当前连接下可执行增删改查等操作, 当连接被关闭后,临时表就会被 MySQL 删除,相关的资源也会被释放。
新建一个临时表tmp并插入一行数据记录,退出数据库再次进入数据库tmp表就不存在了
mysql> create temporary table tmp(id int(3) primary key auto_increment,name varchar(10) not null,score decimal(5,2),address varchar(50) default '未知');
Query OK, 0 rows affected (0.00 sec)
mysql> insert into tmp(name,score,address) values('shengjie',80,'nanjing');
Query OK, 1 row affected (0.00 sec)
mysql> select * from tmp;
+----+----------+-------+---------+
| id | name | score | address |
+----+----------+-------+---------+
| 1 | shengjie | 80.00 | nanjing |
+----+----------+-------+---------+
1 row in set (0.00 sec)
mysql> quit
Bye
[root@localhost ~]# mysql -uroot -p
Enter password:
mysql> use school;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from tmp;
ERROR 1146 (42S02): Table 'school.tmp' doesn't exist
3、克隆表
在 MySQL 的开发和维护过程中,会有原样拷贝某个数据表的需求。怎么样才能够快速、 完整的拷贝数据表呢,AS 这里是作为连接语句的操作符,更多的是被用来设置别名,这种方法可以实现创建表并且将原表的数据拷贝过来,但是这种方法存在一个问题,就是表的索引、默认值等无法复制过来
创建test表把info表的所有记录拷贝过来
mysql> select * from info;
+----+----------+-------+---------+
| id | name | score | address |
+----+----------+-------+---------+
| 3 | shengjie | 80.00 | nanjing |
| 4 | shengjie | 80.00 | nanjing |
+----+----------+-------+---------+
2 rows in set (0.00 sec)
mysql> create table test as select * from info;
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from test;
+----+----------+-------+---------+
| id | name | score | address |
+----+----------+-------+---------+
| 3 | shengjie | 80.00 | nanjing |
| 4 | shengjie | 80.00 | nanjing |
+----+----------+-------+---------+
2 rows in set (0.00 sec)
下面来介绍两种可以实现完整复制的方法
- 方法一:通过 LIKE 方式克隆表
首先,通过在创建表时使用 LIKE 方法,完整复制表结构。LIKE 方法可以将源表完全一样的复制生成一个新表,包括表的备注、索引、主键、存储引擎等,但是不会复制源表内数据记录。再通过 INSERT INTO…SELECT 方法,将源表内的数据写入新表内
mysql> create table test1 like info; <----复制info表
Query OK, 0 rows affected (0.02 sec)
mysql> desc test1; <---查看test1表结构
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| name | varchar(10) | NO | | NULL | |
| score | decimal(5,2) | YES | | NULL | |
| address | varchar(50) | YES | | 未知 | |
+---------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> select * from test1; <-----LIKE方法复制表结构,不复制数据
Empty set (0.00 sec)
mysql> insert into test1 select *from info; <----把info所有数据插入test1表
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from test1;
+----+----------+-------+---------+
| id | name | score | address |
+----+----------+-------+---------+
| 3 | shengjie | 80.00 | nanjing |
| 4 | shengjie | 80.00 | nanjing |
+----+----------+-------+---------+
2 rows in set (0.00 sec)
- 方法二:通过创建表的方式克隆表
首先,使用 SHOW CREATE TABLE 命令来获取源表的表结构、索引等信息。 其次,复制源表结构并修改表名为目标名字,然后执行创建新表的语句。通过这步操作, 就可以获得一个和源表结构一样的克隆表了。 最后,执行 INSERT INTO…SELECT 语句,从源表复制数据到新表内。
mysql> show create table info \G; <---查看info表的创建过程
*************************** 1. row ***************************
Table: info
Create Table: CREATE TABLE "info" (
"id" int(3) NOT NULL AUTO_INCREMENT,
"name" varchar(10) NOT NULL,
"score" decimal(5,2) DEFAULT NULL,
"address" varchar(50) DEFAULT '未知',
PRIMARY KEY ("id")
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
ERROR:
No query specified
复制info的表结构创建语句用来创建新表test2
mysql> CREATE TABLE "test2" (
-> "id" int(3) NOT NULL AUTO_INCREMENT,
-> "name" varchar(10) NOT NULL,
-> "score" decimal(5,2) DEFAULT NULL,
-> "address" varchar(50) DEFAULT '未知',
-> PRIMARY KEY ("id")
-> ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
-> ;
Query OK, 0 rows affected (0.00 sec)
mysql> desc test2;
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| name | varchar(10) | NO | | NULL | |
| score | decimal(5,2) | YES | | NULL | |
| address | varchar(50) | YES | | 未知 | |
+---------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
在test2插入info表的所有记录
mysql> insert into test2 select * from info;
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from test2;
+----+----------+-------+---------+
| id | name | score | address |
+----+----------+-------+---------+
| 3 | shengjie | 80.00 | nanjing |
| 4 | shengjie | 80.00 | nanjing |
+----+----------+-------+---------+
2 rows in set (0.00 sec)
四、数据库用户授权
MySQL 数据库的 root 用户账号拥有对所有数据库、表的全部权限,频繁使用 root 账号 会给数据库服务器带来一定的安全风险。实际工作中,通常会建立一些低权限的用户,只负 责一部分数据库、表的管理和维护操作,甚至可以对查询、修改、删除记录等各种操作做进 一步的细化限制,从而将数据库的风险降至最低。
1、用户权限
查看服务器所支持的不同权限,可以看到数据库可以对以下操作对用户进行授权
mysql> show privileges;
+-------------------------+---------------------------------------+-------------------------------------------------------+
| Privilege | Context | Comment |
+-------------------------+---------------------------------------+-------------------------------------------------------+
| Alter | Tables | To alter the table |
| Alter routine | Functions,Procedures | To alter or drop stored functions/procedures |
| Create | Databases,Tables,Indexes | To create new databases and tables |
| Create user | Server Admin | To create new users |
| Delete | Tables | To delete existing rows |
| Drop | Databases,Tables | To drop databases, tables, and views |
| Event | Server Admin | To create, alter, drop and execute events |
| Execute | Functions,Procedures | To execute stored routines |
| File | File access on server | To read and write files on the server |
| Grant option | Databases,Tables,Functions,Procedures | To give to other users those privileges you possess |
| Index | Tables | To create or drop indexes |
| Insert | Tables | To insert data into tables |
| Lock tables | Databases | To use LOCK TABLES (together with SELECT privilege) |
| Reload | Server Admin | To reload or refresh tables, logs and privileges |
| Select | Tables | To retrieve rows from table |
| Show databases | Server Admin | To see all databases with SHOW DATABASES |
| Show view | Tables | To see views with SHOW CREATE VIEW |
| Shutdown | Server Admin | To shut down the server |
| Super | Server Admin | To use KILL thread, SET GLOBAL, CHANGE MASTER, etc. |
| Trigger | Tables | To use triggers |
| Create tablespace | Server Admin | To create/alter/drop tablespaces |
| Update | Tables | To update existing rows |
| Usage | Server Admin | No privileges - allow connect only |
+-------------------------+---------------------------------------+-------------------------------------------------------+
31 rows in set (0.00 sec)
2、授予授权
GRANT 语句:专门用来设置数据库用户的访问权限。当指定的用户名不存在时, GRANT 语句将会创建新的用户;当指定的用户名存在时,GRANT 语句用于修改用户信息。
语法:
GRANT 权限列表 ON 数据库名.表名 TO 用户名@来源地址 [ IDENTIFIED BY '密码' ]
使用 GRANT 语句时,需要注意的事项如下。
- 权限列表:用于列出授权使用的各种数据库操作,以逗号进行分隔,如“select,insert,update”。使用“all”表示所有权限,可授权执行任何操作。
- 数据库名.表名:用于指定授权操作的数据库和表的名称,其中可以使用通配符“*”。
- 用户名@来源地址:用于指定用户名称和允许访问的客户机地址,即谁能连接、能从哪里连接。来源地址可以是域名、IP地址,还可以使用“%”通配符,表示某个区域或网段 内的所有地址,如“%.bdqn.com”“192.168.1.%”等。
- IDENTIFIED BY:用于设置用户连接数据库时所使用的密码字符串。在新建用户时, 若省略“IDENTIFIE BY”部分,则用户的密码将为空。 使用 GRANT 语句授权的用户记录,会保存到 mysql 库的user、db、host、tables_priv 等相关表中,无须刷新即可生效。
新建用户shengjie,只能在本地登录
mysql> create user shengjie@'localhost';
Query OK, 0 rows affected (0.01 sec)
修改shengjie的密码为abc123
mysql> alter user shengjie@'localhost' identified by 'abc123';
Query OK, 0 rows affected (0.06 sec)
查看数据库的所有用户的用户名,登录终端和密码,密码已经加密
mysql> select user,host,authentication_string from mysql.user;
+-----------+-----------+-------------------------------------------+
| user | host | authentication_string |
+-----------+-----------+-------------------------------------------+
| root | localhost | *6691484EA6B50DDDE1926A220DA01FA9E575C18A |
| mysql.sys | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root | % | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| shengjie | localhost | *6691484EA6B50DDDE1926A220DA01FA9E575C18A |
+-----------+-----------+-------------------------------------------+
4 rows in set (0.01 sec)
删除用户shengjie
mysql> drop user shengjie@'localhost';
Query OK, 0 rows affected (0.01 sec)
mysql> select user,host,authentication_string from mysql.user;
+-----------+-----------+-------------------------------------------+
| user | host | authentication_string |
+-----------+-----------+-------------------------------------------+
| root | localhost | *6691484EA6B50DDDE1926A220DA01FA9E575C18A |
| mysql.sys | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root | % | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-----------+-------------------------------------------+
3 rows in set (0.00 sec)
新建shangzhen用户授权他可以创建,修改,查询,插入,删除的操作对所有库和表在本地,密码为abc123
mysql> grant create,update,select,insert,delete on *.* to shangzhen@'localhost' identified by 'abc123';
Query OK, 0 rows affected, 1 warning (0.02 sec)
查看shangzhen的权限
mysql> show grants for shangzhen@'localhost';
+--------------------------------------------------------------------------------+
| Grants for shangzhen@localhost |
+--------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE ON *.* TO 'shangzhen'@'localhost' |
+--------------------------------------------------------------------------------+
1 row in set (0.00 sec)
新建用户tangyan,密码为123,授权他所有操作,并且还可以给别人授权的权限,但是他只能从192.168.245.0网段登陆
mysql> grant all on *.* to tangyan@'192.168.245.%' identified by '123' with grant option;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> show grants for tangyan@'192.168.245.%'; <--查看tangyan用户的授权
+----------------------------------------------------------------------------+
| Grants for tangyan@192.168.245.% |
+----------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'tangyan'@'192.168.245.%' WITH GRANT OPTION |
+----------------------------------------------------------------------------+
1 row in set (0.00 sec)
新建zhangsan用户授权他只能对school库进行查询的操作,密码为123
mysql> grant select on school.* to 'zhangsan'@'localhost' identified by '123';
Query OK, 0 rows affected, 1 warning (0.00 sec)
以zhangsan的身份重新登录数据库,只能对school进行查询操作,不能进行其他操作
[root@localhost ~]# mysql -uzhangsan -p
Enter password:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| school |
+--------------------+
2 rows in set (0.01 sec)
mysql> delete from info;
ERROR 1142 (42000): DELETE command denied to user 'zhangsan'@'localhost' for table 'info'
mysql> select * from info;
+----+----------+-------+---------+
| id | name | score | address |
+----+----------+-------+---------+
| 3 | shengjie | 80.00 | nanjing |
| 4 | shengjie | 80.00 | nanjing |
+----+----------+-------+---------+
2 rows in set (0.00 sec)
3、查看权限
SHOW GRANTS 语句:专门用来查看数据库用户的授权信息,通过 FOR 子句可指定 查看的用户对象(必须与授权时使用的对象名称一致)
语法:
SHOW GRANTS FOR 用户名@来源地址
查看root用户的权限
mysql> show grants for root;
+-------------------------------------------------------------+
| Grants for root@% |
+-------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION |
+-------------------------------------------------------------+
1 row in set (0.01 sec)
查看当前登录的用户权限
mysql> show grants;
+---------------------------------------------------------------------+
| Grants for root@localhost |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)
查看shangzhen用户的权限,用户名@登录地址这是一个整体,必须要全部写上
mysql> show grants for shangzhen@'localhost';
+--------------------------------------------------------------------------------+
| Grants for shangzhen@localhost |
+--------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE ON *.* TO 'shangzhen'@'localhost' |
+--------------------------------------------------------------------------------+
1 row in set (0.00 sec)
4、撤销权限
REVOKE 语句:用于撤销指定用户的数据库权限,撤销权限后的用户仍然可以连接到 MySQL 服务器,但将被禁止执行对应的数据库操作
语法:
REVOKE 权限列表 ON 数据库名.表名 FROM 用户名@来源地址
取消shangzhen用户的create权限
mysql> revoke create on *.* from shangzhen@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for shangzhen@'localhost';
+------------------------------------------------------------------------+
| Grants for shangzhen@localhost |
+------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'shangzhen'@'localhost' |
+------------------------------------------------------------------------+
1 row in set (0.00 sec)
注意:通过回收授权来修改授权,不能够通过重复授权来修改权限