如何在 MySQL 5.5 的大型重新索引操作期间获取状态消息?

Rob*_*ler 6 mysql index insert mysql-5.5

我定期收到大量数据传输,我过去常常使用这些数据完全替换 MySQL 表的内容。每次执行此操作时,我都会截断表、禁用键、添加几百万行数据,然后启用键。正如预期的那样,一旦我启用了键,在重新索引表时会有很长的延迟。该表有几个活动索引,大约需要 30 分钟才能完成。

不幸的是,我无法弄清楚如何获取状态消息,这些消息将为我提供有关操作如何进行的进度更新。我在 MySQL 论坛上发现了一个 2001 年的旧帖子,基本上说您无法获得进度更新

我希望情况不再如此。我正在运行 MySQL Server 5.5 和 MySQL Workbench 5.2,这两个社区版本。也许我可以用工作台做些什么?

附带问题:目前,我从一个 Windows 程序执行更新,该程序将传输数据文件顺序解析为 SQL INSERT 语句,我立即通过套接字将这些语句发送到 MySQL 客户端。将所有 INSERT 语句生成到文件中,然后通过从 Workbench 执行 SQL 脚本来进行批量导入是否会更快?

——罗施勒

Rol*_*DBA 5

您需要在所有 mysql 客户端程序之外监视该进度。

在这个例子中,假设你的 MyISAM 表在数据库 mydata 中被命名为 workingset 并且 datadir 是默认值,/var/lib/mysql

旁注:如果您使用的是 Windows,请运行此 SQL 命令以获取您的数据目录

SHOW VARIABLES LIKE 'datadir';
Run Code Online (Sandbox Code Playgroud)

您将拥有代表表的三个文件

/var/lib/mysql/mydata/workingset.frm
/var/lib/mysql/mydata/workingset.MYD
/var/lib/mysql/mydata/workingset.MYI
Run Code Online (Sandbox Code Playgroud)

尝试使用临时表方法加载表工作集

use mydata
DROP TABLE IF EXIST workingsetload;
CREATE TABLE workingsetload LIKE workingset;
ALTER TABLE workingsetload DISABLE KEYS;
Perform 7 million row insert into workingsetload here, preferably LOAD DATA INFILE
ALTER TABLE workingsetload ENABLE KEYS;
ALTER TABLE workingset RENAME workingsetold;
ALTER TABLE workingsetload RENAME workingset;
DROP TABLE workingsetold;
Run Code Online (Sandbox Code Playgroud)

在表workingsetload 的加载过程中,将有一个临时表,其前五(5) 个字符是“#sql-”。您可以在 Linux 操作系统中直观地监控 workingsetload 的加载进度,如下所示:

cd /var/lib/mysql/mydata
watch -n 1 "ls -l workingsetload.MY[ID] *sql-*.MY[ID] | awk '{print $5,$9}'"
Run Code Online (Sandbox Code Playgroud)

你可以像这样在 linux 中编写它的脚本:

cd /var/lib/mysql/mydata
ls -l workingsetload.MY[ID] *sql-*.MY[ID] | awk '{print $5,$9}' > /tmp/IndexRebuild.txt
Run Code Online (Sandbox Code Playgroud)

然后,您可以相应地解析列并减去 .MYD 大小以了解 MyISAM 表的数据部分何时完成。随后,您可以相应地解析列并减去 .MYI 大小以了解 MyISAM 表的索引部分何时完成。

对于 Windows,您可以使用 Perl(Windows 的 ActivePerl)编写脚本,或者只是一遍又一遍地使用 DOS Batch 循环。

无论操作系统如何,一旦“ls -l #sql-*.MY[ID]”或“如果不存在#sql-*.MY*”一无所获,重新加载和索引就完成了。

试一试 !!!

更新 2011-07-20 16:55 EDT

Monty 已在 MariaDB 中成功实现了此功能。一探究竟 !!!