始创于2000年 股票代码:831685
咨询热线:0371-60135900 注册有礼 登录
  • 挂牌上市企业
  • 60秒人工响应
  • 99.99%连通率
  • 7*24h人工
  • 故障100倍补偿
您的位置: 网站首页 > 帮助中心>文章内容

MySQL:同时设置innodb_force_recovery和innodb_purge_threa

发布时间:  2012/8/31 17:13:53

版本: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]

  • 您可能在找
  • 亿恩北京公司:
  • 经营性ICP/ISP证:京B2-20150015
  • 亿恩郑州公司:
  • 经营性ICP/ISP/IDC证:豫B1.B2-20060070
  • 亿恩南昌公司:
  • 经营性ICP/ISP证:赣B2-20080012
  • 服务器/云主机 24小时售后服务电话:0371-60135900
  • 虚拟主机/智能建站 24小时售后服务电话:0371-60135900
  • 专注服务器托管17年
    扫扫关注-微信公众号
    0371-60135900
    Copyright© 1999-2019 ENKJ All Rights Reserved 亿恩科技 版权所有  地址:郑州市高新区翠竹街1号总部企业基地亿恩大厦  法律顾问:河南亚太人律师事务所郝建锋、杜慧月律师   京公网安备41019702002023号
      0
     
     
     
     

    0371-60135900
    7*24小时客服服务热线