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

[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在只读从站上更改架构,然后将该从站升级为新的主站.与我上面描述的完全相同的技巧,只是更容易执行.他们仍然没有做太多帮助你完成切换.您必须重新配置并重新启动您的应用.

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

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

相关文章

ListView性能优化

ListView在ScrollView中无法正确计算它的大小, 故不能显示正常的条目。 解决办法有: 1.重写ListView, 覆盖onMeasure()方法。 1 public class WrapperListView extends ListView {2 public WrapperListView(Context context) {3 super(context);4 }…

判断页面关闭的方法 UNLOAD/onbeforeunload

最近一个朋友做在线统计,问我怎么判断用户登陆和离开。获得用户登陆不用说了,大家都知道,判断离开的话就有一点问题了,如果说用户都是按照设计者的规定的范围触发退出事件离开的话那就没什么难度了,但是用户的离开方式…

mysql 第几周 时间戳_php时间戳函数实现计算第几周,以及当天所在周的具体日期范围...

<html><script language"javascript">function showdate(){c new Date(2008,1,29);//输入开学的日期.注意,月份是从0-11;comperc.getTime();//以2008年2月29日作为上半学期结束。然后记录新的开学日期var now new Date();//获取当前时间var d_nownow.ge…

java学习笔记④MySql数据库--03/04 DQL查询

03 使用DQL查询数据&#xff08;一&#xff09; 04 使用DQL查询数据&#xff08;二&#xff09; DQL 数据查询语言 select select * 方式效率低 AS 取别名 (给字段取别名,给表取别名,给计算结果取别名) as取别名时,可省略as distinct 去重 所有字段一起不重复算一条记录 selec…

2005国产空间信息系统软件测评结果揭晓

记者&#xff1a;云洲 来源&#xff1a;www.3sNews.net 责编&#xff1a;小柯 [3sNews讯]2005年12月27&#xff0c;为期两天的“地球观测与导航技术领域科技发展研讨会”于中国科技会堂胜利召开&#xff0c;备受业界关注的2005国产空间信息系统软件测评结果在会上揭晓&am…

mysql变量string_mysql sql语句有变量 time_t变量转换为string

1.char*变量 如果有两个指针变量不可以 需要一个转换为stringstring strCall ;strCall.assign(pCallInfo->m_szCallerNo,strlen(pCallInfo->m_szCallerNo));//char* 转换为stringstring sql "insert into tcallrecord values("strCall","pCallInfo-…

axios+vue实现动态渲染员工数据+数据是对象

<style>table{width: 600px;margin: 0 auto;text-align: center;border-collapse: collapse; /*合并边框哦*/}tr th,tr td{border: 1px solid pink;}</style><script src"../vue.js"></script><script src"../axios.js">&l…

[Translation]《击鼓》

"Live or die,meet or part,weve made oath,you and I;,7UZGive me your hand,Ill hold,and live together,till old.l"From: 《击鼓》I?©MYUP2U社区 -- 整理童年的记忆&#xff0c;释放知识的潜力&#xff0c;共享青春的激情&#xff0c;尽在MYUP2U&#xff0…

[vue] vue自定义事件中父组件怎么接收子组件的多个参数?

[vue] vue自定义事件中父组件怎么接收子组件的多个参数&#xff1f; 子组件传递多个参数&#xff0c;父组件用展开运算符获取个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关…

FLASH全屏,左右侧,闪烁广告及对错觉的代码补充.

<!--焦点图开始--> <script type"text/javascript"><!--var focus_width250; ------ flash的宽度var focus_height160; ------ flash的高度同样可以加上背景颜色 var focus_bgcolor160; ------ flash的背景颜色…

vscode调试angular2

调试步骤&#xff1a; 1.安装nodejs 2.安装vscode 3.vscode安装debugger for chrome插件 4.选择调试->打开调试配置&#xff0c;选择chrome配置&#xff0c;打开lauch.json,修改如下&#xff1a; {"version": "0.2.0","configurations": [{&q…

python实现组合问题_python3 最基本且简单的实现组合设计模式

&#xfeff;组合模式是把一个类别归为一个整体&#xff0c;并且组织多个整体之间的关系&#xff0c;使用通过树形结构来描述所有整体。一般的编写方式为一个类别对象下添加多个该对象的元素&#xff0c;该对象又为其它对象下的元素。简单来说就是一个学校有一个总部&#xff0…

[vue] 说下$attrs和$listeners的使用场景

[vue] 说下attrs和attrs和attrs和listeners的使用场景 <template><el-button v-on"$listeners" v-bind"$attrs" :loading"loading" click"myClick"><slot></slot></el-button> </template><s…

Windows下安装SQLPlus的帮助

Oracle 10G Server不在本机上&#xff0c;我希望安装SQLPlus的帮助。安装SQLPlus需要使用System User登录&#xff0c;但System已经被Lock掉了。还好有dba的权限。先Unlock System账号&#xff0c;并修改密码&#xff1a;-- UnlockALTER USER SYSTEM ACCOUNT UNLOCK;-- Modify …

python爬虫微博24小时热搜_GitHub - Writeup007/weibo_Hot_Search: 微博爬虫:每天定时爬取微博热搜榜的内容,留下互联网人的记忆。...

Weibo_Hot_Search都说互联网人的记忆只有七秒钟&#xff0c;可我却想记录下这七秒钟的记忆。项目已部署在服务器&#xff0c;会在每天的上午 11 点和晚上11 点定时爬取微博的热搜榜内容&#xff0c;保存为 Markdown 文件格式&#xff0c;然后上传备份到 GitHub 你可以随意下载查…

[vue] 分析下vue项目本地开发完成后部署到服务器后报404是什么原因呢?

[vue] 分析下vue项目本地开发完成后部署到服务器后报404是什么原因呢&#xff1f; 1.检查nginx配置&#xff0c;是否正确设置了资源映射条件&#xff1b; 2.检查vue.config.js中是否配置了publicPath&#xff0c;若有则检查是否和项目资源文件在服务器摆放位置一致。个人简介 …

jQuery异步加载数据并添加事件示例

当时项目是通过树形栏进行权限控制的&#xff0c;管理员可以对从数据库去的数据动态生成树形栏进行增删改查操作&#xff0c;可是用$(".XX").click();方法是不行的。1、之前用的是jq1.4.3 ,jq1.7一下都可以使用live()方法&#xff0c;来实现该功能 $(‘#div).live(‘…