锁机制与实现主从复制

版权声明:本博文仅供学习、参考、技术讨论,版权归笔者/译者所有。 https://blog.csdn.net/qq_38025219/article/details/84199264

锁机制

因资源共享,而造成的并发问题。
例子:
买最后一件衣服, 商品加锁 -》 流程 -》商品解锁

锁分类:
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变量进行修改
演示:
主数据库创建表,查看从数据库是否同步。

猜你喜欢

转载自blog.csdn.net/qq_38025219/article/details/84199264