FLUSH TABLES WITH READ LOCK
最近在mysql主从复制中用到锁,翻了资料回忆一下。一下内容参考于:http://blog.csdn.net/arkblue/article/details/27376991
1.FLUSH TABLES WITH READ LOCK
这个命令是全局读锁定,执行了命令之后所有库所有表都被锁定只读。一般都是用在数据库联机备份,这个时候数据库的写操作将被阻塞,读操作顺利进行。
解锁的语句也是unlock tables。
2.LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}
这个命令是表级别的锁定,可以定制锁定某一个表。例如: lock tables test read; 不影响其他表的写操作。
解锁语句也是unlock tables。
刷新表
flush tables with read lock,也就是将所有的脏页都要刷新到磁盘,然后对所有的表加上了读锁,于是这时候直接拷贝数据文件也就是安全的。但是如果你发出命令flush tables with read lock时,还有其他的操作,而起是很耗时的操作呢?先说写操作,这个FTWRL肯定是得等的,等写操作完成才能执行FTWRL,这个很好理解。那么对于 其他的读操作呢?比如说在FLWRL发出之前有一个query:select count(*) from tb,那么FTWRL也得等待(show processlist可以看到 waiting for table flush)。你可能会说在mysql中读与读不是不会排斥的吗,为什么需要等待呢?因为FTWRL是要flush脏页的,只有这样才真的能保证数据一致 性(比如说在xtrabackup备份myisam表的时候),而在select count(*) from tb执行的时候,因为所有的操作都是在内存中操作,所以此时还不能完全flush,因此FTWRL就得等待。或许你还会有疑问,select的页不是脏 页,为什么FTWRL还要等待呢?难道mysql不能做得更完善点吗?我觉得mysql还不是不会做的这么简单吧,等待的原因是因为这个表很大,无法一次 性将所有的页都读到内存中来,而query具有原子性,总不可能执行一般被堵塞吧,所以说还是得乖乖的让它执行然,所以FTWRL就得等待了
这两个语句在执行的时候都需要注意个特点,就是 隐式提交的语句。在退出MySQL终端的时候都会隐式的执行unlock tables。也就是如果要让表锁定生效就必须一直保持对话。
这点要注意
最新文章
- 机器学习实战(一)kNN
- jsexcel导出插件
- Servlet/JSP-05 Cookie
- JS写的多级联select,如何取值
- AngularJS初始化闪烁
- 关于解决JQUERY对INPUT元素Change事件不兼容的问题
- Python 基础语法(四)
- 【shell】多命令执行顺序
- 10 程序员必备:Linux日常维护命令
- SSO单点登录的实现原理
- 最大乘积(Maximum Product,UVA 11059)
- 动态生成Zip
- python 正则指北之我的总结
- java 面向对象String类
- windows 2008 r2 安装TabsStudio
- v-for &; duplicate key bug
- python 用cookie模拟登陆网站
- lodash toString 转换为字符串
- 【学时总结】◆学时·VI◆ SPLAY伸展树
- 团队项目-任务分解[Alpha0]
热门文章
- Webstrom (或Phpstrom)使用git(oschina-码云)
- 基于HTML5技术的电力3D监控应用(四)
- CentOS6.5菜鸟之旅:VirtualBox4.3识别USB设备
- Qt之QAbstractItemView右键菜单
- 订餐APP第一次sprint+燃尽图
- thread_AtomicBoolean
- Winform开发框架之权限管理系统的改进
- jQuery回调函数
- 【循序渐进学Python】7.面向对象的核心——类型(上)
- sql: table,view,function, procedure created MS_Description in sql server