锁机制
因资源共享,而造成的并发问题。
例子:
买最后一件衣服, 商品加锁 -》 流程 -》商品解锁
锁分类:
1、操作类型:
① 读锁(共享锁)
多个读同时进行,互不干扰
②写锁(互斥锁)
如果当前写操作没有完毕,则无法进行读操作和写操作
2、操作范围
表锁
myISAN一次性对一个表整体加锁(开销小,加锁快,无死锁,范围大,容易发生锁操作,并发度低)
行锁
innoDB一次对一条数据加锁,开销大,加锁慢,容易出现死锁;锁范围小,不易发生锁冲突,并发度高:脏读,幻读
页锁
例子:
locak table 表名 reade/writer ,.....
show open tables;查看加锁的表
读:select 写:insert。update
–如果某一个会话,对A表进行读操作、不能进行写操作
对其它表读写都不可以。
–总结,如果会话0对a表加了锁,其它会话操作,可以对其它表进行读写操作。对a表可以读,写需要等待释放锁
释放锁:unlock table;
写锁:
会话0:
当前回话可以对加了写锁的表进行(读写操作),但是不能操作其它表
其它会话:
对会话0加写锁的表,可以对进行(增删改查),但是要等待释放锁。
mysql表级锁,
myisan select 前加读锁
inser、updata、delete 加写锁
分析表锁定:
查看哪些表加了锁: show open tables;
分析表锁定的严重程度
show statis like 'table%'
Table_locks_immediate 可能获取到的锁数
Table_locks_waited : 需要等待的表锁数,越大锁竞争越大
>5000 选择Innodb
否则用 myisan
分析行锁(InnoDB)
自动增加commit,oracle不会自动提交
关闭自动提交
set autocommit = 0;
插入一行,两个回话进行争夺
提交的作用?
没提交时在缓存里面,没有入库
行锁小结:
1.如果会话x对某条数据a进行DML操作,其它会话需要等待
2.行锁通过事务解锁rollback,commit
3.不同行操作不影响
注意:如果没有索引,行锁自动变成表锁
--数据被阻塞,索引类出现类型转换,行锁升级为表锁。
行锁的高特殊情况,间隙锁,值在范围内,但却不存在。
1-9,没有7的时候,给7加一个间隙锁(行锁),无法访问。
行锁:InnoDB
性能损耗大,高并发用,效率高
行锁分析: 一些参数对比
查询行锁: 查询的时候,别人不能修改
begin;事务自动提交关闭
主从复制(集群)
数据库复制为多个请求分流;
负载均衡、失败迁移。
设置主从数据库;两个数据库数据同步,读写分离
难点(数据同步)
window : 主
linux : 从
删除:mysql隐藏文件,mysql缓存文件;注册表删除
–重启计算机
再进行安装MySQL;允许远程访问和运行;
连接远程 linux ipconfig地址
需要授权远程访问,linux里面授权远程访问:防火墙关闭
主从同步原理:
二进制日志文件 binary log (数据库操作的备份)
主数据库改变记录到二进制文件
从数据库开启时读写主数据库二进制文件。
io线程,获取到二进制文件新增数据放到从数据库 relay log(中继日志文件)
中继日志事件,将中继日志文件拷贝到数据库中。
主从复制是异步的,串行化,有延迟的
一个主,从有多个。
主机配置:
windows: my.ini
配置之前,将权限、防火墙关闭。允许远程链接(一个sql语句)
主机里面打开配置文件:[mysqld] server-id =1
log-bin=“mysql/data/mysql-bin”
–错误记录文件
log-error=“mysql/data/mysql-error”
–主从同步时,忽略数据库
binlog-ignore-db=mysql
–指定主从同步时,同步哪些数据库
binlog-do-db = test
sql–授权哪台计算机是自己的从计算机(配置ip)
GRANT REPLICATION slave,reload,super ON . TO ‘root’@‘192.168.2.%’ IDENTIFIED BY ‘root’;
flush privilegs;
–查看主计算机状态(文件名和pocition【磁盘道】)
show master status
从机配置
linux : my.cnf
关闭防火墙:service ip tables stop
[mysqld] server-id =2
log-bin=“mysql/data/mysql-bin”
–错误记录文件
log-error=“mysql/data/mysql-error”
replicate-do-db = test --同步哪些数据库
–设置主机,授权
CHANGE MASETER TO
MASTER_HOST = ‘192.168.2.2’,
MASTER_USER = ‘root’,
MASTER_PASSWORD = ‘root’,
MASTER_PORT =3306,
master_log_file = ‘mysql-bin.000001’,
master_log_pos = 107; --position 的值
--STOP SLAVE;再次执行(报错)
–开启主从同步
从计算机
show slave status \G
–查看slave_IO_running,slave_SQL_running 确保都是yes
–检查日志报错, 查的时候是_,配置的时候是-;
从计算机设置id的时候是有bug的,版本兼容
set变量进行修改
演示:
主数据库创建表,查看从数据库是否同步。