mysql有table函数吗_mysql_alter_table函数流程的部分修改和注解

change log

gdb info

set args --defaults-file=etc/my.cnf --user=liuzhuan

调试的断点列表

mysql_alter_table()

create_table_info_t::innobase_table_flags()

修改发生位置

./sql/mysqld.cc: //[liuzhuan] 增加一个全局hash存储算法项

./plugin/daemon_example/daemon_example.cc: //[liuzhuan] 改写为mysql_pthread(sep-15 second)静默方式刷盘算法数据

./storage/innobase/handler/ha_innodb.cc: //[liuzhuan] 改写为向hash存储算法项,key是table name(排除临时表),value是算法

./storage/innobase/os/os0file.cc://[liuzhuan] os0file刷盘page位置增加了算法分支,分支的入参是IORequest这个类,算法的判断依据来自hash内存储的key

./storage/innobase/include/os0file.h //[liuzhuan] 修改了IORequest这个类,增加了算法判断的一个表达式,这样的考虑个人认为是比较妥当的,因为堆栈函数的入参不用去改了

mysql5.6以后内部在alter table上有两种算法,做如下定义

ALGORITHM=INPLACE

ALGORITHM=COPY

copy table方式

新建跟原表格一致的临时表,并在该临时表上执行DDL语句

锁原表,不允许DML,允许查询

逐行数据从原表拷贝到临时表中(这个过程是没有排序的)

拷贝结束后,原表禁止读操作,也就是原表此时不提供读写服务

进行rename操作,完成DDL过程

inplace方式(fast index creation,仅针对索引的创建跟删除)

新建frm临时文件

锁原表,不允许DML,允许查询

按照聚集索引的顺序,查询数据,找到需要的索引列数据,排序后插入到新的索引页中

原表禁止读操作,也就是原表此时不提供读写服务

进行rename操作,替换frm文件,完成DDL过程

这两种算法的IO行为区别很大,具体在这里不再表述,引用一个博主的文章,对online ddl解释的非常漂亮了:

SQL语句默认的算法行为

inplace算法

alter table encrypt_test_1 ENCRYPTION='y';

alter table encrypt_test_1 add passtest int(4) default 0, ADD genedetail varchar(50) default '0', encryption='y';

CREATE TABLE `test_5` (

`id` int(11) DEFAULT NULL,

`name` varchar(32) DEFAULT NULL,

`passtest` int(4) DEFAULT '0',

`genedetail` varchar(50) DEFAULT '0'

) ENGINE=InnoDB DEFAULT CHARSET=utf8 ENCRYPTION='n';

CREATE INDEX idd1 ON test_5 (`id`);

ALTER TABLE test_5 ADD INDEX nameid1 (name);

DROP INDEX idd1 ON test_5;

ALTER TABLE test_5 DROP INDEX nameid1;

CREATE FULLTEXT INDEX nameid1 ON test_5(name);

DROP INDEX nameid1 ON test_5;

ALTER TABLE test_5 ADD CONSTRAINT fk_name1 FOREIGN KEY(id) REFERENCES t1(id);

copy算法

CREATE TEMPORARY TABLE aaa as ( select * from encrypt_test_1);

CREATE TABLE aaa as ( select * from encrypt_test_1);

alter table encrypt_test_1 ENCRYPTION='n';

mysql 5.7后版本中的一个bug

CREATE TABLE `test_5` (

`id` int(11) DEFAULT NULL,

`name` varchar(32) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8 encryption='y';

然后取消encryption,设置alter table test_5 encryption='n';

最后执行alter table test_5 ENGINE=myisam会出错,这里在

./storage/myisam/ha_myisam.cc中ha_myisam::create()存在一处bug

2024 if (ha_create_info->encrypt_type.length > 0)

2025│ {

2026│ set_my_errno(HA_WRONG_CREATE_OPTION);

2027│ DBUG_RETURN(HA_WRONG_CREATE_OPTION);

2028│ }

这个条件是不可能失败的,这样的结果就是encrypt后的innodb表,转myisam都会失败,这在mariadb中是通过table comment解决的,他把这种变革前的语句写到了comment里,想法也说不上多好

但也算个解决方法吧

他也间接导致sql_table.cc-->mysql_alter_table()函数的copy模式下:

9871行

if (ha_create_table())

goto err_new_table_cleanup; //成立

从而返回 ERROR 1031 (HY000): Table storage engine for '#sql-1ba8_2' doesn't have this option

根据上述两种算法,在alter table中找到算法发生位置,一共要修改三处

bool mysql_alter_table(THD *thd, const char *new_db, const char *new_name, HA_CREATE_INFO *create_info, ABLE_LIST *table_list, Alter_info *alter_info){

1:

9230行,if (alter_ctx.is_table_renamed()) 他是alter table ... reanme ... 词法的切入点,这里直接发生调用mysql_rename_table,然后根据执行状态返回true(失败)或false(成功)

if (table->s->tmp_table != NO_TMP_TABLE) 判断是否具备临时表,table->s->tmp_table有定义好的几种类型在table.h中定义

引用table.h中定义

enum tmp_table_type

{

NO_TMP_TABLE, NON_TRANSACTIONAL_TMP_TABLE, TRANSACTIONAL_TMP_TABLE, INTERNAL_TMP_TABLE, SYSTEM_TMP_TABLE

};

INTERNAL_TMP_TABLE : 大致如'#sql-5bf6',内部临时表后是一个动态数,每次mysql重启,这个动态数都会更新

TRANSACTIONAL_TMP_TABLE : 更多发生在inplace模式,事务性临时表

这个位置修改alter rename对hash的操作

2:

9733行, switch (inplace_supported) 这里进入inplace模式的处理,这种情况下,if (use_inplace)条件成立

这个位置处理无table io的流程(inplace无io,这里切换hash算法是不能被支持的)

3:

9822行,if (!table->s->tmp_table) 这里进去表拷贝模式

这个位置处理copy io流程下,表的encrypt关键字变更

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新常态成型,飞连联手Forrester聚焦数字化办公新体验

随着互联网技术不断发展,在企业办公领域时间与空间的限制正在逐步消弭。但是,当企业面对内外部大量的不确定因素时,以往的办公模式无论是效率、安全性还是体验等各方面都将大打折扣。而在数字时代,混合办公模式则有望成为企业办公…

聊聊我们在业务链路升级中做的数据洞察

简介:关于数据相关的词条很多,虽然有不同的定义,但是本质上是相辅相成,通常结合使用才能拿到结果。类比词条诸如 数据分析,数据挖掘, 数据洞察。本文将聊聊我们在业务链路升级中做的数据洞察。 作者 | 金铎…

阿里云佘俊泉:创新探索不停,边缘云持续为客户创造价值

简介:在12月15日上午举办的分布式云领袖论坛中,阿里云边缘云产品负责人佘俊泉先生发表了《阿里云边缘云产品创新与场景探索》的主题演讲,分享了阿里云在边缘云领域的探索和思考,如何从产品演进、技术创新、场景应用等方面助力企业…

oracle 如何迁移到 mysql_怎么将数据库从Oracle迁移到SQL Server,或从Oracle迁移到MySQL...

有时候我们有迁移数据库的需求,例如从Oracle迁移到SQL Server,或者从MySQL迁移到Oracle。很多江湖好汉一时不知如何手工操作,所幸的是Navicat提供了迁移的自动化操作界面。当然,Navicat的数据库迁移无法做到完美,一些依…

深度解析单线程的 Redis 如何做到每秒数万 QPS 的超高处理能力!

作者 | 张彦飞allen来源 | 开发内功修炼服务器端只需要单线程可以达到非常高的处理能力,Redis 就是一个非常好的例子。仅仅靠单线程就可以支撑起每秒数万 QPS 的高处理能力。今天我们就来带大家看看 Redis 核心网络模块的内部实现,学习下 Redis 是如何做…

阿里云李克:边缘云技术发展与实践

简介:7年磨砺,阿里云边缘云的技术积累和沉淀哪了些?今年全面升级后的技术形态具有什么特性?它可以成熟地赋能哪些商业化技术应用场景?阿里云资深技术专家李克带来分享。 备受关注的2021全球分布式云大会深圳站于12月1…

小程序下一破局点?钉钉小程序卡片,应用与平台的深度集成

简介:卡片技术在钉钉上的运用。 20秒了解小程序卡片 案例1:幸福大巴一键抢座 “幸福大巴”是阿里员工在域内使用的城际客运功能,但因为需要来回跳转VPN工具和H5页面,在用户体验上带来了一定的障碍 抢座流程对比: 以…

mysql复杂查询教程_mysql 复杂查询

聚合函数函数是一个功能体,提供若干数据,产出结果-饺子机COUNT(...)数量SUM(...) 求和AVG(...)平均MAX (...)最大MIN(...) 最小聚合查询/分组查询查询出所有员工的数量SELECT COUNT(eid) FROM emp;SELECT COUNT(*) FROM emp; #推荐写法;查询出…

建站就用这个方法,无需购买服务器10分钟快速部署你的静态网页

简介:阿里云云开发平台重磅推出开源应用中心,聚合最热门的开源应用,让你像安装app一样快速上线一个网站。面向新人和持续活跃的开发者用户推出上线激励加油包,最高100元无门槛代金券免费送,现在体验还能够领取年轻人的…

用 Spring boot 简单搭建一个微服务项目

作者 | 桃花键神来源 | CSDN博客前言:工欲善其事,必先利其器。在对Spring Cloud各部分组件进行具体介绍之前,我们会对Spring Cloud微服务的基础Spring Boot进行介绍。Spring Boot是Spring一套快速配置开发的脚手架,可以基于Spring…

云未来、新可能 - 绿色、无处不在、可信的计算

简介:阿里云资深技术专家、容器服务研发负责人易立在大会主论坛进行了主题为 “云未来,新可能” 的演讲,分享了阿里云基于大规模云原生实践下的技术趋势判断和技术创新进展。 2021 年 12 月 9 日至 10 日,KubeCon CloudNativeCo…

linux服务器查看mysql服务名称_Linux服务器查看MySQL信息

查看mysql路径whereis mysql 查看安装路径which mysql 查看运行路径输入指令 chkconfig --list mysqld 查看mysql服务是否已经添加到linux上mysqld 0:off 1:off 2:off 3:on 4:on 5:on 6:off 表示已添加读取信息出错表示没有安装。MySQL的守…

线上教育核心竞争力是什么?声网发布在线素质、职业教育解决方案

5月11日,声网在线上举办了主题为“聚焦场景力,释放生态力”的在线教育发布会,正式发布了新生态下在线教育多场景教学解决方案,包括在线音乐、在线美术、在线职业教育、在线编程、Stem在线教学解决方案。同时为兼顾降低教学场景研发…

ClickHouse Keeper 源码解析

简介:ClickHouse 社区在21.8版本中引入了 ClickHouse Keeper。ClickHouse Keeper 是完全兼容 Zookeeper 协议的分布式协调服务。本文对开源版本 ClickHouse v21.8.10.19-lts 源码进行了解析。 作者简介:范振(花名辰繁)&#xff0c…

pidof -x 不管用_专业摄影师最佳助手富士X-T200评测

作为X-T100的升级款,X-T200可谓是一经发布就受到了众多关注。相对来说,前作X-T100我们认为已经足够出色,而这次的富士X-T200又有多方面的提升,尤其是视频及视频对焦性能。关于这款机器实际的表现究竟如何我们接下去看。富士X-T200…

Oracle数据到MaxCompute乱码问题详解

简介:集成Oracle数据到MaxCompute,乱码问题分析; 为什么,在oracle数据不乱码,集成到MaxCompute就乱码了? 问题在哪里? 1.1 乱码现象 DataWorks的数据离线集成(DataX)集成Oracle数据到MaxCompute的数据有…

Gartner:2022年全球半导体收入预计将增长13.6%

半导体元件供应链所受到的限制预计将在2022年逐步缓解 根据Gartner的预测,2022年全球半导体收入预计将达到6760亿美元,相比2021年增长13.6%。 Gartner研究副总裁Alan Priestley表示: “由于芯片短缺而引发的半导体平均销售价格(AS…

V8 编译浅谈

简介:本文是一个 V8 编译原理知识的介绍文章,旨在让大家感性的了解 JavaScript 在 V8 中的解析过程。 作者 | 子弈 来源 | 阿里技术公众号 一 简介 本文是一个 V8 编译原理知识的介绍文章,旨在让大家感性的了解 JavaScript 在 V8 中的解析过…

rabbitmq接收不到消息 防火墙_用PHP+RabbitMQ实现消息的发送和接收

消费者&#xff1a;接收消息逻辑&#xff1a;创建连接-->创建channel-->创建交换机-->创建队列-->绑定交换机/队列/路由键-->接收消息<?php /************************************* * PHP amqp(RabbitMQ) Demo - consumer * Author: Linvo * Date: 2018/7/…

斩获大奖|阿里云PolarDB-X引领云原生分布式数据库新时代

简介&#xff1a;阿里云原生分布式数据库PolarDB-X荣获“2021年度最佳分布式数据库”。 12月15-16日&#xff0c;以“引领分布式云变革 助力湾区数字经济”为主题的全球分布式云大会在深圳隆重召开&#xff0c;本届大会由全球分布式云联盟、深圳科技交流服务中心、深圳市通信学…