免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8923 | 回复: 15

mysql如何在shell终端层实现全局锁定 [复制链接]

论坛徽章:
0
发表于 2013-11-01 11:21 |显示全部楼层
比如:
cat mysqllock.sh
#!/bin/bash
mysql -uroot -proot -e "FLUSH TABLE WITH READ LOCK"

当我在mysql终端执行完FLUSH TABLE WITH READ LOCK,mysql server端全局锁定。如果在shell层,按照上述方法锁表不成功,不是在mysql server层。
如果想在shell终端层实现mysql全局锁定的话,如何做?

谢谢大家了。

论坛徽章:
2
酉鸡
日期:2014-02-19 09:11:08摩羯座
日期:2014-05-23 10:16:16
发表于 2013-11-01 17:13 |显示全部楼层
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。

这两个语句在执行的时候都需要注意个特点,就是 隐式提交的语句。在退出mysql终端的时候都会隐式的执行unlock tables。也就是如果要让表锁定生效就必须一直保持对话。

论坛徽章:
0
发表于 2013-11-02 01:09 |显示全部楼层
回复 2# tiankafeiwu


    首先,谢谢您的回答,您说的我都明白。说白了,现在我就想让myisam用shell脚本实现备份。前提要全局锁表。(不使用逻辑备份工具,直接copy文件的方法)。
我现在的想法是:全局锁定,之后终端挂起,等待copy文件完毕,在解除全局锁定。
使用shell脚本实现。

论坛徽章:
169
申猴
日期:2013-10-09 10:10:16天秤座
日期:2013-10-10 15:28:08天蝎座
日期:2014-07-17 14:02:54丑牛
日期:2014-07-17 14:03:04处女座
日期:2014-07-17 14:03:12双子座
日期:2014-07-17 14:03:21天秤座
日期:2014-07-17 14:03:29酉鸡
日期:2014-07-17 14:03:39金牛座
日期:2014-07-21 10:37:54水瓶座
日期:2014-07-22 16:56:09巳蛇
日期:2014-07-23 11:48:03天蝎座
日期:2014-07-31 10:16:36
发表于 2013-11-04 10:42 |显示全部楼层
有从库吗,如果有从库可以通过从库上操作,直接停库

论坛徽章:
0
发表于 2013-11-04 11:19 |显示全部楼层
本帖最后由 yqhenry 于 2013-11-04 11:19 编辑

不知道理解你的意思正确不?
你可以通过以下的方式试试:
#!/bin/sh
mysql -uroot -proot  << EOF
flush tables with read lock;
insert into test.a values(7,8,'test');
EOF

我的执行结果提示:ERROR 1223 (HY000) at line 2: Can't execute the query because you have a conflicting read lock

如果正确的话,只需要把‘insert into test.a values(7,8,'test');’  修改成你所要执行的sql即可。

论坛徽章:
4
技术图书徽章
日期:2013-09-23 10:22:37狮子座
日期:2013-10-15 23:31:54卯兔
日期:2013-11-11 17:33:15金牛座
日期:2013-11-15 17:25:28
发表于 2013-11-04 11:19 |显示全部楼层
回复 3# jason_teach


    你说的这个需求,mysqlhotcopy已经实现了,不用自己再重写脚本,你安装的mysql应该带了mysqlhotcopy这个脚本

论坛徽章:
0
发表于 2013-11-06 16:58 |显示全部楼层
回复 6# nbrr


    我的测试库innodb和myisam都有,我想利用xtrabackup的innobackupex工具写个脚本,同时备份myisam和innodb。不简简单单使用命令hotcopy进行备份那样。

论坛徽章:
4
技术图书徽章
日期:2013-09-23 10:22:37狮子座
日期:2013-10-15 23:31:54卯兔
日期:2013-11-11 17:33:15金牛座
日期:2013-11-15 17:25:28
发表于 2013-11-06 17:42 |显示全部楼层
本帖最后由 nbrr 于 2013-11-06 17:43 编辑

回复 7# jason_teach


你在3楼说要备份myisam,我以为没别的引擎类型了
如果有myisam innodb的话,可以试试这个方法

  1. mysql -uroot -proot <<EOF
  2. FLUSH TABLES WITH READ LOCK;
  3. \! cp -pr /var/lib/mysql /var/lib/mysql.`date +%Y%m%d`
  4. unlock tables;
  5. EOF
复制代码
我用cp来演示备份,如果你的备份命令比较复杂,可以写到脚本里
然后用\!来调用脚本

根据2楼,在退出mysql终端的时候都会隐式的执行unlock tables,所以我的脚本里的unlock tables;那一行删掉也行

论坛徽章:
0
发表于 2013-11-07 15:05 |显示全部楼层
回复 8# nbrr


    嗯,也可以这样写
mysql -uroot -proot <<EOF
FLUSH TABLES WITH READ LOCK;
system  cp -pr /var/lib/mysql /var/lib/mysql.`date +%Y%m%d`
unlock tables;
EOF

把\!写成system

论坛徽章:
0
发表于 2013-11-14 14:24 |显示全部楼层
既然用了xtrabackup,那直接用这脚本就行了,支持同时备份 myisam 和 innodb


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP