1. 服务启动与关闭
在生产环境中,数据库服务的运行状态一般是不会进行随意调整的,在特殊场景下需要提前审批后,才能进行调整。在进行数据库服务关闭前,可以将业务先切换到备库(从库),再停止原有主库服务。
1.1 常规启动和关闭方式
MySQL数据库的常规启动和关闭方式有systemd
和sys-v
两种方式。
- 方法1:
systemd 方式
—— Centos7及以后服务启动主流方式
[root@localhost ~]# systemctl start mysqld
[root@localhost ~]# systemctl stop mysqld
[root@localhost ~]# systemctl restart mysqld
- 方法2:
sys-v 方式
—— Centos7以前服务启动主流方式
[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启动方式
[root@localhost ~]# mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &
- 方法4:mysqld启动方式
[root@localhost ~]# mysqld --defaults-file=/etc/my.cnf --user=mysql &
mysqld_safe
和mysqld
:
mysqld
:是mysql核心程序,用于管理mysql数据库文件以及用户请求 操作。mysqld可以读取配置文件,启动MySQL实例。mysqld_safe
:是mysqld的守护进程,保护MySQL服务正常运行,当mysqld程序被关闭、异常退出等时再次启动程序,mysqld退出了,mysqld_safe会自动把mysqld进程拉起来,用来监视mysqld进程。数据服务运行启动的进程信息查看:
[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服务。
说明:通过以上进程信息,可以看出数据库服务可以更灵活的启动,使用
mysqld
和mysqld_safe
命令来完成,主要用于维护操作。
数据库服务运行启动与关闭操作逻辑:
1.2 维护启动和关闭方式
- 维护性启动方式,往往需要额外加参数启动。
# 附带一般参数
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里的参数。
- 维护性关闭方式
kill pid #<==这里的pid为数据库服务对应的进程号。
killall mysqld #<==这里的mysqld是数据库服务对应的进程名字。
pkill mysqld #<==这里的mysqld是数据库服务对应的进程名字。# 注意:这里的关闭,千万不要加-9参数强制杀死,否则,可能导致数据库无法启动。
1.3 其它关闭方式
MySQL提供了一个mysqladmin
管理命令,可以用来优雅的关闭数据库,命令如下:
[root@localhost ~]# mysqladmin shutdown
#<==注意,如果有密码要指定密码。mysqladmin -uroot -p123456 shutdown
除了应用脚本文件或命令进行关闭数据库服务之外,还可以进入到数据库服务中进行关闭服务:
mysql> shutdown; # 也可以mysql -e "shutdown;" 5.7开始增加.
mysql> restart;
1.4 启动与关闭原理
- 关闭原理
采用systemctl或者service方式关闭数据库的本质都是
kill 进程号
。
# 查看停止脚本
[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 stoptouch "$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)thenecho $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=$?elselog_failure_msg "MySQL server process #$mysqld_pid is not running!"rm "$mysqld_pid_file_path"fi
- 启动原理
采用systemctl或者service方式启动数据库的本质都是调用
mysqld_safe
命令启动。对应脚本如下:
[root@localhost tmp]# sed -n '255,279p' /etc/init.d/mysqld'start') #<==启动命令的传参。# Start daemon# Safeguard (relative paths, core dumps..)cd $basedirecho $echo_n "Starting MySQL"if test -x $bindir/mysqld_safethen# 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 / SuSEif test -w "$lockdir"thentouch "$lock_file_path"fiexit $return_valueelselog_failure_msg "Couldn't find MySQL server ($bindir/mysqld_safe)"fi;;
生产说明:一定不要随意重启数据库,会影响业务访问。导致20秒业务不可用。 业务访问可能变慢(缓存失效)。
1.5 配置systemd方式启动
借用/etc/init.d/mysqld
启动脚本配置真正的systemd方式启动
- 方法1:单独写SYSTEMD的file文件,可以借用centos6启动脚本(建议)
[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命令启动
[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:命令行查帮助(创建数据库示例)
# 步骤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