mysql读写锁表区别?
MySQL读写锁表的区别:
读写锁。
读锁:是一种共享锁,一个事务持有读锁时,不会阻塞其它的读锁,其他事务都可以对该数据进行读取;
写锁:是一种排他锁,一个锁持有写锁会阻塞其他的写锁和读锁,从而保证了一个只有一个事务进行写操作,并且防止其他事务读取正在写入资源,避免了脏读;
mysql从库 binlog写入会加排他锁吗?
MySQL从库的binlog写入不会加排他锁。在MySQL的主从复制中,主库会将其写入的数据变更记录在binlog中,然后传输到从库并在从库上执行相同的数据变更操作,从而保持主从数据的一致性。
从库在执行binlog中记录的数据变更操作时,并不会加锁,因为从库的目标是将数据变更操作应用到自己的数据中,而不是控制并发访问的并发性。所以,在从库上执行binlog写入不会加排他锁。
mysql从库 binlog同步会加排他锁吗?
MySQL从库的binlog同步过程不会加排他锁。在MySQL的复制过程中,从库会连接到主库,并通过读取主库的binlog来获取更新的数据。这个过程是通过异步的方式进行的,从库不会对主库的数据进行修改或加锁。因此,binlog同步不会引入额外的锁机制,不会对主库的并发性能产生影响。这也是MySQL复制机制的一个优点,可以实现高性能的数据复制和同步。
mysql从库在进行binlog同步时,会加排他锁来保证数据的一致性和避免并发写入的冲突。这是因为从库在进行同步时需要对数据进行修改,如果不加锁可能会导致数据的不一致性和错误的结果。因此,为了保证数据的正确性和一致性,mysql从库在binlog同步时会使用排他锁。
1. 不会加排他锁。
2. 因为MySQL的从库在进行binlog同步时,是通过读取主库的binlog文件并解析其中的事件来实现的,不会对从库的数据进行写操作,因此不需要加排他锁。
3. 由于不需要加排他锁,从库在进行binlog同步时可以并发地读取主库的binlog文件,提高了同步效率。
同时,从库的读操作也不会被同步过程所阻塞,保证了从库的读写性能。
mysql新增字段为何会锁表?
MySQL在5.6.0版本之前对表结构进行修改会锁表的,5.6以后引入了online ddl,online ddl解决的就是修改表结构时候锁表的问题,能够让mysql在进行表变更时候,不影响正常的读写操作。要知道为什么表结构变更时候(新增/修改字段、索引的删除和添加)会锁表,就得知道当我们修改表结构时候,MySQL都做了哪些事情。
SQL语言
- DQL:数据查询语言:SELECT <字段名表> FROM <表或视图名> WHERE <查询条件>;
- DML:数据操作语言:INSERT/UPDATE/DELETE;
- DDL:数据定义语言:CREATE TABLE/VIEW/INDEX;
- DCL:数据控制语言:授权、事物ROLLBACK/COMMIT;
DDL
在MySQL5.6之前的版本中,执行ddl有copy和inplace两种方式,可以根据命名就知道两种方式的意思。其中replace方式仅支持添加、删除索引操作。这两种方式都是锁表操作。copy方式执行的操作:- 创建一个临时表,和要修改的表结构一致;
- 将原来的表锁住,禁止DML操作,可以DQL操作;
- 将原来的表数据拷贝到临时表中
- 将临时表重命名为原来的表,删除原来的表
- 创建新的索引数据
- 新建索引的数据字典
- 锁表,禁止DML操作,可以DQL操作;
- 构造新的索引数据
- 等待所有只读操作完毕
- 创建索引结束
线上大数据表如何执行DDL
当我们需要对生产数据库中的表执行DDL的话,一定要小心,一定要慎之又慎。一不小心就会导致锁表,锁表一旦产生,数据库就会堆积大量对该表的请求,瞬间将数据库的连接吃没,CPU飙升,最后。。。数据库宕机!这里提供以下思路供大家参考:1.停服务执行,这种方式要求业务可以停止运行的情况下执行,比如半夜凌晨执行表结构变更,简单粗暴。2.参考copy的方式自己执行这些步骤:
创建一个临时表table_copy,代表最新的表结构和索引;
- 把旧表的数据copy到新表:这步不要用sql操作,自己写一个脚本,按照数据的创建时间一次10000条的拷贝到新表,这个过程中可能会有新的数据进入,所以根据每一条记录的创建时间不断同步,直至两张表的记录完全一致,再执行第三步。
- 删除旧表,把新表重命名为旧表的名字