Skip to content

MYSQL 详解

一. 什么是 mysql ?

mysql 是一种关系型数据库。它是 C/S 架构,所以有客户端和服务端。系统不同,mysql 安装目录也不同。若是unix类系统通过包管理软件安装,路径一般为 /usr/bin/mysql ;手动安装地址 /usr/local/mysql

1.1 bin目录下的文件

mysql bin目录下部分可执行文件如下所示:

.
├── mysql
├── mysql.server -> ../support-files/mysql.server
├── mysqladmin
├── mysqlbinlog
├── mysqlcheck
├── mysqld
├── mysqld_multi
├── mysqld_safe
├── mysqldump
├── mysqlimport
├── mysqlpump
... (省略其他文件)
0 directories, 40 files

1.1.1 mysqld

mysqld是mysql数据库的服务端进程,但不经常用,原因还需往下看!运行mysqld会启动一个带有log输出窗口的mysql服务进程。

1.1.2 mysqld_safe

mysqld_safe 是启动脚本,会间接调用 mysqld ,并启动一个监控进程,在 mysqld 故障时进行重启。直接运行 mysqld 时 log 会之间输出到启动窗口,而 mysql_safe 的 log 会重定向到一个文件中。

1.1.3 mysql.server

mysql.server 同样是启动脚本,也会间接调用 mysqld_safe 。这个 mysql.server 文件其实是一个链接文件,它的实际文件是 ../support-files/mysql.server。执行 mysql.server 时可以在后面跟命令,如: mysqld.server start

1.1.4 mysqld_multi

以上命令都是启动一个实例进程,而 mysqld_multi 是启动多个实例,可以对每一个服务器进程的启动或停止进行监控。

1.1.5 mysqlbinlog

mysqlbinlog 是查看 binlog 日志文件的命令。binlog 文件以二进制方式存储,不能直接查看,需要使用 mysqlbinlog 命令来查看。

1.2 mysql 与 mysqld "相爱相杀"!

1.2.1 mysql 简单语法

mysql 中,-u这类参数是短参数,后面可以直接跟值,也可以空格后再跟值,例: -uroot-u root 等效。短参数前面用单个短划线 --p 参数特例,参数和值之间不能有空格!!! 有短参数也有长参数,--user 就是 -u 的完整形式,完整参数的赋值格式为 --user=VALUE 中间不能有空格。长参数前面用两个短划线 --。 mysql 各个参数之间没有顺序要求,可以随意摆放各参数。

1
2
3
mysql -hHOST -uUSER -pPASSWORD -Pport
# for example
mysql -hmoloom.com -uroot -p123456 -P7777

注意:连接上 mysql 后,msql的命令都要以分号 ;结尾!

参数 解释
-h 指定要连接的主机地址,可以是域名和ip地址。如果连接本地mysql可以省略。
-u 指定要登录的用户名
-p 用户名的密码

如果要断开客户端与服务端的连接,在 mysql 控制台输入 quit,exit,\q 中的任意一个命令即可退出客户端。

1.2.3 mysql 和 mysqld 是怎么"交流"的?

要使用 mysql 数据库,必须要连接它的服务端,发生了"连接"这个动作,那就涉及到了通信。mysql 支持 TCP\IP、pipe和共享内存、Unix套接字文件 三种通信方式,默认方式是 TCP\IP 。

1.2.3.1 TCP\IP

mysql 服务默认监听 3306 端口。客户端连接服务端时,如果没有指定主机和端口,默认连接本地地址 127.0.0.13306 端口。

1
2
3
#这两条命令等效
mysql -h 127.0.0.1 -P 3306 -uroot -p
mysql -uroot -p

1.2.3.2 pipe和共享内存

1.2.3.3

1.3 什么是存储引擎?

二. mysql 的配置

. MYSQL备份与还原

备份可划分为热备份、冷备份和温备份。 - 热备份:读写不受影响 - 冷备份:也叫离线备份,读写都被中止后再备份 - 温备份:仅可执行读操作

备份还可划分为物理备份和逻辑备份 - 物理备份:复制数据文件到其他硬盘 - 逻辑备份:将数据导出至文本文件中

备份还分为完全备份、增量备份和差异备份 - 完全备份:完全备份全部数据 - 增量备份: - 差异备份:

1.

binlog 日志

binglog 日志记录了所有 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,不包括查询语句。binlog 以二进制形式存储,不可直接查看,需要使用 mysqlbinlog 命令查看 binlog 日志。

通过 show variables like '%log_bin%'; 语句查看有关 binlog 的配置

查看 binlog 配置

.1 日志格式

mysql 提供了多种格式来记录二进制日志: - statement 基于 SQL 语句的日志记录,记录的是 SQL 语句,对数据进行修改的 SQL 语句都会记录到日志中 - row 基于行的日志记录,记录的数据涵盖变更前后的实际数据内容 - mixed 混合了 statement 和 row 两种格式,它默认采用 statement,在某些特殊情况下会自动切换为 row 格式进行记录

两种日志格式的区别如下所示:

statement 格式

staement 格式的 binlog 日志记录的是 sql 语句,用 mysqlbinlog 日志查看工具可以明文查看。

row 格式

而 row 格式下的日志就算是使用 mysqlbinlog 日志工具查看也是加密的。使用 mysqlbinlog -v 参数把日志重构为 sql ,才能看见 sql 语句,WHERE 段落中的是修改前的值,SET 后面的是修改的结果。如上图第二大段,以 “BINLOG” 开头的五行加密信息,后面的则是明文 sql 语句。

使用 show variables like '%binlog_format%'; 查看当前 mysql 的日志格式。

在 mysql 的配置文件中添加 binlog_format=STATEMENT 来修改日志格式

.2 查看日志

binlog 日志由二进制格式存储,需要用 mysql 自己提供的命令工具 mysqlbinlog 来查看。 参数: - -d 指定数据库名称 - -o 忽略掉日志中的前 n 行命令 - -v 将行事件(数据变更)重构为 SQL 语句 - -vv 将行事件(数据变更)重构为 SQL 语句,并输出注释信息

.3 清理日志

清理日志分手动清理和自动清理,手动清理通过如下命令来手动删除需要删除的日志,自动清理通过 mysql 的配置文件来设置

1
2
3
reset master;   # 删除全部 binlog 日志,之后编号从 1 开始
purge master logs to 'mall-mysql-bin.000004';   # 删除 4 号之前的日志(不包括 4 号)
purge master logs before 'yyyy-mm-dd hh:MM:ss'; # 删除 什么时间之前产生的日志

mysql 配置文件方式删除日志

1
2
3
4
5
6
[mysqld]
# 旧版本 5.x或 8.0早期版本,,deprecate!!
expire_logs_days = 7

# 保留 7 天的 binlog,单位 秒
binlog_expire_logs_seconds = 604800

查看清理日志设置

show variables like "%binlog_expire_logs_seconds%";

查询日志

binlog 日志只是把 DML 和 DDL 语句记录起来,不包括查询语句。mysql 有个查询日志,它会记录所有的操作语句,在配置中添加如下配置即可。

1
2
3
4
# 是否开启查询日志,1 开启;0关闭;
general_log=1
# 指定日志文件的存储名称,默认名称为 当前主机名.log
general_log_file=mysql.log

检查当前数据库是否开启查询日志,用 show variables like '%general%';

慢查询日志

慢查询日志把执行时间超过参数 "long_query_time" 设置值并且扫描记录数不小于 "min_examined_row_limit" 的所有 SQL 语句给记录下来。慢查询日志默认不开启,参数 "long_query_time" 默认为 10s,它的精度可以到微秒。

在 mysql 配置文件中添加如下选项来配置慢查询日志

1
2
3
4
5
6
7
8
# 慢查询日志
slow_query_log=1
# 执行时间参数
long_query_time=2
# 记录执行较慢的管理语句,默认不会记录管理语句
log_slow_admin_statements=1
# 记录未使用索引的语句,这个一开,只要未走索引都会记录,就算查询语句是毫秒级别,也同样会记录!
log_queries_not_using_indexes=1