?《博主介绍》:✨又是一天没白过,我是奈斯,从事IT领域✨
?《擅长领域》:✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(MongoDB)有了解✌️
???大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注???
各位小伙伴今天与大家分享一个MySQL数据库非常重要的话题——启动、关闭、重启linux下MySQL数据库的多种方式。众所周知MySQL作为一款广泛使用的开源关系性数据库管理系统,已经成为了许多企业和个人在存储和管理数据时的首选工具。然而,正确地启动或者关闭MySQL对于确保系统的稳定运行、数据的完整性和安全性至关重要。
启动、关闭、重启MySQL看似简单,但实际上涉及到许多细节和注意事项。不同的操作系统、配置和环境可能需要采用不同的方法来启动、关闭、重启MySQL服务。因此,了解并掌握多种方法对于数据库管理员和开发者来说是至关重要的。
在这篇文章中,将探讨多种启动、关闭、重启MySQL的方法,并解释每种方法的适用场景和注意事项。通过这些方法的学习和实践,我们不仅能够更好地管理和维护数据库,还能够提高工作效率和减少潜在的风险。
目录
1、MySQL启动的几种方式
方式一:mysqld命令(在多实例环境中,指定对应实例参数文件就可以启动某个实例)
方式二:mysqld_safe命令(在多实例环境中,指定对应实例参数文件就可以启动某个实例)
方式三:写入linux服务进行启动(在多实例环境中,通过不同的脚本定义不同的mysql_server就可以启动某个实例)
linux7.6版本将MySQL启动写入系统服务:
linux8.3版本将MySQL启动写入系统服务:
2、MySQL关闭的几种方式
方式一:mysqladmin命令(在多实例环境中,指定对应实例socket文件就可以关闭某个实例)
方式二:shutdown命令
方式三:写入linux服务进行关闭(在多实例环境中,通过不同的脚本定义不同的mysql_server就可以关闭某个实例)
3、MySQL重启方式(8.0版本新增)
方式一:restart命令(8.0.4版本新增。至此可以通过命令实现关闭和重启,但还不支持通过命令启动)
方式二:写入linux服务进行重启(在多实例环境中,通过不同的脚本定义不同的mysql_server就可以重启某个实例)
1、MySQL启动的几种方式
MySQL数据库启动的第一步同Oracle数据库一样都是先读取参数文件的内容,大家都知道Oracle数据库启动的第一步(nomount状态)就会在$ORACLE_HOME/dbs目录下读取参数文件,并且数据库的设置、配置、优化都是在参数文件中完成的。读取参数文件会按照spfile<SID>.ora --> spfile.ora --> init<SID>.ora(同pfile.ora)的顺序依次寻找,如果按照顺序都没有找到参数文件,那么启动就会报错,当然也可以在启动时指定自定义的参数文件完成数据库的启动。
在MySQL数据库中,读取参数文件会按照/etc/my.cnf --> /etc/mysql/my.cnf --> /usr/local/mysql/etc/my.cnf --> ~/.my.cnf的顺序依次寻找(读取参数文件的顺序通过mysql --help | grep my.cnf命令查看) ,如果按照顺序都没有找到参数文件,那么启动也就会报错的,除非在启动时指定自定义的参数文件,就可以完成正常的数据库启动了。 如果指定的是自定义的参数文件,记录参数文件的位置是十分重要的,因为在MySQL中没有确定参数文件的参数,所以通过ps -ef | grep mysql确定参数文件的位置尤为重要。
MySQL启动时,涉及到以下关键的两个程序和一个函数。
my_print_defaults 函数:这个函数用于读取 MySQL 的配置文件(通常是 my.cnf),并输出配置文件中指定的参数,输出参数传递给parse_server_arguments。 parse_server_arguments 程序:这个程序接收 my_print_defaults 函数输出的参数。它负责解析这些参数,并将它们分配给 MySQL 启动过程中必要的关键变量,例如 --basedir(MySQL安装目录)、--datadir(MySQL数据存储目录)、--pid-file(MySQL进程ID文件路径)、--server-startup-timeout(MySQL服务器启动超时时间)等。mysqld_safe 程序:这是 MySQL 的安全启动程序,它负责启动和管理实际的数据库服务器进程 mysqld。在启动 mysqld 之前,mysqld_safe 会调用 parse_server_arguments 确保配置参数正确,并设置好运行环境。这些组件共同协作,确保 MySQL 在启动过程中能够正确读取配置、设置环境变量,并以安全和可靠的方式启动数据库服务器。
方式一:mysqld命令(在多实例环境中,指定对应实例参数文件就可以启动某个实例)
mysqld 是 MySQL 数据库管理系统中的主要服务器进程 。它负责处理客户端的连接请求,并执行数据库操作,如查询、更新、插入和删除数据。mysqld 是多线程的,可以同时处理多个客户端连接,支持事务处理和多种存储引擎,如 InnoDB、MyISAM 等。它还负责管理数据库的日志和缓存,如事务日志和查询缓存,以优化数据库的性能和可靠性。
mysqld --verbose --help选项:
参数选项 | 描述 |
--defaults-file=# | 指定参数文件 |
-u, --user=name | 指定操作系统的用户名,指定为mysql用户。 |
mysqld命令启动数据库:
[root@mgr1 ~]# nohup /liu_data/mysql8.0/app/mysql/bin/mysqld --defaults-file=/liu_data/mysql8.0/data/3306/my.cnf --user=mysql &###mysqld数据库后台进程,只是显示了指定的参数,为了方便管理使用mysqld_safe或者指定多个参数[root@mgr1 ~]# ps -ef | grep mysql
方式二:mysqld_safe命令(在多实例环境中,指定对应实例参数文件就可以启动某个实例)
mysqld_safe由shell脚本编写,是 MySQL的守护进程启动工具 ,负责启动和监控mysqld进程,并在需要时进行自动重启。
当MySQL的mysqld进程宕机时,mysqld_safe作为它的守护进程启动工具发挥着关键作用。它负责监控并自动重启mysqld,确保数据库的持续运行。如果仅mysqld进程宕机而mysqld_safe仍在运行,数据库可以继续工作。然而,如果mysqld_safe和mysqld两者同时宕机,数据库将停止运行。
mysqld_safe --help选项:
参数选项 | 描述 |
--defaults-file=FILE | 指定参数文件 |
mysqld_safe命令启动数据库:
[root@mgr1 ~]# nohup /liu_data/mysql8.0/app/mysql/bin/mysqld_safe --defaults-file=/liu_data/mysql8.0/data/3306/my.cnf &###mysqld_safe带动mysqld数据库后台进程[root@mgr1 ~]# ps -ef | grep mysql
方式三:写入linux服务进行启动(在多实例环境中,通过不同的脚本定义不同的mysql_server就可以启动某个实例)
通过将MySQL的mysql.server脚本添加到LINUX系统服务中进行启动操作。
linux版本8之前服务的启动文件定义在/etc/init.d中,并且通过service命令进行管理。
到了linux版本8之后服务的启动文件定义在/usr/lib/systemd/system中了,通过systemctl命令进行管理。当然版本8之后的系统还兼容service命令,同样的/etc/init.d下,但是linux版本8建议使用systemctl命令替代。小提示?:下面案例中的mysql数据库系统服务名为mysqld,这里是可以按照业务自定义命令的哦。
linux7.6版本将MySQL启动写入系统服务:
一、编辑mysql.server脚本,并将mysql.server脚本添加到linux服务
[root@ha1 ~]# cd /liu_data/mysql5.7/app/mysql/support-files/ ###MySQL的目录,这里以实际安装的目录为准哦[root@ha1 support-files]# cp mysql.server mysql.server.bk[root@ha1 support-files]# vi mysql.server ###作用就是为了方便启动和关闭mysql服务,这个脚本中调用mysqld_safe来启动mysqld。以下是mysql.server需要修改的内容
修改一:目录和数据存储目录
修改二:相关目录和数据存储目录
修改三:通过mysqld_safe带动mysqld进程的启动,--defaults-file参数为指定自定义的参数文件,默认读取参数文件会按照/etc/my.cnf --> /etc/mysql/my.cnf --> /usr/local/mysql/etc/my.cnf --> ~/.my.cnf的顺序依次寻找(读取参数文件的顺序通过mysql --help | grep my.cnf命令查看)
[root@ha1 support-files]# cp /liu_data/mysql5.7/app/mysql/support-files/mysql.server /etc/init.d/mysqld ###将启动脚本放到系统服务管理中并命名为mysqld[root@ha1 ~]# chmod 755 /etc/init.d/mysqld[root@ha1 ~]# chkconfig --add mysqld ###将mysqld加入到服务中[root@ha1 init.d]# service mysqld start[root@ha1 init.d]# chkconfig mysqld on ###开机启动mysqld服务 [root@ha1 init.d]# service mysqld status
service mysqld status查询服务的PID,并且通过ps -ef | grep mysql查看MySQL数据库的PID是否一致
linux8.3版本将MySQL启动写入系统服务:
一、编辑mysql.server脚本,并将mysql.server脚本添加到linux服务
[root@mgr1 3306]# cd /liu_data/mysql8.0/app/mysql/support-files ###MySQL的目录,这里以实际安装的目录为准哦[root@mgr1 support-files]# cp mysql.server mysql.server.bk[root@mgr1 support-files]# vi mysql.server ###作用就是为了方便启动和关闭mysql服务,这个脚本中调用mysqld_safe来启动mysqld。以下是mysql.server需要修改的内容
修改一:目录和数据存储目录
修改二:相关目录和数据存储目录
修改三:通过mysqld_safe带动mysqld进程的启动,--defaults-file参数为指定自定义的参数文件,默认读取参数文件会按照/etc/my.cnf --> /etc/mysql/my.cnf --> /usr/local/mysql/etc/my.cnf --> ~/.my.cnf的顺序依次寻找(读取参数文件的顺序通过mysql --help | grep my.cnf命令查看)
[root@mgr1 3306]# cd /usr/lib/systemd/system[root@mgr1 system]# vi mysqld.service[Unit]Description=MySQL ServerDocumentation=man:mysqld(8)Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.htmlAfter=network.targetAfter=syslog.target [Install]WantedBy=multi-user.target [Service]User=mysqlGroup=mysqlType=forkingTimeoutSec=0 # Execute pre and post scripts as rootPermissionsStartOnly=true # Start main serviceExecStart=/liu_data/mysql8.0/app/mysql/support-files/mysql.server start ###调用mysql目录下的mysql.server脚本进行启动# Use this to switch malloc implementationEnvironmentFile=-/etc/sysconfig/mysql # Sets open_files_limitLimitNOFILE = 65536LimitNPROC = 65536 Restart=on-failureRestartPreventExitStatus=1PrivateTmp=false [root@mgr1 system]# systemctl daemon-reload[root@mgr1 system]# systemctl start mysqld.service[root@mgr1 system]# systemctl enable mysqld.service [root@mgr1 system]# systemctl status mysqld.service
systemctl status mysqld.service查询服务的PID,并且通过ps -ef | grep mysql查看MySQL数据库的PID是否一致
2、MySQL关闭的几种方式
在MySQL数据库中,读取参数文件会按照/etc/my.cnf --> /etc/mysql/my.cnf --> /usr/local/mysql/etc/my.cnf --> ~/.my.cnf的顺序依次寻找(读取参数文件的顺序通过mysql --help | grep my.cnf命令查看) ,如果按照顺序都没有找到参数文件,那么启动也就会报错的,除非在启动时指定自定义的参数文件,就可以完成正常的数据库启动了。 如果指定的是自定义的参数文件,那么关闭MySQL前记录参数文件的位置是十分重要的,因为在MySQL中没有确定参数文件的参数,所以通过ps -ef | grep mysql确定参数文件的位置尤为重要。关闭前记录参数文件位置,然后启动的时候指定即可。
方式一:mysqladmin命令(在多实例环境中,指定对应实例socket文件就可以关闭某个实例)
mysqladmin 是 MySQL 数据库管理系统中一个重要的命令行工具,用于执行管理和监控数据库的各种任务。它可以通过执行不同的子命令来管理数据库服务器,如创建和删除数据库、管理用户权限、监控服务器状态等。
mysqladmin --help选项:
参数选项 | 描述 |
-u, --user=name | 用于登录的用户名(如果不是当前用户) |
-S, --socket=name | 指定用于连接的套接字文件的名称(socket套接字就是ip+端口,包括本地ip:port, 远程ip:port)。如果系统上有多个实例,通过连接socket可以连接相应的实例,socket可以用户连接到那个实例 |
-p, --password[=name] | 连接到服务器时使用的密码 |
mysqladmin命令关闭数据库:
[root@mgr1 ~]# mysqladmin -uroot -p shutdown -S /liu_data/mysql8.0/data/3306/liu.sockEnter password: ###输入密码[root@mgr1 ~]# tail -200f /liu_data/mysql8.0/log/3306/liu.err ###查看错误文件,观察关闭信息
方式二:shutdown命令
此语句用于停止MySQL实例,不过需要 SHUTDOWN 权限。
SHUTDOWN 提供了一个 SQL 层级的接口,功能与使用 mysqladmin shutdown 命令或 mysql_shutdown() C API 函数所实现的功能相同。一个成功的 SHUTDOWN 序列包括:检查权限、验证参数,并向客户端发送一个 OK 数据包。然后,实例将关闭。
Com_shutdownstatus 变量跟踪 SHUTDOWN 语句的执行次数。由于状态变量在每次服务器启动时都会初始化,并且不会在重启后保留,因此 Com_shutdown 通常为零,但如果执行了 SHUTDOWN 语句并且执行失败,则该值可能非零。
分两种情况进行模拟:
1)情况一:mysql的后台进程通过mysqld_safe进行调用
[root@mgr1 3306]# mysql -uroot -p123456 -S /liu_data/mysql8.0/data/3306/liu.sockmysql> shutdown;[root@mgr1 ~]# tail -200f /liu_data/mysql8.0/log/3306/liu.err ###查看错误文件,观察关闭信息
2)情况二:mysql的后台进程没有通过mysqld_safe调用
[root@mgr1 3306]# mysql -uroot -p123456 -S /liu_data/mysql8.0/data/3306/liu.sockmysql> shutdown;[root@mgr1 ~]# tail -200f /liu_data/mysql8.0/log/3306/liu.err ###查看错误文件,观察关闭信息
总结:不管有没有通过mysqld_safe启动调用mysqld这个进程,都可以使用shudown关闭数据库命令。
方式三:写入linux服务进行关闭(在多实例环境中,通过不同的脚本定义不同的mysql_server就可以关闭某个实例)
通过将MySQL的mysql.server脚本添加到LINUX系统服务中进行关闭操作。添加过程参考MySQL启动方式的方式三即可。
3、MySQL重启方式(8.0版本新增)
在MySQL数据库中,读取参数文件会按照/etc/my.cnf --> /etc/mysql/my.cnf --> /usr/local/mysql/etc/my.cnf --> ~/.my.cnf的顺序依次寻找(读取参数文件的顺序通过mysql --help | grep my.cnf命令查看) ,如果按照顺序都没有找到参数文件,那么启动也就会报错的,除非在启动时指定自定义的参数文件,就可以完成正常的数据库启动了。 如果指定的是自定义的参数文件,那么重启MySQL前记录参数文件的位置可有可无,因为重启是先关闭然后再启动,启动时就会按照已经指定好的参数文件进行启动了,可以通过ps -ef | grep mysql确定参数文件。
方式一:restart命令(8.0.4版本新增。至此可以通过命令实现关闭和重启,但还不支持通过命令启动)
在MySQL8.0.4版本中引入restart命令,此语句用于停止并重新启动MySQL实例,不过需要 SHUTDOWN 权限(这里没有写错哈,是和SHUTDOWN命令一样,restart也需要SHUTDOWN权限)
RESTART 的一个用途是在无法或不方便通过命令行访问 MySQL 服务器所在主机以重新启动服务器时使用。例如,SETPERSIST_ONLY 可以在运行时用来修改只能在服务器启动时设置的系统变量,但这些更改仍然需要重新启动服务器才能生效。RESTART 语句提供了一种从客户端会话内执行此操作的方式,而无需在服务器主机上获取命令行访问权限。
不过使用restart命令进行重启是有前提条件的,操作要求 mysqld(mysqld 是 MySQL 数据库管理系统中的主要服务器进程)运行在一个有 mysqld_safe(mysqld_safe 是 MySQL的守护进程启动工具 ,负责启动和监控mysqld进程) 进程的环境中,以便检测为了重启而执行的实例关闭:
在有mysqld_safe监控进程的情况下,发起 RESTART 命令时会终止 mysqld ,以便监控进程能够检测到并启动一个新的 mysqld 实例。如果没有mysqld_safe监控进程,RESTART 将失败并抛出错误(下面的案例会有演示)restart 命令的原理是mysqld_safe监控进程检测mysqld退出时的返回值,若是16,则进行重启。相关bash shell如下:
#!/bin/bashexport MYSQLD_PARENT_PID=$$export MYSQLD_RESTART_EXIT=16while true ; do bin/mysqld mysqld options here if [ $? -ne $MYSQLD_RESTART_EXIT ]; then break fidone
分两种情况进行模拟:
1)情况一:mysql的后台进程通过mysqld_safe进行调用
[root@mgr1 3306]# mysql -uroot -p123456 -S /liu_data/mysql8.0/data/3306/liu.sockmysql> restart;[root@mgr1 ~]# tail -200f /liu_data/mysql8.0/log/3306/liu.err ###查看错误文件,观察重启信息
2)情况二:mysql的后台进程没有通过mysqld_safe调用
[root@mgr1 3306]# mysql -uroot -p123456 -S /liu_data/mysql8.0/data/3306/liu.sockmysql> restart; ###重启服务器失败(mysqld没有被管理进程管理)ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor process).
总结:只有通过mysqld_safe启动mysqld这个进程才能使用restart命令进行重启;如果只有mysqld进程,没有通过mysqld_safe带动,则不能使用restart命令,报ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor process).
方式二:写入linux服务进行重启(在多实例环境中,通过不同的脚本定义不同的mysql_server就可以重启某个实例)
通过将MySQL的mysql.server脚本添加到LINUX系统服务中进行重启操作。添加过程参考MySQL启动方式的方式三即可。
呼,终于写完了,这篇文章整合了linux下MySQL数据库的启动、关闭、重启的多种方式,希望对各位小伙伴在以后的MySQL运维工作中有借鉴意义!!!