高性能MySQL(1):浅析MySQL基本常识

一、并发控制

二、事物

2.1、什么是事物

事物是逻辑上的一组操作,要么都执行,要么都不执行。

事物的四大特性(ACID):

(1)原子性:事物是最小执行单元不可再分割,原子性确保动作要么全部完成,要么全部不完成;

(2)一致性:执行事物前后数据保持一致,多个事物对同一个数据读取结果相同;

(3)隔离性:并发访问数据库时,一个用户的事物不被其他事物干扰,彼此间独立;

(4)持久性:一个事物提交后,它对数据库中的数据改变是持久的,即使数据库发生故障也不用改对其有影响。

MySQL 命令行的默认配置中事务都是自动提交的,执行SQL语句后马上执行 COMMIT 操作,而Oracle不会)

2.3、并发事物带来的问题

经常会出现多个事物并发运行,操作相同的数据来完成各自的任务,也就是多个用户对同一数据操作,可能会导致如下问题:

(1)脏读:当一个事物正在访问数据并且对数据进行了修改,这种修改还没有提交到数据库中,这时另一个事物也访问并使用了这个数据。因为读的是还没有提交的数据所以读取的是“脏数据”,脏数据可能是不正确的。

(2)丢失修改:一个事物读取一个数据时另一个事物也访问了该数据。第一个事物修改了这个数据后,第二个事物也修改了这个数据,这样第一个事物修改的结果就被丢失

(3)不可重复读:一个事物内多次读取同一个数据。这个事物还没有结束时另一个事物也访问了该数据,在第一个事物两次读取数据之间,由于第二个事物的修改导致第一个事物两次读取的数据可能不太一样。导致同一个事物内两次读取到数据不一样,就是不可重复读。(重点在修改)

4)幻读:与不可重复读类似。它发生在一个事物读取了几行数据,接着另一个并发事物插入一些数据。对吼查询中第一个事物发现多了一些不存在的记录就好像发生幻觉一样。(重点在新增或者删除)

不可重复读和幻读区别:

不可重复读重点是修改,比如多次读取一条记录发现其中某些列值被修改;幻读重点是新增或者删除,比如多次读取一条记录发现记录增多或者减少了。

2.4、事物隔离级别

(1)READ_UNCOMMITTED(最低隔离级别)——读取未提交——脏读、幻读、不可重复读

允许读取尚未提交数据,可能会导致脏读、幻读、不可重复读

(2)READ_COMMITTED——Oracle默认——读取已提交——幻读、不可重复读

允许读取并发事物已提交的数据,可阻止脏读,但幻读和不可重复读仍可发生。

(3)REPEATABLE_READ——MySQL默认——可重复读——幻读

对同一字段多次读取结果一致(除非被本身事物修改),可以阻止脏读和不可重复读,幻读仍可发生

(4)SERIALIZABLE(最高隔离级别)——可串行化——都可防止

完全服从ACID的隔离级别,所有事物依次执行,可防止脏读、不可重复读、幻读。但是性能不好不常用

2.5、数据库三大范式

第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列;

第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分;

第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。

(2NF与3NF容易混淆:2NF——非主键列是否完全依赖于主键,还是依赖于主键的一部分;3NF——非主键列是直接依赖于主键,还是直接依赖于非主键列)

三、多版本并发控制(MVCC)

仅 InnoDB 支持。应对高并发事务, MVCC比单纯的加锁更高效,MVCC只在“读取已提交”和“可重复读”隔离级别工作,MVCC可以使用乐观锁、悲观锁来实现,各数据库MVCC并不统一。

......待更新

四、存储引擎

4.1、MyISAM与InnoDB的区别

(1)MySQL不同版本默认存储引擎不同:MyISAM是5.5版本之前的默认引擎,InnoDB是5.5版本之后的;

(2)是否支持行级锁:MyISAM只支持表级锁,而InnoDB即支持表级锁又支持行级锁,默认是行级锁;

(3)是否支持事物和崩溃后恢复:MyISAM强调的是性能,每次查询具有原子性,速度比InnoDB更快(不是绝对的),但不提供事物支持,不可崩溃恢复;InnoDB 提供事物支持和外部键等功能,具有事物(commit)、回滚、崩溃恢复、事物安全(ACID)

(4)是否支持外键:MyISAM不支持、InnoDB支持;

(5)是否支持多版本并发控制(MVCC):仅InnoDB支持,应对高并发事物MVCC比单纯加锁更高效。

五、MySQL主从复制(自带的工功能)

Mysql 环境安装参考: https://blog.csdn.net/a774630093/article/details/79270080

关闭防火墙 systemctl stop firewalld.service

5.1、主从复制原理 

MySQL有一种日志叫bin日志(二进制日志binLog),这个日志会记录所有修改了数据库的SQL语句。主从复制原理就是把主服务器上的bin日志复制到从服务器上执行一遍,这样从服务器上的数据就和主服务器上的数据相同了。

疑问1:如果MySQL集群,需要考虑哪些问题?——数据实时同步问题,通过主从复制可实现。

疑问2:不小心删表了怎么办?——所有变更都可到binLog文件找日志,然后恢复就行了

5.2、主从复制目的

通过主从复制可以实现数据备份、故障转移、高可用、集群、读写分离

5.3、主从复制配置

主服务器节点:

vi /etc/my.cnf  新增以下内容
server_id=177  ###服务器id
log-bin=mysql-bin   ###开启日志文件
重启mysql服务 service mysqld restart
验证是否已经配置成功
show variables like '%server_id%';
能够查询对应配置文件中的server_id 说明已经配置成功
show master status;
能够看到同步的文件,和行数 说明已经配置成功。

从服务器节点:

克隆服务器
vi /etc/my.cnf
server_id=178  ###从服务器server_id
log-bin=mysql-bin  ###日志文件同步方式
binlog_do_db=test   ###同步数据库


重启mysql服务 service mysqld restart
验证是否已经配置成功
show variables like '%server_id%';
能够查询对应配置文件中的server_id 说明已经配置成功

从服务器同步主服务器配置
change master to master_host='192.168.212.200',master_user='root',master_password='root',
         master_log_file='mysql-bin.000002',master_log_pos=216;
开始同步 
start slave
检查从服务器复制功能状态
SHOW SLAVE STATUS

Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

解决办法
因为服务器克隆的时候交UUID产生了重复 ,解决办法

Cat  /etc/my.cnf
cd /var/lib/mysql
rm -rf auto.cnf
重启服务器即可
service mysqld restart

下一篇:https://mp.csdn.net/postedit/103778112

  参考资料:《高性能MySQL 第三版》

### 若对你有帮助的话,欢迎点赞!评论!转发!谢谢!

发布了52 篇原创文章 · 获赞 116 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/RuiKe1400360107/article/details/103727285