您的位置:首页 > 数据库 > MySQL

mysql 宕机 innodb_force_recovery,innodb_fast_shutdown对数据的影响

2014-06-11 17:15 381 查看
在关闭时,参数innodb_fast_shutdown影响着表的存储引擎为InnoDB的行为。

该参数取值为0、1、2

0 代表党MySql关闭时,InnoDB需要完成所有的full purge 和 merge insert buffer操作,这会需要一些时间。1 代表不需要完成上述的full purge ,merge insert buffer操作,但是在缓冲池的一些数据脏页还是会刷新到磁盘。2 代表不完成full purge ,merge insert buffer操作,也 不将缓冲池中的数据脏页写回磁盘,而是将日志都写入日志文件。这样不会有任何事物会丢失,但是Mysql数据库下次启动时,会执行recovery

参数Innodb_force_recovery影响了整个InnoDB存储引擎的恢复状况。默认0

测试:

环境:innodb_fast_shutdown = 2

innodb_flush_log_at_trx_commit  = 2

sync_binlog   = 0

innodb_force_recovery影响整个InnoDB存储引擎的恢复状况。默认为0,表示当需要恢复时执行所有的

恢复操作。当不能进行有效的恢复操作时,mysql有可能无法启动,并记录下错误日志。

innodb_force_recovery可以设置为1-6,大的数字包含前面所有数字的影响。

当设置参数值大于0后,可以对表进行select,create,drop操作,但insert,update或者delete这类操作

是不允许的。

1(SRV_FORCE_IGNORE_CORRUPT):忽略检查到的corrupt页。

2(SRV_FORCE_NO_BACKGROUND):阻止主线程的运行,如主线程需要执行full purge操作,会导致crash。

3(SRV_FORCE_NO_TRX_UNDO):不执行事务回滚操作。

4(SRV_FORCE_NO_IBUF_MERGE):不执行插入缓冲的合并操作。

5(SRV_FORCE_NO_UNDO_LOG_SCAN):不查看重做日志,InnoDB存储引擎会将未提交的事务视为已提交。

6(SRV_FORCE_NO_LOG_REDO):不执行前滚的操作。

测试一

破坏xbb5.ibd表

删除了数据页

innodb_force_recovery = 1-3  表不可用 

报ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysqld.sock' 错误

innodb_force_recovery = 4-6  select * 可用,select count(*) 不准缺

报ERROR 2013 (HY000): Lost connection to MySQL server during query错误

测试二

创建事务,不提交

root@test 04:32:32>begin;

Query OK, 0 rows affected (0.01 sec)

root@test 04:33:14>update test set b = b+100;

Query OK, 9999 rows affected (0.18 sec)

Rows matched: 9999  Changed: 9999  Warnings: 0

innodb_force_recovery =0  要检查回滚操作

130626 16:32:20  InnoDB: Database was not shut down normally!

InnoDB: Starting crash recovery.

InnoDB: Reading tablespace information from the .ibd files...

InnoDB: Restoring possible half-written data pages from the doublewrite

InnoDB: buffer...

InnoDB: 1 transaction(s) which must be rolled back or cleaned up

InnoDB: in total 9999 row operations to undo

InnoDB: Trx id counter is 0 12544

InnoDB: Last MySQL binlog file position 0 920753, file name /vobiledata/mysqllog/mysql-bin.000245

InnoDB: Starting in background the rollback of uncommitted transactions

130626 16:32:21  InnoDB: Rolling back trx with id 0 12032, 9999 rows to undo

InnoDB: Progress in percents: 1130626 16:32:21  InnoDB: Started; log sequence number 0 4330016

130626 16:32:21 [Note] Recovering after a crash using /vobiledata/mysqllog/mysql-bin

130626 16:32:21 [Note] Starting crash recovery...

130626 16:32:21 [Note] Crash recovery finished.

 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
90 91 92 93 94 95 96 97130626 16:32:21 [Note] Event Scheduler: Loaded 0 events

130626 16:32:21 [Note] /usr/local/mysql/bin/mysqld: ready for connections.

Version: '5.1.57-log'  socket: '/tmp/mysqld.sock'  port: 3306  MySQL Community Server (GPL)

 98 99 100

InnoDB: Rolling back of trx id 0 12032 completed

130626 16:32:21  InnoDB: Rollback of non-prepared transactions completed

如果回滚数据多,恢复就相对的慢

innodb_force_recovery =2 阻止主线程的运行,如主线程需要执行full purge操作,会导致crash。

InnoDB: Starting crash recovery.

InnoDB: Reading tablespace information from the .ibd files...

InnoDB: Restoring possible half-written data pages from the doublewrite

InnoDB: buffer...

InnoDB: 1 transaction(s) which must be rolled back or cleaned up

InnoDB: in total 9999 row operations to undo

InnoDB: Trx id counter is 0 15616

InnoDB: Last MySQL binlog file position 0 920753, file name /vobiledata/mysqllog/mysql-bin.000245

InnoDB: Starting in background the rollback of uncommitted transactions

130626 17:05:53  InnoDB: Rolling back trx with id 0 15104, 9999 rows to undo

InnoDB: Progress in percents: 1130626 17:05:53  InnoDB: Started; log sequence number 0 13016158

InnoDB: !!! innodb_force_recovery is set to 2 !!!

130626 17:05:53 [Note] Recovering after a crash using /vobiledata/mysqllog/mysql-bin

130626 17:05:53 [Note] Starting crash recovery...

130626 17:05:53 [Note] Crash recovery finished.

 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85130626 17:05:53
[Note] Event Scheduler: Loaded 0 events

130626 17:05:53 [Note] /usr/local/mysql/bin/mysqld: ready for connections.

Version: '5.1.57-log'  socket: '/tmp/mysqld.sock'  port: 3306  MySQL Community Server (GPL)

 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

InnoDB: Rolling back of trx id 0 15104 completed

130626 17:05:53  InnoDB: Rollback of non-prepared transactions completed

innodb_force_recovery =3 不执行回滚操作

130626 16:33:53  InnoDB: Database was not shut down normally!

InnoDB: Starting crash recovery.

InnoDB: Reading tablespace information from the .ibd files...

InnoDB: Restoring possible half-written data pages from the doublewrite

InnoDB: buffer...

InnoDB: 1 transaction(s) which must be rolled back or cleaned up

InnoDB: in total 9999 row operations to undo

InnoDB: Trx id counter is 0 13056

InnoDB: Last MySQL binlog file position 0 920753, file name /vobiledata/mysqllog/mysql-bin.000245

130626 16:33:53  InnoDB: Started; log sequence number 0 6497918

InnoDB: !!! innodb_force_recovery is set to 3 !!!

130626 16:33:53 [Note] Recovering after a crash using /vobiledata/mysqllog/mysql-bin

130626 16:33:53 [Note] Starting crash recovery...

130626 16:33:53 [Note] Crash recovery finished.

130626 16:33:53 [Note] Event Scheduler: Loaded 0 events

130626 16:33:53 [Note] /usr/local/mysql/bin/mysqld: ready for connections.

Version: '5.1.57-log'  socket: '/tmp/mysqld.sock'  port: 3306  MySQL Community Server (GPL)

innodb_force_recovery =5 不查看重做日志,innodb存储引擎会将未提交的事务事务已经提交

此时数据已经被update

+----+------+------+------+

| a  | b    | c    | d    |

+----+------+------+------+

|  1 |  101 |    1 |    1 |

|  2 |  102 |    2 |    2 |

|  3 |  103 |    3 |    3 |

|  4 |  104 |    4 |    4 |

|  5 |  105 |    5 |    5 |

|  6 |  106 |    6 |    6 |

|  7 |  107 |    7 |    7 |

|  8 |  108 |    8 |    8 |

|  9 |  109 |    9 |    9 |

| 10 |  110 |   10 |   10 |

+----+------+------+------+

innodb_force_recovery =6 不执行前滚操作,但是恢复的时候有回
b80f
滚操作

+----+------+------+------+

| a  | b    | c    | d    |

+----+------+------+------+

|  1 |  101 |    1 |    1 |

|  2 |  102 |    2 |    2 |

|  3 |  103 |    3 |    3 |

|  4 |  104 |    4 |    4 |

|  5 |  105 |    5 |    5 |

|  6 |  106 |    6 |    6 |

|  7 |  107 |    7 |    7 |

|  8 |  108 |    8 |    8 |

|  9 |  109 |    9 |    9 |

| 10 |  110 |   10 |   10 |

+----+------+------+------+

130626 16:44:29  InnoDB: Database was not shut down normally!

InnoDB: Starting crash recovery.

InnoDB: Reading tablespace information from the .ibd files...

InnoDB: Restoring possible half-written data pages from the doublewrite

InnoDB: buffer...

InnoDB: Doing recovery: scanned up to log sequence number 0 8680656

InnoDB: 1 transaction(s) which must be rolled back or cleaned up

InnoDB: in total 9999 row operations to undo

InnoDB: Trx id counter is 0 14080

InnoDB: Last MySQL binlog file position 0 920753, file name /vobiledata/mysqllog/mysql-bin.000245

InnoDB: Starting in background the rollback of uncommitted transactions

130626 16:44:29  InnoDB: Rolling back trx with id 0 13057, 9999 rows to undo

InnoDB: Progress in percents: 1130626 16:44:29  InnoDB: Started; log sequence number 0 8680656

 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79130626 16:44:29 [Note] Event Scheduler:
Loaded 0 events

130626 16:44:29 [Note] /usr/local/mysql/bin/mysqld: ready for connections.

Version: '5.1.57-log'  socket: '/tmp/mysqld.sock'  port: 3306  MySQL Community Server (GPL)

 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

InnoDB: Rolling back of trx id 0 13057 completed

130626 16:44:29  InnoDB: Rollback of non-prepared transactions completed

130626 16:45:08 mysqld_safe Starting mysqld daemon with databases from /vobiledata/mysqldata

130626 16:45:08 [Note] Plugin 'FEDERATED' is disabled.

130626 16:45:08  InnoDB: Initializing buffer pool, size = 2.0G

130626 16:45:08  InnoDB: Completed initialization of buffer pool

InnoDB: The user has set SRV_FORCE_NO_LOG_REDO on

InnoDB: Skipping log redo

130626 16:45:08  InnoDB: Started; log sequence number 0 0

InnoDB: !!! innodb_force_recovery is set to 6 !!!

130626 16:45:08 [Note] Recovering after a crash using /vobiledata/mysqllog/mysql-bin

130626 16:45:08 [Note] Starting crash recovery...

130626 16:45:08 [Note] Crash recovery finished.

130626 16:45:08 [Note] Event Scheduler: Loaded 0 events

130626 16:45:08 [Note] /usr/local/mysql/bin/mysqld: ready for connections.

Version: '5.1.57-log'  socket: '/tmp/mysqld.sock'  port: 3306  MySQL Community Server (GPL)

130626 16:45:14  InnoDB: error: space object of table test/test,

InnoDB: space id 3 did not exist in memory. Retrying an open.

-+------+------+------+

|  1 |  101 |    1 |    1 |

|  2 |  102 |    2 |    2 |

|  3 |  103 |    3 |    3 |

|  4 |  104 |    4 |    4 |

|  5 |  105 |    5 |    5 |

|  6 |  106 |    6 |    6 |

|  7 |  107 |    7 |    7 |

|  8 |  108 |    8 |    8 |

|  9 |  109 |    9 |    9 |

| 10 |  110 |   10 |   10 |

+----+------+------+------+

130626 16:44:29  InnoDB: Database was not shut down normally!

InnoDB: Starting crash recovery.

InnoDB: Reading tablespace information from the .ibd files...

InnoDB: Restoring possible half-written data pages from the doublewrite

InnoDB: buffer...

InnoDB: Doing recovery: scanned up to log sequence number 0 8680656

InnoDB: 1 transaction(s) which must be rolled back or cleaned up

InnoDB: in total 9999 row operations to undo

InnoDB: Trx id counter is 0 14080

InnoDB: Last MySQL binlog file position 0 920753, file name /vobiledata/mysqllog/mysql-bin.000245

InnoDB: Starting in background the rollback of uncommitted transactions

130626 16:44:29  InnoDB: Rolling back trx with id 0 13057, 9999 rows to undo

InnoDB: Progress in percents: 1130626 16:44:29  InnoDB: Started; log sequence number 0 8680656

 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79130626 16:44:29 [Note] Event Scheduler:
Loaded 0 events

130626 16:44:29 [Note] /usr/local/mysql/bin/mysqld: ready for connections.

Version: '5.1.57-log'  socket: '/tmp/mysqld.sock'  port: 3306  MySQL Community Server (GPL)

 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

InnoDB: Rolling back of trx id 0 13057 completed

130626 16:44:29  InnoDB: Rollback of non-prepared transactions completed

130626 16:45:08 mysqld_safe Starting mysqld daemon with databases from /vobiledata/mysqldata

130626 16:45:08 [Note] Plugin 'FEDERATED' is disabled.

130626 16:45:08  InnoDB: Initializing buffer pool, size = 2.0G

130626 16:45:08  InnoDB: Completed initialization of buffer pool

InnoDB: The user has set SRV_FORCE_NO_LOG_REDO on

InnoDB: Skipping log redo

130626 16:45:08  InnoDB: Started; log sequence number 0 0

InnoDB: !!! innodb_force_recovery is set to 6 !!!

130626 16:45:08 [Note] Recovering after a crash using /vobiledata/mysqllog/mysql-bin

130626 16:45:08 [Note] Starting crash recovery...

130626 16:45:08 [Note] Crash recovery finished.

130626 16:45:08 [Note] Event Scheduler: Loaded 0 events

130626 16:45:08 [Note] /usr/local/mysql/bin/mysqld: ready for connections.

Version: '5.1.57-log'  socket: '/tmp/mysqld.sock'  port: 3306  MySQL Community Server (GPL)

130626 16:45:14  InnoDB: error: space object of table test/test,

InnoDB: space id 3 did not exist in memory. Retrying an open.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: