首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL的启动原理

MySQL的启动原理

作者头像
AsiaYe
发布于 2019-11-06 08:34:36
发布于 2019-11-06 08:34:36
2.2K00
代码可运行
举报
文章被收录于专栏:DBA随笔DBA随笔
运行总次数:0
代码可运行
MySQL的启动原理
1

mysql.server、mysqld_safe和mysqld

我们知道mysql.server,mysqld_safe和mysqld都是可以用来启动mysql服务,他们之间是有区别的。这三个命令中,其中mysql.server和mysqld_safe是shell脚本写的,我们可以打开来查看里面的内容。下面我们看看这三种启动方法的区别:

mysql.server脚本的主要作用就是为了方便启动和关闭mysql服务,mysql.server程序主要会用到两个程序和一个函数,分别是my_print_defaults、myslqd_safe和parse_server_arguments,它们的介绍如下:

1、my_print_defaults:读取my.cnf配置文件,输出参数传递给parse_server_arguments,该程序只读my.cnf中[mysqld]中的参数。

2、parse_server_arguments:该函数处理my_print_defaults传递过来的参数赋值给--basedir、--datadir、--pid-file、--service-startup-timeout,相关部分的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
parse_server_arguments() {
  for arg do
    case "$arg" in
      --basedir=*)  basedir=`echo "$arg" | sed -e 's/^[^=]*=//'`
                    bindir="$basedir/bin"
                    if test -z "$datadir_set"; then
                      datadir="$basedir/data"
                    fi
                    sbindir="$basedir/sbin"
                    libexecdir="$basedir/libexec"
        ;;
      --datadir=*)  datadir=`echo "$arg" | sed -e 's/^[^=]*=//'`
                    datadir_set=1
        ;;
      --pid-file=*) mysqld_pid_file_path=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
      --service-startup-timeout=*) service_startup_timeout=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
    esac
  done
}

3、mysql.server接着调用mysqld_safe这个脚本,把第二步解析到的参数值传递到mysqld_safe的参数列表中,其中调用部分的shell代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if test -x $bindir/mysqld_safe
    then
      # Give extra arguments to mysqld with the my.cnf file. This script
      # may be overwritten at next upgrade.
      $bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null &
      wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?

      # Make lock for RedHat / SuSE
      if test -w "$lockdir"
      then
        touch "$lock_file_path"
      fi

      exit $return_value
    else
      log_failure_msg "Couldn't find MySQL server ($bindir/mysqld_safe)"
    fi

需要注意的是:

mysql.server脚本在调用mysqld_safe脚本去启动MySQL服务器的时候,此时mysqld_safe不能使用参数选项,即不能mysqld_safe --defaults-file这样的模式,此时只能使用默认的/etc/my.cnf配置文件,如上述代码所示。就算是ps -ef|grep mysql显式看到的信息也只是parse_server_arguments函数指定的参数,也是来自my.cnf,相当于mysql.server把my.cnf中的参数传递给mysqld_safe,mysqld_safe再传递给mysqld

总结一下:mysql.server这个脚本就是为了方便启动和关闭mysql服务,但真正启动mysql服务的不是它.

mysqld_safe

我们打开mysqld_safe这个脚本可以发现以下几点:

第一、mysqld_safe程序调用mysqld程序来启动mysql服务

第二、my.cnf配置文件中的[mysqld_safe]部分中的参数会覆盖[mysqld]部分中的参数

第三、在mysqld进程挂掉的时候,mysqld_safe进程会监测到并重新将mysqld启动起来。换句话说,mysqld_safe是mysqld的守护进程,所以mysqld_safe脚本会在启动MySQL服务器后继续监控其运行情况,并在其死机时重新启动它。

所以,当我们启动一个服务时,我们可以看到如下的情况:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root              : pts/    :: /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/localhost.localdomain.pid
mysql          : pts/    :: /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/usr/local/mysql/data/localhost.localdomain.pid --socket=/tmp/mysql.sock
root           : pts/    :: grep mysqld

即包含两个进程,一个是mysqld_safe、另外一个是mysqld的服务进程,其中mysqld_safe是守护进程,如果我们要kill掉mysqld进程,需要先kill掉守护进程。

添加开机启动,把mysql.server启动脚本放到开机初始化目录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#创建
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
# 赋予可执行权限
chmod +x /etc/init.d/mysqld

启动服务方式变为:
service mysqld start
关闭服务方式变为:
service mysqld stop

mysqld

它是mysql中正常的服务启动方式,一般mysql的初始化和启动都是用mysqld的方法,正常的启动方式为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/usr/local/mysql/bin/mysqld 
--basedir=/usr/local/mysql 
--datadir=/usr/local/mysql/data 
--plugin-dir=/usr/local/mysql/lib/plugin 
--user=mysql 
--log-error=/var/log/mysqld.log 
--pid-file=/usr/local/mysql/data/localhost.localdomain.pid 
--socket=/tmp/mysql.sock

后面的参数中一些是可选参数。

2

my.cnf---启动参数配置文件

在mysql进行启动的时候,需要设定一些启动参数,这些启动参数一般在my.cnf配置文件中,启动参数一般按照大的类型分为三类,一类的client,一类是mysqld另外一类是mysqld_safe,如下是我测试环境的一些启动参数配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[mysqld]
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
socket=/tmp/mysql.sock
user=mysql
server-id=
port=
log-bin=mysql-bin
binlog-do-db=DBAs
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
binlog-ignore-db=employees
expire_logs_days=
symbolic-links=

[mysql]
prompt="\\u@\\h :\\d\\r:\\m:\\s>"
socket=/tmp/mysql.sock

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
socket=/tmp/mysql.sock
default-character-set=utf8

mysql的启动参数很多,需要注意的是这些参数的具体位置,有些是服务端的,有些是客户端的,例如default-character-set这个参数,如果放在mysqld中,就会报如下错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2019-02-17T08::14.855753Z  [Note] Plugin 'FEDERATED' is disabled.
2019-02-17T08::14.858853Z  [ERROR] unknown variable 'default-character-set=utf8'
2019-02-17T08::14.858867Z  [ERROR] Aborting

这些启动参数之间存在一些覆盖关系,这里描述如下:

首先来看mysql的配置文件调用顺序,当我们启动mysql的时候,有时候系统中包含多个my.cnf配置文件,mysql在启动的时候到底是按照什么顺序来启动的呢,通过下面的命令可以看出来:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost support-files]# mysql --help|grep my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf

顺序如下,其中,后面的文件参数会覆盖前面的参数,这也就能解释为什么有时候我们已经在my.cnf中更改了相关的配置文件参数,但是参数貌似并没有生效,此时需要查看是否有别的配置文件中的参数对该参数进行了覆盖。

当我们启动mysql的时候单数使用了一些参数,这些参数也会覆盖my.cnf配置文件中的参数,具体的覆盖规则有:

1.mysqld_safe指定的--defaults-file指定的新文件会覆盖默认my.cnf中的配置

2.mysqld_safe指定的参数会覆盖my.cnf中的配置

3.mysqld直接启动使用参数,也会覆盖my.cnf中的配置

3

初始化方法以及初始化时候的一些选项

mysql服务在正式运行之前,需要先进行初始化,常用的初始化方法如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./mysqld --defaults-file=/etc/my.cnf --initialize-insecure

初始化的时候包含一些参数,如下:

--no-defaults 不读取任何选项文件,该选项在mysql_install_db启动时,若因为读取了未知的参数而启动失败时使用。

--initialize

为“ 默认安全 ”的安装(即包括产生一个随机的初始根密码)。在这种情况下,密码被标记为过期,你需要选择一个新的密码。

--initialize-insecure

没有root密码生成;

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-02-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL-5.7.10主主同步的安装和配置
这里安装的是最新的MySQL 5.7.10(5.7.12、5.7.13(后续更新版本可能类似)有些区别,安装过程中遇到错误可搜索下本文,也许可以找到解决办法),下载网址为:http://dev.mysql.com/downloads/mysql/。
一见
2018/08/06
1.3K0
mysql多实例(多个配置文件方式)设置为多个服务单独管理启动停止
有个大佬搞了一套mysql多实例(多个配置文件方式),却没有任何管理方式,想重启还找 找pid , kill掉,再通过 mysql 指定配置文件启动,极度不方便,想做成。
用户2323866
2021/06/29
1.6K0
11.6 MariaDB安装
安装mariadb cd /usr/local/src wget https://downloads.mariadb.com/MariaDB/mariadb-10.2.6/bintar-linux-glibc_214-x86_64/mariadb-10.2.6-linux-glibc_214-x86_64.tar.gz tar zxvf mariadb-10.2.6-linux-glibc_214-x86_64.tar.gz mv mariadb-10.2.6-linux-glibc_214-x86_64
运维小白
2018/02/06
1.1K0
mysql启动管理脚本
#!/bin/sh# Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB# This file is public domain and comes with NO WARRANTY of any kind# MySQL daemon start/stop script.# Usually this is put in /etc/init.d (at least on machines SYSV R4 base
用户10048459
2022/09/16
1.7K0
运维:Centos7安装解压版mysql5.7
Centos7安装mysql5.7解压版完整教程避免踩坑,可以把数据目录和系统目录分开设置。
小明互联网技术分享社区
2023/11/11
3820
运维:Centos7安装解压版mysql5.7
MySQL service启动脚本浅析(r12笔记第59天)
我们在搭建MySQL环境的时候,一般都会按照建议的标准规范来做,比如拷贝mysql.server到自启动目录下。 cp -rf $basedir/support-files/mysql.server /etc/init.d/mysql 然后设置MySQL自启动的服务,配置完成之后就可以运行命令service mysql.server start 来启动MySQL了。 /sbin/chkconfig --add mysql /sbin/chkconfig --level 2345 mysql on
jeanron100
2018/03/21
9260
Mysql5.7多实例配置
Mysql采用离线的二进制包安装方式,安装在/usr/local/mysql 两个实例配置 创建目录 > mkdir -p /usr/local/mysql/data/{3306,3307} 3306配置 > vim /etc/my3306.cnf [client] socket=/usr/local/mysql/data/3306/mysql.sock [mysqld] basedir=/usr/local/mysql datadir=/usr/local/mysql/data/3306 socke
入门笔记
2022/06/02
9360
MYSQL多实例配置详解.md
Q:什么是MySQL多实例? 答:简单的说,就是在一台机器上开启多个不同的服务端口(如: 3306、 3307 ) ,运行多个 MysQL 服务进程,服务进程通过不同的 socket 监听不同的服务端口来提供各自的服务。
全栈工程师修炼指南
2022/09/28
1.8K0
MYSQL多实例配置详解.md
mysql多实例
同一开发环境下安装两个数据库,必须处理以下问题: 配置文件安装路径不能相同 数据库目录不能相同 启动脚本不能同名 端口不能相同 socket文件的生成路径不能相同
仙人技术
2020/04/29
2.7K0
MySQL之my.cnf配置文件
今天是中秋节之后的第一天,虽然身体来上班了,但是脑子还在放假。今天主要是把密码管理模块的代码推了一版,然后研究了一下mysql的my.cnf文件,简单总结一下。
AsiaYe
2019/11/06
4.7K0
MySQL之my.cnf配置文件
mysql利用mysqld_multi部署单机多实例
近期博客更新不及时,是因为工作有了大的变动,今天分享个工作中遇到的一个小问题。 随着硬件层面的发展,linux系统多核已经是普通趋势,而mysql是单进程多线程,所以先天上对多进程的利用不是很高,虽然5.6版本已经在这方面改进很多,但是也没有达到100%,所以为了充分的利用系统资源,mysql有自己的补充,那就是可以部署多实例,一个实例一个端口。 一、mysql编译安装: cd /usr/local/src wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysq
老七Linux
2018/05/31
9570
MySQL关闭,kill还是kill -9 ?
线上某个MySQL实例需要关停,跟同事沟通了一下关停MySQL的方法。常见的关停MySQL实例的方法有:
AsiaYe
2022/04/01
3.7K0
Mysql 编译安装并使用自定义用户启动
必备的组件,如果没有使用 yum 进行安装,可以使用网上的源,也可以使用本地光盘作为 Yum 源。 1、CMake 2、make 3、gcc 4、ncurses 5、Perl
大江小浪
2018/07/24
8420
MySQL 数据库的启动与关闭
    MySQL数据库服务器通常指的的是mysqld,而命令行mysql则是mysql客户端程序,这两个概念通常容易混淆。通常启动mysql服务器即是启动mysqld进程,mysqld启动后,可以通过mysql连接到mysql服务器。本文主要描述了mysql服务器的几种启动方式以及如何关闭mysql服务器。
Leshami
2018/08/13
6.4K0
数据库介绍(MySQL安装 体系结构、基本管理)
该文章介绍了如何通过MySQL Workbench 5.7.31在Windows 10上重置MySQL root密码。包括安装MySQL Workbench、运行MySQL命令行工具、查看MySQL服务器信息、通过命令行重置MySQL root密码、重载MySQL服务、登录MySQL数据库等步骤。
惨绿少年
2017/12/27
3.1K0
数据库介绍(MySQL安装 体系结构、基本管理)
MySQL单机多实例的配置笔记
    CentOS6.7x86_64【2.6.32-573.el6.x86_64】
保持热爱奔赴山海
2019/09/18
1.4K0
linux环境安装mariadb,linux环境下安装Mariadb
mariadb是属于mysql的一个分支,是其创始人在mysql被卖给oracle之后重新分出来的,maria取自于他女儿的名字。mariadb完全兼容于mysql,在很多新版本的linux系统中,mysql都已经被替换成了mariadb。
全栈程序员站长
2022/06/27
33.7K0
linux环境安装mariadb,linux环境下安装Mariadb
# 故障恢复
只要开启了binlog功能的mysql服务器就支持同步数据,支持数据同步就支持做为主节点.
用户1175783
2020/05/09
8790
CentOS 7 安装Percona Mysql Server
此方法我也不知道为什么在CentOS7里面安装之后可以用,在Debian服务器里面无法进行编译安装使用。另外在使用的过程中,有时候可能也需要Percona-Server-client的支持。针对这个问题,可以使用以下方法解决:将文件上传到/home/soft/目录下,然后进行安装。安装方法如下:
Tacc
2022/01/11
5690
CentOS 7 安装Percona Mysql Server
MySQL体系结构及多实例
MySQL客户端和服务器端模型 MySQL是一个典型C/S,服务器端与客户端两部分组成 服务器端程序  mysqld mysql自带的客户端(mysql mysqladmin  mysqldump等),API接口(php-mysql) 连接方式 通过网络连接串,TCP/IP:(用户名;密码;IP;port) mysql -uroot -p123 -h 10.0.0.52 -P 3306 通过套接字文件,SOCKET:(用户名;密码;Socket路径) mysql -uroot -p123 -S /appli
863987322
2018/03/29
1.7K0
MySQL体系结构及多实例
相关推荐
MySQL-5.7.10主主同步的安装和配置
更多 >
交个朋友
加入前端学习入门群
前端基础系统教学 经验分享避坑指南
加入腾讯云技术交流站
前端技术前沿探索 云开发实战案例分享
加入云开发企业交流群
企业云开发实战交流 探讨技术架构优化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档