November 5, 2012

[MySQL学习] Innodb崩溃恢复流程

简要记录跟踪代码,很多代码流程没有细细的跟进去,只是了解了个大概,杂七杂八,还有太多不了解的地方。 不过,一知半解总比一无所知要好点…sign… //////////////////////////////////////////// 一、innobase_init 1.初始化存储引擎接口函数、检查指定的page大小(innodb_page_size,Percona版本支持16k以下的page size定义)、innodb_log_block_size。 2.检查是否通过记录在innodb层的relay log信息更新relay-info文件(通过innodb_recovery_update_relay_log来控制) 3.innodb文件路径、类型、各类全局变量等信息初始化, 4.innobase_start_or_create_for_mysql //主要函数,稍后细述 5.更新每个bp实例的buf_pool->LRU_old_ratio(innodb_old_blocks_pct),也就是LRU上old list的百分比。 6.初始化innobase_share_mutex、prepare_commit_mutex、commit_threads_m、commit_cond_m、commit_cond等变量。 可以看到在这个函数中除了innobase_start_or_create_for_mysql这个主要函数外,基本上都是些变量之类的初始化,我们简要看看innobase_start_or_create_for_mysql主要干了什么吧。 二、innobase_start_or_create_for_mysql 1. 当buffer pool size大于等于1000MB时,在innodb层最大允许等待同一信号量的线程数srv_max_n_threads=5000 当1000MB >= buffer pool size >= 8MB,只使用1个bp实例,srv_max_n_threads = 10000 当buffer pool size小于8MB时,只使用1个bp实例,srv_max_n_threads = 1000 2.调用srv_boot srv_normalize_init_values(void) //初始化全局变量 srv_general_init(void) //Initialize synchronization primitives, memory management, and thread local storag srv_init(); 初始化各种全局信号量,kernel_mutex、srv_sys以及srv_sys->threads数组中每个slot的event(调用os_event_create初始化),同样的还需要初始化srv_mysql_table数组(类型为srv_slot_t) dict_ind_init();//初始化dict_ind_redundant和dict_ind_compact,为infimum 和supremum 记录 创建一个名为SYS_DUMMY1/SYS_DUMMY2的表结构,暂时不了解用途。 初始化srv_conc_slots 3.创建临时文件srv_dict_tmpfile和srv_misc_tmpfile,调用函数os_file_create_tmpfile()来创建   […]