小阿轩yx-MySQL数据库管理
使用 MySQL 数据库
在服务器运维工作中不可或缺的
SQL (结构化查询语句)的四种类型
- 数据定义语言(DDL):DROP(删除)、CREATE(创建)、ALTER(修改)
- 数据操作语言(DML):INSERT(插入)、UPDATE(更新)、DELETE(删除)
- 数据查询语言(DQL):SELECTE(选择),SHOW 语句,DESCRIBE)
- 数据控制语言(DCL):GRANT(授权)、REVOKE(撤销授权)、COMMIT(提交:指的事物)、ROLLBACK(回退)
查看数据库结构
[root@localhost ~]# mysql -u root -ppwd123
mysql> show databases;
mysql> use mysql
mysql> show tables;
mysql> describe user;
mysql> select * from user\G;
注:
- information_schema数据库:保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权 限等
- performance_schema:用于监控MySQL server在一个较低级别的运行过程中的资源消耗、资源等待等情况
- mysql:是 MySQL 服务正常运行所需的数据库,其中包含了用户认证相关的表
MySQL
- 是一套数据库管理系统
- 每台 MySQL 服务器均支持多个数据库
- 每个数据库相当于一个容器,存放着许多表
查看当前服务器中的数据库
SHOW DATABASES 语句
- 用于査看当前 MySQL服务器中包含的数据库
- MySQL 的每一条操作语句都是以分号(;)结束的
MySQL服务器初始化后,默认建立了四个数据库
mysqI>SHOW DATABASES;
+-------------------+
|Database |
+-------------------+
information_schema
|mysql |
performance schema
|test |
+-------------------+
4 rows in set (0.00 sec)
- test
- mysql
- information schema
- performance schema
(注:其中 mysql是 MySQL服务正常运行所需的数据库,其中包含了用户认证相关的表)
查看当前数据库中有哪些表
SHOW TABLES 语句
- 用于查看当前所在的数据库中包含的表
- 操作前,需要先使用 USE 语句切换到所使用的数据库
mysql>USE mysql;
Database changed
mysqI>SHOW TABLES;
+-----------------+
|Tables_in_mysql |
+-----------------+
|columns_priv |
|db |
|event |
...//省略部分内容900
|user |
+-----------------+
28 rows in set (0.01 sec)
MySQL数据库的数据文件存放在/usr/local/mysql/data 目录下,每个数据库对应一个子目录,用于存储数据表文件
每个数据表对应为三个文件扩展名分别为
- ".frm”
- “.MYD”
- “.MYI”
“.frm”
- 是与表相关的元数据(meta)信息都存放在“.frm”文件中,包括表结构的定义信息等
“.MYD”
- 文件是 MyISAM 存储引擎专用,存放 MyISAM 表的数据
“.MYI”
- 也是专属于 MyISAM 存储引擎的,主要存放 MyISAM 表的索引相关信息
MyISAM
- 存储引擎的表在数据库中,每一个表都被存放为三个以表名命名的物理文件(frm,myd,myi)。每个表都有且仅有这样三个文件做为 MyISAM 存储类型的表的存储
存放 Innodb 数据(包括索引)的两个文件
- “.ibd”
- ibdata
有两种文件来存放是因为Innodb 的数据存储方式能够通过配置来决定是使用共享表空间存放存储数据,还是独享表空间存放存储数据
独享表空间存储方式使用“.ibd”文件来存放数据,且每个表一个“.ibd”文件,文件存放在和 MyISAM 数据相同的位置。如果选用共享存储表空间来存放数据,则会使用ibdata 文件来存放,所有表共同使用一个(或者多个,可自行配置)ibdata 文件。
查看表的结构
DESCRIBE语句
- 用于显示表的结构
- 即组成表的各字段(列)的信息
- 需要指定“数据库名”
表名
- "作为参数”;若只指定表名参数,则需先通过 USE语句切换到目标数据库
mysql>USE mysql;
Database changed
mysqI>DESCRIBE user;
+------+------+---------+------+
|Field |Type |Null |Key |Default | Extra |
+------+------+---------+------+
|Host |char(60) |NO |PRI| | |
|User
|Password |char(41) |NO| | |
|Select priv |enum('N','Y') |NO| | |N | |
......//省略部分内容
+------+------+---------+------+
43 rows in set(0.00ses)
- 数据库目前标准的指令集是 SQL
SQL
- 是 Structured Query Language 的缩写,即结构化查询语言
- 1974 年由 Boyce 和 Chamberlin 提出来的
- 1975~1979 年IBM 公司研制的关系数据库管理系统原型 SystemR实现了这种语言
SQL语言主要组成部分
- DDL(Data Definition Language,数据定义语言):用来建立数据库、数据库对象和定义字段,如 CREATE、ALTER、DROP。
- DML(Data Manipulation Language,数据操纵语言):用来插入、删除和修改数据库中的数据,如INSERT、UPDATE、DELETE。
- DQL(Data Query Language,数据査询语言): 用来查询数据库中的数据,如 SELECTDCL(Data Control Language,数据控制语言):用来控制数据库组件的存取许可、存取权限等,如 COMMIT、ROLLBACK、GRANT、REVOKE
创建及删除数据库和表
创建新的数据库
CREATE DATABASE 语句
- 用于创建一个新的数据库,需指定数据库名称作为参数 auth 的数据库
mysqI>CREATE DATABASE auth;
Query OK, 1 row affected (0.01 sec)
刚创建的数据库是空的,其中不包含任何表,在/usr/local/mysql/data 目录下会自动生成一个与新建的数据库名相同的文件夹。
创建新的表
CREATE TABLE 语句
- 用于在当前数据库中创建新的表
- 需指定数据表名称作为参数,并定义该表格所使用的各字段,基本格式
CREATE TABLE 表名 (字段1 名称类型,字段2 名称类型,…, PRIMARY KEY (主键名))
mysql> use auth;
mysql> CREATE TABLE users (user_name CHAR(16) NOT NULL, user_passwd CHAR(48) DEFAULT '', PRIMARY KEY (user_name));
(注:DEFAULT '' 密码默认为空)
删除一个数据表
DROP TABLE 语句
- 用于删除数据库中的表,需要指定“数据库名
- 表名”作为参数
- 若只指定表名参数,则需先通过执行“USE"语句切换到目标数据库
mysql>DROP TABLE auth.users;
Query OK, 0 rows affected (0.00 sec)
删除一个数据库
DROP DATABASE 语句
- 用于删除指定的数据库,需要指定数据库名作为参数
mysql>DROP DATABASE auth;
Query OK, 0 rows affected (0.01 sec)
管理表中的数据记录
插入数据记录
INSERT INTO 语句
-
用于向表中插入新的数据记录
语句格式
mysql>use auth;
INSERT INTO 表名(字段 1,字段 2,...) VALUES(字段1的值,字段2的值,..)
mysql>use auth;
Database changed
mysql>INSERT INTO users(user_name,user_passwd) VALUES('zhangsan',PASSWORD ('123456'));
Query OK, 1 row affected (0.00 sec)
(注:在插入新的数据记录时,如果这条记录完整包括表中所有字段的值,则插入语句中指定字段的部分可以省略。)
查询数据记录
SELECT语句
- 用于从指定的表中查找符合条件的数据记录
- MySQL数据库支持标准的 SQL 查询语句
语句格式
SELECT 字段名 1,字段名 2,...FROM 表名 WHERE 条件表达式
mysql>select * from auth.users;
mysql>SELECT user_name,user_passwd FROM auth.users WHERE user_name='zhangsan';
(注:表示所有字段时,可以使用通配符“*”,若要显示所有的数据记录,则可以省略 WHERE条件子句。)
修改数据记录
UPDATE 语句
- 用于修改、更新表中的数据记录
语句格式
mysql>UPDATE auth.users SET user_passwd=PASSWORD('') WHERE user_name= 'lisi';
mysql>SELECT * FROM auth.users;
mysql>UPDATE mysql.user SET authentication_string=PASSWORD('123457') WHERE user='root';
mysql>FLUSH PRIVILEGES;
[root@localhost ~]# mysqladmin -u root -p'123457' password '123456'
删除数据记录
DELETE语句
-
用于删除表中指定的数据记录
语法格式
DELETE FROM 表名 where 条件表达式
mysql>DELETE FROM auth.users WHERE user_name='lisi';
mysql>SELECT * FROM auth.users;
(注:执行 UPDATE、DELETE 语句时,通常都带 WHERE 条件,不带条件的 UPDATE 语句和 DELETE语句会修改或删除所有的记录,是非常危险的操作。)
数据库表高级操作
清空表
- 清空一个数据表就是删除这个表内的所有数据
DELETE FROM 语句
- 可以使用 WHERE 子句对删除的结果集进行过滤选择
好处
- 更方便
- 更灵活
TRUNCATE TABLE 语句
- 删除表中所有记录数据
缺点
- 没法定制
- 灵活性上稍差
//通过 LIKE 方法,复制 users 表生成 tmp 表
mysql>create table tmp like player;
Query OK, 0 rows affected (0.01 sec)
//通过 player 表生成 tmp 表内数据记录
mysql>insert into user01 select * from player;
Query OK, 3218 rows affected (0.06 sec)
Records:3218 Duplicates:0 Wamings: 0
mysql>delete from tmp where level >= 45;
Query OK, 7 rows affected (0.01 sec)
mysql>delete from tmp;
Query OK, 3211 rows affected (0.06 sec)
mysql>insert into tmp select * from player;
Query OK, 3218 rows affected (0.07 sec)
Records:3218 Duplicates:0 Wamings: 0
mysql>truncate table tmp;
Query Ok, 0 rows affected (0.01 sec)
mysql>select count(*) from tmp;
+-------+
|count(*)|
+-------+
| 0|
+-------+
1 row in set (0.01 sec)
- DELETE 在不加 WHERE 子句的时候,跟 TRUNCATE 是一样的效果,清空整个表
不同
delete from
- 返回的结果内有删除的记录条目
- 工作时是一行一行的删除记录数据的
- DELETE FROM 删除所有记录后,再次新添加的记录会从原来最大的记录 ID 后面继续自增写入记录
truncate
- 并没有返回被删除的条目
- 工作时是将表结构按原样重新建立
- 速度上 TRUNCATE 会快很多
- TRUNCATE TABLE 清空表内数据后,ID 会从1开始重新记录
临时表
- 临时建立的表,并不会长期存在,主要用于保存一些临时数据
特性
- 只在当前连接可见,当前连接下可执行增删改查等操作
- 当连接被关闭后,临时表就会被 MySQL删除,相关的资源也会被释放
//查看 mytmp 表是否存在
mysql>select * from mytmp;
mysql>CREATE TEMPORARY TABLE `mytmp` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`NAME` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`level` int(10) NOT NULL,
PRIMARY KEY (id)
//创建临时表
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
//插入数据
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 之后查看临时表状态
mysql>select * from mytmp;
ERROR 1146(42S02): Table 'dzm.mytmp' doesn't exist
(注:临时表创建成功之后,使用 SHOW TABLES 命令是看不到创建的临时表的,临时表会在连接退出后被销毁)
退出连接之前,也可以手动直接删除,使用 DROP TABLE 语句,具体操作
mysql>drop table mytmp;
Query OK, 0 rows affected (0.00 sec)
克隆表
mysql>drop table tmp;
Query OK, 0 rows affected (0.01 sec)
mysql>create table tmp as select * from player;
Query OK, 3218 rows affected (0.15 sec)
Records:3218 Duplicates:0 Wamings:0
mysql>select count(*) from tmp;
+--------+
|count(*)|
|3218 |
+--------+
1 row in set (0.00 sec)
- AS 这里是作为连接语句的操作符,更多的是被用来设置别名
- 这种方法可以实现创建表并且将原表的数据拷贝过来
解决无法复制表的索引、默认值两个方法
方法一
LKE方式克隆表
- 通过在创建表时使用 LIKE方法,完整复制表结构
- LIKE方法可以将源表完全一样的复制生成一个新表,包括表的备注、索引、主键、存储引擎等,但是不会复制源表内数据记录
- 其次,在通过 INSERT INTO..SELECT 方法,将源表内的数据写入新表内
//通过 LIKE 方法,复制 mytmp 表生成 test 表
mysql>create table test like mytmp;
Query OK, 0 rows affected (0.01 sec)
mysql>show create table test\G
*******************************1.row**************************************************
Create Table: CREATE TABLE 'test`(
`id` int(10) NOT NULL AUTO INCREMENT
`NAME` varchar(32) CHARACTER SET utf8 COLLATE utf8 bin NOT NULL"level int(10) NOT NULL.
PRIMARY KEY (`id')
)ENGINE=InnoDB AUTO INCREMENT=4 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
//LIKE 方法复制表结构,不复制数据
mysql>select * from test;
Empty set (0.00 sec)
//将 mytmp 表的数据写入 test 表Query OK, 1 rows
mysql>insert into test select* from mytmp;
Query OK,1 rows affected (0.00 sec)
Records:1Duplicates:0 Warnings:0
mysql> select * from test;
+---+------+------+
|id | NAME | level|
| 1 | aa | 10 |
+---+------+------+
3 rows in set (0.00 sec)
方法二
通过创建表的方式克隆表
- 使用 SHOW CREATE TABLE 命令来获取源表的表结构、索引等信息
- 其次,复制源表结构并修改表名为目标名字,然后执行创建新表的语句
- 最后,执行 INSERT INTO...SELECT 语句,从源表复制数据到新表内
mysql>show create table mytmp\G
*******************************1.row**************************************************
Table:mytmpCreate
CREATE TABLE 'mytmp'(
`id` int(10) NOT NULL AUTO INCREMENT,
`NAME` varchar(32) CHARACTER SET Utf8 COLLATE utf8 bin NOT NULL,
level int(10) NOT NULL,
PRIMARY KEY (`id`)
)ENGINE=InnODB AUTO INCREMENT=4 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
//改名后创建新表
mysql>CREATE TABLE`test(
->`id` int(10) NOT NULL AUTO INCREMENT,
->`NAME` varchar(32) CHARACTER SET Utf8 COLLATE utf8 bin NOT NULL,
->`level int(10) NOT NULL,
->PRIMARY KEY (id)
->) ENGINE=InnODB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)
//导入原表数据
mysql> insert into test select* from mytmp;
Query OK, 1 rows affected (0.00 sec)
Records:1 Duplicates:0 Warnings:0
mysql> select * from mytmp;
+---+------+------+
|id | NAME | level|
|1 | aa | 10 |
+---+------+------+
3 rows in set(0.01 sec)
3 rows in set (0.01 sec)
数据库用户授权
- 降低风险通常会建立一些低权限的用户,只负责一部分数据库、表的管理和维护操作
- 甚至可以对查询、修改、删除记录等各种操作做进一步的细化限制,从而将数据库的风险降至最低
授予权限
- 一组权限的集合:角色
GRANT语句
- 专门用来设置数据库用户的访问权限
- 当指定的用户名不存在时GRANT语句将会创建新的用户
- 当指定的用户名存在时,GRANT 语句用于修改用户信息
语句格式
GRANT 权限列表 ON数据库名.表名 TO 用户名@来源地址[IDENTIFIED BY'密码']
mysql>GRANT select ON auth.* TO 'zhangsan'@'localhost' IDENTIFIED BY '123456';
注:
- 权限列表:用于列出授权使用的各种数据库操作,以逗号进行分隔,如“select,insert,update”。使用“al”表示所有权限,可授权执行任何操作。
- 数据库名.表名:用于指定授权操作的数据库和表的名称,其中可以使用通配符“*”。例如,使用“auth.*”表示授权操作的对象为 auth 数据库中的所有表。
- 用户名@来源地址:用于指定用户名称和允许访问的客户机地址,即谁能连接、能从哪里连接。来源地址可以是域名、IP地址,还可以使用“%"通配符,表示某个区域或网段内的所有地址,如“%.bdqn.com"“192.168.1.%”等。
- IDENTIFIED BY:用于设置用户连接数据库时所使用的密码字符串。在新建用户时,若省略“IDENTIFIED BY"部分,则用户的密码将为空。
查看权限
SHOW GRANTS 语句
- 专门用来查看数据库用户的授权信息
- 通过 FOR 子句可指定查看的用户对象(必须与授权时使用的对象名称一致)
语句格式
SHOW GRANTS FOR 用户名@来源地址
mysql> SHOW GRANTS FOR 'zhangsan'@'localhost';
撤销权限
REVOKE语句
- 用于撤销指定用户的数据库权限
- 撤销权限后的用户仍然可以连接到MySQL服务器,但将被禁止执行对应的数据库操作
语句格式
REVOKE 权限列表ON数据库名.表名 FROM 用户名@来源地址
验证权限
[root@localhost ~]# mysql -u zhangsan -p123456
小阿轩yx-MySQL数据库管理