sql之增删改查 (insert、 delete.、update、select)数据库的四剑客

数据库需要掌握的重点

1、掌握常见的数据库类型及各自的特点
2、理解MySQL的工作原理

DBMS数据库管理系统

  数据库的服务    数据库  库  表

查询、添加(插入新数据)、修改、删除
rm -rf /*一定不能执行

数据库的备份

全量备份
三进制备份

数据库:数据信息(既有区别又有联系)
数据的存放位置:”服务器(服务器的结构)远程 IP地址

数据库系统的特点:

1.实现数据的共享(百度网盘)
2.减少系统和数据的冗余 (避免数据的重复)
3.数据实现集中控制(数据存放的位置是一样的)
4.保持数据的安全、完整合并发
5.故障恢复(数据丢失的找回方法,备例)

数据库的模型:

层次模型:(以一个树状的形式显示)((缺点:进行复杂数据的查看花费时间长))
网状模型:(一个数据能够有多个父节点,允许一个数据可以没有父节点)
关系模型: 查询数据可以把两个数据库联系起来进行查询,数据库1(姓名,ID年龄,性别)和数据库2(姓名、成绩)(数据有限制,内容是固定的)
面对对象模型:对数据的详细描述,对数据属性的描述

数据恢复:三步骤:刪除了数据库, 回滚日志到第二步

关系型数据库

关系型数据库是指采用关系型模型来组织数据的数据库。关系型数据库采用了关系对应的表现形式,以行和列的形式存储数据,就像是一组二维表格,便于用户理解。(淘宝不属于关系型数据库)

关系型数据库
oracle数据库:收费的,适应场景:政府机构,银行、证券公司(对数据要求高并且稳定性强的场合)
access数据库:也是在Windows上使用

非关系型数据库

Memcached 是一个开源的、高性能的、具有分布式内存对象的缓
Redis 与 Memcached 类似,也是一个高性能的键值( Key-Value)存储数据库系统。

mongoDB数据库:没有企业使用mongodb做为主库,存放数据的位置

DBMS:数据库管理系统

             - 数据库服务
                      - - - - 数据库
                             - - - - - -   库    单独创建
                                     - - - - - - - - -        表    必须选择数据库,然后再去创建表

SQL简介

数据表是关系型数据库 MySQL 的基本存储单元,它与生活中使用的 Excel 表格
类似。在实际的生产环境中,因为需要控制硬件成本,所以在安装操作系统时都
是进行最小化安装,并不提供图形化界面,因此 MySQL 也不能像在 Excel 中那
么便捷地修改数据。为了能够对数据进行管理,VMySQL 中提供了 SQL 来支持数
据操作。

sql功能:增刪改查、存储数据
sql:结构化查询语言

sql:语句的分类

DDL:数据定义语言—对象:数据库(create创建、drop删除、alter修改)(create既可以用来创建数据库也可以用来创建数据库的表)
DML:数据操纵语言—数据库当中的表 (insert增、delete删、update修改、 select查 (delete删除, 那么只能删除表当中的数据,但是表的结构依然存在)
DCL:数据控制语言—授权、取消授权(grant授权、revoke取消权限、create user)
create database
create table
DQL:数据查询语言—数据库当中的表(select查询)from、where

三种数据类型

整数类型:int tinyint
字符串类型:CHaR VARCHAR
日期和时间类型:DATE、DATETIME、TIME

整数类型:tinyint int

单精度和双精度的区别:1、所占的字节数不一样,单精度所占的字节是4个字节,双精度所占的字节是8个字节
2、有效的数字位数不一样,单精度有效数字的8位, 双精度有效数字是16位

字符串类型:char、varchar 取值字段都是0-255

char(20)字符串字节为20 定长(如果内容只占了15个后面还有五个就是会自动用空格补全)
varchar(30)字符串字节为30(如果内容只占了20后面不会用空格补全该是多少就是多少)

数据库的操作命令

数据库中没执行一条命令结尾必须是分号结尾,并且分号是英文的
查看当前有哪些数据库:show databases;|

创建数据库:create database 数据库名;

如果想看数据库里面有哪些表(先进入数据库use 数据库名;在执行直看表的命令show tables ; show tables from 数据库名;

如果想要查看数据库单面某一张表的结构(先进入数据库use 数据库名;再执行desc 表名;) desc 数据库名 表名;

查看当前我正在使用的数据库是哪一个select database();

使用数据库/进入到某一个数据库:use (database) 数据库名; (括号里面的内容代表可有可为)

drop删除数据库

删除数据库drop database 数据库名;(即可以删除数据库也可以删除表,如果是删除表那么整张表都会被删除,包括表内容,表结构delete删除表,表内容删除,但是表的结构依然存在)
删除表drop table 表名;(把整张表删除)

delete删除

delete删除(①删除所有的数据②删除部分数据)只是删除表里面的数据,结构不会删除,(如果是自动增长,表结构依然存在,数据的id会从之前删除的末尾继续)
删除所有数据:delete from 表名;(表当中的数据都会被删除,但是表结构依然存在)
删除部分数据:delete from student where age = 30;(如果满足后面的条件,则只会删除和后面条件相关的数据)(如果是自动增长,表结构依然存)

truncate +表名删除(删除表当中的数据,表结构依然存在,如果有自动增长的不会延续id号,而是从新开始)

创建表

创建表: create(创建) table 表 dd(表名)(字段1 类型,字段2 类型,字段3 类型);例:create table dd(id int not null,name varchar(20) not null,age tinyint );(创建了学号姓名年龄)noll 为空
在每次创建表的时候都在最后加上 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;即可在表中添加中文
自动增长:auto_increment primary key一般跟主键连用

查看表结构:desc 表名;

查看表的属性/可以查看表是如何创建的show create table 表名\G; (当信息
混乱时,就反斜杠大写G)
查看表结构:1.describe 表名 2.desc +表名

登录数据库的方式

1.mysq]-u用户 -p密码
2.mysql -u用户 -p密码 -h主机地址/1ocalhost/服务端IP地址
3.mysq1-用户 -P密码 -P端口号
4.mysql -u用户 -p密码 -e‘命令’ 代表的是不登录到数据库里面直接查看命令

创建数据库需要注意的内容

1.数据库的名字是唯一的不能重复,不能大小写混用(数据库里面执行的命令可以大小写一起用,大写主要是为了区分命令和参数的区别)
MariaDB [(none)]> create database (if not exists) if not exists代表的是如果后面的数据库不存在则创建,如果存在则不创建) “括号单面的内容可有可无
2.尽量多使用字母和数字,尽量少使用特殊符号
3.不能使用关键字】
4.不能单独使用数字作为数据库名
runtime1 runtime_2
5.数据库名字最长128位

英语单词:insert插入 select查询、from从哪里、delete删除

数据库四剑客(增刪改查)

向数据库里面的表添加数据时(①向指定某一列添加②批量添加)(和名字有关的要用单引号框起来)(没有设置主键、自动增长…数据可以重复添加)

insert插入数据的方式

需要选择字段(name,age) +数据
插入多条数据语法insert into 表名 (字段1,字段2,字段三) values(字段一的数据,字段二的数据,字段三的数据) ,(),()… 例如(insert into 表名 (id,name,age) values(1,'tom",13),(2, ‘jerry’,15),(3,‘lisi’,2)

插入一条数据语法insert into 表名(字段1, 字段2, 字段3,…) values(字段一的值,字段二的值,字段三的值,…)(数值和字段是一一对应)

插入指定列数据时:insert into 表名(字段1,字段3) values(字段1的值 字段3的值)

插入多条数据insert into 表名(字段1,字段3) values(字段1的值 字段3的值),(字段1的值 字段3的值)…
insert into student(id,name) values(7,‘alice’);

查询表里面的数据 select * from 表名;(*表示所有)

修改alter

1.修改表名

语法:alter table 旧表名 rename [to]新表名;
alter table student1 rename student2; P(代表把student1的名字数为student2)

2.修改表字段

语法:alter table 表名 change 原來的字段名字 +新字段的名字+新字段的类型
alter table student2 change age score float;
(代表把student2表当中的age字段改为score字段同时指定新字段的类型float)

modify.修改。

修改字段的数据类型alter table 表名 modify 字段 字段类型;
alter table 表名 modify id tinyint; ( 代表把id字段的类型改为tinyint)

add添加表的字段

alter table 表名 add 新字段名 数据类型:
alter table student add score float; (向student表中添加新字段,新的字段为score字段类型为float)

删除表当中的字段

alter table 表名 drop 需要删除的字段;
alter table student drop score; (代表删除student表中score的字段)

修改表字段的排列顺序

alter table 表名 modify 字段1名(要修改的字段)+数据类型 + fipst/after+ 字段2名
例:alter table student modify name varchar(20) after age; (代表把name的字段放在age字段的后面)

更新数据update

修改表当中数据:update 表名 set 字段名=值;
更改全部的数据:update student set age = 20;(修改student表中,把所有的年龄都设置为20岁
更改部分数据:update 表名 set 字段名= 值 Where 条件;
例:update 表名 set age = 15 where name = jerry;
“代表的是修改student表中,满足条件名字为jerry时,把年龄设置为15岁

select查询

select * from student3 where age <15; 查询student3表当中年龄小于15岁的不包含15岁
select * from student3 where age>15; 查询student3表当中年龄大于15岁的不包含15岁
select * from student3 where age >= 15; 查询student3表当中年岭大于15岁的,包含15岁
select * from student3 where age <= 15; 查询student3表当巾年龄小于15岁的,包含15岁
select * from student3 where age != 15; 查询student3表当中年龄不是15岁的”
select * from student3 where age = 15;’查询student3表当中年龄是15岁的
select * from student3 where age between 15 and 20;查询student3表当中年龄在15-20岁之间的,并且包含15和28

select * from student3 where age is not null; 查询Student3表当中年龄是空的有哪些
select * from student3 where age is null; 查询student3表当中年龄是空的有哪些”

and代表两个条件同时满足

select * from student3 where age >= 15 and age <=20;
or代表两个条件满足其中一个”
select * from student3 where age >= 30 or age <= 20;

order by升序 也就是从小到大的顺序

按照从小到大的顺序排序:select * from 表名 order by 字段;
select * from student3 order by age;把student3表当中年龄按照从小到大的顺序排序
select * from 表名 order by 字段 desc;
select * from 表名 order by age desc; 把student3表当中的年龄按照从大到小的顺序排序

limit 数字----代表的是取前多少个值

select * from 表名 order by 字段 desc limit 3;先从大到小排序取年龄最大的前三位

select"* from 表名 order by 字段 desc limit 2.3;
把student3表当中的年龄按照从大到小的顺序排序取年龄最大的二位同学但是跳过前两位 ,前面2指跳过前两位取后面3位。

主键

学生表(学号、姓名、性别、班级) -----学号是唯一,学号也就是主键
课程表(课程编号、课程名、学分) ----课程编号是唯一的,课程编号就是一个

主键
主键:在关系型数据库当中,是唯一的并且只能有一个 ,是唯一标识,并且能够确定是哪一条记录

某一张表(id、 name、age) —id是主键
第二张表(id.name、age) ----id和name一起组合起来那么就是复合主键

复合主键

复合主键:指的是表的主键包含一个以上的字段组成,把字段组合起来我们称他为复合主键
复合主键的使用场景:在一个主键不能唯一标识这个表的记录的时候可以使用

主键的约束规则:①不允许为空②能够唯一标识(不能重复)

创建主键的方式:

    ①创建表的时候直接添加:create table 表名(字段  数据类型 not null primary key);create table yun(id int not null primary key,name varchar(20),age tinyint);
      创建一张名为yun1的表,其中包含id,name,age字段,并且id不允许为空也是主键
    ②:表已经创建完成之后添加主键:alter table 表名 add primary key(需要添加主键的字段);
       alter table yun1 add primary key(id); 修改yun1表中的id字段,给id字段添加主键

删除主键

删除主键的方式: alter table 表名 drop primary key;
alter table yun2 drop primary key; 删除yun2表当中的主键字段

唯一键

唯一约束:一张表当中可以有多个唯一键,并且可以为空
id name age
id设置为唯一键(1.2.3.4…) 不能为相同的
name设置为唯一键(zhangshan null )值不能相同,但是可以是空的

创建唯一键的方式:

①:创建表的时候直接添加:create table 表名(字段 数据类型 unique);
create table yun1(id int unique,name varchar(20),age tinyint);
创建一张名为yun1的表,包含id,name,age字段,但是把id设置为了唯一约束
②:表已经创建完之后添加唯一键:alter table 表名 add unique(id);修改yun1表中id的字段为唯一键

删除唯一键的方式

刪除唯一键的方式 : ①drop index 唯一键的字段名 on 表名;
drop index phone on orders; 删除orders表当中phone字段的唯一键。
②alter table 表名 drop index 唯一键的字段名

自动增长的设置方式:

1.创建表的时候设置:create table 表名(字段 数据类型 auto_increment primary key);
2.表已经创建完成再去添加自动增长:alter table 表名 modify 字段 数据类型 aufo_increment primary key;

非空约束的创建方式:

创建表的时候设置:create table 表名(字段 数据类型 not null);
表已经创建完成后再去添加非空约束:alter table 表名 modify 字段 数据类型 not null;

默认值的创建方式:

创建表的时候创建:create table 表名(字段 数据类型 default 默认值);
表已经创建完成后去添加默认值:alter table 表名 modify 需要添加默认值的字段 字段的数据类型 default 默认值;

外键

外键:表的外键是另外一张表的主机,可以有重复,并且可以为空,就是用来和其他表建立联系,外键可以有多个
主键所在的表为主表,外键所在的表为从表,两表之间的关系为主从关系

设置外键的方式:

1.创建表的时候添加:create table 表名(字段 数据类型,foreign key (需要设置为外键的字段) references 主表的名字(主表中主键的字段));
2.表创建完成之后再去添加外键:alter table 表名 add foreign key(需要设置为外键的字段) references 主表(主键的字段);

外键约束:

1.主表当中没有数据时,从表无法插入数据
2.从表的数据删除之后才能够删除主表的数据
刪除外键的方式:alter table 表名 drop foreign key 外键的名字;(外键的名字可以使用show create table表名\G查看)

普通索引的创建:

①创建表的时候添加:create table 表名(字段 数据类型,index 索引名(需要添加索引的字段);(其中索引的名字是由大家自己来去定义的)

create table student(id int,name varchar(20),age tinyint,index yunjisuan(name)
创建一个名为student的表,表中有j,name,age字段,然后添加索引索引名字为yunjisuan,这个索引添加到name字段
②表已经创建完成再去进行添加索引:create index 索引的名字 on 表名(需要添加索引的字段);
create index yun on student1(name); 把student表的name字段添加索引,索引的名字为yun

查看索引是否创建成功:show index from表名\G

删除普通索引

删除普通索引:drop index 索引名 on 索引所在的表;
唯一索引,只要是设置了唯一索引的字段,那么这个字段就不允许有重复的值。保证数据的唯一性

唯一索引的创建;

创建表的时候添加:create table 表名(字段·数据类型,unique index 索引名(需要添加唯一索引的字段));
表已经创建完成再去进行添加唯一索引:create unique index 索引名 on 表名(需要添加唯一索引的字段);
刪除唯一索引:alter table 表名 drop index 索引的名字;

关系型数据库

在关系型数据库当中,数据库表和表直接的联系有很多种(一对一、一对多(多对一) 、多对多)
一张表的一条数据只能能与另外一张表的一条数据对应

一对多:

也就是一张表的一条数据可以和另外一张表的一条或者多条数据相关联
两张表相同的字段是stu_id,查询时可以指定两张表的stu_id相同的时候,把这个学生姓名以及成绩一起查询出来,学生表称为父表,成绩表称为子表

多对多:

在多对多关系中,两个数据表中的数据需要通过“中间人”实现数据的连接,每条记录都可以和另一个数据表里任意数量的记录相关联
teacher和class没有联系起来之前是单独的两张表,然后我们可以通过中间人(tea_class)来把两张表联系起来,联系起来之后每条记录都可以和另外一张表的任意数据联系

合并结果集:对表的连接查询

union:

能够把两张表的数据合并到一起进行查询,当有重复的数据那么只会显示一条
语法:select * from 表1名 union select * from 表2名;

例如:select * from test1 union select * from test2;
把test1和test2两张表的内容合并查询,如果结果有重复的则只显示一次

union all:

能够把两张表的数据合并到一起查询,如果查询的时候有重复的数据也不会进行覆盖,而且全部都显示
语法:select * from 表1名 union all select * from 表2名;

例如:select * from test1 union all select * from test2;
把test1和test2表当中的所有的数据进行合并查询,查询结果不会覆盖而且全部显示。

语法select 表1名.需要查询表1的字段,表2名.需要查询表2的字段 from 表1名 cross join 表2 ;
例如:select emp.empno,emp.ename,dept.deptno,dept.dname from emp cross join dept;
代表的是查询emp和dept表中员工编号以及部门编号把所有可能组合的选项全部列出来
语法:select 表1名.需要查询表1的字段,表2名.需要查询表2的字段 cross join 表2 where 条件;

内连接:

将两个表中的记录组合, 并返回关联字段相符的记录, 也就是返回两个表的交集部分 (是数据库中默认的查询方式)
内连接查询的返回结果只包含符合查询条件和连接条件的数据
语法:select 字段 from 表1 inner join 表2 on 条件;
select emp.empno,emp.ename,dept.deptno,dept.dname from emp inner join dept on

emp.deptno=dept.deptno where empno=2;
查询emp表中的empno和ename字段以及dept表中的deptno和dname字段,当两张表中的部门编号一致并且员工编号为2的查询出来

外连接查询与内连接查询不同的是

内连接查询的返回结果只包含符合查询条件和连接条件的数据,而外连接查询可以返回没有关联的数据,返回结果不仅包含符合条件的数据,而且包含左表或右表或两个表中的所有数据。

外连接:

而外连接查询可以返回没有关联的数据, 返回结果不仅包含符合条件的数据,而且包含左表或右表或两个表中的所有数据

左外连接:

以左表为基准,把左表的数据全部显示出来,右表中满足条件的显示出来, 不满足条件的显示为空。
语法:select 查询字段 from 表1 left join 表2 on 表1.字段=表2.字段 where 条件;
(on是两张表的连接条件,where后面跟上查询条件)

右外连接

右外连接:右外连接以右表为基准,右表的数据行全部保留,左表保留符合连接条件的行
语法:select.字段 from 表1 right [outer] join 表2 on 表1.字段=表2.字段 where 条件;
(on是两张表的连接条件,where后面跟上查询条件)
select * from a_table right join b_table on a_table.a_id=b_table.b_id;
left左边 right右边

左右外连接的区别

左外连接,保留了左表,右边取符合条件的数据;右外连接就保留右表数据, 左表取符合条件的数据

数据库的登录方式:

1.-h 指定登录的主机 (既可以跟上主机名/IP地址)
语法:mysql -u用户-p用户的密码-h主机名/IP地址
A主机192.168.88.130(数据库) B主机192.168.88.150(数据库)
----B主机连接A主机:mysql -uroot -p -h(A的地址)

2.-u 指定登录的用户 (既可以是管理员也可以是普通用户)
语法:mysql -u用户 -p用户的密码

3.-p 指定登录用户的密码
语法:mysql -u用户 -p

  1. -P 指定端口号
    语法:mysql -u用户 -p 用户的密码 -p端口号
    httpd80 ssh22 nginx80 mariadb3306

5.-e不登录数据库直接执行命令
语法:mysql -u用户 -p用户的密码-e’需要执行的命邻’

6.mysql -uroot -p123456 yunjisuan 代表的是用root用户登录到数据库,并且自动进入yunjisuan数据库中

7.mysql --user=root --password=123456

数据库的退出方式

(数据库的退出是没有办法回到上一步的,只有两个状态要么直接退出去,要么不退出)
1.exit.
2.quit.
3.\q
8、查看有哪些用户可以登录
select user,host from mysql.user;

ctrl+z 代表的是停止,这个进程还存在只不过放在了后台,随时用随时调取
jobs查看后台进程有哪些
fg把后台的作业调用到前台 fg %(加上后台进程号)
ctrl+c代表的是终止,这个进程不存在了,当想要再次执行那就再次执行命令

创建用户

语法:create user ‘用户名’@'主机名/IP地址’identified by ‘密码’;

具体用法:create user ‘tom’@‘localhost’ identified by ‘123’;
代表创建一个名为tom的用户能够在本地以123的密码登录

create user ‘jerry’@‘localhost’;
创建用户jerry能够不使用密码登录

查看用户以及能够登录的主机

select user,host from mysql.user;(不管是管理员还是普通用户都可以看到)

删除用户

1.drop user ‘用户名’@“主机名/IP地址”;
用法drop user ‘tom’@‘192.168.253.155’;
删除tom能够在192.168.253.155这台主机上面的登录

2.delete from mysql.user where host=‘主机名/IP地址’ and user=‘用户名’;
用法delete from mysql.user where host=‘localhost’ and user=‘tom’
删除tom用户在本机的登录

修改用户密码

1.mysqladmin (给管理员修改密码)
语法:mysqladmin -uroot -p原来的密码 password 新密码
(不用在数据库里面修改密码)

mysqladmin -uroot -p123 password 123456
代表的是把root用户的密码从原来的123改为123456

2.set (既可以是普通用户使用也可以是管理员用户使用)
①语法:set password for ‘用户名’@'主机名/IP地址’ =password(‘需要设置的新密码’);
(管理员给普通用户修改密码方式)

set password for ‘tom’@‘localhost’=password(‘123456’);
修改tom用户在本机登录的密码为123456

②语法:set password=password(‘新密码’);(普通用户给自己修改密码的方式)
例如:set password=password(‘123456’);

3.alter

语法:alter user ‘用户名’@'主机名/IP地址’ identified by ‘新密码’;
alter user ‘tom’@‘localhost’ identified by ‘123’; 代表的是修改tom用户在本地登录的密码为123

4.update

语法:update mysql.user set authentication_string=password(‘新密码’) where user=‘用户名’ and host=‘主机名/IP地址’;
(如果修改密码成功但是还是原来的密码可以登录,就用别的方式修改一下密码,然后再从新用update这个命令修改密码,再重启服务就好了)

mysql密码破解步骤

mysq1破解数据库密码跟mariadb有区别
mysql破解密码:
①安装mysql
②修改my.cnf配置文件,添加内容skip-grant-tables-true
③重启服务生效
④登录数据库,不需要密码登录
⑤修改用户密码, 看到显示ok代表修改成功
⑥退出数据库去验证, 修改my.cnf文件把添加的内容删除
⑦重启服务生效,以新密码登录

给用户修改名字

rename user‘原来的用户名’@‘主机名/IP地址’ to ‘新名字’@'主机名/IP地址’
例如:rename user ‘alice’@‘localhost’ to ‘zhangshan’@‘localhost’;
把Alice用户重命名为zhangshan

给用户添加权限

create drop —创建用户、数据库、表、删除用户、删除数据库、删除表
insert 、delete、update、select ----表
index ----创建索引、删除索引|
alter —修改表结构/表名
grant —可以授权
all (添加所有的权限)

CREATE ROUTINE·权限允许用户创建要保存的程序(函数)
FILE 权限允许用户使用 LOAD DATA INFILE和 SELECT INTO OUTFTLE 等语句读写服务器上的文件

all (添加所有的权限)
select * from mysql.user\G(查看所有用户所有的权限)

授权(给用户授权用户可以事先不存在,授权的过程会自动创建)
语法:grant 需要赋予的权限 on 数据库名.表名 to ‘用户名’@'主机名/IP地址’identified by ‘密码’;
with grant option:如果添加了这个内容那么就意味着授权的用户也能够把这个权限赋予其他人
例如:grant insert on . to ‘tom’@‘localhost’ identified by ‘123456’;
授权插入的权限运用在所有数据库中所有表给tom用户

查看权限

show grants for‘用户名’@'主机名/IP地址;

取消权限:revoke

语法:revoke 需要取消的权限 on 数据库.表名 from ‘用户名’@注机名/IP地址’;
revoke insert on from ‘jerry’@‘localhost’; 取消jerry用户插入的权限

事务

事务:保证唯一性和准确性

commit 提交:

在没有提交之前的所有操作不是真正的修改,只有执行commit提交之后才会真正生效

rollback 回滚:

回到命令没有执行之前的状态
回滚的操作只能回滚未提交(没有执行commit的)的数据,至于已经执行commit的操作无法回滚到之前的状态

查看数据库自动提交模式是开启还是关闭:
show variables like (on开/0FF关)

手动关闭自动提交模式:
set autocommit=0;(临时生效)

验证commit提交
①关闭自动提交模式
②开启begin
③执行相关的操作
④执行commit提交
⑤验证发现双方结果都发生了变化

并发:
把时间分成若干段,让我们误以为是同时在运行。 (既可以出现在单核处理器也可以出现在多核处理器)
并行:
同一个时间,处理不同的请求,是真正的在同时运行 (只能够出现在多核处理器)

事务ACID特性—需要弄清楚有哪些特性。这些特性分别是什么意思
事务的隔离级别—要知道有哪些级别

事务出现的一些情况
1.脏读
2.不可重复读
3.幻读
隔离级别由低到高:
—读未提交(不能避免脏读,实际运用很少,安全性不高)
—读已提交(可以避免脏读,但是不能避免可重复读和幻读)
—可重复读(可以避免脏读已经不可重复读,1 但是无法避免幻读)
—可串行化(能够解决幻读问题,通过添加锁来去解决所有的情况,只能有一个用户进行操作,只有前一个用户执行commit提交才可以由后面的用户执行操作,一旦没有执行commit提交那么只能等待)

查看当前数据库的隔离级别:select @@tx_isolation;

用户自行更改隔离级别
set session transaction isolation level 隔离级别;
(隔离级别:read committed 、read uncommitted repeatable read 、serialzable)

set session transaction isolation level read uncommitted;
代表把用户的隔离级别改为读未提交
set session transaction isolation level read committed;
代表把用户的隔离级别改为读已提交

数据库的备份

通过判断服务器是否在线的备份方式分类

热备份:数据库处于工作状态时进行的备份
冷备份:数据库关闭的时候进行备份
温备份:中间的状态

根据备份方式不同:物理备份、逻辑备份
根据备份的数据大小分类:全量备份、增量备份、差异备份

全量备份:对全部的数据进行备份, ,也可以称为完全备份,也就是整个数据全部备份(备份的数据是最大的)(时间最长)
优点:可以对数据进行全部的恢复
缺点:重复的內容较多,并且备份时间长
第一天:A
第二天:A+B
第三天:A+B+C
第四天:A+B+C+D

增量备份:在第一次全备基础之上对后面新增的内容做的备份(增量备份前需要进行全备份)(备份的数据是最小的)(时间最短)
优点:备份数据体积小
缺点:恢复数据时间长
第一天:A (全量备份)
第二天:B 新增的数据

差异备份:主要备份的是第一次备份后到目前为止产生的数据(差异备份前需要进行全备份)(数据介于全量备份和增量备份之间)(时间两者之间)
第一天:A(全量备份)
第二天:B B-A=
第三天:c c-A=

tar备份和恢复

1.需要创建备份文件所存放的目录

2.进行备份需要备份的数据存放在/var/lib/mysql
tar -jcf(-zcf/jcf)/创建的备份文件的目录名(backup)/备份后的文件名(具体时间+文件名,比如202204841415-mysql.tar.bz2)/var/lib/mysql

3.模拟数据丢失,首先关闭数据库服务,进入/var/lib/mysql删除所有内容

4.恢复备份tar xf 压缩包名-C 指定解压位置

5.开启服务进行验证

全量备份步骤

全量备份数据
1.安装备份工具

2.手动添加一些数据,然后进行备份数据库
mariabackup --backup --target-dir=/root/fullbackup --user=root --password=123456
(–backup代表的是对数据库进行备份,–target-dir指定数据备份之后的位置,
–user指定数据库用户,–password指定用户密码)

3.备份数据mariabackup --prepare --target-dir=/root/fullbackup --user=root --password=123456
(–prepare备份数据)
模拟数据丢失

4.进入数据存放的位置,删除所有内容
模拟数据恢复

5.数据恢复mariabackup --copy-back --target-dir=/root/fullbackup --user=root --password=123456
(–copy-back数据恢复时使用,–target-dir指定数据还原时数据从哪里还原)

6.修改数据存放位置的所有者和所属组为mysql用户

7.重启数据库进行验证

增量备份步骤:

1.确保数据库服务是安装,并且数据库里面有内容

2.数据库进行全量备份mariabackup --backup --target-dir=/root/fullbackup --user=root --password=123456
(–backup代表的是进行备份。–target-dir代表的是备份后文件所存放的位置)

3.进行增量备份mariabackup --backup --target-dir=/root/inc1 --incremental-basedir=/root/fullbackup --user=root --password=123456
(–backup代表备份,–target-dir指定增量文件所存放的位置,–incremental-basedir告诉增量备份全量备份的文件在哪里)

4.对数据做全量备份mariabackup --prepare --target-dir=/root/fullbackup --user=root --password=123456
(–prepare代表是对数据做全量备份)

5合并全量备份和增量备份mariabackup --prepare --target-dir=/root/fullbackup/ --user=root --password=123456 --incremental-dir=/root/inc1/–apply-log-only
(–target-dir指定全量备份文件位置,-incremental-dir指定的是增量备份文件位置,
–apply-log-only是增量备份和全量备份合并时必须要使用)

模拟数据丢失
6.进入数据库存放位置删除所有数据

模拟数据恢复
7.mariabackup --copy-back --target-dir=/root/fullbackup/ --user=root --password=123456
(–copy-back代表数据恢复,恢复的时候指定文件为全量备份文件)

8.修改数据存放位置的所有者和所属组改为mysql改的是/var/lib/mysq1目录下所有内容的权限

9.重启服务生效