MySQL中有太多未知的写入

时间:2016-08-06 09:06:37

标签: mysql

我的生产环境中有一个MySQL数据库。它有大约4.3亿行,其中1.9亿行没有任何用处,所以我开始删除这些行的范围,在夜晚,因为它会影响我的应用程序在白天的表现。

现在,当我在监控应用程序中看到时,我看到100%IO,其中最大值是写入(12-30MB / s)。 (400-500写/秒) 但是当我检查进程列表时,我没有找到任何INSERT或UPDATE查询或任何回滚。

可能存在的问题是什么,或者如何找到可能在MySQL中编写的任何隐藏查询。

(在IOTP中,我发现写操作仅由mysqld完成) this fine answer

还有一件事,我可以在IOTOP中看到80MB / s的写入,但是当我在/中检查目录大小时,我看不到任何目录大小的上升。

2 个答案:

答案 0 :(得分:1)

删除操作是否仍在进行中? DELETE可能非常慢并且会产生大量写入。通常最好创建一个新的相同表并将要保留的行复制到它,然后用生产表切换它,而不是直接删除生产表中的东西。

如果DELETE已经完成并且您怀疑还有其他查询正在运行,您可以启用查询日志几秒钟并查看执行了哪些查询:

TRUNCATE TABLE mysql.general_log;
SET GLOBAL log_output = 'TABLE';
SET GLOBAL general_log = 'ON';
SELECT SLEEP(10);
SET GLOBAL general_log = 'OFF';

然后从mysql.general_log中选择SELECT,以查看在10秒睡眠期间执行的查询。

答案 1 :(得分:1)

慢慢退后......等等。

InnoDB不会使用每个DML查询更改表空间文件中的实际数据。

它将更改写入内存,当然,然后是redo log,此时它们实际上是#34; live"并安全地保存到磁盘...但它们尚未应用于实际数据(表空间)文件。 InnoDB然后在后台同步对数据文件的更改,但同时,其他查询使用表空间和日志内容的组合来确定"官方"表数据目前包含。当然,这是过度简化,但MVCC必然意味着物理数据是逻辑数据的超集,但不一定是正确的超集。

这很可能是你现在所看到的解释。

有意义的是,空闲/使用的磁盘空间没有变化,因为最终删除这些行只会将表空间文件中的空间标记为未使用。他们不应该成长或缩小。

抵制诱惑试图修复"无论你做什么,都不要重新启动服务器...因为最好的结果是它会从它停止的地方开始,因为它还有工作要做。

import pandas as pd from sklearn.linear_model import Ridge import numpy as np data = pd.DataFrame({"Name": ["A", "A", "A", "B", "B", "B"], "Score": [90, 80, 90, 92, 87, 80], "Age": [10, 12, 14, 9, 11, 12], "Training": [0, 1, 2, 0,$ modeldict = {} # INITIALIZE DICT grouped_df = data.groupby(['Name']) for key, item in grouped_df: Score = grouped_df['Score'] Y = grouped_df['Age', 'Training'] Score_item = Score.get_group(key) Y_item = Y.get_group(key) model = Ridge(alpha = 1.2) modelfit = model.fit(Y_item, Score_item) modelpred = model.predict(Y_item) modelscore = model.score(Y_item, Score_item) modeldict[key] = modelfit # SAVE EACH FITTED MODEL TO DICT line = [u"A, 13, 0", u"B, 12, 1", u"A, 10, 0"] Name = [line[i].split(",")[0] for i in range(len(line))] Age = [line[i].split(",")[1] for i in range(len(line))] Training = [line[i].split(",")[2] for i in range(len(line))] for i in range(len(line)): Name = line[i].split(",")[0] Age = line[i].split(",")[1] Training = line[i].split(",")[2] model = modeldict[Name] ip = [float(Age), float(Training)] score = model.predict(ip) print score 需要一些练习来解释,但很可能是这个难题的另一个关键。