在过去的4天里,我的每晚更新出现了大量问题,除了1晚之外,这4天之间一切都很顺利。
在这些更新期间,我更新了几个全文索引。我是这样做的。
- 删除全文索引
- 更新全文表
- 添加全文索引
醇>
完美超过2年。通常的更新时间约为3-4小时,这对于每晚更新的数据量是正常的。但自周五以来,更新时间确实在 9-12 小时之间!
昨晚服务器故意被引擎崩溃,这是在错误日志中
InnoDB:警告:长信号量等待: --Thread 8676在dict0boot.ic第36行等待241.00秒信号量:Mutex at 0000000053B0C1E8创建文件dict0dict.cc 第887行,lock var 1服务员标志1 InnoDB:######启动InnoDB 监视30秒以打印诊断信息:InnoDB:待定传播 0,写0
InnoDB:######诊断信息打印到标准错误流 InnoDB:错误:信号量等待已持续> 600秒InnoDB:我们 故意使服务器崩溃,因为它似乎挂了。 2014-07-21 05:20:54 1384 InnoDB:线程4996中的断言失败 文件srv0srv.cc第1748行
InnoDB:我们故意生成内存陷阱。 InnoDB:提交一个 详细的错误报告http://bugs.mysql.com。 InnoDB:如果你得到了 重复断言失败或崩溃,甚至InnoDB:紧接着 mysqld启动时,可能有InnoDB:InnoDB中的腐败 表空间。请参考InnoDB: http://dev.mysql.com/doc/refman/5.6/en/forcing-innodb-recovery.html InnoDB:关于强迫恢复。
我刚刚重新启动服务器并且它运行良好所以我现在等待在bugs.mysql.com上发布完整的错误报告
我在这个page上发现了一些东西,它似乎是同一类问题,但没有进一步的消息。
我不知道从哪里开始,我不知道为什么会突然发生这种情况。
我必须从这里提供什么样的细节?
修改
阅读this后,它说明了
" MySQL 5.6及更高版本中的体系结构更改会产生更多工作负载 适用于禁用自适应哈希索引比以前 发布,但默认情况下仍然启用。"
我已经使用了禁用自适应哈希索引
SET GLOBAL innodb_adaptive_hash_index=0
我现在正在尝试第一次尝试查看问题是否已解决。情况就像晚上一样。
夜间更新:
更新很顺利。不到6个小时。全文索引更新没有问题,但我仍然发现使用JOIN
的简单更新查询速度很慢。 (8
秒内有40000条记录,通常在1
之内完成。
今天会继续尝试微调它。
答案 0 :(得分:14)
问题在于innodb_adaptive_hash_index
innodb_adaptive_hash_index=0
并重新启动解决了问题。
正如我在问题中所述
" MySQL 5.6及更高版本中的体系结构更改会产生更多工作负载 适用于禁用自适应哈希索引比以前 发布,但默认情况下仍然启用。"
这对我有用,因为我没有再遇到同样的问题。
答案 1 :(得分:0)
也有这样的问题。每天几次无故损坏数据库。我不确定这是否对我有帮助,但是我的解决方案是优化所有表。到目前为止三天,此问题不再出现。
有许多优化所有表的方法,但我将为您提供一个示例,说明如何通过Linux控制台使用PHP进行此操作
#!/bin/php -n
<?php
// /bin/php -n /sysmyx/mysql/hand_optimize_all_tables.php
dl('mysqlnd.so');
dl('mysqli.so');
$timestart = time();
$n=0;
$con=mysqli_connect("localhost","roootmysql","passss");
if (mysqli_connect_errno()) { echo "mysql error".PHP_EOL;
exit;
}
mysqli_query($con,"SET GLOBAL innodb_buffer_pool_dump_now = 1");
$res = mysqli_query($con,"SHOW DATABASES");
while ($row = mysqli_fetch_assoc($res)) {
$db_name=$row['Database'];
if ($db_name!="mysql" && $db_name!="information_schema" && $db_name!="performance_schema" && $db_name!="" && $db_name!="sys") {
echo '*'.$db_name.'*'.PHP_EOL;
//!!!!!!!!!!!!!!!!!!!!!!!// $query="SHOW TABLE STATUS FROM $db_name where Data_free>0;";
$query="SHOW TABLE STATUS FROM $db_name";
$tabbll=mysqli_query($con,$query);
while ($row2 = mysqli_fetch_assoc($tabbll)) {
$n++;
$opt_table='`'.$db_name.'`.`'.$row2['Name'].'`';
$query2="OPTIMIZE TABLE $opt_table";
$time1 = time();
mysqli_query($con,$query2);
$time2 = time();
$time3 = $time2-$time1;
echo $n.' '.$time3.' '.$row2['Data_free'].' '.$opt_table.PHP_EOL;
}}}
mysqli_query($con,"SET GLOBAL innodb_buffer_pool_load_now = 1");
mysqli_close($con);
$timeend = time();
$time = $timeend-$timestart;
?>
还有部分设置my.cnf
innodb_thread_concurrency=0
flush_time=0
innodb_adaptive_hash_index=0
innodb_adaptive_hash_index_parts=1
innodb_purge_threads=1
innodb_fatal_semaphore_wait_threshold=60