Welcome 微信登录

首页 / 数据库 / MySQL / MySQL:同时设置innodb_force_recovery和innodb_purge_thread导致无限loop

版本:Percona5.5.18设置参数:innodb_force_recovery>=2innodb_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 ");  
  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 ");  
  15. +                       srv_n_purge_threads = 0;  
  16. +               }  
  17.         }  
  18.    
  19.         /* Wait for the purge and master thread to startup. */  
Oracle dataguard switchover切换MySQL源代码:如何对读写锁进行处理相关资讯      MySQL基础教程 
  • MySQL基础教程:关于varchar(N)  (01月22日)
  • MySQL SELECT同时UPDATE同一张表  (02/19/2013 07:20:18)
  • Linux修改MySQL最大并发连接数  (02/15/2013 15:37:21)
  • 高性能MySQL(第3版) 中文PDF带目  (10/26/2014 10:03:50)
  • 如何在MySQL中的获取IP地址的网段  (02/18/2013 12:23:33)
  • C++和C#访问MySQL的简单代码示例  (12/21/2012 09:04:10)
本文评论 查看全部评论 (0)
表情: 姓名: 字数