MySQL运行中被改权限测试

作者:吴炳锡 来源:http://wubx.net/ 联系方式: wubingxi#163.com 转载请注明作/译者和出处,并且不能用于商业用途,违者必究.

今天一个接到一个朋友求助,说是数据在运行中,数据库的目录被改了权限。如: 数据库目结构如下:

datadir=/data/mysql/mysql3306/data
log-bin = /data/mysql/mysql3306/logs
tmpdir  = /data/mysql/mysql3306/tmp

被运维同步执行了:

chown -R  root:root /data/mysql/mysql3306

1.构建主从环境

mysql;3306 主
/data/mysql/mysql3306/{data,tmp,logs}
mysql;3307 从
/data/mysql/mysql3307/{data,tmp,logs}

2. 在主的wubx库里创建:

CREATE TABLE `t2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
)

确认复制正常。

3. 把主库的目录权限改成root

chown -R root:root /data/mysql/mysql3306

4. 弄出来大量的写入

for i in `seq(100000); do mysql wubx -e "insert into t2(name) vlaues('golang$i')"; done

5. 观查主库和从库上数据
发现日志没有切换时,数据都可以写入,同步正常。 主库上binlog还可以正常写入。

6. 模拟日拟切换
主库上执行: flush logs;
得到报错:
切换日志错误

从库同步报错:
1595错误
show slave status\G;
show slave status\G;

从这里看出来,从库获取到主库日志切换指令,但主库没能创建出来新的日志,所以造成复制中断。

7.结论
主库上不影响数据写入,但发生日志切换后,不能进行新的日志写入,但没卡住写入。
从库上在主库日志发生切后,能得到新的日志文件名,但不能获到新的日志,所以同步停掉。

8.修复建议:
通过实验说明,主库上的数据是最全的,在后续日志切换失败后,没有影响数据的写入。但数据没有同步到从上。

 

思考:

这个有点是mysqld的一个bug的感觉了,日志已经无法写入,但数据还可以写入。 很容易造成同步有问题。 对于数据不同步怎么修复。多次给学生们讲过,也能很快的把环境处理好。

Good luck!

MySQL运行中被改权限测试》上有2个想法

  1. 这个绝对不是mysqld的bug。
    切换之前日志可以写,应该是因为文件已经被mysqld打开了
    切换之后不能写,只因为目录权限不够,无法创建日志文件

    • 实质上你可以这样看待这个问题。如果不能写日志, 尽可能的就报错就行了。别让还能写入,这样复制一下就被玩坏了。 从产品设计上可以改进,但从代码实现那块又不是严格的事务处理。 所以这块大家小心对待吧。BTW: 这个事也是那个同学的公司的SA要收回系统的权限过程中搞出来的一个误操作。

评论已关闭。