版本:Percona5.5.18
设置参数:
innodb_force_recovery>=2
innodb_purge_thread = 1
观察alert.log,出现大量信息:
InnoDB: Waiting for the background threads to start-
我们定位到相应的代码:
在srv_purge_thread里,会判断当前是否以recovery mode启动:
[html]
1.879 /* Check for shutdown and whether we should do purge at all. */
2.3880 if (srv_force_recovery >= SRV_FORCE_NO_BACKGROUND 3.3881 || srv_shutdown_state != 0
4.3882 || srv_fast_shutdown) {
5.3883
6.3884 break;
7.3885 }
其中SRV_FORCE_NO_BACKGROUND值为2,可以看看不同的恢复级别分别代表什么:
[cpp]
1.enum {
2. SRV_FORCE_IGNORE_CORRUPT = 1, /*!< let the server run even if it 3. detects a corrupt page */
4. SRV_FORCE_NO_BACKGROUND = 2, /*!< prevent the main thread from 5. running: if a crash would occur
6. in purge, this prevents it */
7. SRV_FORCE_NO_TRX_UNDO = 3, /*!< do not run trx rollback after 8. recovery */
9. SRV_FORCE_NO_IBUF_MERGE = 4, /*!< prevent also ibuf operations: 10. if they would cause a crash, better
11. not do them */
12. SRV_FORCE_NO_UNDO_LOG_SCAN = 5, /*!< do not look at undo logs when 13. starting the database: InnoDB will
14. treat even incomplete transactions
15. as committed */
16. SRV_FORCE_NO_LOG_REDO = 6 /*!< do not do the log roll-forward 17. in connection with recovery */
18.};
也就是说,当恢复级别大于等于2时,将会从while循环中break然后退出线程(os_thread_exit)
但在函数innobase_start_or_create_for_mysql里,由于设置innodb_purge_thread为1,因此这里会等待purge线程起来
[cpp]
1.2027 while (srv_shutdown_state == SRV_SHUTDOWN_NONE) {
2.2028 if (srv_thread_has_reserved_slot(SRV_MASTER) == ULINT_UNDEFINED 3.2029 || (srv_n_purge_threads == 1
4.2030 && srv_thread_has_reserved_slot(SRV_WORKER)
5.2031 == ULINT_UNDEFINED)) {
6.2032
7.2033 ut_print_timestamp(stderr);
8.2034 fprintf(stderr, " InnoDB: " 9.2035 "Waiting for the background threads to " 10.2036 "start\n"); 11.2037 os_thread_sleep(1000000);
12.2038 } else { 13.2039 break; 14.2040 }
15.2041 }
FIX:
在创建purge线程前,同时判断recovery值,当>=2时,我们强制将innodb_purge_thread置为0,以防止无限Loop
[cpp]
1.diff -ur Percona-Server-5.5.18.stock/storage/innobase/srv/srv0start.c Percona-Server-5.5.18.fix-purge/storage/innobase/srv/srv0start.c
2.--- Percona-Server-5.5.18.stock/storage/innobase/srv/srv0start.c 2012-01-07 16:38:37.000000000 +0800
3.+++ Percona-Server-5.5.18.fix-purge/storage/innobase/srv/srv0start.c 2012-01-29 11:34:09.000000000 +0800
4.@@ -2019,7 +2019,14 @@
5. /* If the user has requested a separate purge thread then 6. start the purge thread. */
7. if (srv_n_purge_threads == 1) { 8.- os_thread_create(&srv_purge_thread, NULL, NULL);
9.+ if (srv_force_recovery < SRV_FORCE_NO_BACKGROUND) { 10.+ os_thread_create(&srv_purge_thread, NULL, NULL);
11.+ } else { 12.+ fprintf(stderr, " InnoDB: " 13.+ "we will force innodb_purge_thread to 0 " 14.+ "becanse force recovery is larger than 1\n"); 15.+ srv_n_purge_threads = 0;
16.+ }
17. }
18.
19. /* Wait for the purge and master thread to startup. */
本文出自:亿恩科技【www.enkj.com】
服务器租用/服务器托管中国五强!虚拟主机域名注册顶级提供商!15年品质保障!--亿恩科技[ENKJ.COM]
|