热门回答:
DQL:数据查询语言:SELECT <字段名表> FROM <表或视图名> WHERE <查询条件>;
DML:数据操作语言:INSERT/UPDATE/DELETE;
DDL:数据定义语言:CREATE TABLE/VIEW/INDEX;
DCL:数据控制语言:授权、事物ROLLBACK/COMMIT;
创建一个临时表。和要修改的表结构一致;
将原来的表锁住。禁止DML操作。可以DQL操作;
将原来的表数据拷贝到临时表中
将临时表重命名为原来的表。删除原来的表
创建新的索引数据
inplace方式执行的操作:
新建索引的数据字典
锁表。禁止DML操作。可以DQL操作;
构造新的索引数据
等待所有只读操作完毕
创建索引结束
2.参考copy的方式自己执行这些步骤:
创建一个临时表table_copy。代表最新的表结构和索引;
把旧表的数据copy到新表:这步不要用sql操作。自己写一个脚本。按照数据的创建时间一次10000条的拷贝到新表。这个过程中可能会有新的数据进入。所以根据每一条记录的创建时间不断同步。直至两张表的记录完全一致。再执行第三步。
删除旧表。把新表重命名为旧表的名字
3.pt-online-schema-change:在线修改大数据表结构工具。可以google了解一下。
其他观点:
锁是计算机协调多个进程或线程并发访问某一资源的机制。数据库中。数据也是一种供许多用户共享的资源。需要用到锁来保证数据的一致性。
添加表字段本身就是对自身表结构的修改。而在一开始创建表之后就会存储到对应的数据文件当中。如果不加锁。当前你在修改的时候。客户端请求还可以继续来访问数据。这样违背了数据的一致性。因为前后的表结构已经发生了变化
例如:接通电路的时候。我们同样需要关闭电源的开关
如何发现表锁
对于锁定表。首先我们需要去发现它。这样才能做故障的排查
1、服务端命令检查
一般情况下我们可以通过show processlist 来检查出是那条语句导致大量查询语句处于等待状态。然后kill 掉修改表格语句的进程。
2、服务监控提示
可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺:
mysql> show status like 'table%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| Table_locks_immediate | 2979 |
| Table_locks_waited | 0 |
+-----------------------+-------+
2 rows in set (0.00 sec))
如果Table_locks_waited的值比较高。则说明存在着较严重的表级锁争用情况。
Table_locks_immediate表示立即释放表锁数
Table_locks_waited表示需要等待的表锁数
表结构修改原理
在MySQL5.6之前的版本中。直接修改表结构的过程中会锁表。之后引入了Online DDL用于支持DDL执行期间DML语句的并行操作。提高数据库的吞吐量
(1)首先创建新的临时表。表结构通过命令ALTAR TABLE新定义表结构
(2)然后把原表中数据导入到临时表
(3)删除原表
(4)最后把临时表重命名为原来的表名
如果有感悟。欢迎关注额
其他观点:
最近再找一些Mysql锁表原因。整理出来一部分sql语句会锁表的。方便查阅。整理的不是很全。都是工作中碰到的。会持续更新笔者能力有限。如果有不正确的。或者不到位的地方。还请大家指出来。方便你我。方便大家。此测试环境Mysql5.5基于innodb引擎 insert into table1 valu
您还感兴趣的文章推荐
- 为什么喜欢的总是害自己最深的?背后有何规律?
- 在北京月入14k,这种情况下要不要离职呢?
- 在当前社会背景下,学生学历低会导致爹不疼娘不爱且家庭成员不和睦吗?
- 刚刚离职的我现在还能从事哪些工作呢?
- 为何无人治理满大街逆行的送餐骑手?背后原因大揭秘
以上就是由互联网推广工程师 桔子生活网 整理编辑的,如果觉得有帮助欢迎收藏转发~
本文地址:https://www.wangchuang8.com/301487.html,转载请说明来源于:桔子生活网
声明:本站部分文章来自网络,如无特殊说明或标注,均为本站原创发布。如若本站内容侵犯了原著者的合法权益,可联系进行处理。分享目的仅供大家学习与参考,不代表本站立场。
评论(2)
数据,结构,操作,语句,索引,命名为,语言,创建一个,到新,在线
没想到大家都对mysql新增字段为何会锁表?感兴趣,不过这这篇解答确实也是太好了
DQL:数据查询语言:SELECT <字段名表> FROM <表或视图名> WHERE <查询条件>;DML:数据操