MySQL FROM_UNIXTIME根据指定时间段分组获取数据

UNIX_TIMESTAMP 将时间输出为时间戳

1、无参数调用:UNIX_TIMESTAMP()

返回值:当前时间戳

例子:select UNIX_TIMESTAMP(); => 1494746052  (2017/5/14 15:14:12)

2、无参数调用:UNIX_TIMESTAMP(date)

例子:select UNIX_TIMESTAMP("2017-01-01"); => 1483200000  (2017/01/01 00:00:00)



FROM_UNIXTIME 格式化MYSQL时间戳函数

作用:将MySQL中以int(11)存储的时间以"YYYY-MM-DD HH-II-SS"的格式来显示

语法,FROM_UNIXTIME(time,"%Y-%m-%d %H:%i:%s")

比如统计每天销售时间段高峰期(以小时分组),数据库表存了一张订单记录表:create table table_name(id int primary key,time int(10));  time记录的是订单时间戳,以前的做法是,接收查询开始时间、查询结束时间,然后循环查询每天的注册数量,代码:

/* 查询2015-12-01 至 2015-12-14 */  
// 开始的时间戳  
$startUnix = 1494604800; // 2017-05-13 00:00:00  
// 结束的时间戳  
$endUnix = 1494777599;   // 2017-05-14 23:59:59  
for($i = $startUnix; $i < $endUnix; $i += 86400){  // 86400为1天的秒数  
    // 查询  
    $sql = 'select count(*) from table_name where time> '.$i.' and register_time <= '.$i + 86400;  
    // 执行查询  
}

这种方法的弊端就是,查询开始于结束的日期相差多少天就查询检索数据库多少次。

优化方法:

/* 查询2017-05-13 至 2017-05-14 */  
// 开始的时间戳  
$startUnix = 1494604800; // 2017-05-13 00:00:00  
// 结束的时间戳  
$endUnix = 1494777599;   // 2017-05-14 23:59:59 
  
$sql = 'select count(id) as count, FROM_UNIXTIME(time, '%H') as datetime from table_name where time> '.$startUnix.' and time <= '.$endUnix group by datetime;  
// 执行查询

1111111111.png


查询时把时间戳转成小时,最后group by 分组,得到每天每个小时段的订单数,查询数据库一次

QQ截图20170514150550.png

PHP:array_multisort()对多维数组重新排序

日常的工作中,PHP经常会需要对复杂的数据重新排序处理。

可以使用PHP的array_multisort()对多个数组或多维数组进行重新排序

关联(string)键名保持不变,但数字键名会被重新索引。 
输入数组被当成一个表的列并以行来排序——这类似于 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话就按照下一个输入数组中相应值的大小来排序,依此类推。——这句话是理解此函数用法的关键。

第一个参数必须是一个数组。接下来的每个参数可以是数组或者是下面列出的排序标志。

排序顺序标志: 
■SORT_ASC - 按照上升顺序排序 
■SORT_DESC - 按照下降顺序排序

排序类型标志: 
■SORT_REGULAR - 将项目按照通常方法比较 
■SORT_NUMERIC - 将项目按照数值比较 
■SORT_STRING - 将项目按照字符串比较

每个数组之后不能指定两个同类的排序标志。每个数组后指定的排序标志仅对该数组有效 - 在此之前为默认值 SORT_ASC 和 SORT_REGULAR。

$num1 = array(3, 5, 4, 3);
$num2 = array(27, 50, 44, 78);
array_multisort($num1, SORT_ASC, $num2, SORT_DESC);
print_r($num1);
print_r($num2);
//result: Array ( [0] => 3 [1] => 3 [2] => 4 [3] => 5 ) Array ( [0] => 78 [1] => 27 [2] => 44 [3] => 50 )

对多维数组(以二位数组为例)进行排序:

先看下结果(左边是未排序之前的数组,右边是排序过后的数组,按照price从大到小排序)

QQ截图20170508104853.png


下面是排序处理源码,最终得到上图的排序结果

	foreach ($out_arr['data'] as $k => $v) {
		$arr[] = $v['son']['price'];			//将需要排序的字段压入空数组
	}
			
	array_multisort($arr,SORT_DESC,SORT_NUMERIC,$out_arr['data']);
//	参数:1.排序数据,2.排序方式,3将每一项按数字顺序排列,4.数据源

QQ截图20170508105532.png

基于ThinkPHP框架MySQL事务的使用

一个事务是一个连续的一组数据库操作,就好像它是一个单一的工作单元进行。换言之,永远不会是完整的事务,除非该组内的每个单独的操作是成功的。如果在事务的任何操作失败,则整个事务将失败。

实际上,很多项目的连贯操作都需要依赖事务来保证数据的完整性。将许多SQL查询到一个组中,将执行所有的人都一起作为事务的一部分。


事务的特性: 

事务有以下四个标准属性的缩写ACID,通常被称为:


原子性: 确保工作单元内的所有操作都成功完成,否则事务将被中止在故障点,和以前的操作将回滚到以前的状态。


一致性: 确保数据库正确地改变状态后,成功提交的事务。


隔离性: 使事务操作彼此独立的和透明的。


持久性: 确保提交的事务的结果或效果的系统出现故障的情况下仍然存在。


MySQL的存储引擎

关系数据库表是用于存储和组织信息的数据结构,可以将表理解为由行和列组成的表格,类似于Excel的电子表格的形式。有的表简单,有的表复杂,有的表根本不用来存储任何长期的数据,有的表读取时非常快,但是插入数据时去很差;而我们在实际开发过程中,就可能需要各种各样的表,不同的表,就意味着存储不同类型的数据,数据的处理上也会存在着差异,那么。对于MySQL来说,它提供了很多种类型的存储引擎,我们可以根据对数据处理的需求,选择不同的存储引擎,从而最大限度的利用MySQL强大的功能。这篇博文将总结和分析各个引擎的特点,以及适用场合,并不会纠结于更深层次的东西。


在mysql客户端中,使用以下命令可以查看MySQL支持的引擎。

show engines;

MyISAM

MyISAM表是独立于操作系统的,这说明可以轻松地将其从Windows服务器移植到Linux服务器;每当我们建立一个MyISAM引擎的表时,就会在本地磁盘上建立三个文件,文件名就是表明。例如,我建立了一个MyISAM引擎的tb_Demo表,那么就会生成以下三个文件:


1.tb_demo.frm,存储表定义;
2.tb_demo.MYD,存储数据;
3.tb_demo.MYI,存储索引。

MyISAM表无法处理事务,这就意味着有事务处理需求的表,不能使用MyISAM存储引擎。MyISAM存储引擎特别适合在以下几种情况下使用:

1.选择密集型的表。MyISAM存储引擎在筛选大量数据时非常迅速,这是它最突出的优点。
2.插入密集型的表。MyISAM的并发插入特性允许同时选择和插入数据。例如:MyISAM存储引擎很适合管理邮件或Web服务器日志数据。


InnoDB

InnoDB是一个健壮的事务型存储引擎,这种存储引擎已经被很多互联网公司使用,为用户操作非常大的数据存储提供了一个强大的解决方案。我的电脑上安装的MySQL 5.6.13版,InnoDB就是作为默认的存储引擎。InnoDB还引入了行级锁定和外键约束,在以下场合下,使用InnoDB是最理想的选择:

1.更新密集的表。InnoDB存储引擎特别适合处理多重并发的更新请求。
2.事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎。
3.自动灾难恢复。与其它存储引擎不同,InnoDB表能够自动从灾难中恢复。
4.外键约束。MySQL支持外键的存储引擎只有InnoDB。
5.支持自动增加列AUTO_INCREMENT属性。

一般来说,如果需要事务支持,并且有较高的并发读取频率,InnoDB是不错的选择。


MEMORY

使用MySQL Memory存储引擎的出发点是速度。为得到最快的响应时间,采用的逻辑存储介质是系统内存。虽然在内存中存储表数据确实会提供很高的性能,但当mysqld守护进程崩溃时,所有的Memory数据都会丢失。获得速度的同时也带来了一些缺陷。它要求存储在Memory数据表里的数据使用的是长度不变的格式,这意味着不能使用BLOB和TEXT这样的长度可变的数据类型,VARCHAR是一种长度可变的类型,但因为它在MySQL内部当做长度固定不变的CHAR类型,所以可以使用。

一般在以下几种情况下使用Memory存储引擎:

1.目标数据较小,而且被非常频繁地访问。在内存中存放数据,所以会造成内存的使用,可以通过参数max_heap_table_size控制Memory表的大小,设置此参数,就可以限制Memory表的最大大小。

2.如果数据是临时的,而且要求必须立即可用,那么就可以存放在内存表中。

3.存储在Memory表中的数据如果突然丢失,不会对应用服务产生实质的负面影响。

Memory同时支持散列索引和B树索引。B树索引的优于散列索引的是,可以使用部分查询和通配查询,也可以使用<、>和>=等操作符方便数据挖掘。散列索引进行“相等比较”非常快,但是对“范围比较”的速度就慢多了,因此散列索引值适合使用在=和<>的操作符中,不适合在<或>操作符中,也同样不适合用在order by子句中。


MERGE

MERGE存储引擎是一组MyISAM表的组合,这些MyISAM表结构必须完全相同,尽管其使用不如其它引擎突出,但是在某些情况下非常有用。说白了,Merge表就是几个相同MyISAM表的聚合器;Merge表中并没有数据,对Merge类型的表可以进行查询、更新、删除操作,这些操作实际上是对内部的MyISAM表进行操作。Merge存储引擎的使用场景。

对于服务器日志这种信息,一般常用的存储策略是将数据分成很多表,每个名称与特定的时间端相关。例如:可以用12个相同的表来存储服务器日志数据,每个表用对应各个月份的名字来命名。当有必要基于所有12个日志表的数据来生成报表,这意味着需要编写并更新多表查询,以反映这些表中的信息。与其编写这些可能出现错误的查询,不如将这些表合并起来使用一条查询,之后再删除Merge表,而不影响原来的数据,删除Merge表只是删除Merge表的定义,对内部的表没有任何影响。


ARCHIVE

Archive是归档的意思,在归档之后很多的高级功能就不再支持了,仅仅支持最基本的插入和查询两种功能。在MySQL 5.5版以前,Archive是不支持索引,但是在MySQL 5.5以后的版本中就开始支持索引了。Archive拥有很好的压缩机制,它使用zlib压缩库,在记录被请求时会实时压缩,所以它经常被用来当做仓库使用。


如何选择合适的存储引擎?
(1)选择标准可以分为:
(2)是否需要支持事务;
(3)是否需要使用热备;
(4)崩溃恢复:能否接受崩溃;
(5)是否需要外键支持;
然后按照标准,选择对应的存储引擎即可。


下面是基于ThinkPHP框架的事务使用方式

//启动事务:
$User->startTrans(); 
//提交事务:
$User->commit();
//事务回滚:
$User->rollback();

QQ截图20170419161754.png

thinkphp隐藏默认显示的index.php入口配置

一、在Apache根目录conf文件夹下的httpd.conf配置文件中加载mod_rewrite.so模块;

#LoadModule rewrite_module modules/mod_rewrite.so把前面的井号注释去掉

QQ截图20170419152141.png


二、将AllowOverride None 的None全部改为 All     

在APACHE里面去配置 (注意其他地方的AllowOverride也统统设置为ALL)

即:AllowOverride none  改   AllowOverride ALL

保存httpd.conf,重启Apache服务器;

QQ截图20170419152310.png


三、配置配置项文件config.php

/*隐藏index.php主入口*/
'URL_CASE_INSENSITIVE' => true,
//REWRITE模式
'URL_MODEL' => 2,

QQ截图20170419152453.png


四、在根目录下的.htaccess文件添加:

Rewritebase /index.php

注意:如果在Linux的服务器下,.htaccess文件使用下面的配置

#伪静态和泛域名 
 #此文件禁止在行内注释
 <IfModule mod_rewrite.c>
 RewriteEngine on
 #禁止对图片等文件重写:没有这一条,所有的404都会执行index.php脚本,耗费大量资源。
 RewriteCond %{REQUEST_URI} !((.*).jpg|.jpeg|.bmp|.gif|.png|.js|.css)$
 #禁止对/public文件夹内重写,作用同上
 RewriteCond %{REQUEST_URI} !(^/public/(.*))$
 #如果是一个物理存在的目录,禁止重写
 RewriteCond %{REQUEST_FILENAME} !-d
 #如果是一个物理存在的文件,禁止重写
 RewriteCond %{REQUEST_FILENAME} !-f
 #上面2条不识别REQUEST_FILENAME时的替代写法
 #RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
 #RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
 #php api模式,服务器能识别PATH_INFO
 #RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
 #php fastcgi模式 服务器不识别PATH_INFO
 RewriteRule ^(.*)$ index.php [E=PATH_INFO:$1,QSA,PT,L]
 </IfModule>

微信截图_20170523164843.png

至此配置完成。。。

web性能优化 - Apache-ab压力测试

Apache的ab命令模拟多线程并发请求,测试服务器负载压力,ab命令对发出负载的计算机要求很低,既不会占用很多CPU,也不会占用太多的内存,但却会给目标服务器造成巨大的负载,因此是某些DDOS攻击之必备良药,老少皆宜。自己使用也须谨慎。否则一次上太多的负载,造成目标服务器直接因内存耗光死机,而不得不硬重启,得不偿失。在带宽不足的情况下,最好是本机进行测试,建议使用内网的另一台或者多台服务器通过内网进行测试,这样得出的数据,准确度会高很多。远程对web服务器进行压力测试,往往效果不理想(因为网络延时过大或带宽不足)
Apache附带的压力测试工具ab,非常容易使用,并且完全可以摸你各种条件对Web服务器发起测试请求。ab可以直接在Web服务器本地发起测试请求,这对于需要了解服务器的处理性能至关重要,因为它不包括数据的网络传输时间以及用户PC本地的计算时间。。

11.png


   参数:-n 在测试会话中所执行的请求总数
         -c 一次产生的请求个数,并发数。默认是一次一个。
         -t测试所进行的最大秒数。其内部隐含值是-n 50000,它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。
         -p包含了需要POST的数据的文件。
         -P对一个中转代理提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即, 
是否发送了401认证需求代码),此字符串都会被发送。
         -T POST数据所使用的Content-type头信息。
         -v设置显示信息的详细程度-4或更大值会显示头信息,3或更大值可以显示响应代码(404,200等),2或更大值可以显示警告和其他信息。
         -V显示版本号并退出。
         -w以HTML表的格式输出结果。默认时,它是白色背景的两列宽度的一张表。
         -i执行HEAD请求,而不是GET。
         -x设置<table>属性的字符串。
         -X对请求使用代理服务器。
         -y设置<tr>属性的字符串。
         -z设置<td>属性的字符串。

22.png


This is ApacheBench, Version 2.3 <$Revision: 655654 $> 
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ 
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 192.168.0.10 (be patient) 
Completed 100 requests 
Completed 200 requests 
Completed 300 requests 
Completed 400 requests 
Completed 500 requests 
Completed 600 requests 
Completed 700 requests 
Completed 800 requests 
Finished 800 requests

Server Software:        Microsoft-HTTPAPI/2.0 
Server Hostname:        192.168.0.10 
Server Port:            80
Document Path:          / 
Document Length:        315 bytes        //HTTP响应数据的正文长度
Concurrency Level:      800 
Time taken for tests:   0.914 seconds    //所有这些请求处理完成所花费的时间 
Complete requests:      800              //完成请求数 
Failed requests:        0                //失败请求数 
Write errors:           0                
Non-2xx responses:      800 
Total transferred:      393600 bytes     //网络总传输量 
HTML transferred:       252000 bytes     //HTML内容传输量 
Requests per second:    875.22 [#/sec] (mean) //吞吐量-每秒请求数 
Time per request:       914.052 [ms] (mean)   //服务器收到请求,响应页面要花费的时间 
Time per request:       1.143 [ms] (mean, across all concurrent requests) //并发的每个请求平均消耗时间 
Transfer rate:          420.52 [Kbytes/sec] received //平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题

网络上消耗的时间的分解: 
Connection Times (ms) 
              min  mean[+/-sd] median   max 
Connect:        0    1   0.5      1       3 
Processing:   245  534 125.2    570     682 
Waiting:       11  386 189.1    409     669 
Total:        246  535 125.0    571     684


Thinkphp3.2.3使用PHPqrcode生成二维码(附带插件下载链接)

前段时间用jquery.qrcode给每个页面自动生成二维码,却发现和前端页面的jQuery冲突导致某些js效果失效,后来换成使用PHPqrcode生成二维码,前端直接调用接口


PHPqrcode下载链接:http://pan.baidu.com/s/1qY0I4jU

提取密码:2asa


一:下载PHPqrcode并且解压


二:将PHPqrcode文件夹放入ThinkPHP\Library\Vendor中

QQ截图20170113153109.png


三:在控制器中写入下方代码

/**
* 生成链接二维码
* @param $id : 文章主键
* @param $level : 容错级别
* @param $size : 点大小
*/
public function qrcode($id=9,$level=3,$size=4){
			
	Vendor('phpqrcode.phpqrcode');					//导入phpqrcode组件
	$url = "http://www.isblog.cn/isC/".$id.".html";		//跳转链接
	$errorLevel = intval($level);					//容错级别:L、M、Q、H
	$imgSize = intval($size);					//点的大小:1到10,用于手机端4就可以了
	$object = new \QRcode();					//实例化
	$object->png($url, false, $errorLevel, $imgSize, 2);
			
}

22.png


四:在前端页面需要调用该二维码的img标签中直接调用该方法即可

33.png

ThinkPHP3.2.3路由设置,短链接优化站点url,更利于搜索引擎优化

众所周知,搜索引擎对于动态路径的网站抓取是相当不友好的,因此,网站该如何设置静态、伪静态页面呢?


下面说一下ThinkPHP3.2.3框架的静态路由设置(静态路由其实属于规则路由的静态简化版,又称之为URL映射)。


一:在Application\Common\Conf\config.php中配置路由配置项

return array(
//'配置项'=>'配置值'
//模块化
'MODULE_ALLOW_LIST'      =>  ['Home','Admin'],                   //设置URL不显示的模块名
'MODULE_DENY_LIST'       =>  ['Module'],                         //设置禁止访问的模块列表
//路由设置
'URL_MODEL'              =>  2,                                 //URL模式,去除index.php
'URL_ROUTER_ON'         =>  TRUE,                               //开启路由
'URL_ROUTE_RULES'        =>  [                                   //定义路由规则
           'Blog/list'           =>     'enty/index',            //静态路由
           'Blog/cont/:id\d'     =>     'user/editArticle',      //动态路由
],
);


1.png

2.png

至此路由配置完成。

点击下面打赏一个呗~

WordPress博客系统外部主题安装

如果你在WordPress官方主题目录无法找到你喜欢的WordPress主题,你还可以尝试使用 谷歌。 想创建一个软件主题博客? 搜索”software wordpress theme” ;想创建一个在线商店出售产品? 搜索“online store wordpress theme” ……。

在这里,推荐几个第三方WordPress主题收藏站:

1.wopus.org——目前国内最大的WordPress主题站,提供大量的国内外WordPress主题

2.wpued.com——相对wopus,wpued提供的WordPress主题较少,但不失是个找主题的好地方

3. boygj.com——提供大量的国外免费和收费WordPress主题,是笔者最喜欢关注的国外博客之一。除了推荐WordPress主题,它还推荐Joomla模板、Drupal主题和其他一些建站素材。

如果你的预算充足,你还可以考虑购买一些优秀的专业WordPress,国外的专业WordPress主题价格一般在20-60美金之间,质量对于免费的WordPress主题好很多。或者请专业的WordPress主题设计者为了量身定做一个,价格会相对较高,视主题的功能和制作难度而定。

一旦你找到一个合适的WordPress主题,从网站下载.zip文件到你的电脑。

点击”外观—主题”进入主题管理面板,然后点击添加新主题,在下一页选择“上传”,并选择你计算机上要上传的WordPress主题.zip文件进行上传并进行安装。

如果由于某些原因,使用WordPress管理面板可以出现主题安装失败,这种情况下你可以尝试使用FTP工具直接上传WordPress主题。将主题.zip压缩包解压至你的电脑, 然后用FTP工具把它上传到您的服务器。 我们推荐你使用FlashFXP。使用FlashFXP上传WordPress主题,需要设置你的主机信息,比如网站主机的IP,FTP用户名和密码。将主题(整个文件夹)上传到wp-content/themes/文件夹下即可。

20161223114724161.png

使用前端插件jquery.qrcode生成网页二维码(附带插件下载链接)

使用jquery.qrcode插件,给不同的网页自动生成二维码。


jquery.qrcode插件下载链接:http://pan.baidu.com/s/1eSDocG6

提取密码:dn5p


jquery.qrcode支持使用table和canvas方式渲染

canvas性能还是非常不错的,但是如果用table方式,性能不太理想,特别是IE9以下的浏览器,所以需要自行优化一下渲染table的方式,这里就不细述了。


一:引入依赖jQuery库


二:引入jquery.qrcode.min.js插件库


三:在页面底部添加下方js代码

<script type="text/javascript">
var url = "http://www.isblog.cn/index.html";//页面链接
   $('#qrcode').qrcode({//绑定显示二维码图片的div
      width: 150,//二维码宽度
      height: 150,//二维码高度
      text: url//传入url
   });
</script>

QQ截图20170112111752.png

MySQL实用命令及使用innodb_force_recovery处理表损坏

一、非常实用的MySQL语句

1. 计算年数

你想通过生日来计算这个人有几岁了。

SELECTDATE_FORMAT(FROM_DAYS(TO_DAYS(now()) - TO_DAYS(@dateofbirth)), '%Y') + 0;
SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(now())- TO_DAYS('1987-02-28 14:23:56')),'%Y') + 0;


2. 两个时间的差

取得两个 datetime 值的差。假设 dt1  dt2 datetime 类型,其格式为 ‘yyyy-mm-dd hh:mm:ss’,那么它们之间所差的秒数为:

UNIX_TIMESTAMP( dt2 ) - UNIX_TIMESTAMP( dt1 ) 除以60就是所差的分钟数,除以3600就是所差的小时数,再除以24就是所差的天数。


3. 显示某一列出现过N次的值

SELECT id
FROM tbl
GROUP BY id
HAVING COUNT(*) = N;


4. 计算两个日子间的工作日

所谓工作日就是除出周六周日和节假日。

SELECT COUNT(*)
FROM calendar
WHERE d BETWEEN Start ANDStop
AND DAYOFWEEK(d) NOTIN(1,7)
AND holiday=0;


5. 查找表中的主键

SELECT k.column_name
FROMinformation_schema.table_constraints t
JOINinformation_schema.key_column_usage k
USING(constraint_name,table_schema,table_name)
WHEREt.constraint_type='PRIMARY KEY'
AND t.table_schema='db'
AND t.table_name=tbl'


6. 查看你的数库有多大

ELECT
table_schema AS 'Db Name',
Round( Sum( data_length +index_length ) / 1024 / 1024, 3 ) AS 'Db Size (MB)',
Round( Sum( data_free ) /1024 / 1024, 3 ) AS 'Free Space (MB)'
FROMinformation_schema.tables
GROUP BY table_schema ;

 

二、参数innodb_force_recovery

IP修改后,环境遇到一个问题,MySQL重启后启动失败,进程不存在。经后续定位分析,MySQL的Undo表空间遭到损坏,MySQL重启后就会导致进程起不来。

日志部分如下:

The manual page athttp://dev.mysql.com/doc/mysql/en/crashing.html contains
information that should help you find outwhat is causing the crash.
130609 18:03:51 mysqld_safe mysqld from pidfile /home/mysql/data/rcs.pid ended
130609 18:11:19 mysqld_safe Starting mysqlddaemon with databases from /home/mysql/data
130609 18:11:19 [Note] Failed to executemysql_file_stat on file '../binlog/mysqlbinlog.000020'
130609 18:11:19 [Note] Plugin 'FEDERATED'is disabled.
130609 18:11:19 InnoDB: The InnoDB memoryheap is disabled
130609 18:11:19 InnoDB: Mutexes andrw_locks use GCC atomic builtins
130609 18:11:19 InnoDB: Compressed tablesuse zlib 1.2.3
130609 18:11:19 InnoDB: Using Linux nativeAIO
130609 18:11:19 InnoDB: Initializing bufferpool, size = 11.5G
130609 18:11:20 InnoDB: Completedinitialization of buffer pool
130609 18:11:20 InnoDB: highest supportedfile format is Barracuda.
130609 18:11:20  InnoDB: Error: page 2 log sequence number498375142
InnoDB: is in the future!Current system log sequence number 495237684.
InnoDB: Your database maybe corrupt or you may have copied the InnoDB
InnoDB: tablespace butnot the InnoDB log files. See
InnoDB: http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
InnoDB: for more information.
130609 18:11:20  InnoDB: Error: page 489 log sequence number495468639
InnoDB: is in the future! Current systemlog sequence number 495237684.
InnoDB: Your database may be corrupt or youmay have copied the InnoDB
InnoDB: tablespace but not the InnoDB logfiles. See
InnoDB:http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
InnoDB: for more information.

 

检查其他正常启动MySQL数据库的系统参数时,发现:

mysql> show variables like'innodb_force_recovery';                                                                         
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_force_recovery | 0     |
+-----------------------+-------+

 

发现innodb_force_recovery参数的默认值为0,意思就是当需要恢复时执行所有的恢复操作。当不能进行有效的恢复操作时,mysql就有可能无法启动。.

于是手动在my.cnf文件里面配置innodb_force_recovery=6,再重启MySQL,就可以了。

 

注意:

只有在需要从错误状态的数据库进行数据备份时,才建议设置innodb_force_recovery的值大于0。

0 —正常的关闭和启动,不会做任何强迫恢复操作;

1 —跳过错误页,让mysqld服务继续运行。跳过错误索引记录和存储页,尝试用

SELECT * INOT OUTFILE ‘../filename’ FROM tablename;方式,完成数据备份;

2 —阻止InnoDB的主线程运行。清理操作时出现mysqld服务崩溃,则会阻止数据恢复操作;

3 —恢复的时候,不进行事务回滚;

4 —阻止INSERT缓冲区的合并操作。不做合并操作,为防止出现mysqld服务崩溃。不计算表的统计信息

5 — mysqld服务启动的时候不检查回滚日志:InnoDB引擎对待每个不确定的事务就像提交的事务一样;

6 —不做事务日志前滚恢复操作;

 

具体细节可参考MySQL官方网址:http://dev.mysql.com/doc/refman/5.6/en/forcing-innodb-recovery.html