MySQL服务启动与关闭

1. 服务启动与关闭

在生产环境中,数据库服务的运行状态一般是不会进行随意调整的,在特殊场景下需要提前审批后,才能进行调整。在进行数据库服务关闭前,可以将业务先切换到备库(从库),再停止原有主库服务。

1.1 常规启动和关闭方式

MySQL数据库的常规启动和关闭方式有systemdsys-v两种方式。

  • 方法1:systemd 方式 ------ Centos7及以后服务启动主流方式
bash 复制代码
[root@localhost ~]# systemctl start mysqld
[root@localhost ~]# systemctl stop mysqld
[root@localhost ~]# systemctl restart mysqld
  • 方法2:sys-v 方式 ------ Centos7以前服务启动主流方式
bash 复制代码
[root@localhost ~]# service mysqld start
[root@localhost ~]# service mysqld stop
[root@localhost ~]# service mysqld restart
# 或者
[root@localhost ~]# /etc/init.d/mysqld start
[root@localhost ~]# /etc/init.d/mysqld stop
[root@localhost ~]# /etc/init.d/mysqld restart

注意:上述停止命令本质:kill mysql_pid;启动命令本质:mysqld_safe ....

  • 方法3:mysqld_safe启动方式
bash 复制代码
[root@localhost ~]# mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &
  • 方法4:mysqld启动方式
bash 复制代码
[root@localhost ~]# mysqld --defaults-file=/etc/my.cnf --user=mysql &

mysqld_safemysqld

  • mysqld:是mysql核心程序,用于管理mysql数据库文件以及用户请求 操作。mysqld可以读取配置文件,启动MySQL实例。
  • mysqld_safe:是mysqld的守护进程,保护MySQL服务正常运行,当mysqld程序被关闭、异常退出等时再次启动程序,mysqld退出了,mysqld_safe会自动把mysqld进程拉起来,用来监视mysqld进程。

数据服务运行启动的进程信息查看:

bash 复制代码
[root@localhost ~]# ps -ef|grep mysqld
root      20315      1  0 07:55 ?        00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/3306/data --pid-file=/data/3306/data/db.pid
# 利用mysqld_safe脚本信息,可以满足定制修改的需求,设置一些灵活的变量信息,支持一些高级的启动功能

mysql     20469  20315  1 07:55 ?        00:00:23 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/3306/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=db.err --pid-file=/data/3306/data/db.pid --socket=/tmp/mysql.sock --port=3306
root      20580  20558  0 08:28 pts/1    00:00:00 grep --color=auto mysqld
# 利用mysqld命令可以启动数据库服务,并显示启动的命令进程信息,但不能负责完成数据库服务的停止和重启操作
# 利用mysqld命令可以启动数据库服务,有些服务功能是锁定死的,不能编辑改动(比如日志功能)
# 利用mysqld_safe命令启动数据库服务,可以进行特殊功能信息配置,并且可以实现数据库维护性操作,还可以设置启停重启; 

#/etc/init.d/mysqld是MySQL自带的使用Shell编写的启动脚本,执行脚本后最终会调用mysqld_safe命令脚本,mysqld_safe脚本执行后又会调用mysqld主程序启动MySQL服务。

说明:通过以上进程信息,可以看出数据库服务可以更灵活的启动,使用mysqldmysqld_safe命令来完成,主要用于维护操作。

数据库服务运行启动与关闭操作逻辑

1.2 维护启动和关闭方式

  • 维护性启动方式,往往需要额外加参数启动。
bash 复制代码
# 附带一般参数
mysqld --port=3306 --mysqlx=0 &        # 其中--mysqlx=0为关闭33060端口(MySQL X Protocol协议端口),这是8.0增加的功能。

## 命令解读
mysqld:      MySQL服务器的守护进程(daemon)的名字。它负责运行MySQL数据库服务。
--port=3306: 指定MySQL服务监听的TCP/IP端口号。默认情况下,MySQL服务通常监听3306端口。这里明确指定了端口为3306。
--mysqlx=0:  控制MySQL X Protocol(支持JSON数据格式)协议启用。设置为0表示禁用该协议。通常是为了减少资源消耗或不必要的网络暴露。
&:           用于将命令放入后台运行。这意味着命令会被立即执行,同时shell不会等待命令完成就可以继续执行其他命令。

# 附带忽略授权表和忽略网络参数启动,当root管理员密码丢失时,要使用这个命令启动。
mysqld_safe --skip-grant-tables --skip-networking &
--skip-grant-tables:  启动时不加载权限(grant)表。任何人都可以无需密码直接连接到数据库,并且拥有所有权限(包括管理员权限)。
--skip-networking:    禁止MySQL服务器监听任何网络端口,即阻止任何远程连接。

# 使用mysqld和mysqld_safe启动优势:可以额外加参数启动,命令行参数优先级高于配置文件my.cnf里的参数。
  • 维护性关闭方式
bash 复制代码
kill pid               #<==这里的pid为数据库服务对应的进程号。
killall mysqld         #<==这里的mysqld是数据库服务对应的进程名字。
pkill mysqld           #<==这里的mysqld是数据库服务对应的进程名字。

# 注意:这里的关闭,千万不要加-9参数强制杀死,否则,可能导致数据库无法启动。

1.3 其它关闭方式

MySQL提供了一个mysqladmin管理命令,可以用来优雅的关闭数据库,命令如下:

bash 复制代码
[root@localhost ~]# mysqladmin shutdown     
#<==注意,如果有密码要指定密码。mysqladmin -uroot -p123456 shutdown

除了应用脚本文件或命令进行关闭数据库服务之外,还可以进入到数据库服务中进行关闭服务:

bash 复制代码
mysql> shutdown;     # 也可以mysql -e "shutdown;" 5.7开始增加.
mysql> restart;

1.4 启动与关闭原理

  • 关闭原理

采用systemctl或者service方式关闭数据库的本质都是 kill 进程号

bash 复制代码
# 查看停止脚本
[root@localhost tmp]#  sed -n '281,301p' /etc/init.d/mysqld
  'stop')
    # Stop daemon. We use a signal here to avoid having to know the
    # root password.

    if test -s "$mysqld_pid_file_path"
    then
      # signal mysqld_safe that it needs to stop
      touch "$mysqld_pid_file_path.shutdown"

      mysqld_pid=`cat "$mysqld_pid_file_path"`
	  ###kill -0 $mysqld_pid 判断pid对应的进程是否运行.
      if (kill -0 $mysqld_pid 2>/dev/null)
      then
        echo $echo_n "Shutting down MySQL"
        # 杀死进程
        kill $mysqld_pid
        # mysqld should remove the pid file when it exits, so wait for it.
        wait_for_pid removed "$mysqld_pid" "$mysqld_pid_file_path"; return_value=$?
      else
        log_failure_msg "MySQL server process #$mysqld_pid is not running!"
        rm "$mysqld_pid_file_path"
      fi
  • 启动原理

采用systemctl或者service方式启动数据库的本质都是调用mysqld_safe命令启动。对应脚本如下:

bash 复制代码
[root@localhost tmp]# sed -n '255,279p' /etc/init.d/mysqld
  'start')     #<==启动命令的传参。
    # Start daemon

    # Safeguard (relative paths, core dumps..)
    cd $basedir

    echo $echo_n "Starting MySQL"
    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.
      ## 这正是在初始化数据库时系统给出的快速启动MySQL方式
      $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
    ;;

生产说明:一定不要随意重启数据库,会影响业务访问。导致20秒业务不可用。 业务访问可能变慢(缓存失效)。

1.5 配置systemd方式启动

借用/etc/init.d/mysqld启动脚本配置真正的systemd方式启动

  • 方法1:单独写SYSTEMD的file文件,可以借用centos6启动脚本(建议)
bash 复制代码
[root@localhost ~]# vim /usr/lib/systemd/system/mysqld_1.service
[Unit]
Description=mysqld service
After=network.target
[Service]
Type=forking
ExecStart=/etc/init.d/mysqld start
ExecReload=/etc/init.d/mysqld restart
ExecStop=/etc/init.d/mysqld stop
[Install]
WantedBy=multi-user.target

[root@localhost ~]# chmod +x /usr/lib/systemd/system/mysqld_1.service
[root@localhost ~]# systemctl enable mysqld_1.service
[root@localhost ~]# systemctl start mysqld_1
  • 方法2:单独写SYSTEMD的file文件,借用mysqld命令启动
bash 复制代码
[root@localhost ~]# vim /usr/lib/systemd/system/mysqld_2.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaultsfile=/etc/my.cnf
LimitNOFILE=5000

[root@localhost ~]# ls -l /usr/lib/systemd/system/mysqld_2.service
-rwxr-xr-x 1 root root 322 11月 16 15:25 /usr/lib/systemd/system/mysqld_2.service
[root@localhost ~]# systemctl enable mysqld_2.service
[root@localhost ~]# systemctl start mysqld_2.service

2. MySQL命令行帮助

MySQL命令行帮助命令有?help,类似Linux下的man和help。其中,核心命令是: help contents

  • 帮助方法1:命令行查帮助(创建数据库示例)
bash 复制代码
# 步骤1.help contents
mysql> help contents
You asked for help about help category: "Contents"
For more information, type 'help <item>', where
<item> is one of the following
categories:
......
Data Definition(数据定义)
......

# 步骤2.? Data Definition
mysql> ? Data Definition
You asked for help about help category: "Data Definition"
For more information, type 'help <item>', where <item> is one of the following
topics:
   ......
   CREATE DATABASE #这里
   ......
   
# 步骤3.mysql> ? CREATE DATABASE
# 这样创建数据库的语法就看到了
mysql> ? CREATE DATABASE
Name: 'CREATE DATABASE'
Description:
Syntax:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name    
#说明: {DATABASE | SCHEMA} 大括号里的必须2选1;[IF NOT EXISTS]中括号里的可选。
    [create_option] ...

create_option: [DEFAULT] {
    CHARACTER SET [=] charset_name
  | COLLATE [=] collation_name
  | ENCRYPTION [=] {'Y' | 'N'}
}

CREATE DATABASE creates a database with the given name. To use this
statement, you need the CREATE privilege for the database. CREATE
SCHEMA is a synonym for CREATE DATABASE.

URL: https://dev.mysql.com/doc/refman/8.0/en/create-database.html

# 步骤4:创建数据库名字为db_name
CREATE DATABASE db_name
  • 帮助方法2:查看官方文档

https://dev.mysql.com/doc/refman/8.0/en/create-database.html

https://dev.mysql.com/doc/refman/8.0/en/drop-table.html

相关推荐
壹屋安源28 分钟前
CentOS 安装 Python 3.11.9完整流程
python·centos·virtualenv·pip·python3.11
q5673152334 分钟前
通过scrapy和Django登录、爬取和持久化数据
java·开发语言·数据库·scrapy·django
飞大圣1 小时前
Ubuntu 18 EDK2 环境编译
linux·运维·ubuntu
亥时科技1 小时前
政企学习考试系统(源码+文档+部署+讲解)
java·数据库·开源·源代码管理
赵渝强老师1 小时前
【赵渝强老师】MySQL InnoDB的表空间
数据库·sql·mysql
冷心笑看丽美人1 小时前
RHEL 网络配置(Linux网络服务器 09)
linux·运维·服务器·网络·bash
枫叶_v1 小时前
【SpringBoot】19 文件/图片下载(MySQL + Thymeleaf)
spring boot·后端·mysql
运维&陈同学1 小时前
【HAProxy05】企业级反向代理HAProxy调度算法之静态算法与动态算法
linux·运维·算法·nginx·云原生·负载均衡·lvs·haproxy
Narutolxy1 小时前
深入解析 CentOS 7 上 MySQL 8.0 的最佳实践20241112
linux·mysql·centos
BillKu1 小时前
Linux(CentOS)项目总结(前后端分离)
java·linux·mysql·nginx·centos