前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL 到底能不能online ddl index PG VS MYSQL

MySQL 到底能不能online ddl index PG VS MYSQL

作者头像
AustinDatabases
发布于 2024-06-05 10:23:45
发布于 2024-06-05 10:23:45
23500
代码可运行
举报
文章被收录于专栏:AustinDatabasesAustinDatabases
运行总次数:0
代码可运行

上周一篇关于MySQL 拜托加个索引能和PG一样简单吗?只能gh-ost了 烦人的帖子引起争议,主要因为我提到 POSTGRESQL 在线添加索引是非常方便的,MySQL 在这方面不咋地,首先说结果,我对MYSQL的知识需要更新,针对高版本得MYSQL是支持online ddl index,所以写这篇来纠正一下,但是有一些同学发了一些MYSQL 支持online ddl index 的绝对论甚至有人说mysql 5.x就可以onine ddl index,这点咱们也的纠正,对就是对,错就是错。

先说结论,高版本的MySQL可以进行online ddl index是在8.023版本以上的MySQL 而在MySQL 8.023 版本以下的MySQL没有默认使用 online ddl index 的功能或根本没有,使用create index on 的语句来建立索引,是会直接给表加锁,并且阻碍任何事务的运行,所以如果是8.023 的版本或以上的MYSQL那么我是错的,但在这个版本以下的mysql,我们是需要继续使用pt-osc, or gh-osc 工具来添加索引的(大表)。

给我反馈我说错的同学(感谢一位叫Mong的同学),当然还有其他在文章下面留言的同学,这位叫Mong的同学非常细心的对 ONLINE DDL INDEX 进行了工作和解释,并截图给我,同时他也发现版本的问题和即使支持也是有条件的支持,然后就有了此篇文章。的确从8.023版本已经默认引入了 online ddl add index 的功能。并且我也亲测在8.030上的确在存储过程疯狂的插入数据的情况下,建立索引删除都是OK 的,没有问题不会锁表,DML和index add drop之间是不存在锁表而导致DML无法进行的情况,所有说8.023 以后的版本不可以ONLINE DDL INDEX 是不对的。

那么8.023以上的版本有多少人再用,这是一个问题,同时有多少人知道这个事情,也是问题。另外8.023以下的版本,通过alter table 语句添加参数是否也可以进行在线的online ddl index 是需要通过 algorithm=inplace 和lock 的模式调整来降低添加索引锁定的时间,这点有多少人知道并且这和MYSQL8.023版本的online ddl index 是一回事吗?????

让我不解的是上篇帖子出来,马上就有人反馈,不对MYSQL 5.7 就可以DDL INDEX ONLINE 的同学,拜托不要在人云亦云了The proof of the pudding is in the eating!

下面是证实在MYSQL8.030 在线加索引是否可以,答案是可以

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> 
mysql> CREATE PROCEDURE generate_data()
    -> BEGIN
    ->     DECLARE i INT DEFAULT 1;
    ->     DECLARE practice_time TIMESTAMP;
    -> 
    ->     CREATE TABLE generated_table (
    ->         id INT PRIMARY KEY AUTO_INCREMENT,
    ->         text_field VARCHAR(255),
    ->         practice_field TIMESTAMP
    ->     );
    ->     
    ->     SET practice_time = NOW();
    ->     
    ->     WHILE i <= 10000000 DO
    ->         INSERT INTO generated_table (text_field, practice_field) VALU
    ->         SET practice_time = practice_time + INTERVAL 1 SECOND;
    ->         SET i = i + 1;
    ->     END WHILE;
    -> END //
Query OK, 0 rows affected (0.01 sec)

mysql> 
mysql> DELIMITER ;
mysql> 
mysql> CALL generate_data();

我们先建立一个存储过程,并且往里面添加1000万的数据。然后我在添加数据的过程中,我建立索引开是否能成功。参见下图,毫无疑问,这个版本的MySQL一点问题都没有。

除此以外,我们还应该有几个事情来说明即使在8.023版本以上的MYSQL ,online ddl index是有可能失败了,并且从上图大家也知道大致的ONLINE DDL 的原理是什么了,在创建索引的语句使用了更高的隔离级别,添加索引使用的是 RR,而不是当前的RC的isolation.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> SELECT * FROM information_schema.INNODB_TRX\G
*************************** 1. row ***************************
                    trx_id: 7881607
                 trx_state: RUNNING
               trx_started: 2024-04-16 14:11:48
     trx_requested_lock_id: NULL
          trx_wait_started: NULL
                trx_weight: 2
       trx_mysql_thread_id: 112
                 trx_query: INSERT INTO generated_table (text_field, practice_field) VALUES (CONCAT('Text_', i), practice_time)
       trx_operation_state: NULL
         trx_tables_in_use: 1
         trx_tables_locked: 1
          trx_lock_structs: 1
     trx_lock_memory_bytes: 1128
           trx_rows_locked: 0
         trx_rows_modified: 1
   trx_concurrency_tickets: 0
       trx_isolation_level: READ COMMITTED
         trx_unique_checks: 1
    trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
 trx_adaptive_hash_latched: 0
 trx_adaptive_hash_timeout: 0
          trx_is_read_only: 0
trx_autocommit_non_locking: 0
       trx_schedule_weight: NULL
*************************** 2. row ***************************
                    trx_id: 7881467
                 trx_state: RUNNING
               trx_started: 2024-04-16 14:11:46
     trx_requested_lock_id: NULL
          trx_wait_started: NULL
                trx_weight: 1
       trx_mysql_thread_id: 114
                 trx_query: create index idx_text_field on generated_table (text_field)
       trx_operation_state: NULL
         trx_tables_in_use: 1
         trx_tables_locked: 0
          trx_lock_structs: 0
     trx_lock_memory_bytes: 1128
           trx_rows_locked: 0
         trx_rows_modified: 1
   trx_concurrency_tickets: 0
       trx_isolation_level: REPEATABLE READ
         trx_unique_checks: 1
    trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
 trx_adaptive_hash_latched: 0
 trx_adaptive_hash_timeout: 0
          trx_is_read_only: 0
trx_autocommit_non_locking: 0
       trx_schedule_weight: NULL
2 rows in set (0.00 sec)



那么咱们现在说说,即使在8.023版本以上的MYSLQ online ddl index 失败的可能性有什么?

1 表太大:对表太大,大表要进行online ddl index 是需要更大的内存也就是innodb buffer pool 的支持和磁盘空间tmpdir 或者innodb_tmpdir 文件系统的磁盘空间的支持,如果空间不足则无法支持,可能会导致操作失败。

2 innodb_online_alter_log_max_size 这个参数主要是在线添加索引的情况下设定在添加索引期间,对表所做的增删改查的记录,如果这个参数的值较小,则在online ddl index 的情况下,会导致DDL INDEX 的任务失败,并且回滚。这里默认值是128MB ,显然是有点保守了,可以设置的在大一点,尤其针对大表的情况并且这个表还在进行疯狂的 DML操作。

另外如果需要使用在线建立index online 的功能的情况下,建议使用8.027以上的版本(不要使用8.029)。因为在8.027 版本才引入了innodb_ddl_buffer_size 的功能,这个功能是专门为了在线DDL 定义操作的缓冲区的大小,默认1MB。在此之前这个变量是通过 innodb_sort_buffer_size 来做 DDL online 的索引在线的缓冲使用的。

基于以上的内容,1 online ddl index 在mysql 高版本是可以的,至少应该是8.023版本以上,但完善的等到8.027 以上的版本。2 如果你是之下的版本,那么你的继续和笔者一样,在大表添加索引的时候继续业障,烦人。

注明:实际上MySQL 可以进行online ddl index lock=none 也是在MySQL 8.015 后开始的,所以,MySQL ddl index online 在低版本大表还是要借助工具的,否则工具的产生原因是什么???

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
php一句话免杀简单学习(附赠自用免杀一句话)
今天我们简单学习一下php的一句话木马的各种方式,通过学习这些我们可以编写出自己的免杀一句话木马。文章最后附赠免杀一句话。这里较为基础,适合新手入门学习。
网e渗透安全部
2023/09/01
5.5K0
php一句话免杀简单学习(附赠自用免杀一句话)
php一句话木马变形技巧
一句话木马就是只需要一行代码的木马,短短一行代码,就能做到和大马相当的功能。为了绕过waf的检测,一句话木马出现了无数中变形,但本质是不变的:木马的函数执行了我们发送的命令。
全栈程序员站长
2022/08/31
4.5K0
php一句话木马变形技巧
一句话木马
“一句话木马”短小精悍,而且功能强大,隐蔽性非常好,在入侵中始终扮演着强大的作用,居家生活搞站越货必备神器。
用户3376177
2018/09/21
2K0
PHP木马免杀的一些总结
这篇文章写一些php木马免杀的一些技巧,希望对大家有点帮助。这里解释一下什么是php木马,这里大体分为三种:
雪痕@
2020/09/27
2.8K0
PHP木马免杀的一些总结
webshell免杀——以PHP为例
凡是使用webshell时,免杀都是需要考虑的事情,说白了就是我的webshell得能用啊!故本篇做一个webshell免杀的学习,主要是php的一句话
中龙技术
2022/09/29
2.9K0
webshell免杀——以PHP为例
webshell变形记之一
虽然进行了变形,但是还是被检测出来了4级,这个变形也是比较鸡肋,所以可以配合其他的php函数进行变形
vFREE
2022/08/08
1.1K0
聊聊一句话木马
木马是什么意思就不用我介绍了,网站通常在渗透中找到可以操作文件的机会使用时候,和代码执行文件上传漏洞息息相关,在网站中获得种种上了木马,我们就说拿到了webshell,获得一个较低的权限,网站木马通常是入侵者入侵者拿到网站权限的标志,也是内网渗透.权限提升的开始,一般有两种网站木马,俗称小马和大马,小马又称一句话木马,以只有一句代码,功能简单而得名,大马往往有文件操作,数据操作,执行命令等复杂的功能,在渗透的过程中配合大小木马交叉使用,非常强大,这里和大家简单聊聊我见过的木马。
用户5878089
2019/07/25
1.8K0
PHP WebShell
404页面是网站常用的文件,一般建立好后很少有人会去对它进行检查修改,这时我们可以利用这一点进行隐藏后门。
Al1ex
2021/08/13
2.2K0
一句话木马的各种变形
一句话木马短小精悍,而且功能强大,隐蔽性非常好,在入侵中始终扮演着强大的作用。一句话木马一直在跟杀软斗智斗勇,出现一种,杀软秒更新规则。木马再变形,再被杀。。。出现
洛米唯熊
2019/07/22
4.9K0
PHP一句话木马后门
在我们进行渗透测试的最后阶段,入侵到内网里,无论是想要浏览网站结构,还是抓取数据库,或者是挂个木马等等,到最后最常用的就是执行一句话木马,从客户端轻松连接服务器。
全栈程序员站长
2022/08/31
3.4K0
深入浅出玩转php一句话(含过waf新姿势)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/143614.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/31
7590
分享一些比较强悍的PHP木马大全-源码
由于PHP一句话木马可以说有很多,简单的、中等的、复杂的.......,今天主要是分享一些比较强悍的一些PHP一句话木马大全;
程序猿的栖息地
2022/04/29
5.8K0
分享一些比较强悍的PHP木马大全-源码
2024全网最全面及最新的网络安全技巧 1 之 bypass各种waf技巧以及命令执行 ———— 作者:LJS
php中call_user_func是执行回调函数的标准方法,这也是一个比较老的后门了:
盛透侧视攻城狮
2024/10/22
2160
2024全网最全面及最新的网络安全技巧 1 之 bypass各种waf技巧以及命令执行 ———— 作者:LJS
一句话木马踩坑记
所以我在怀疑,有些大佬们都是照抄assert的变形方式没有测试过就放到博客上了就是说,如果换了assert,这个是可以用的
用户5878089
2019/11/07
1.8K0
Wellshell一句话木马
何为一句话木马?他跟其他木马有什么区别吗? 一句话木马的叫法是来自他代码结构简单,简单到什么地步?最简单的一句话木马甚至可以就一句代码就结束了,比如经典PHP一句话:<?php @eval($_POS
Tommonkey
2023/03/20
2.7K0
创造tips的秘籍——PHP回调后门
最近很多人分享一些过狗过盾的一句话,但无非是用各种方法去构造一些动态函数,比如_GET['func'](_REQUEST['pass'])之类的方法。万变不离其宗,但这种方法,虽然狗盾可能看不出来,但人肉眼其实很容易发现这类后门的。
phith0n
2020/10/15
2.1K0
PHP一句话木马使用技巧
近来发现好多网站有安全狗,会拦截菜刀和蚁剑,因此总结下通过浏览器直接调用一句话木马的姿势。
全栈程序员站长
2022/08/31
2.8K0
PHP一句话木马使用技巧
eval与php一句话的关系
||作者:抹布 part1 首先我们知道,eval能执行php代码,最常见的php一句话也是用eval关键字的。 <?php @eval($_GET["code"])?> Part2 在论坛学习的时候
随心助手
2019/10/15
1.5K0
eval与php一句话的关系
php一句话木马深度解析
一句话木马短小精悍,而且功能强大,隐蔽性非常好,在入侵中始终扮演着强大的作用。我们可以利用一句话木马来对主机进行渗透操作,最常见的工具就是号称黑客之刃的中国菜刀。这里我们主要讲解php一句话木马,因为别的语言我也不会啊。
用砖头敲代码
2022/06/06
4K0
PHP Web 木马扫描器
<?php /**************PHP Web木马扫描器************************/ /* [+] 版本: v1.0
用户1696846
2018/07/16
5.2K0
相关推荐
php一句话免杀简单学习(附赠自用免杀一句话)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档