mysql源码启动_MySQL源码阅读1-启动初始化

substitute_progpath:将命令行的程序名替换成全路径的程序名,可能是“全路径”,home路径解释,环境变量PATH解释。sysd::notify_connect:在环境变量(“NOTIFY_SOCKET“)中查找socket的文件名,如果存在的话则连接该Socketsysd::notify:向Notify Socket发送正在启动的消息。my_init:初始化my_sys函数,资源和变量my_thread_global_init:初始化线程的环境(初始化一堆资源锁)PSI_mutex_key 结构my_thread_init:申请mysys线程的内存,主要用于debugload_defaults -> my_load_defaults:从配置文件中读取配置项init_default_directories:获取配置的目录my_search_option_files:处理在缺省目录下的配置文件,即上一步结果get_defaults_options:从命令行中获取配置选项;init_variable_default_paths:初始化配置文件的作用域(enum_variable_source)search_default_file:如果是绝对路径,直接读取;search_default_file_with_ext:从输入配置的文件中读取;my_default_get_login_file:从login集群中读取配置。my_search_option_filesset_args_separator:分隔符persisted_variables_cache:持久化的参数配置缓存,采用JSON进行存储,Init:初始化,从命令行或者是环境变量“MYSQL_DATADIR“中获取文件my_handle_options:主要处理参数的逻辑。load_persist_file:加载持久化文件的配置,并且转成JSON格式,分析出K/V结构;append_read_only_variables:将上一步分解出的只读配置参数追加到命令行参数中。init_variable_default_paths:初始化配置文件的作用域(enum_variable_source)init_pfs_instrument_array: PSI:performance schema interface; PFS:performance storagehandle_early_options:处理早期的选项,包括:performance schema;与help或者启动相关的参数sys_var_add_options:增加系统参数;增加命令行中的早期选项;add_terminator:增加终结。handle_options->my_handle_options:处理参数init_sql_statement_names:初始化与sql语句相关的名字(com_status_vars),包括各种dml/ddl/acl/dql等sys_var_init:初始化系统变量(mysql-server-8.0/sql/sys_vars.cc中定义静态变量)mysql_add_sys_var_chaininit_error_log:初始化错误日志adjust_related_options:调整相关的参数,adjust_open_files_limitadjust_max_connectionsadjust_table_cache_sizeadjust_table_def_sizeinitialize_performance_schema:初始化performance_schemapfs_automated_sizing:将ps相关的参数都置为0;init_timers:根据系统进行初始化performance_schema的计数器,并且获得当前值;可以从performance_timers表获取my_timer_initmy_timer_cyclesmy_timer_nanosecondsmy_timer_milliseconds初始化histograms(表的统计量)的定时器,init_event_name_sizing:初始化全局表I/O,表锁/元数据等的事件register_global_classes:初始化全局的仪表,包括类型有:表I/O,表锁,Idle类,元数据类,错误类,事物类。接下来是申请一堆仪表的内存并且从参数里头获取配置init_pfs_plugin_table:初始化pfs内置的tablePFS_dynamic_table_shares::init_mutexinit_pfs_plugin_tableLO_init:初始化Lock Order,主要用Lock Order Graph描述锁依赖关系:https://dev.mysql.com/doc/refman/8.0/en/lock-order-tool.html//START与psi相关的服务设置psi相关的服务:thread_service,mutex_service,rwlock_service,cond_service,file_service,socket_service,table_service,mdl_service,idle_service,stage_service,statement_service,transaction_service,memory_service,error_service,data_lock_service,system_serviceinit_server_psi_keys:注册psi key的函数,包括psi服务的mutex,rwlock,conds,threads,files,stage,socket;内存的key,sql语句的信息(init_sql_statement_names中提到的),psi_api,与store procedures相关的key,与调度(scheduler)相关的(主要是evengt),与client公用的key,vio的key(与通信相关的)my_thread_global_reinit:重新初始化一些比较开始与锁相关的,因为需要考虑一些仪表// 与psi相关的服务 ENDcomponent_infrastructure_initmysql_services_bootstrap:启动服务注册,动态加载器,和基础的服务registry_init:创建注册服务套件,内部的结构mysql_registry把加载器的实现写入到服务注册表dynamic_loader_init:初始化动态加载器,其实就是初始化锁dynamic_loader_scheme_file_init:初始化scheme文件pfs_init_services:ps是performance storageregister_pfs_notification_serviceregister_pfs_resource_group_serviceResource_group_mgr::init:初始化资源组管理器,与资源相关的服务,包括: registry service,mysql_service_pfs_resource_group_v3_t,mysql_service_pfs_notification_v3_t注册线程创建/断开连接的回调创建用户级/系统级的资源组对象调用psi_thread_service相关函数:new_thread,set_thread_os_id,set_threadmysql_audit_initialize:初始化与audit相关的变量;Srv_session::module_init:初始化srv_session模块query_logger.init:查询日志初始化init_common_variables:init_thread_environment:初始化与线程相关的锁;mysql_init_variables:初始化全局变量为缺省值mysql_bin_log.set_psi_keys完成bin log的初始化,让仪表相关的对bin log可见mysql_bin_log.init_pthread_objects:初始化bin log与线程相关的锁get_options,剩余的可选项,binlog,压缩算法,页的大小,线程缓存大小,back_logConnection_handler_manager::init,初始化连接池Per_thread_connection_handler::init,初始化Per_thread_connection_handler,初始化锁初始化mysql client的plugin选字符集/collation日志配置创建数据目录表的大小写等my_init_signals:初始化信号处理线程栈大小检查Migrate_keyring::init:初始化Migrate_keyring(一种mysql数据搬运模式)相关的,如压缩方式,并且连接到数据源主机Migrate_keyring::executefetch_and_store_keys// 如果启动方式为Migrate_keyring,则数据搬完后退出set_ports:确定tcp端口init_server_componentsmdl_init:metadata locking subsystem元数据锁子系统,MDL_map::init, MDL_key,一个重要的数据结构:元数据锁partitioning_inittable_def_init:表定义缓存(Table_definition_cache)Table_cache_manager::init:表缓存初始化Table_cache::inithostname_cache_init:初始化(client)主机名缓存,Host_entrymy_timer_initialize:初始化内部组建,fd,start_helper_thread:时间通知线程,timer_notify_thread_funcinit_slave_list:初始化从机列表transaction_cache_init:初始化事务缓存的psi键MDL_context_backup_manager::init,MDL_context_backup_manager:维护XA事务中元数据锁delegates_init:初始化外部observer的委托,包括事务,bin log,服务状态,bin log传输,relay IO与bin/relay log相关的初始化process_key_caches:用ha_init_key_cache函数初始化所有的key缓存ha_init_errors:初始化错误信息gtid_server_init:GTID server初始化udf_init_globals:初始化udf结构体init_ssl:配置SSL包ssl_start:SSL_library_initOpenSSL_add_all_algorithmsinit_ssl_locks:初始化ssl锁,init_lock_callback_functions:锁回调函数plugin_register_early_pluginsplugin_init_internals:初始化内部plugin,资源/锁plugin_load_listplugin_dl_addplugin_addplugin_init_initialize_and_reap:重试失败的pluginplugin_register_builtin_and_init_core_se,初始化内置plugin,包含MyIsam,CSV,InnoDBinit_sql_command_flags:初始化sql命令flagdd::init:cache::Shared_dictionary_cache::init,包括字符/collation,抽象表,事件,routine,schema,column,tablespace,资源组等字典初始化System_tables::instance()->add_inert_dd_tables()System_views::instance()->init() 系统视图,主要是information_schema下的Dictionary_impl::initplugin_register_dynamic_and_init_all,注册动态的plugin和初始化所有的plugin确定线程池组织方式:SCHEDULER_ONE_THREAD_PER_CONNECTION/SCHEDULER_NO_THREADS从5.7升级到8.0相关的处理dd::performance_schema::init_pfs_tables:处理好pfs相关的表upgrade_system_schemas:升级系统库表Resource_group_mgr::post_init从磁盘读取资源组数据handle_options:处理剩余的参数可选项ha_init:初始化query_logger相关的处理initialize_storage_engine:初始化缺省(或临时)的存储引擎Recovered_xa_transactions::init:恢复XA事务初始化Recovered_xa_transactions::recover_prepared_xa_transactions恢复预处理的XA事务init_server_auto_options:初始化服务自动项,MYSQL_BIN_LOG::open_binlog,打开一个bin log文件,分析主备bin log,也会purge一些日志init_optimizer_cost_module:初始化优化器(应该是物理优化器)代价的模块init_cache_tmp_engine_propertiesCache_temp_engine_properties::init,临时的引擎特性,HEAP/TempTable/INNODBft_init_stopwords:停用词init_max_user_conn:client连接Gtid_state::init,将server_uuid放至sid_map中MYSQL_BIN_LOG::init_gtid_sets,从gtid_executed表和binlog文件中初始化GLOBAL.GTID_EXECUTED 和 GLOBAL.GTID_PURGED 的值,分别应该是已经执行的GTID和回收的GTIDinit_ssl_communication:set_fips_mode:设置openssl包的fipsSslAcceptorContext::singleton_init,初始化ssl接收器do_auto_cert_generation,生成证书init_rsa_keys,从磁盘中加载RSA键值对,sha256network_init,初始化服务的listener,三种,Mysqld_socket_listener/Named_pipe_listener/Shared_mem_listener,后两者仅在windows下会启动Connection_acceptor::init_connection_acceptorMysqld_socket_listener::setup_listener,如果是Mysqld_socket_listener,并且需要开通管理员socketspawn_admin_thread,启动admin的listener线程。admin_socket_threadhandle_admin_socket,开始监听管理请求create_pid_file,创建pid文件reload_optimizer_cost_constants,重新加载优化器的计算成本常量Cost_constant_cache::reloadmysql_component_infrastructure_init,通过初始化动态加载器来初始化mysql服务组建persistent_dynamic_loader_init,恢复持久化文件中的数据mysql_persistent_dynamic_loader_imp::initopen_component_table读取组件table中的数据mysql_dynamic_loader_imp::loaddd::sdi_file::loadtrans_rollback_stmt:回滚单语句的事务ha_rollback_transtrans_rollback:回滚当前的事务server_component_init,除第一个函数外,其他均为dummy空函数,mysql_comp_sys_var_services_initmysql_string_services_init();mysql_comp_status_var_services_init();mysql_comp_system_variable_source_init();mysql_backup_lock_service_init();clone_protocol_service_init();page_track_service_init();mysql_security_context_init();mysql_server_ongoing_transactions_query_init();host_application_signal_imp_init();mysql_audit_api_service_init();mysql_current_thread_reader_imp_init();mysql_keyring_iterator_service_init();mysql_comp_udf_extension_init();mysql_connection_attributes_iterator_imp_init();trans_commit_stmt,提交语句事务trans_commit,提交当前事务mysql_rm_tmp_tables,删除之前服务遗留的临时文件acl_initinit_acl_cachecheck_engine_type_for_acl_table,check_acl_tables_intactnotify_flush_eventinit_acl_memory,出事acl的内存my_tz_init:初始化时区open_trans_system_tables_for_readopen_tablesopen_tables_check_upgradable_mdlfind_table_for_mdl_upgradelock_table_nameslock_tablesmysql_lock_tableslock_tables_checkget_lock_data:获得表的锁结构check_lock_and_start_stmt闰秒相关的初始化逻辑grant_init:grant_reload:加载授权open_and_lock_tablesgrant_load:从授权表中加载表/列的权限检查信息grant_reload_procs_priv:从procs_priv表中读取权限信息commit_and_close_mysql_tables:dynamic_privilege_init:mysql_plugin_registry_acquire初始化管理相关的权限servers_init:从mysql库中初始化结构数据servers_reload:初始化mysql.servers表的数据udf_read_functions_table:从mysql.func中加载数据init_status_vars:init_slave:初始化slave线程,并开启Rpl_info_factory::create_slave_info_objectsstart_slave_threads,对多个channel开启start_slave_thread::handle_slave_sql处理relay日志initialize_performance_schema_aclACL_internal_schema_registry::register_schemaEvents::init:初始化event结构load_events_from_dbEvent_scheduler::startpre_init_event_threadevent_scheduler_threadstart_signal_handler,启动单独的线程signal_hand来处理信号,如SIGTERM, SIGQUIT, SIGHUP, SIGUSR1 and SIGUSR2process_bootstrap:server_components_initializedrun_bootstrap_thread:启动单独处理init_file 中的sql语句handle_bootstraphandle_bootstrap_implprocess_iteratordd::initmysql_audit_notify:mysql_audit_acquire_plugins,获取pluginsevent_class_dispatchplugins_dispatch,通过调用plugin的event_notify函数分发时间start_handle_manager,开启handler管理线程handle_manager,线程函数,监听COND_manager信号等create_compress_gtid_table_thread,开启一个线程调用以下函数compress_gtid_table,根据压缩COND_compress_gtid_table信号对gtid_executed表进行压缩Gtid_state::compressGtid_table_persistor::compress,更多详细的逻辑在mysql-server-8.0/sql/rpl_gtid_persist.cc中Connection_acceptor::connection_event_loop:开启监听服务。 window会进入setup_conn_event_handler_threads函数,并启动三个单独线程处理不同的连接方式,即Mysqld_socket_listener/Named_pipe_listener/Shared_mem_listener// 以下为结束阶段的代码待收到结束信号后,terminate_compress_gtid_table_thread,终止compress_gtid_table_threadsave_gtids_of_last_binlog_into_table,保存gtid的最新值到表中发送信号给监听线程close_connections:关闭连接,SIGQUIT信号Per_thread_connection_handler::kill_blocked_pthreadsMysqld_socket_listener/Shared_mem_listener/Named_pipe_listener::close_listenermysql_socket_shutdownmysql_socket_closeConnection_acceptor::close_listenerEvents::stop,停止Event调度器Set_kill_conn,对连接设置KILL_CONNECTION flagEvents::deinit,清理调度器的资源,关闭所有连接,Call_close_conn::close_connectionConnection_handler_manager::wait_till_no_connection,等待所有连接结束delete_slave_info_objects,释放slave线程占用的资源终止仪表线程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值