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




点赞

发表评论