01.基本知识
名词解释
数据库 - database 数据库管理系统 - dbms 数据库系统 - dbs
DDL - 数据定义语言。create,drop 之类对表、存储过程等进行操作的命令 DML - 数据操作语言。CRUD之类的对数据进行操作的命令,insert,update,delete DQL - 数据查询语言。select DCL - 数据库控制功能
mysql体系
事务隔离级别
概述
mysql 事务隔离级别按照从低到高依次是:Read uncommitted、Read committed、Repeatable read、Serializable。每个隔离级别对应的问题如下: 
隔离级别的查看与设置
查看当前会话隔离级别:select @@tx_isolation;
查看系统隔离级别:select @@global.tx_isolation;
设置当前会话隔离级别:set session transaction isolatin level repeatable read;
设置系统隔离级别:set global transaction isolation level repeatable read;
Read uncommitted
描述:未提交读,可以读取到其他未提交的事务影响到的数据 导致的问题:脏读 原理:已知有两个事务A和B, A读取了已经被B更新但还没有被提交的数据,之后,B回滚事务,A读取的数据就是脏数据。 案例:公司发工资了,领导把5000元打到Tom的账号上,但是该事务并未提交,而Tom正好去查看账户,发现工资已经到账,账户多了5000元,非常高兴,可是不幸的是,领导发现发给Tom的工资金额不对,是2000元,于是迅速回滚了事务,修改金额后,将事务提交,Tom再次查看账户时发现账户只多了2000元,Tom空欢喜一场,从此郁郁寡欢,走上了不归路…... 分析:上述情况即为脏读,两个并发的事务:“事务B:领导给Tom发工资”、“事务A:Tom查询工资账户”
Read committed
描述:已提交读,只能读取到提交后的数据 导致的问题:不可重复读 原理:A多次读取同一数据,B在其中修改了数据并提交,导致A多次读取的数据不一致 案例:Tom拿着工资卡去消费,酒足饭饱后在收银台买单,服务员告诉他本次消费1000元,Tom将银行卡给服务员,服务员将银行卡插入POS机,POS机读到卡里余额为3000元,就在Tom磨磨蹭蹭输入密码时,他老婆以迅雷不及掩耳盗铃之势把Tom工资卡的3000元转到自己账户并提交了事务,当Tom输完密码并点击“确认”按钮后,POS机检查到Tom的工资卡已经没有钱,扣款失败,Tom十分纳闷,明明卡里有钱,于是怀疑POS有鬼,和收银小姐姐大打出手,300回合之后终因伤势过重而与世长辞,Tom老婆痛不欲生,郁郁寡欢,从此走上了不归路...... 分析:上述情况即为不可重复读,两个并发的事务,“事务A:POS机扣款”、“事务B:Tom的老婆网上转账”
Repeatable read
描述:可重复读,避免隔离级别 read committed 导致的不可重复读的问题 导致的问题:幻读 原理:已知有两个事务A和B,A从一个表中读取了数据,然后B在该表中插入了一些新数据,导致A再次读取同一个表, 就会多出几行,简单地说,一个事务中先后读取一个范围的记录,但每次读取的纪录数不同,称之为幻象读。 案例:Tom的老婆工作在银行部门,她时常通过银行内部系统查看Tom的工资卡消费记录。2019年5月的某一天,她查询到Tom当月工资卡的总消费额(select sum(amount) from record where card_id='6226090219290000' and date_format(create_time,'%Y-%m')='2019-05')为80元,Tom的老婆非常吃惊,心想“老公真是太节俭了,嫁给他真好!”,而Tom此时正好在外面胡吃海塞后在收银台买单,消费1000元,即新增了一条1000元的消费记录并提交了事务,沉浸在幸福中的老婆查询了Tom当月工资卡消费明细(select amount from record where card_id='6226090219290000' and date_format(create_time,'%Y-%m')='2019-05')一探究竟,可查出的结果竟然发现有一笔1000元的消费,Tom的老婆瞬间怒气冲天,外卖订购了一个大号的榴莲,傍晚降临,Tom生活在了水深火热之中,只感到膝盖针扎的痛......
Serializable
描述:串行执行,读和写互相锁定,读取数据时会导致写等待,同样的写时导致读等待。
案例验证不可重复读

MVCC

架构图

文件系统
# 查看数据文件路径
show variables like '%datadir%';
多种后缀名的文件 
undoLog
查看关于 undoLog 的参数:show variables like '%innodb_undo%';
redoLog
redoLog 的写入机制 
binLog

binLog 的文件结构
binLog 的相关操作

在配置文件中设置 binLog 的参数:

binglog恢复数据
概述
通过下面命令查看是否开启 log_bin
SHOW VARIABLES LIKE '%log_bin%';
如果没有要修改配置文件,windows版本的配置文件在 C:\ProgramData\MySQL\MySQL Server 5.7\my.ini 在 [mysqld] 下添加下面的设置
log-bin=ccbinlog # binlog文件的文件名称
binlog-format=ROW # binlog 的ROW模式 - 数据量大,恢复数据最准确
设置完毕后要重启数据库服务
MYSQL中查看binlog
# 查看当前有哪些binlog 文件
SHOW BINARY LOGS;
# 等价于下面的
SHOW MASTER LOGS ;
# 当前正在使用的 log 文件
SHOW MASTER STATUS;
# 查看binlog 文件的记录
SHOW BINLOG EVENTS;
# 查看指定的binlog文件,引号里面是文件的名称
SHOW BINLOG EVENTS IN 'ccbinlog.000001';
windows中查看binlog
这里的操作都是在 windows 的 cmd 中执行命令,上面的都是在MYSQL IDE 中执行命令的
# 在CMD中切换路径到 C:\ProgramData\MySQL\MySQL Server 5.7\Data
# 然后执行下面的命令查看指定文件的内容
mysqlbinlog "ccbinlog.000001"
# 注意这里是 windows 下的 cmd 环境中,所以不要使用分号
# 将日志文件提取SQL语句
mysqlbinlog "文件名" > "test.sql"
通过 binlog 恢复数据
创建了名称为 testbinlog 的数据库,并且创建了表 weixin_user 写入了两行数据,然后通过 drop database 删除了数据库,接下来在 datagrip 中查看 binlog ,看下图
接下来在 windows 的 cmd 中恢复被删除的数据库

上面的 --start-position=539 表示从行号多少开始恢复,自然后面的 --stop-position 是结束的位置编号,后面的 ccbinlog.000001 是 binlog 的文件名称,所以要现在 datagrip 中通过 show master logs 查看当前 binlog 文件的名称,后面还要显示的给出登录 mysql 的账号和密码,回车即恢复数据了,在 2020年10月29日 16:32:41 测试成功
清空日志
# 删除日志文件
purge binary logs to 'ccbinlog.000001'
# 清除指定时间点之前的内容
purge binary logs before '2020-10-29 00:00:00'
# 清空当前 binlog 文件中的所有内容
reset master;
binLog 和 redoLog 的区别

mysql基本数据库
sys
mysql
INFORMATION_SCHEMA
PERFORMANCE_SCHEMA
收集数据库服务器性能参数
排序规则
概述
创建数据库时在字符集下面有个排序规则,看下图
定义:在指定字符集下不同字符的比较规则 有以下几个特征:
- 它和字符集有关
- 每个字符集都有多种排序规则
- 每个字符集都会指定其中一个规则作为默认
作用与影响
- 影响 order by 排序结果
- 影响 where 字句中大于、小于号的结果
- 影响 distinct、group by、having 等语句的查询结果
- 如果索引列是字符类型也会影响到索引的创建
总结:凡是用到字符类型的比较、排序时都和该排序规则有关
