首页数据库MySQL在非双1场景下的丢数据问题

MySQL在非双1场景下的丢数据问题

时间2023-11-27 18:14:03发布访客分类数据库浏览886
导读:开发哥们最近遇到个问题,说是Django ORM日志上看数据已经提交了,但是服务器突然断电,重启后发现之前写入的数据丢失了。 让我帮看看什么原因导致的。这个问题其实很常见,大概率是MySQL没有设置双一导致的。下面简单实验模拟下。先确保my...

开发哥们最近遇到个问题,说是Django ORM日志上看数据已经提交了,但是服务器突然断电,重启后发现之前写入的数据丢失了。 让我帮看看什么原因导致的。

这个问题其实很常见,大概率是MySQL没有设置双一导致的。

下面简单实验模拟下。

先确保mysqld单进程运行
(如果是mysqld_safe守护的请先kill掉mysqld_safe进程,防止我们后面kill -9的时候,mysqld会自动再次拉起mysqld进程)
(systemd守护的也会自动拉起)

设置下参数,确保非双1

# 我这里是修改后的参数
mysql [localhost:5726] {
root}
     ((none)) >
     show global variables like '%innodb%trx%commit%';

+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 0     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql [localhost:5726] {
root}
     ((none)) >
     show global variables like '%sync%bin%';

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog   | 0     |
+---------------+-------+
1 row in set (0.01 sec)

# 当前数据库里面情况
mysql [localhost:5726] {
root}
     ((none)) >
     select * from test.t1;
    
+----+------+------+
| id | name | sex  |
+----+------+------+
|  1 | wang | M    |
|  2 | wang | F    |
+----+------+------+
2 rows in set (0.00 sec)

脚本模拟:


# a.sh脚本
# 先写入数据,然后查出来,最近kill -9 杀进程
mysql -S /tmp/mysql_sandbox5726.sock -uroot -pmsandbox -e 'update test.t1 set sex="A" where id=2'
mysql -S /tmp/mysql_sandbox5726.sock -uroot -pmsandbox -e 'select * from  test.t1 where id=2'
kill -9 28048  # 直接kill mysqld进程,这里的进程号替换成自己机器上的

脚本执行过程如下:
$ sh a.sh
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql: [Warning] Using a password on the command line interface can be insecure.
+----+------+------+
| id | name | sex  |
+----+------+------+
|  2 | wang | A    |
+----+------+------+

再次启动mysqld,查看数据更新情况


./start 

$ mysql -S /tmp/mysql_sandbox5726.sock -uroot -pmsandbox -e 'select * from  test.t1 where id=2'
mysql: [Warning] Using a password on the command line interface can be insecure.
+----+------+------+
| id | name | sex  |
+----+------+------+
|  2 | wang | F    |  # 可以看到数据没有更新成功,还是F
+----+------+------+

至此,我们也看到了如果MYSQL参数设置非双1是极其危险的。

生产上主节点切记请设置为双一,从库一般可以宽松点,例如设置为: 
sync_binlog=100
innodb_flush_log_at_trx_commit=2

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: MySQL在非双1场景下的丢数据问题
本文地址: https://pptw.com/jishu/557897.html
使用my2sql提取binlog里的数据 如何使用向量数据库解决复杂问题

游客 回复需填写必要信息