[2017]更新:MySQL 5.6支持在线索引更新

In MySQL 5.6 and higher, the table remains available for read and write operations while the index is being created or dropped. The CREATE INDEX or DROP INDEX statement only finishes after all transactions that are accessing the table are completed, so that the initial state of the index reflects the most recent contents of the table. Previously, modifying the table while an index is being created or dropped typically resulted in a deadlock that cancelled the INSERT, UPDATE, or DELETE statement on the table.

?[2015]更新表指示在MySQL 5.5中阻止写入

从上面的答案:

“If your using a version greater than 5.1 indices are created while the database is online. So not to worry you won’t interrupt production system use.”

这是**** FALSE ****(至少对于MyISAM / InnoDB表来说,这是99.999%的人使用的.集群版是不同的.)

在创建索引时,对表执行UPDATE操作将为BLOCK. MySQL真的非常愚蠢(以及其他一些事情).

测试脚本:

(

for n in {1..50}; do

#(time mysql -uroot -e 'select * from website_development.users where id = 41225\G'>/dev/null) 2>&1 | grep real;

(time mysql -uroot -e 'update website_development.users set bio="" where id = 41225\G'>/dev/null) 2>&1 | grep real;

done

) | cat -n &

PID=$!

sleep 0.05

echo "Index Update - START"

mysql -uroot website_development -e 'alter table users add index ddopsonfu (last_name, email, first_name, confirmation_token, current_sign_in_ip);'

echo "Index Update - FINISH"

sleep 0.05

kill $PID

time mysql -uroot website_development -e 'drop index ddopsonfu on users;'

我的服务器(InnoDB):

Server version: 5.5.25a Source distribution

输出(注意第6个操作如何阻止完成索引更新所需的~400ms):

1 real 0m0.009s

2 real 0m0.009s

3 real 0m0.009s

4 real 0m0.012s

5 real 0m0.009s

Index Update - START

Index Update - FINISH

6 real 0m0.388s

7 real 0m0.009s

8 real 0m0.009s

9 real 0m0.009s

10 real 0m0.009s

11 real 0m0.009s

Vs读操作不会阻塞(交换脚本中的行注释):

1 real 0m0.010s

2 real 0m0.009s

3 real 0m0.009s

4 real 0m0.010s

5 real 0m0.009s

Index Update - START

6 real 0m0.010s

7 real 0m0.010s

8 real 0m0.011s

9 real 0m0.010s

...

41 real 0m0.009s

42 real 0m0.010s

43 real 0m0.009s

Index Update - FINISH

44 real 0m0.012s

45 real 0m0.009s

46 real 0m0.009s

47 real 0m0.010s

48 real 0m0.009s

无需停机即可更新MySQL的架构

因此,我知道只有一种方法可以更新MySql架构并且不会出现可用性中断.圆形大师:

> Master A上运行了您的MySQL数据库

>让B大师服役并让它复制A大师的写作(B是A的奴隶)

>在Master B上执行架构更新.它将在升级期间落后

>让B大师赶上来.不变:您的模式更改必须能够处理从反转模式复制的命令.索引更改符合条件.简单的列添加通常符合条件.删除列?可能不是.

> ATOMICALLY将所有客户端从Master A交换到Master B.如果你想要安全(相信我,你这样做),你应该确保最后一次写入A被复制到B BEFORE B第一次写入之前.如果您允许并发写入2个主服务器,…您最好在DEEP级别了解MySQL复制,否则您将走向痛苦的世界.极度痛苦.比如,你有一个是AUTOINCREMENT的列吗?你搞砸了(除非你在一个主人身上使用偶数,而在另一个主人身上使用赔率).不要相信MySQL复制“做正确的事”.它不聪明,不会救你.它比从命令行复制二进制事务日志并手动重放它的安全性稍差.尽管如此,断开所有客户端与旧主服务器的连接并将其翻转到新主服务器可以在几秒钟内完成,比等待多小时架构升级快得多.

>现在B大师是你的新主人.你有新的架构.生活很好.喝啤酒;最坏的结束了.

>使用Master A重复此过程,升级他的架构,以便他成为您的新辅助主人,准备好在您的主要主人(现在的主人B)失去权力或仅仅因为你而死亡的情况下接管.

这不是一种简单的更新架构的方法.可在严峻的生产环境中使用;是的.拜托,请,如果有一种更容易的方法在没有阻止写入的情况下向MySQL表添加索引,请告诉我.

谷歌搜索引导我到this article描述了一种类似的技术.更好的是,他们建议在进行中的同一时间饮酒(注意我在阅读文章之前写了我的答案)!

?Percona的pt-online-schema-change

>创建与原始结构相同的新表.

>更新新表的架构.

>在原始表上添加触发器,以使更改与副本保持同步

>从原始表批量复制行.

>将原始表移开并替换为新表.

>放下旧桌子.

我自己从未尝试过这个工具.因人而异

?RDS

我目前正在使用MySQL到Amazon’s RDS.这是一个非常好的服务,包装和管理MySQL,让你用一个按钮添加新的只读副本,并透明地在硬件SKU上升级数据库.这真的很方便.您没有获得对数据库的SUPER访问权限,因此您无法直接使用复制(这是一种祝福还是诅咒?).但是,您可以使用Read Replica Promotion在只读从站上更改架构,然后将该从站升级为新的主站.与我上面描述的完全相同的技巧,只是更容易执行.他们仍然没有做太多帮助你完成切换.您必须重新配置并重新启动您的应用.

mysql 开发 生产_在没有表锁定的情况下在巨大的MySQL生产表...相关推荐

  1. oracle 11g b表空间什么情况下自动增加,oracle 11g 查看表空间使用情况,表空间创建,表空间添加数据文件,修改数据文件自动增长,删除表空间...

    1.查看表空间以及表空间使用情况 SELECT TABLESPACE_NAME "表空间", To_char(Round(BYTES / 1024, 2), '99990.00') ...

  2. mysql 开发规范_专业级的MySQL开发设计规范及SQL编写规范

    在团队开发过程中为了项目的稳定,代码的高效,管理的便捷制定内部种开发设计规范是必不可少的, 这里分享一份我们定义MySQL开发设计规范包括表设计规范,字段设计规范,SQL编写规范 数据库对象命名规范 ...

  3. mysql 并发避免锁表_Yii+MYSQL锁表防止并发情况下重复数据的方法

    本文实例讲述了Yii+MYSQL锁表防止并发情况下重复数据的方法.分享给大家供大家参考,具体如下: lock table 读锁定 如果一个线程获得在一个表上的read锁,那么该线程和所有其他线程只能从 ...

  4. 并发产生mysql锁表_Yii+MYSQL锁表防止并发情况下重复数据的方法

    本文实例讲述了Yii+MYSQL锁表防止并发情况下重复数据的方法.分享给大家供大家参考,具体如下: lock table 读锁定 如果一个线程获得在一个表上的read锁,那么该线程和所有其他线程只能从 ...

  5. mysql overwrite数据,sparkSQL 写数据到MySQL的几种模式解释以及overwrite模式在不删除表结构的情况下的实现...

    1.数据存入Mysql 几种模式 默认为SaveMode.ErrorIfExists模式,该模式下,若数据库中已经存在该表,则会直接报异常,导致数据不能存入数据库: SaveMode.Append 若 ...

  6. 如何在注册表被锁定的情况下修复注册表

    如何在注册表被锁定的情况下修复注册表          注册表被锁定这一招是比较恶毒的,它使普遍用户即使会简单修改注册表使其恢复的条件下,困难又多了一层.症状是在开始菜单中点击"运行&quo ...

  7. 如何根据分页的当前页数查询数据_数据量很大的情况下,如何分页查询优化方案?...

    当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询.对于数据库分页查询,也有很多种方法和优化的点.下面简单说一下我知道的一些方 ...

  8. 【Nacos】生产上需要不重启服务的情况下刷新配置,这个方法可以试试

    [Nacos]生产上需要不重启服务的情况下刷新配置,这个方法可以试试 配置 Demo搭建 RefreshScope 原理 假设Nacos服务已经搭建完成 配置 新建service-config配置文件 ...

  9. mysql开发问题解决_开发过程中mysql常见问题的解决方法

    本篇文章给大家带来的内容是关于开发过程中mysql常见问题的解决方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 记录开发过程中遇到mysql相关的问题以及解决方法,长期更新. 远 ...

最新文章

  1. Vmware VsPhere下的VM如何安装Hyper-v服务
  2. 5G全球声量升级:Verizon宣布固定+移动齐步走,中国第三阶段试验倒计时
  3. 24年前华为招聘广告是什么样的?
  4. YbtOJ-森林之和【dp】
  5. 工业以太网交换机故障的排障步骤
  6. 历史回顾——NLP问题解决方案的演变史
  7. kotlin 两个数字相加_Kotlin程序交换两个数字
  8. 自动控制原理_电容补偿的作用与自动控制原理
  9. Android数据库框架总结
  10. 【算法总结】数学问题-高精度整数
  11. HBase安装配置及测试
  12. 29.正向和负向Lookahead
  13. win8计算机禁止休眠,win8系统设置禁止电脑休眠的教程方法
  14. 【前端领域】3D旋转超美相册(HTML+CSS)
  15. linux无法识别m2固态,主板识别不出m.2固态硬盘怎么办|笔记本电脑无法识别m.2固态硬盘解决方法-系统城...
  16. pr文字转语音有插件吗_Premiere pro 视频字幕的急速制作方法(语音转字幕)
  17. 探索Java中empty()与isEmpty()的区别
  18. 在云服务器重装系统后vscode连不上服务器的解决
  19. Oracle12c DBCA方式创建数据库
  20. python数组和函数的区别_真假美猴王-Numpy数据与Python数组的区别与联系!

热门文章

  1. 前端学习(3104):react-hello-react案例
  2. [html] html哪个标签属性可以通过预解析DNS?
  3. [css] 举例说明时间、频率、角度、弧度、百分度的单位分别是哪些?
  4. 工作109:控制mode跳转
  5. 工作75::一直报404
  6. 工作37:账号绑定逻辑复杂
  7. 前端学习(1811):前端调试之css装饰cursor练习
  8. 第八十五期:一文彻底搞懂cookie和session
  9. r语言 将表格导出为csv_如何将R语言中表格数据输出为Excel文件.pdf
  10. python转c报错no module named_python异常No module named 'win32com'