https://www.w3school.com.cn/sql/sql_select.asp
数据库启动
1、启动与关闭
RHEL7:systemctl start|stop mysqld
2、登录与退出
mysql -u user_name -ppassword -h host_name
h:连接MySQL不在本机时,填写主机名或IP地址
u:登录MySQL用户
p:登录MySQL的密码
注意:密码写在命令行时一定不能有空格
3、设置及修改MySQL root用户密码
没有密码时设置:
mysqladmin -uroot password '123456'
修改root密码
方法1:mysqladmin -uroot -p'123456' password;
方法2:ALTER USER root@localhost identified by '123456';
方法3:
mysql> update mysql.user set authentication_string=password('123456')
-> where user='root' and host='localhost';
root密码遗忘
1、关闭数据库,修改主配置文件(/etc/my.cnf)添加:skip-grant-tables
2、启动数据库, 直接登录
mysql> update mysql.user set authentication_string=password('ABCabc123!')
-> where user='root' and host='localhost';
mysql> flush privileges;
3、将配置文件的skip-grant-tables删除。
数据库安全初始设置
[root@mysql02 ~]# mysql_secure_installation
Securing the MySQL server deployment.
Enter password for user root: 输入root用户密码
The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
Using existing password for root.
Estimated strength of the password: 0
Change the password for root ? ((Press y|Y for Yes, any other key for No) : n 是否改变root用户密码
... skipping.
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y 是否移除匿名用户
Success.
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y 是否禁止root用户远程登录
Success.
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y 是否移除test数据库
- Dropping test database...
Success.
- Removing privileges on test database...
Success.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y 是否现在更新权限表
Success.
All done!
数据库表操作
SQL语句主要可以划分为以下几类:
DDL(Data Definition Language):数据定义语言,定义对数据库对象(库、表、列、索引)的操作。
CREATE、DROP、ALTER、RENAME、 TRUNCATE等
DML(Data Manipulation Language): 数据操作语言,定义对数据库记录的操作。
INSERT、DELETE、UPDATE、SELECT等
DCL(Data Control Language):数据控制语言 ,定义对数据库、表、字段、用户的访问权限和安全级别。
GRANT、REVOKE等
**Transaction Control:事务控制 **
COMMIT、ROLLBACK、SAVEPOINT等
SQL语句的书写规范
1、SQL语句不区分大小写,建议用大写
2、字符串常量区分大小写
3、以“;”结尾
4、关键字不能跨多行或简写
5、子句具有独立性,便于编辑,提高可读性。
注释:
SQL标准:/**/ 多行注释
“–” 单行注释
MySQL注释:
“#”
数据库操作
1、查看数据库
mysql> show databases;
语法:SHOW DATABASES [LIKE wild];
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
eg:
mysql> show databases like "m%";
"_" 代表一个字符
“%” 代表任意多个
MySQL自带数据库:
1、Information_schema:主要存储了系统中的一些数据库对象信息:如用户表信息、列信息、权限信息、字符集信息、分区信息等。(数据字典表)
2、performance_schema:主要存储数据库服务器的性能参数
3、mysql:存储了系统的用户权限信息及帮助信息。
4、sys: 5.7新增,之前版本需要手工导入。这个库是通过视图的形式把information_schema 和 performance_schema结合起来,查询出更加令人容易理解的数据
5、test:系统自动创建的测试数据库,任何用户都可以使用。
2、创建数据库
语法:CREATE DATABASE [IF NOT EXISTS]数据库名;
eg:
mysql> create database db2;
mysql> create database if not exists db2;
3、删除数据库(一次只能删除一个数据库)
语法: DROP DATABASE [IF EXISTS]数据库名;
功能:删除数据库中得所有表和数据库
eg:
mysql> drop database if exists db1;
4、切换数据库
mysql> use db1;
Database changed
5、查看数据库的相关信息
# 查看当前连接的数据库
mysql> select database();
+------------+
| database() |
+------------+
| db1 |
+------------+
1 row in set (0.00 sec)
#查看数据库的版本
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.14 |
+-----------+
1 row in set (0.00 sec)
#查看当前用户
mysql> select user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
6、在MySQL中执行linux指令 ,注意前面加system
mysql> system date;
2021年 01月 13日 星期三 13:44:31 CST
执行Linux命令:
SYSTEM <命令>
存储引擎
1、innoDB存储引擎
InnoDB 事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键。MySQL 的默认存储
引擎为InnoDB。
InnoDB主要特性有:
⑴ InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。
⑵ InnoDB是为处理巨大数据量时的最大性能设计。它的CPU效率可能是任何其它基于磁盘的关系数据
库引擎所不能匹敌的。
⑶ InnoDB存储引擎被完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持
它自己的缓冲池。
⑷ InnoDB支持外键完整性约束(FOREIGN KEY)。 ⑸ InnoDB被用来在众多需要高性能的大型数据库站点上。
2、MyISAM存储引擎
MyISAM主要特性有:
⑴ 大文件(达63位文件长度)在支持大文件的文件系统和操作系统上被支持。
⑵ 当把删除和更新及插入混合的时候,动态尺寸的行更少碎片。
⑶ 每个MyISAM表最大索引数是64。 ⑷ 最大的键长度是1000字节。
⑸ BLOB和TEXT列可以被索引。
⑹ NULL值被允许在索引的列中。这个占每个键的0-1个字节。
⑺ 所有数字键值以高字节位先被存储以允许一个更高地索引压缩。
⑻ 每表一个AUTO_INCREMEN列的内部处理。
⑼ 可以把数据文件和索引文件放在不同目录。
⑽ 每个字符列可以有不同的字符集。
3、MEMORY存储引擎
MEMORY主要特性有:
⑴ MEMORY表可以有多达每个表32个索引,每个索引16列,以及500字节的最大键长度。
⑵ MEMORY存储引擎执行HASH和BTREE索引。
⑶ 可以在一个MEMORY表中有非唯一键。
⑷ MEMORY表使用一个固定的记录长度格式。
⑸ MEMORY不支持BLOB或TEXT列。
⑹ MEMORY支持AUTO_INCREMENT列和对可包含NULL值的列索引。
⑺ MEMORY表在所有客户端之间共享。
⑻ MEMORY表内容被存在内存中。
⑼ 当不再需要MEMORY表的内容之时,要释放被MEMORY表使用的内存。
存储引擎的选择
不同存储引擎都有各自的特点,适应于不同的需求,为了做出选择,首先需要考虑每一个存储引擎提供
了那些不同的功能。
MySQL字符集
MySQL字符集包括字符集(CHARACTER)和校对规则(COLLATION)两个概念:
latin1支持西欧字符、希腊字符等
gbk支持中文简体字符
big5支持中文繁体字符
utf8几乎支持世界所有国家的字符。
1、查看所有字符集: SHOW VARIABLES like ‘character%’;
mysql> show create database db1; 查看db1数据库使用的字符集
+----------+----------------------------------------------------------------+
| Database | Create Database |
+----------+----------------------------------------------------------------+
| db1 | CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+----------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> show variables like '%character%'; 查看所有字符集
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
character_set_client:MySQL客户机字符集。
character_set_connection:数据通信链路字符集,当MySQL客户机向服务器发送请求时,请求数据以该 字符集进行编码。
character_set_database:数据库字符集。
character_set_filesystem:MySQL服务器文件系统字符集,该值是固定的binary。
character_set_results:结果集的字符集,MySQL服务器向MySQL客户机返回执行结果时,执行结果以该 字符集进行编码。
character_set_server:MySQL服务实例字符集。 character_set_system:元数据(字段名、表名、数据库名等) 的字符集,默认值为utf8。
2、查看当前MySQL服务实例支持的字符序:SHOW COLLATION;
mysql> SHOW COLLATION;
+--------------------------+----------+-----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+--------------------------+----------+-----+---------+----------+---------+
| big5_chinese_ci | big5 | 1 | Yes | Yes | 1 |
| big5_bin | big5 | 84 | | Yes | 1 |
| dec8_swedish_ci | dec8 | 3 | Yes | Yes | 1 |
| dec8_bin | dec8 | 69 | | Yes | 1 |
| cp850_general_ci | cp850 | 4 | Yes | Yes | 1 |
MySQL字符序命名规则是
以字符序对应的字符集名称开头,以国家名居中(或以general居中),以ci(不区分大小写)、cs(大小写敏感)或**bin(按二进制编码比较)**结尾。
默认为latin1字符集,如何更改为utf8:
临时修改,重启无效
mysql> set character_set_server =utf8;
永久修改
方法:修改my.cnf配置文件,可修改MySQL默认的字符集,修改完毕重启MySQL
1.在[mysqld]下添加 default-character-set=utf8 #适合5.1及以前版本
(mysql 5.5及以后版本添加character-set-server=utf8)
init_connect = 'SET NAMES utf8'
修改后重启服务
[root@localhost ~]# systemctl restart mysqld
2.在[client]下添加 default-character-set=utf8
数据库对象
数据库对象的命名规则
1、可包括数字和三个特殊字符(# _ $)
2、不要使用MySQL的保留字
3、同一Schema下的对象不能同名
表的基本操作
1、表的物理存储结构
MyISAM(一种引擎)的表:
[root@node1 ~]# cd /var/lib/mysql/mysql/
[root@node1 mysql]# ls -l user*
-rw-r----- 1 mysql mysql 10816 7月 16 17:39 user.frm # 描述表结构文件,字段长度等, frame框架
-rw-r----- 1 mysql mysql 384 7月 16 17:52 user.MYD # 数据信息文件,存储数据信息 (如果采用独立表存储模式) data
-rw-r----- 1 mysql mysql 4096 7月 16 17:54 user.MYI # 索引信息文件,index
InnoDB(默认的存储引擎)的表:
[root@node2 employess]# ls -l t4*
-rw-r----- 1 mysql mysql 8586 7月 16 20:31 t4.frm
-rw-r----- 1 mysql mysql 98304 7月 16 20:32 t4.ibd
ttt
t.frm:#存储列相关信息,描述表结构文件,字段长度等
t.ibd:#数据行+索引,如果采用独立表存储模式,data\a中还会产生b.ibd文件(存储数据信息和索引信 息)
#如果采用共存储模式的,数据信息和索引信息都存储在ibdata1中 如果采用分区存储,还会有一个t.par文件(用来存储分区信息)
数据类型
三种类型:文本、数字 、日期/时间
Text 类型:
Number 类型:
- 这些整数类型拥有额外的选项 UNSIGNED。通常,整数可以是负数或正数。如果添加 UNSIGNED 属性,那么范围将从 0
开始,而不是某个负数。
Date 类型:
1、查看表(SHOW 语法,DESCRIBE 语法)
SHOW
语法: SHOW TABLES[FROM 数据库名][LIKE wild];
功能:显示当前数据库中已有的数据表的信息
eg:
mysql> create table it
-> (id int);
Query OK, 0 rows affected (0.13 sec)
mysql> show tables from mysql like 'time%';
+---------------------------+
| Tables_in_mysql (time%) |
+---------------------------+
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
+---------------------------+
5 rows in set (0.00 sec)
DESCRIBE
语法: {
DESCRIBE|DESC}表名[列名];
功能:查看数据表中各列的信息 用“SHOW CREATE TABLE 表名\G”可以查看更全面的表定义信息
eg:
mysql> describe mysql.time_zone;
+------------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+------------------+------+-----+---------+----------------+
| Time_zone_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| Use_leap_seconds | enum('Y','N') | NO | | N | |
+------------------+------------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
2、 创建表(CREATE TABLE 简单语法)
语法: CREATE TABLE 表名( 列名 列类型, 列名 列类型 );
功能:在当前数据库中创建一张表
eg:
mysql> create table b1
-> (it int);
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| it |
+---------------+
1 row in set (0.00 sec)
3、删除表(DROP TABLE 语法)
语法: DROP TABLE [IF EXISTS] 表名;
功能:删除指定的表
eg:
mysql> drop table it;
Query OK, 0 rows affected (0.01 sec)
4、修改表的结构(ALTER TABLE)
**修改列类型**
ALTER TABLE 表名 MODIFY 列名 列类型;
**增加列**
ALTER TABLE 表名 ADD 列名 列类型;
**删除列**
ALTER TABLE 表名 DROP 列名;
**列改名**
ALTER TABLE 表名 CHANGE 旧列名 新列名 列类型;
**更改表名**
ALTER TABLE 表名 RENAME 新表名;
RENAME TABLE 表名 TO 新表名;
eg:
mysql> alter table table1
-> add gender enum('M','F') default 'M';
mysql> alter table table1
-> modify name varchar(16) unique not null;
mysql> alter table table1
-> change id xid int unsigned auto_increment;
mysql> alter table table1
-> drop gender;
mysql> alter table table1
-> rename table2;
mysql> rename table table2
-> to table1;
5、复制表结构
语法:create table 新表名 like 源表
功能:可以将**源表的表结构**复制到新表中
eg:
mysql> create table student3
-> like student2;
语法:create table 新表名 select * from 源表
功能:将**源表的表结构**以及**源表的所有记录**拷贝到新表中。
eg:
mysql> create table student2
-> select * from student;
6、数据库字典(由information_schema数据库负责维护)
tables-存放数据库里所有的数据表、以及每个表所在数据库。
schemata-存放数据库里所有的数据库信息
views-存放数据库里所有的视图信息。
columns-存放数据库里所有的列信息。
triggers-存放数据库里所有的触发器。
routines-存放数据库里所有存储过程和函数。
key_column_usage-存放数据库所有的主外键
table_constraints-存放数据库全部约束。
statistics-存放了数据表的索引。
7、表的约束
约束是在表上强制执行的数据校验规则.
约束主要用于保证数据库的完整性。
当表中数据有相互依赖性时,可以保护相关的数据不被删除.
大部分数据库支持下面五类完整性约束:
NOT NULL非空
UNIQUE Key唯一键
PRIMARY KEY主键
FOREIGN KEY外键
CHECK检查
约束作为数据库对象,存放在系统表中,也有自己的名字
创建约束的时机:在建表的同时创建 、建表后创建(修改表)
可定义列级或表级约束
有单列约束和多列约束
列级约束:在定义列的同时定义约束
语法:列定义 约束类型,
表级约束:在定义了所有列之后定义的约束
语法:列定义 [CONSTRAINT 约束名] 约束类型(列名)
约束名的取名规则
推荐采用:表名_列名_约束类型简介
约束可以在创建表时就定义,也可以在创建完后再添加
语法:
alter table 表名
add constraint 约束名 约束类型(要约束的列名)
1、非空约束(NOT NULL)
列级约束,只能使用列级约束语法定义。 确保字段值不允许为空,只能在字段级定义
所有数据类型的值都可以是NULL。
空字符串不等于NULL。
0也不等于NULL。
eg:
mysql> create table tb_student(
-> id int primary key auto_increment,
-> name varchar(18) not null);
2、唯一约束
唯一性约束条件确保所在的字段或者字段组合不出现重复值
唯一性约束条件的字段允许出现多个NULL
同一张表内可建多个唯一约束
唯一约束可由多列组合而成
建唯一约束时MySQL会为之建立对应的索引。
如果不给唯一约束起名,该唯一约束默认与列名相同。
eg:
mysql> create table tb_student2(
-> id int primary key auto_increment,
-> name varchar(18) unique not NULL);
3、逐渐约束
主键从功能上看相当于非空且唯一
一个表中只允许一个主键
主键是表中唯一确定一行数据的字段
主键字段可以是单字段或者是多字段的组合
当建立主键约束时,MySQL为主键创建对应的索引
主键约束名总为PRIMARY。
eg:
mysql> create table tb_student2(
-> id int primary key auto_increment,
-> name varchar(18);
4、外键约束
外键是构建于一个表的两个字段或者两个表的两个字段之间的关系
外键确保了相关的两个字段的两个关系:
子(从)表外键列的值必须在主表参照列值的范围内,或者为空(也可以加非空约束,强制不允许为空)。
当主表的记录被子表参照时,主表记录不允许被删除。
外键参照的只能是主表主键或者唯一键,保证子表记录可以准确定位到被参照的记录。
格式FOREIGN KEY (外键列名)REFERENCES 主表(参照列)
eg:
mysql> create table tb_dept(
-> dept_id int primary key,
-> name varchar(18),
-> description varchar(255));
mysql> create table tb_employee(
-> employee_id int primary key,
-> name varchar(18),
-> gender varchar(18),
-> dept_id int,
-> foreign key(dept_id) references tb_dept(dept_id),
-> address varchar(255)
-> );
mysql> insert into tb_dept values(101,'tom',NUll);
mysql> insert into tb_dept values(102,'xiaoming',NUll);
mysql> insert into tb_dept values(103,'xiaohong',NUll);
mysql> select * from tb_dept;
+---------+----------+-------------+
| dept_id | name | description |
+---------+----------+-------------+
| 101 | tom | NULL |
| 102 | xiaoming | NULL |
| 103 | xiaohong | NULL |
+---------+----------+-------------+
mysql> insert into tb_employee values(1001,'xiaomei','F','101',NUll);
Query OK, 1 row affected (0.00 sec)
mysql> insert into tb_employee values(1002,'xiaohong','M','104',NUll);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`db1`.`tb_employee`, CONSTRAINT `tb_employee_ibfk_1` FOREIGN KEY (`dept_id`) REFERENCES `tb_dept` (`dept_id`))
mysql> insert into tb_employee values(1002,'xiaohong','M','102',NUll);
Query OK, 1 row affected (0.00 sec)
8、删除表的约束
删除NOT NULL约束
alter table 表名 modify 列名 类型;
删除UNIQUE约束
alter table 表名 drop index 惟一约束名;
删除PRIMARY KEY约束
alter table 表名 drop primary key;
删除FOREIGN KEY约束
alter table 表名 drop foreign key 外键名;
9、自动增长和默认值
auto_increment :自动增长
为新的行产生唯一的标识
一个表只能有一个auto_increment,且该属性必须为主键的一部分。
auto_increment的属性可以是 任何整数类型
default : 默认值
10、存储引擎
mysql中的数据库由不同的技术存储在文件中,有不同的存储机制、索引技巧、锁定水平,不同的技术以及配套的相关功能在mysql中被称作存储引擎(也称表类型)。
插件式存储引擎是mysql数据库最重要的特性之一,用户可以根据应用的需要选择如何存储和索引数据、是否使用事务。
默认创建表不指定表的存储引擎,可使用配置文件的my.cnf 中的default-storage-engine=InnoDB指定InnoDB
常见的存储引擎:
MyISAM:应用于以读写操作为主, 很少更新 、 删除 , 并对事务的完整性、 并发性要求不高的情况。
InnoDB: 应用于对事务的完整性要求高,在并发条件下要求数据的一致性的情况。现在的默认值。
MEMORY:表的数据存放在内存中,访问效率高 ,但一旦服务关闭,表中的数据全部丢失。
MERGE: 是一组MyISAM表的组合。 可以突破对单个MyISAM表大小的限制, 并提高访问效率
总结-完整的建表语句
CREATE TABLE 表名(
列名 列类型 [AUTO_INCREMENT] [DEFAULT 默认值][列约束]
...
[表约束]
) [ENGINE=表类型] [DEFAULT] CHARSET=字符集;
列类型: 该列的数据的存储类型
AUTO_INCREMENT: 自动增尙只能是数值类型的列
DEFAULT 默认值: 设置该列的默认值
约束: 对列的一些限制
ENGINE: 表类型, 也叫表的存储引擎
CHARSET: 设置表的字符篥
Mysql密码的策略
MySQL5.7为root用户随机生成了一个密码,打印在error_log中,关于error_log的位置,如果安装的是RPM包,则默认是 /var/log/mysqld.log 。
查看数据库当前密码策略:
mysql> show variables like '%password%';
+---------------------------------------+--------+
| Variable_name | Value |
+---------------------------------------+--------+
| default_password_lifetime | 0 |
| disconnect_on_expired_password | ON |
| log_builtin_as_identified_by_password | OFF |
| mysql_native_password_proxy_users | OFF |
| old_passwords | 0 |
| report_password | |
| sha256_password_proxy_users | OFF |
| validate_password_dictionary_file | |
| validate_password_length | 8 |
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | MEDIUM |
| validate_password_special_char_count | 1 |
+---------------------------------------+--------+
查看密码插件:
mysql> show variables like 'validate_password%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password_dictionary_file | |
| validate_password_length | 8 |
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | MEDIUM |
| validate_password_special_char_count | 1 |
+--------------------------------------+--------+
yum /rpm 安装密码策略默认中级(MEDIUM);
官方的文档策略定义:
Policy | tests |
---|---|
0 or low(低级) | Length(要求长度) |
1 or MEDIUM(中级) | Length(长度); numeric(数字), lowercase/uppercase(大小写), and special characters(特殊字符) |
2 or STRONG(高级) | Length(长度); numeric(数字), lowercase/uppercase(大小写), and special characters(特殊字符); dictionary file (字典文件)若设置的密码与字典文件相似将会拒绝密码设置 |
更改密码策略
1、临时修改
**更改密码策略为LOW,改为LOW或0**
mysql> set global validate_password_policy='LOW';
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'validate_password%';
+--------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------+-------+
| validate_password_dictionary_file | |
| validate_password_length | 8 |
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | LOW |
| validate_password_special_char_count | 1 |
+--------------------------------------+-------+
mysql> set global validate_password_length=0; ##密码长度不限制
Query OK, 0 rows affected (0.00 sec)
mysql> set global validate_password_special_char_count=0; ##密码特殊字符不要求
Query OK, 0 rows affected (0.00 sec)
mysql> set global validate_password_mixed_case_count=0; ##密码大小写不要求
Query OK, 0 rows affected (0.01 sec)
mysql> set global validate_password_number_count=0; ##密码数字不要求
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'validate_password%';
+--------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------+-------+
| validate_password_dictionary_file | |
| validate_password_length | 4 |
| validate_password_mixed_case_count | 0 |
| validate_password_number_count | 0 |
| validate_password_policy | LOW |
| validate_password_special_char_count | 0 |
+--------------------------------------+-------+
mysql> alter user root@localhost identified by '123456'; ##修改密码
Query OK, 0 rows affected (0.10 sec)
2、初始化时不启用
只需要在初始化时指定 --initialize-insecure 即可,比如:
mysqld --initialize-insecure --datadir=/var/lib/mysql --basedir=/usr -- user=mysql
3、修改配置文件
在 /etc/my.cnf 配置文件中增加
[mysqld]
validate_password=off
修改完毕,重启服务。
mysql> show variables like '%password%';
+---------------------------------------+-------+
| Variable_name | Value |
+---------------------------------------+-------+
| default_password_lifetime | 0 |
| disconnect_on_expired_password | ON |
| log_builtin_as_identified_by_password | OFF |
| mysql_native_password_proxy_users | OFF |
| old_passwords | 0 |
| report_password | |
| sha256_password_proxy_users | OFF |
+---------------------------------------+-------+
Mysql权限控制
作用
用于对用户执行的操作进行限制。连接后用户的每次操作系统都会根据用户的身份判断该用户是否有执行权限。
用户的身份由用户用于连接的主机名和使用的用户名来决定。
格式:eg:root@localhost
工作原理
Mysql存取控制包含2个阶段:
1、服务器检查是否允许连接。
2、若允许,服务器需要检查用户发出的每个请求,判断是否有权限执行。
用户授权操作
**方法1:create和grant结合 **(所有MySQL版本适用)
eg:
1、 创建用户
mysql> create user 'xx'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.01 sec)
注:只创建用户当用户进入数据库时无任何权限
2、为用户xx授权,*.*(所有权限)
mysql> grant all on *.* to 'xx'@localhost identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)
3、退出重新登录数据库
4、查看用户的权限
mysql> show grants for 'xx'@'localhost';
+-------------------------------------------------+
| Grants for xx@localhost |
+-------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'xx'@'localhost' |
+-------------------------------------------------+
**方法2:直接grant ** (5.8.0之后版本不适合)
1、为用户授权
mysql> grant all on school.* to 'xxx1'@localhost identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)
2、退出重新登录数据库
3、查看该用户的数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| school |
+--------------------+
生产环境授权用户建议:
1、博客,CMS等产品的数据库授权
select(查询),insert(插入),update(更新),delete(删除),create(创建)
库生成后收回create权限
2、生产环境主库用户授权
select(查询),insert(插入),update(更新),delete(删除)
3、生产环境从库授权
select(查询)
创建用户的方法
1、CREATE USER 创建
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass'; 创建用户
2、INSERT 创建
INSERT INTO mysql.user(user,host, authentication_string ,ssl_cipher,x509_issuer,x509_subject) VALUES('user2','localhost',password('ABCabc123!'),'','','');
FLUSH PRIVILEGES;
3、GRANT 创建
GRANT SELECT ON *.* TO user3@’localhost’ IDENTIFIED BY ‘123456’;
FLUSH PRIVILEGES;
用户授权
授权:help GRANT;
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass'; 创建用户
GRANT ALL ON db1.* TO 'jeffrey'@'localhost'; 用户可以查询db1数据库的所有表
GRANT SELECT ON db2.invoice TO 'jeffrey'@'localhost'; 用户只可以查看db1库的invoice表
ALTER USER 'jeffrey'@'localhost' WITH MAX_QUERIES_PER_HOUR 90; 用户每小时最多可以查询90条记录。
**语法格式**:
grant 权限列表 on 库名.表名 to 用户名@'客户端主机' [identified by '密码' with option参数];
==权限列表 all 所有权限(不包括授权权限)
==数据库.表名
*.* 所有库下的所有表 全局级别
web.* web库下的所有表 数据库级别
web.stu_info web库下的stu_info表 表级别
SELECT (col1),INSERT (col1,col2) ON mydb.mytbl 列级别
==客户端主机
% 所有主机
192.168.2.% 192.168.2.0网段的所有主机
192.168.2.168 指定主机
localhost 指定主机
with_option参数:
GRANT OPTION: 授权选项
MAX_QUERIES_PER_HOUR: 定义每小时允许执行的查询数
MAX_UPDATES_PER_HOUR: 定义每小时允许执行的更新数
MAX_CONNECTIONS_PER_HOUR: 定义每小时可以建立的连接数
MAX_USER_CONNECTIONS: 定义单个用户同时可以建立的连接数
查看用户权限(show)
语法格式:
show grants for '用户名'@'地址';
eg:
mysql> show grants for 'xx'@'localhost';
+-------------------------------------------------+
| Grants for xx@localhost |
+-------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'xx'@'localhost' |
+-------------------------------------------------+
收回权限(REVOKE )
语法格式:
REVOKE INSERT ON *.* FROM 'jeffrey'@'localhost';
eg:
mysql> revoke select on school.* from 'xxx1'@localhost;
Query OK, 0 rows affected (0.00 sec)
删除用户
方法一:
语法格式:
DROP USER 'jeffrey'@'localhost';
eg:
mysql> drop user 'xx'@localhost;
Query OK, 0 rows affected (0.00 sec)
方法二:在数据库表中删除用户
mysql> use mysql
mysql> delete from mysql.user
-> where user='xxx1'
-> and host='localhost';
权限应用的顺序:
user (Y|N) ==> db ==> tables_priv ==> columns_priv
面试题:用户xxx1的权限有什么?
1、收回xxx1 的select权限
mysql> revoke select on school.* from 'xxx1'@localhost;
Query OK, 0 rows affected (0.00 sec)
2、查看xxx1的权限
mysql> show grants for 'xxx1'@localhost;
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for xxx1@localhost |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'xxx1'@'localhost' |
| GRANT INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `school`.* TO 'xxx1'@'localhost' |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
注:该用户不能给别人授权
例题
MySQL第二次作业–库表操作
2、创建数据库school,字符集为utf8
3、在school数据库中创建Student和Score表
4、授权用户tom,密码mysql,能够从任何地方登录并管理数据库school。
5、使用mysql客户端登录服务器,重置root密码
2、创建数据库school,字符集为utf8
mysql> create database school default character set=utf8;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> show create database school; #查看数据库的字符集
+----------+-----------------------------------------------------------------+
| Database | Create Database |
+----------+-----------------------------------------------------------------+
| school | CREATE DATABASE `school` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+-----------------------------------------------------------------+
1 row in set (0.00 sec)
3、在school数据库中创建Student和Score表
mysql> create table score(
-> id int(10) primary key auto_increment,
-> stu_id int(10) not null,
-> c_name varchar(20),
-> grade int(10));
mysql> desc score;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| stu_id | int(10) | NO | | NULL | |
| c_name | varchar(20) | YES | | NULL | |
| grade | int(10) | YES | | NULL | |
+--------+-------------+------+-----+---------+----------------+
mysql> create table student(
-> id int(10) primary key auto_increment,
-> name varchar(20) not null,
-> sex varchar(4),
-> birth year,
-> department varchar(20),
-> address varchar(50));
mysql> desc student;
+------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| sex | varchar(4) | YES | | NULL | |
| birth | year(4) | YES | | NULL | |
| department | varchar(20) | YES | | NULL | |
| address | varchar(50) | YES | | NULL | |
+------------+-------------+------+-----+---------+----------------+
4、授权用户tom,密码mysql,能够从任何地方登录并管理数据库school。
mysql> create user 'tom'@'%' identified by 'mysql';
Query OK, 0 rows affected (0.00 sec)
mysql> grant all on school.* to 'tom'@'%';
Query OK, 0 rows affected (0.00 sec)
[root@localhost ~]# mysql -utom -pmysql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| school |
+--------------------+
2 rows in set (0.00 sec)
5、使用mysql客户端登录服务器,重置root密码
mysql> alter user root@localhost identified by '123456789';
Query OK, 0 rows affected (0.00 sec)
mysql> update mysql.user set authentication_string=password('123456')
-> where user='root' and host='localhost';
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 1