只是做为简洁钻研代码5.7.22有误请体谅
一、对于参数innodb_open_files假如innodb_open_files小于10(可能没有配置为0),innodb_file_per_table没有起用的情状下默许值便是假如innodb_open_files小于10(可能没有配置为0),假如在innodb_file_per_table开启的且table_cache_size大于,则innobase_open_files为table_cache_size(table_open_cache)假如innobase_open_files配置大于了open_files_limit,则爆发告诫,同时假如大于table_cache_size则配置为table_cache_size(table_open_cache)代码以下:
if(innobase_open_files10){innobase_open_files=;if(srv_file_per_tabletable_cache_size){innobase_open_files=table_cache_size;}}if(innobase_open_files(long)open_files_limit){ib::warn()"innodb_open_filesshouldnotbegreater""thantheopen_files_limit.\n";if(innobase_open_files(long)table_cache_size){innobase_open_files=table_cache_size;}}
这个参数把持的是理论的Iinnodb层同时翻开的文献数目(open),天然大于了也不会报错,经过LRU链表淘汰便可。这个一点和open_files_limit是不同样的。
二、对于fil_system简述这是一个innodb中的一个全面变量,初始化的情状下就会配置,咱们能够明白为这是一个对于Innodb悉数物理文献音信的一个内存空间。
fil_init(srv_file_per_table?:,srv_max_n_open_files);-fil_system-max_n_open=max_n_open;
这边的srv_max_n_open_files理论上便是咱们的参数innodb_open_files,初始化实行后,会将经过数据字典翻开fil_space_t和fil_node_t介入到fil_system中,同时还会中物理文献能否存在的校验,查验会先理论的open物理文献,尔后施行close。查验实行后理论上fil_system就包括了悉数现时文献的一个内存布局,叫做InnoDBtablespacememorycache。fil_system中包括(不限于):
UT_LIST_BASE_NODE_T(fil_node_t)LRU现时翻开文献的LRU链表(open)状况,留神这边是fil_node_t是理论对应的文献了,然而不必定处于open状况,当需求做IO操纵的时辰必定是需求施行open操纵的。对于redo,ibdata和undo来说是常驻翻开的,而对于咱们通常用户的表来说则是受这个LRU链表办理的。反面咱们在商议。UT_LIST_BASE_NODE_T(fil_space_t)space_list这个便是悉数按照字典创建的悉数fil_space_t和file_node_t的内存布局,然而需求留神的是,这边面的音信并不代表曾经翻开了文献(open)。spaces按照spaceid施行hashname_hash按照space的名字施行hashmax_n_open参数innodb_open_files配置的值n_open现时翻开的文献数目fil_space_create中能够看到:
HASH_INSERT(fil_space_t,hash,fil_system-spaces,id,space);HASH_INSERT(fil_space_t,name_hash,fil_system-name_hash,ut_fold_string(name),space);UT_LIST_ADD_LAST(fil_system-space_list,space);//介入space_list
fil_node_create中能够看到:
UT_LIST_ADD_LAST(space-chain,node);mutex_exit(fil_system-mutex);
他们都是在施行fil_system的保护操纵。
个中:
fil_space_t:为一个space布局代表一个表空间个中space_id包括在个中,上面是fil_node_t来示意各个物理文献,例如咱们redo文献就包括多个,对于innodb_file_per_table的表和undo文献来说,每个fil_space_t都代表一个space,然而file_node_t天然就惟有1个了。创建函数fil_space_create。天然这边的元素还良多,例如和hash布局相对应的元素,IO相干的元素等等。fil_node_t:为一个详细文献的示意,个中name便是文献地方的地方,is_open则代表能否曾经翻开了(open),还包括一些和IO相干的属性,chain和LRU则离别代表自身在space和fil_systemLRU链表中地方的地方。创建函数为fil_node_create。上面咱们经过fil_system这个布局,来会见悉数创建的cache目标。
(gdb)pfil_system-space_list-start-name$11=0x"innodb_system"(gdb)pfil_system-space_list-start-chain$17={count=1,start=0x,end=0x,node=fil_node_t::chain,init=}(gdb)pfil_system-space_list-start-space_list-next-name$12=0xe38"innodb_redo_log"(gdb)pfil_system-space_list-start-space_list-next-chain-start-name$21=0xf48"./ib_logfile0"gdb)pfil_system-space_list-start-space_list-next-chain$19={count=3,start=0xe68,end=0xa8,node=fil_node_t::chain,init=}(gdb)pfil_system-space_list-start-space_list-next-space_list-next-name$13=0xdd98"innodb_undo"(gdb)pfil_system-space_list-start-space_list-next-space_list-next-space_list-next-name$14=0xe8d8"innodb_undo"(gdb)pfil_system-space_list-start-space_list-next-space_list-next-space_list-next-space_list-next-name$15=0xedc8"innodb_undo"
总的说来,当平常启动的时辰,悉数文献都邑施行翻开测试,然而随后闭塞,同时介入到fil_system中,孕育一个内存音信叫做InnoDBtablespacememorycache,反面咱们要翻开的文献时辰就依赖于它。然而咱们ibdata,undo,redo是常驻翻开的。然而有一点当咱们配置了innodb_force_recovery3参数后不会做如此的探测和介入操纵,随后会涌现一个报错这个反面再说。这边可是简洁的将fil_system的space_list和LRU画一下,以下图。不触及hash布局,理论上搜索的时辰普遍经过spaceid和name经过hash布局施行快捷搜索。
三、初始化对于文献测试翻开和闭塞(gdb)bt#00xffff7bcded0inopen64()from/lib64/libpthread.so.0#10x0000000aeinos_file_create_simple_no_error_handling_func(name=0xba88"./woaini/im10.ibd",create_mode=51,access_type=,read_only=true,success=0x7ffffffff)at/opt/percona-server-locks-detail-5.7.22/storage/innobase/os/os0file.cc:#20x0000000ccb07cinpfs_os_file_create_simple_no_error_handling_func(key=...,name=0xba88"./woaini/im10.ibd",create_mode=51,access_type=,read_only=true,success=0x7ffffffff,src_file=0x"/opt/percona-server-locks-detail-5.7.22/storage/innobase/fsp/fsp0file.cc",src_line=)at/opt/percona-server-locks-detail-5.7.22/storage/innobase/include/os0file.ic:#30x0000000ccbc3finDatafile::open_read_only(this=0x7fffffff,strict=true)at/opt/percona-server-locks-detail-5.7.22/storage/innobase/fsp/fsp0file.cc:#40x0000000cbinfil_ibd_open(validate=true,fix_dict=true,purpose=FIL_TYPE_TABLESPACE,id=40,flags=33,space_name=0xb"woaini/im10",path_in=0xb4c8"./woaini/im10.ibd")at/opt/percona-server-locks-detail-5.7.22/storage/innobase/fil/fil0fil.cc:#50x0000000c85cccindict_check_sys_tables(validate=true)at/opt/percona-server-locks-detail-5.7.22/storage/innobase/dict/dict0load.cc:#60x0000000c85fe1indict_check_tablespaces_and_store_max_id(validate=true)at/opt/percona-server-locks-detail-5.7.22/storage/innobase/dict/dict0load.cc:#70x0000000ba2ininnobase_start_or_create_for_mysql()at/opt/percona-server-locks-detail-5.7.22/storage/innobase/srv/srv0start.cc:#80x000000097ininnobase_init(p=0x2e64a20)at/opt/percona-server-locks-detail-5.7.22/storage/innobase/handler/ha_innodb.cc:#90xfe1inha_initialize_handlerton(plugin=0x2fef)at/opt/percona-server-locks-detail-5.7.22/sql/handler.cc:#x000000059ainplugin_initialize(plugin=0x2fef)at/opt/percona-server-locks-detail-5.7.22/sql/sql_plugin.cc:#x0000000598c80inplugin_register_builtin_and_init_core_se(argc=0x2d7cremaining_argc,argv=0x2e62f58)at/opt/percona-server-locks-detail-5.7.22/sql/sql_plugin.cc:#xebbininit_server_