MariaDB-数据库入门
关系型数据库:
-
Oracle
-
MS SQL Server
-
MySQL
-
PostgreSQL
MySQL分支:
-
MySQL
-
MariaDB
-
Percona Server
-
AliSQL
非关系型数据库(NoSQL):key:value形式存储数据,数据之间没有关联
-
redis
-
mongodb
一、 安装配置mariadb
1、 安装MariaDB
yum install -y mariadb-server
systemctl start mariadb
systemctl enable mariadb
2、 配置MariaDB
2.1、 服务端配置文件
vi /etc/my.cnf
#数据存放位置
datadir=/var/lib/mysql
#socket文件所在位置
socket=/var/lib/mysql/mysql.sock
#指定监听地址,不写或设为0.0.0.0表示监听所有地址来访问,可以不写,默认就是监听所有。
bind-address
#服务器监听端口,默认为3306
port
#字符集
character-set-server=utf8
注意:针对不同用途,给了不同的配置文件模版,在/usr/share/mysql/*.cnf
2.2、 客户端配置文件
vi /etc/my.cnf.d/client.cnf
[client]
default-character-set=utf8
vi /etc/my.cnf.d/mysql-clients.cnf
[mysql]
default-character-set=utf8
2.3、 防火墙
firewall-cmd --permanent --add-service=mysql
firewall-cmd --reload
2.4、 修改root密码
安装完成后,数据库的root密码默认为空
mysql_secure_installation
-
设置root密码
-
删除可以从本地主机外部访问的root帐户
-
删除anonymous-user
-
删除test数据库
注意:必须先启动数据库,才能进行这步操作
2.5、 登陆
#本地登陆
mysql -u root -p
#远程登陆
mysql -u user1 -h 172.25.0.11 -p
注意
-
如果要在命令行输入密码,要紧跟-p后面,不能空格,否则认为密码为空
-
表和数据库的名称要区分大小写,命令不区分大小写
3、 SQL语言
-
DDL(Data Definition Language)数据定义语言,用于定义或修改数据库中的对象,如:表、索引、视图、序列、用户、角色、表空间等。
-
DML(Data Manipulation Language)数据操纵语言,用于对数据库表中的数据进行操作,如插入,更新和删除。
-
DCL(Data Control Language)数据控制语言,用来设置或更改数据库事务、权限操作(用户或角色授权,权限回收)、锁表(支持共享锁和排他锁两种锁表模式)、停机等。
-
DQL(Data Query Language)数据查询语言,用来查询数据库内的数据,如单表查询、多表查询。
4、 查看数据库
#查询数据库
mysql> show databases;
#查看databse()这个函数,查询当前数据库名称
mysql> select database();
#连接数据库mysql
mysql> use mysql;
#列出mysql库中的所有表
mysql> show tables;
5、 查看帮助
#查看create table命令的帮助
help create table;
6、 字符集
字符集不对,中文会乱码,使用utf-8
#character_set_database,当前字符集
mysql> show variables like '%char%';
7、 数据类型
字符型
-
char:定长数据类型,最大255字节,不管输入的字符多短,占用空间就是指定的大小
-
varchar:变长数据类型,最大65535字节,在指定范围内,用多少占多少
-
数值型
-
int:整型
-
float:浮点型,float(10,5),表示小数点前面最多10位数,小数点后面最多5位
日期时间型
-
date:YYYY-MM-DD
-
time:HH:MM:SS
-
datetime:YYYY-MM-DD HH:MM:SS
-
timestamp:YYYYMMDD HHMMSS
-
year:YYYY
内建类型
-
set,集合,指定一个字符集,赋值可以从这个字符集中选择多个字符进行组合。
-
enum,枚举,比如,一个字段是性别,只定义男和女,只能从中选一个
二、 DDL
在mysql管理软件,可以通过SQL语句中的DDL语言来实现对表结构的操作
-
create,创建表
-
alter,修改表
-
drop,删除表
注意:进入数据库后,命令可用tab补齐
1、 创建数据库
mysql> create database db1;
mysql> use db1;
#查看now()函数,查询当前时间
#在插入数据时,如果要插入当时时间,可直接调用now()函数
select now();
2、 创建表
#创建表t1
#同时,在表内创建4个列:id name sex age,并指定类型
#enum,枚举,只能从指定的选项中选一个
#male,男
#female,女
mysql> create table t1(id int,name varchar(50),sex enum('m','f'));
#列出t1表结构
mysql> describe t1;
#通过查询现有的表创建,新表会被直接插入查询来的数据
create table t1 select语句
#通过复制现有的表的表结构创建,不会复制数据,只复制表结构
create table t1 like 旧表;
3、 查看表
#查看表名称
show tables;
#查看t1表的属性
#engine,使用的引擎
#row_format,行格式,和引擎有关
#rows,总共有多少行数据
#avg_row_length,每行的平均数据大小
#data_length,总共数据大小
#data_free,已经分配置空间,但还没数据的大小
#auto_increment,下次该增长到几了
#collation,排序规则
show table status like 't1'\G
#查看详细的表创建过程
#显示会有点乱
show create table t1;
#更改显示风格
show create table t1\G
#查看表结构
describe t1;
4、 重命名表
#修改表名
mysql> alter table t1 rename t2;
5、 增加字段
#修改表table1,添加一列age
mysql> alter table t1 add column age int;
#在最前面加一个字段
mysql> alter table t1 add y1 int first;
#指定在哪个字段下面加一个新字段
mysql> alter table t1 add y2 int after age;
6、 修改字段
#modify主要用来修改字段类型
mysql> alter table t1 modify name char(10);
#change主要用来修改字段名,也可同时修改数据类型
#注意,必须加上数据类型,不管是旧类型,还是新类型
mysql> alter table t1 change name name1 varchar(50);
7、 删除字段
#修改表table1,删除age这个列
mysql> alter table table1 drop column age;
8、 删除表
#删除t1这个表
mysql> drop tables t1;
9、 删除数据库
#删除db1这个数据库
mysql> drop database db1;
三、 DML
在mysql管理软件,可以通过SQL语句中的DML语言来实现对数据的操作
-
insert,插入数据
-
update,更新数据
-
delete,删除数据
一次可插入一行或多行数据
注意:
-
字符串,必须加引号,双引号或单引号都可
-
整形,不用加引号
1、 插入数据
#插入完整数据
insert into 表名 values(值1,值2....);
#向t1这个表添加两行数据,中间用逗号隔开
#注意,没指定字段,必须按表结构的列字段的顺序插入数据
mysql> insert into t1 values(1,'tom','m'),(2,'jerry','f');
#指定字段插入数据
insert into 表名(字段名2,字段名5.....) values(值2,值5....);
#指定字段,只插入指定字段的数据
mysql> insert into t1(id,name) values(3,'sam');
#插入多条记录
#每条数据,用()括起来
#多条数据之间,用逗号隔开
insert into 表名 values
(值1,值2....),
(值1,值2....);
#插入查询结果
#从t2表中查询id>3的数据
#然后将这些数据,插入到t1表中
insert into t1 select * from t2 where id>3;
注意:两张表中对应的字段,数据类型必须要一致
2、 更新数据
update 表名 set
字段1=值1,
字段2=值2,
where 条件;
注意:如果不加where条件过滤,字段对应的数据,将全部被修改
#更新表t1,把name列的值是sam的行中,把id这一列的值改成 2
mysql> update t1 set id=2 where name='sam';
3、 查询数据
#列出t1表的所有行
mysql> select * from t1;
#查询表中的数据,但只列出id和name两列
mysql> select id,name from t1;
3.1、 where子句
指明过滤条件,过滤条件是一个布尔型表达式
LIKE
-
模糊匹配
-
%,任意长度的任意字符
-
_,任意单个字符
逻辑操作符:
-
AND,与
-
OR,或
-
NOT,非
-
XOR,异或,所谓异或,二者相同则为假,不同则为真
#一个条件就能查找到对应行
mysql> select * from t1 where id=1;
#需要两个条件才能找到对应行
mysql> select * from mysql.user where name='root' and host='localhost';
#查询所有名字以j开头的
select * from employee where name like 'j%';
#查询名字以j开头,并且后面只有一个字符的
#多个字符,就用多个_
select * from employee where name like 'j_';
4、 多表查询
#查询两张表中name字段相同的行,并进行合并
select * from t1,t2 where t1.name=t2.name;
5、 删除数据
#从表t1中删除id列为1的行
mysql> delete from t1 where id=1;
注意:一定要带where,指定限制条件,否则将清空整张表的数据
6、 实例1
#创建表2
#4列,id name interest birthday
#interest的值是一个集合,插入的数据只能从这个集合中选择
#birthday的值是一个日期
create table t2(id int,name varchar(50),interest set('chiji','basketball','bar'),birthday date);
#插入数据
insert into t2 values(1,'mike','chiji,bar',19910611);
四、 DDL进阶:约束条件
-
PRIMARY KEY(PK):标识为主键,可以唯一标识一条数据,不可为NULL
-
FOREIGN KEY(FK):标识为外键,标识表与表之间的关系,父表的主键和子表的外键
-
NULL:允许为空
-
NOT NULL:不能为空
-
UNIQUE KEY(UK):标识值是唯一的,不可重复,可以为空,一个表中可以有多个UK
-
AUTO_INCREMENT:标识值自动增长,整形,且为主键
-
DEFAULT:默认值
-
UNSIGNED:无符号,也就是正数
-
ZEROFILL:使用0填充
注意:
-
默认,字段允许为空(NULL),可设置为不允许为空(NOT NULL),就必须赋值
-
如果插入数据时,不给字段赋值,则该字段使用默认值,缺省的默认值是NULL
-
key
主键,PK
外键,FK
索引,index,UK
例1:
mysql> create table db1.t3(
-> id int not null primary key auto_increment,
-> name varchar(50) not null,
-> sex enum('m','f') default 'm' not null,
-> age int unsigned default 20 not null,
-> interest set('chiji','basketball','bar') default 'chiji,bar'
-> );
desc t3;
#插入一条数据,其它为默认值
insert into t3(name) values('sam');
例2:
#创建表t4
#指定dep_name字段的值,必须唯一,不能重复
mysql> create table t4(
-> id int,
-> dep_name varchar(50),
-> unique(dep_name)
-> );
desc t4;
insert into t4 values(1,'it')
例3:
例2还可以用以下方法:
mysql> create table t4(
-> id int,
-> dep_name varchar(50) unique,
-> );
1、 主键
-
主键是能确定一条记录的唯一标识。
-
primary key字段的值不允许重复,且不能为NULL(UNIQUE+NOT NULL)
-
主键可以是单列
-
也可以是多列(复合主键)
注意:如果没有显式地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,作为主键。
1.1、 单例主键
create table t5(
id int primary key not null auto_increment,
name varchar(50)
);
或者:
create table t5(
id int not null auto_increment,
name varchar(50),
primary key(id)
);
1.2、 复合主键
复合主键,允许其中某一个字段重复,但复合主键的多个字段连起来,不能重复
#mysql.user表就是复合主键
#以host和user为主键
#只有host和user两个条件加起来,才能定位到一行
desc mysql.user;
create table t6(
host varchar(20) not null,
user varchar(20) not null,
ip varchar(20),
primary key(host,user)
);
注意:复合主键,只能在最后用primary key指定,因为primary key只能在语句中出现一次
1.3、 增加主键
#增加主键,不建议用modify
#如果用modify,需要将字段的所有信息都重写一遍
alter table 表名 add primary key(id);
注意:
-
如果要修改的字段,已经是主键,modify的时候,就不要再加primary key这个约束条件了,否则报错
-
如果已经存在单列主键,想添加复合主键,需要先将已存在的主键drop掉,再添加
#比如:给当前主键ID增加auto_increment约束条件
#不要将primary key再加上
alter table tt modify id int not null auto_increment
1.4、 删除主键
注意:
-
如果主键有auto_increment,需要先将auto_increment删除,才能再删除primary key
-
因为auto_increment是依赖主键的
alter table tt modify id int not null;
alter table tt drop primary key;
2、 外键
外键用于与另一张表的关联。
注意:
-
子表的外键是关联父表的主键
-
一个字段不能同时作为父、子表的主键
-
外键和主键的数据类型和长度必须一致,比如:varchar(50)
2.1、 父表
create table t6(
name varchar(50) not null,
mail varchar(20),
primary key(name)
);
2.2、 子表
子表(t7)的name是外键,关联父表(t6)的主键name,同步更新,同步删除
create table t7(
id int not null auto_increment,
name varchar(50) not null,
payroll float(10,2) not null,
primary key(id),
foreign key(name)
#参照父表t6的name字段
references t6(name)
#同步更新
on update cascade
#同步删除,也就是说父表数据删除了,子表对应的行也删除
on delete cascade
);
insert into t6 values('sam','sam@example.com'),('jerry','jerry@example.com');
insert into t7(name,payroll) values('sam',8000),('jerry',10000);
#同步更新
update t6 set name='same' where name=sam;
select * from t7;
注意:如果子表没有设置同步更新,且已经有了数据,父表不允许更新
#同步删除
delete from t6 where name='jerrry';
select * from t7;
2.3、 添加外键
#给一个已经存在的表,添加一个外键
#constraint,给定义的约束取个名字,不指定,mariadb会自动分配一个
alter table t2 add constraint fk_t2 foreign key(name) references t1(name);
注意:子表中不能存在数据
2.4、 删除外键
#查看foreign key的名字
show create table t2\G
#通过名字,删除foreign key
alter table t2 drop foreign key fk_t2_t1;
五、 DQL
select,查询过程:
-
from,从哪个表查询
-
where,过滤表中的字段
-
group by,将过滤后的字段分组
-
having,将分组进行过滤
-
order by,将数据进行排序
-
select,挑选所需字段
-
limit,限制输出结果
#select的结果,如果符合缓存条件,会被缓存下来
#query_cache_type ON,表示开启了查询缓存功能
show global variables like 'query%';
1、 准备环境
#编号、姓名、性别、年龄、入职时间、职位、工资、部门编号
create database test;
use test;
#创建员工信息表
#id、姓名、性别、岁数、入职日期、部门id、职位、工资
create table employee(
id int primary key auto_increment not null,
name varchar(30) not null,
sex enum('m','f') default 'm' not null,
age int,
entry_date date not null,
dep_id int(3) zerofill not null
position varchar(50) not null,
salary double(15,2) not null,
);
#插入数据
insert into employee(name,sex,age,entry_date,dep_id,position,salary) values
('tom','m',20,'20010101',001,'engineer',10000),
('jerry','f',22,'20010102',002,'hr',3000),
('jack','m',30,'20120103',003,'seller',5000),
('tony','m',28,'20180101',003,'seller',5500),
('harry','m',34,'20180101',002,'hr',8000),
('marry','f',21,'20180501',002,'hr',10000),
('annie','f',NULL,'20180601',005,'seller',20000);
#部门信息表
#id、部门id、部门名称
create table department(
id int not null primary key auto_increment,
dep_id int(3) zerofill not null,
dep_name varchar(30) not null
);
#技术部,人事部,销售部、账务部
insert into department(dep_id,dep_name) values
(001,'technology'),
(002,'personnel'),
(003,'sales'),
(004,'finance');
2、 简单查询
#查询所有数据
select * from employee;
#只查询name和salary这两个字段的数据
select name,salary from employee;
2.1、 去重
#发现,查询出来的结果,很多重复的
select position from employee;
#distinct,去重
select distinct position from employee;
注意:distinct不能用于多字段查询,通常仅用于单个字段查询
2.2、 排序
根据指定的字段对查询结果进行排序,默认为升序(ASC),可手动指定降序(DESC)
#单列排序
#按salary进行排序
#默认按升序排列,从低到高
select * from employee order by salary;
#ASC,升序排列,默认的
select name,salary from employee order by salary ASC;
#DESC,降序排列,从高到低
select name,salary from employee order by salary DESC;
注意:
-
如果是数字,就按数字从小到大,或从大到小排序
-
如果是字符串,按头字母在字母表的顺序排序
#多列排序
#先按hire_date,降序排列
#再按salary,升序排列
select * from employee order by entry_date DESC,salary ASC;
2.3、 字段别名
#将name这个字段,显示为employee_name
select name as employee_name from employee;
2.4、 四则运算查询
四则运算,即加减乘除
#本来没有salary*12这个字段
#定义一个公式:slary*12,算出年薪,就是有薪乘以12
#默认,新字段名是以公式命名
select name,salary,salary*12 from employee;
#AS,表示给新字段起个别名
select name,salary,salary*12 AS annual_salary from employee;
#或者
#AS可以省略
select name,salary,salary*12 annual_salary from employee;
2.5、 限制显示的条数
对查询的结果进行输出行数的限制
#只显示前2行
select name,age from employee order by age desc limit 2;
#显示第3行到第4行
#第一个2,表示偏移量,偏移2行,也就是从第3行开始
#第二人2,表示显示后面2行,也就是第3行到第4行
select name,age from employee order by age desc limit 2,2;
3、 where子句
指明过滤条件,过滤条件是一个布尔型表达式
-
算术操作符:+,-,*,/,%
-
比较操作符:=,!=,<>,<,<=,>,>=,注意:!=和<>,都表示不等于
-
BETWEEN min_num AND max_num;#指定一个范围
-
IN (element1,element2);#in后面跟一个列表,在列表内指明取值的范围,要么等于element1,要么等于element2
-
IS NULL;#指明值为空的行
-
IS NOT NUL
-
LIKE,#模糊匹配;#%,任意长度的任意字符;#_,任意单个字符
-
RLIKE,#后面跟正则表达式
逻辑操作符:
-
NOT#非
-
AND#与
-
OR#或
-
XOR#异或
#所谓异或,二者相同则为假,不同则为真
3.1、 单条件查询
select name,position from employee where position='hr';
3.2、 多条件查询
#查询HR部门,并且工资高于3000的人
select name,position from employee where position='hr' and salary>3000;
#查询HR部门,或工资高于3000的人
select name,position from employee where position='hr' or salary>3000;
3.3、 关键字between and
#查询工资在5000-10000之间的人
select name,salary from employee where salary between 5000 and 10000;
#排除工资在5000-1000之间的人
select name,salary from employee where salary not between 5000 and 10000;
3.4、 关键字IN
#查询工资在3000,5000,8000,10000的人
#太麻烦
select name,salary from employee
where salary=3000 or salary=5000 or salary=8000 or salary=10000;
#使用IN,指定一个集合
select name,salary from employee
where salary in (3000,5000,8000,10000);
#not in,取反
select name,salary from employee
where salary not in (3000,5000,8000,10000);
3.5、 关键字is null
#查询age字段是空的数据
select name,age from employee where age is null;
注意:null和空格不是一回事,空格,是一个特殊字符。
#查询age字段不是空的数据
select name,age from employee where age is not null;
3.6、 like
like,模糊查询
通配符%,匹配任意个任意字符
通配符_,匹配一个任意字符
#查询所有名字以j开头的
select * from employee where name like 'j%';
#查询名字以j开头,并且后面只有一个字符的
#多个字符,就用多个_
select * from employee where name like 'j_';
3.7、 正则表达式查询
regexp,使用正则表达式
#^ja,以ja开头
select * from employee where name regexp '^ja';
#om$,以om结尾
select * from employee where name regexp 'om$';
#n{2},n出现两次
select * from employee where name regexp 'n{2}';
#.o.*,表示第二字母是o,第一个字母任意,o后面有任意个任意字符
select * from employee where name regexp '.o.*';
4、 使用函数查询
-
avg(),求平均值
-
max(),求最大值
-
min(),求最小值
-
count(),求数量
-
sum(),求和
#count,统计查询的行数
select count(*) from employee;
#max,最大值
#查询谁的工资最高
select max(salary) from employee;
#min,最小值
#查询谁的工资最低
select min(salary) from employee;
#avg,平均值
#查询平均工资
select avg(salary) from employee;
#sum,求和
#查询所有人的工资总和
select sum(salary) from employee;
#查询出工资最低的那个人的信息
select name,salary from employee
where salary = (select min(salary) from employee);
4.1、 自定义显示格式
#自定义显示格式为:name annual salary:
#并起个别名:annual_salary
#注意,字符串前后加一个空格,否则,两个字段中间没有间隔
#concat()函数用于将多个字段的值,拼接成一个字段
select CONCAT(name,' annual salary: ',salary*12) annual_salary from employee;
5、 group子句
根据指定的条件把查询结果分组,然后进行“聚合”运算
#按性别进行分组,然后算出每个性别的平均年龄
#注意,结果一个组只会显示一行数据,只是个代表,代表一组数据
#avg(),算平均值函数
select sex,avg(age) from employee group by sex;
#按性别进行分组,然后算出每个性别的平均年龄,最后算出平动年龄大于25的分组
select sex,avg(age) as ages from employee group by sex having ages>25;
注意:
-
where,是对select的结果进行过滤
-
having,是对group by的结果进行过滤
6、 子查询
-
子查询是将一个查询语句嵌套在另一个查询语句中。
-
内层查询语句的查询结果,可以为外层查询提供查询条件
-
子查询中可以包含:IN、NTO IN、ANY、ALL、EXISTS、NOT EXISTS等关键字
-
还可以包含比较运算符:=、!=、>、<等
#查询dep_id在department表中存在的行
select * from employee
where dep_id in (select dep_id from department);
#查询年龄大于平均年龄的人
select name,age from employee where age>(select avg(age) from employee);
7、 多表查询
7.1、 交叉连接查询
不带任何匹配条件,才叫交叉连接,生成笛卡尔积。但结果可能不是我们想要的,所以还是要带上匹配条件,结果和内连接一样了。
#查询所有人在哪个部门
#两张表中不重复的字段,可以省略前面的表名称
#但如果有重复的字段,必须指明表名称,否则报错
#发现,没有匹配的行,并没有列出来,比如,005号部门和annie这个员工
select name,age,employee.dep_id,dep_name from employee,department where employee.dep_id = department.dep_id;
7.2、 inner join(常用)
内连接,只连接匹配的行
#将两张表交叉的部分打印出来。
select * from employee a inner join department b on a.dep_id=b.dep_id;
7.3、 left join
左连接,返回左表所有的行,即使右表没有匹配
#不管有没有连接,把左边employee表内的项都显示出来
#发现annie的部门名称是NULL
select name,dep_name from employee left join department on employee.dep_id = department.dep_id;
7.4、 right join
右连接,返回右表所有的行
#不管有没有连接,把右边department表内的项都显示出来
#发现finance部门没有人
select name,dep_name from employee right join department on employee.dep_id = department.dep_id;
7.5、 union
全外连接
-
连接两个以上的SELECT语句的结果组合到一个结果集合中。
-
多个SELECT语句会删除重复的数据。
#合并两条语句结果,去重,得到所有
#union,合并去重
select * from employee a left join department b on a.dep_id=b.dep_id
union
select * from employee a right join department b on a.dep_id=b.dep_id;
#去掉两个表相同的数据
select * from employee a left join department b on a.dep_id=b.dep_id where b.dep_id is null
union
select * from employee a right join department b on a.dep_id=b.dep_id where a.dep_id is null;
注意:union查询的分析结果会产生一张额外的临时表。
六、 DCL
默认,有个mysql库,里面包含以下表:
-
user,记录用户信息,包含用户名,权限等
-
db,数据库级的权限
-
tables_priv,表级的权限
-
columns_priv,列级的权限
-
procs_priv,存储过程的权限
-
proxies_priv,代理用户的权限
1、 用户管理
1.1、 登陆
mysql -h 192.168.1.11 -P 3306 -uroot -p'123' mysql -e 'select user,host from user'
-
-h,指定主机名
-
-P,指定mysql服务端口
-
-u,指定用户名
-
-p,指定密码
-
mysql,指定登陆的数据库名称,这里指登陆到mysql这个库
-
-e,要执行的SQL语句
1.2、 创建用户
用户账号组成部分:
'username'@'host'
-
host,指作为客户端的主机,如果是主机名,需要能反解
-
可用通配符:% _
方法一:
create user user1@'localhost' identified by '123';
方法二:
#grant命令本来是用来赋权的
#如果给一个不存在的用户赋权,则会直接创建这个用户
grant all on *.* to 'user1'@'localhost' identified by '123';
#刷新权限
flush privileges;
注意:
-
一定要刷新权限,否则当前不生效
-
因为,创建的用户信息是存在磁盘上,而当前生效的信息在内存中
-
刷新就是将磁盘上的信息同步到内存中
1.3、 用户重命名
rename user old_name to new_name
2、 删除用户
2.1、 方法一
mysql> drop user 'user1'@'localhost';
2.2、 方法二
mysql> delete from mysql.user where user='user1' and host='localhost';
3、 修改用户密码
3.1、 方法一
#root用户的旧密码是123,改成345.
mysqladmin -uroot -p'123' password '345'
3.2、 方法二
#password()函数,对密码进行hash加密
update mysql.user set password=password('345') where user='root' and host='localhost';
#刷新
#在数据库启动时,验证数据会被加载到内存,运行过程中,会使用内存的数据来进行验证。
#而我们上面的步骤只是修改了磁盘上的数据,内存中的数据并没有被修改,所以需要刷新一下,重新加载验证数据
flush privileges;
3.3、 方法三
#更改当前用户的密码
mysql> set password=password('345');
mysql> set password for user1@'localhost'=password('345');
-
注意,只有root用户才能更改其它用户的密码
3.4、 方法四
mysql> alter user root@'localhost' identified by "redhat"
4、 root密码丢失
#重启的时候,跳过授权表
vi /etc/my.cnf
[mysqld]
skip-grant-talbes
systemctl restart mysqld
#跳过授权表,就不需要密码认证了
mysql -uroot
#跳过授权表,就没办法使用工具改密码了,只能直接改数据库
update mysql.user set password=password('NEW_PASSWORD')
where user='root' and host='localhost';
注意:
-
跳过授权表后,不能使用set命令改密码
-
修改完密码,别忘了恢复配置文件,重启服务
5、 权限管理
5.1、 语法
grant 权限列表 on 库名.表名 to '用户名'@'客户端主机' [identified by '密码' with option 参数];
权限列表:
-
all,所有权限(不包括授权权限)
-
select,update,delete等
数据库名.表名:
-
*.*表示所有库下的所有表,全局级别
-
db1.*表示db1这个库下的所有表,库级别
-
db1.tab1表示db1库下的tab1表,表级别
-
select (column1),insert(column2,column3) on db1.tab1 表示column1这个列只有select权限,column2和column3两列有insert权限,列级别
客户端主机:
-
localhost仅本地
-
%表示所有主机
-
192.168.1.%表示192.168.1这个网段内的所有主机
-
192.168.1.1指定一台具体主机
#查看拥有全局权限的用户信息
#\G,将内容坚着显示
#mysql.user表记录的是用户信息,及全局权限
#mysql.db表记录的是库级别的权限
select * from mysql.user\G
5.2、 设置权限
grant all on *.* to user1@'%' identified by 'Redhat123';
#grant option,表示user2可以将自己的权限再次授权给别人
grant all on *.* to user2@'%' identified by 'Redhat123' with grant option;
#查看全局级别权限
select * from mysql.user\G
#如果db1这个库不存在,也没关系,可以赋权之后,再去创建
grant all on db1.* to user3@'%' identified by 'Redhat123';
#查看库级别权限
select * from mysql.db\G
#如果库和表都不存在,没关系
grant all on db1.t1 to user4@'%' identified by 'Redhat123';
#查看表级别权限
select * from mysql.tables_priv\G
#如果表不存在,会报错
#列不存在,没关系
grant select(col1),insert(col2,col3) on db1.t1 to user5@'%' identified by 'Redhat123';
#查看列级别权限
select * from mysql.columns_priv\G
5.3、 查看权限
#查看当前用户的权限
show grants\G
#查看指定用户的权限
#注意,只有管理员才能查看
show grants for user1@'%'\G
5.4、 收回权限
#只回收部分权限
revoke delete on *.* from user1@'%';
#回收所有权限
revoke all privileges on *.* from user2@'%';
#回所所有权限,及赋权权限
revoke all privileges,grant option on *.* from user2@'%';
七、 备份数据库
http://172.25.254.254/content/courses/rh254/rhel7.0/materials/mariadb/
0.1、 备份
#将数据库t1备份到/tmp/bachup目录下,备份文件名叫t1.dump
mysqldump -u root -p t1 > /tmp/backup/t1.dump
#备份所有数据
mysqldump -u root -p --all-databases > /tmp/backup/all.dump
0.2、 恢复
systemctl stop mariadb
#删除数据文件
rm -rf /var/lib/mysql/*
systemctl start mariadb
方法一:
mysql -u root -p tt < /tmp/backup/tt.dump
mysql -u root -p --all-databases < /tmp/backup/all.dump
#从全备中只恢复tt这个数据库
mysql -u root -p tt < /tmp/bakcup/all.dump
方法二:
mysql> source /backup/2018-07-28-11-mysql-all.sql