姜承尧新版MySQL DBA实战进阶班 Study Notes
Kierke

姜老师MySQL数据库培训精品班学习笔记

MySQL简介与前景

初识MySQL

  • MySQL是遵循于GPL开源协议的数据库


MySQL数据库历史

  • 创始人:Monty Widenius

  • MySQL最早可以追溯到1979年

  • 1996年10月MySQL1.0发布

  • 2001年MySQL3.23发布

    • 最早在生产环境使用的版本:MySQL 3.23.49
  • 1996~2008:MySQL属于MySQL AB公司

  • 2008~2010:SUN MySQL

  • 2010~至今:Oracle MySQL



MySQL分支版本

  • MariaDB
  • oracle MySQL
  • percona
  • Drizzle

MySOL & MariaDB

  • MariaDB没有核心存储引擎
  • 更推荐Oracle MySQL
  • 未来两者将越来越不兼容
MySQL MariaDB
核心存储引擎 InnoDB 无,社区提供
多线程复制 MySQL5.7版本 MariaDB 10版本
商业支持 Oracle公司 SkySQL公司
开发驱动 用户需求与企业驱动 社区驱动
开发现状 代码重构 无重构计划


Oracle与MySQL的关系

有人担心“邪恶”的oracle公司干掉GPL协议的软件,但是不要忘记Oracle是这个星球上最懂数据的厂商

Oracle MySQL与Linux Redhat/SUSE没有什么不同

MySQL被收购的五年Oracle一直在提供资金与人员支持

很多历史遗留问题在Oracle公司下最终得到解决



MySQL数据库的应用

  • 目前主要应用于互联网行业
  • 主要应用于OLTP(Online Transaction Processing)业务
  • 越来越多的传统企业开始转向MySQL数据库


MySQL & 传统商业数据库

- MySQL Oracle Microsoft SOL Server
操作系统支持 跨平台 跨平台 仅Windows
免费与收费 社区版免费 根据License收费 根据License收费
服务器数量 较多 较少 较少
典型应用类似 OLTP OLTP & OLAP OLTP & OLAP
典型应用场景 互联网 传统企业 传统企业
应用趋势 越来越多的企业开始使用MySQL 去I0E 自主可控


MySQL数据库版本比较

MySQL 5.5 MySQL 5.6 MySQL 5.7
索引 全局读写锁,并发一般 全局读写锁,并发一般 锁优化,并发性能提升
多线程复制 不支持 基于库的多线程复制 基于组提交的多线程复制
数据一致性 半同步,数据有丢失 半同步,数据有丢失 无损复制,数据无丢失
半结构化数据 BLOB BLOB 原生JSON格式
InnoDB全文索引 不支持 支持,但不支持中文 支持
地理空间索引 MyISAM支持 MyISAM支持 InnoDB也支持
事务组提交 有bug,不支持 支持 支持


MySQLDBA的工作前景与发展

  • MySQL是最为流行的开源数据库系统

  • 越来越多的企业正开始使用MySQL数据库

  • 中国国内开始进行去IOE的相关计划与工作

  • 毫无疑问,MySQL是去I0E中的最大收益者

  • Oracle从业人员较多,已经趋于饱和状态

  • MySQLDBA的工资相比Oracle DBA要更高(物以稀为贵)

  • 更有前(钱)途(景)



MySQL相关从业人员

  • 运维DBA
    • 负责数据库的相关运维工作
    • 监控数据库状态
    • 搭建高可用集群
  • 开发DBA
    • 负责应用程序的建表
    • 负责表的索引创建
    • 审核开发SQL语句
  • 内核DBA
    • 负责数据库内核级开发
    • 处理内核级的相关bug
    • 跟踪最新数据库内核



MySQL的安装

MySQL5.6安装

MySQL5.6.28二进制安装包解压后目录中有INSTALL-BINARY文件,该文件中有MySQL的安装步骤可作为参考

  • MySQL5.6官方文档
  • 安装注意事项:
    • 如果当前服务器上已经安装过MySQL或mariadb,需要先卸载
    • 注意每个操作步骤所在服务器目录位置
    • 注意目录的权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# (0)服务器环境准备
# 服务器信息:CentOS 7 64位

# (1)准备mysql-5.6.28的二进制安装包
wget -P /usr/local/src/ https://downloads.mysql.com/archives/get/p/23/file/mysql-5.6.28-linux-glibc2.5-x86_64.tar.gz

# (2)创建MySQL软件的用户组和用户:mysql
groupadd mysql
useradd -r -g mysql -s /bin/false mysql

# (3)解压安装包,并创建软连接
tar -zxvf /usr/local/src/mysql-5.6.28-linux-glibc2.5-x86_64.tar.gz -C /usr/local/
ln -s /usr/local/mysql-5.6.28-linux-glibc2.5-x86_64/ /usr/local/mysql

# (4)修改MySQL文件的属组和属主
chgrp -R mysql /usr/local/mysql/
chown -R mysql /usr/local/mysql/

# (5)修改(创建)mysql配置文件信息
# 全局搜索 my.cnf,一般默认会有 /etc/my.cnf 文件,如果没有就新建 /etc/mysql/my.cnf
mkdir -p /etc/mysql
mv /etc/my.cnf /etc/mysql/
vim /etc/mysql/my.cnf

# 修改 /etc/mysql/my.cnf 文件为如下内容
[client]

[mysql]
prompt=(\\u@\\h) [\\d]>\\_

[mysqld]
port = 3306
user = mysql
datadir =/mdata/mysql_test_data
log_error = error.log
# end

# (6)创建MySQL的数据目录并修改目录属组和属主
mkdir -p /mdata/mysql_test_data
chgrp -R mysql /mdata
chown -R mysql /mdata

# (6)初始化MySQL
cd /usr/local/mysql
# mysql5.6通过如下命令初始化安装mysql并不会有初始化密码
scripts/mysql_install_db --user=mysql

# (7)修改MySQL相关目录权限
chown -R root /usr/local/mysql/
chown -R mysql /mdata

# (8)后台启动MySQL
/usr/local/mysql/bin/mysqld_safe --user=mysql &

# 拷贝mysql的启动脚本,该脚本可以启停mysql
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql.server


MySQL5.7安装

  • MySQL5.7官方文档
  • 安装注意事项:
    • 如果当前服务器上已经安装过MySQL或mariadb,需要先卸载
    • 注意每个操作步骤所在服务器目录位置
    • 注意目录的权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# (0)服务器环境准备
# 服务器信息:CentOS 7 64位

# (1)准备mysql-5.7.16的二进制安装包
wget -P /usr/local/src/ https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz

# (2)创建MySQL软件的用户组和用户:mysql
groupadd mysql
useradd -r -g mysql -s /bin/false mysql

# (3)解压安装包,并创建软连接
tar -zxvf /usr/local/src/mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz -C /usr/local/
ln -s /usr/local/mysql-5.7.16-linux-glibc2.5-x86_64/ /usr/local/mysql

# (4)修改MySQL文件的属组和属主
chgrp -R mysql /usr/local/mysql/
chown -R mysql /usr/local/mysql/

# (5)修改(创建)mysql配置文件信息
# 全局搜索 my.cnf,一般默认会有 /etc/my.cnf 文件,如果没有就新建 /etc/mysql/my.cnf
mkdir -p /etc/mysql
mv /etc/my.cnf /etc/mysql/
vim /etc/mysql/my.cnf

# 修改 /etc/mysql/my.cnf 文件为如下内容
[client]

[mysql]
prompt=(\\u@\\h) [\\d]>\\_

[mysqld]
port = 3306
user = mysql
datadir =/mdata/mysql_test_data
log_error = error.log
# end

# (6)创建MySQL的数据目录并修改目录属组和属主
mkdir -p /mdata/mysql_test_data
chgrp -R mysql /mdata
chown -R mysql /mdata

# (6)初始化MySQL
cd /usr/local/mysql
# 注意 --initialize 和 --initialize-insecure 区别,前者会生成初始化密码
bin/mysqld --initialize --user=mysql
bin/mysql_ssl_rsa_setup

# (7)修改MySQL相关目录权限
chown -R root /usr/local/mysql/
chown -R mysql /mdata

# (8)后台启动MySQL
/usr/local/mysql/bin/mysqld_safe --user=mysql &


# 拷贝mysql的启动脚本,该脚本可以启停mysql
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql.server

# 查看初始密码
cat /mdata/mysql_test_data/error.log |grep password


MySQL安装成功后额外设置

  • 将mysql二进制文件目录添加到环境变量
1
2
3
4
5
6
vim /etc/profile

export MYSQL_HOME=/usr/local/mysql
export PATH=$PATH:$MYSQL_HOME/bin

source /etc/profile
  • 将MySQL添加到开机启动项
1
2
3
4
chkconfig --add /etc/init.d/mysql.server

# 查看开机启动项
chkconfig --list


MySQL启动

1
2
3
cp support-files/mysql.server /etc/init.d/mysql.server
/etc/init.d/mysql.server start
/etc/init.d/mysql.server stop


MySQL登录

1
mysql -uroot -p


MySQL设置(修改密码)

MySQL5.6设置密码

  • MySQL5.6安装后默认没有密码
1
2
3
4
5
6
7
8
9
# 终端登录mysql后进行如下操作
set password = password('root');
flush privileges;

# 或者使用下面方式
use mysql;
delete from mysql.user where user <> 'root' or host <> 'localhost';
update mysql.user set password=PASSWORD('root') where user='root' and host = 'localhost';
flush privileges;

MySQL5.7设置密码

  • MySQL5.6安装后有初始密码,该密码在error.log文件中
1
2
3
# 终端登录mysql后进行如下操作
set password = 'root';
flush privileges;



MySQL5.6安装 VS MySQL5.7安装

  • MySQL5.6与MySQL5.7在安装上有细微差别,主要在初始化数据库方式设置初始密码等方面不同
  • 如果想要MySQL5.7安装时不生成初始化密码,则使用bin/mysqld --initialize-insecure --user=mysql命令进行初始化即可
版本 初始化数据库方式 设置密码
MySQL5.6 scripts/mysql_install_db --user=mysql set password = password('root');
MySQL5.7 bin/mysqld --initialize --user=mysql set password = 'root';



MySQL升级

概述

  • MySQL支持小版本间升级(例如:5.6升级到5.7)
  • 升级前一定要备份好数据库(源文件和数据文件),以便意外情况进行恢复


MySQL5.6升级到MySQL5.7实战

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# (1)对MySQL5.6进行全库备份
mysqldump -uroot -proot --all-databases > /usr/local/src/mysql_all.sql

# (2)停止MySQL5.6
# 查看MySQL5.6运行状态
/etc/init.d/mysql.server status

# 停止MySQL5.6
/etc/init.d/mysql.server stop

# 查看MySQL5.6运行状态,确保已经MySQL5.6已经停止运行
/etc/init.d/mysql.server status

# 查看MySQL进程,确保已经MySQL已经停止运行
ps -ef |grep mysql

netstat -tnpl|grep :3306

# (3)准备mysql-5.7.16的二进制安装包
wget -P /usr/local/src/ https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz
tar -zxvf /usr/local/src/mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz -C /usr/local/


# (4)修改软连接
unlink /usr/local/mysql
ln -s /usr/local/mysql-5.7.16-linux-glibc2.5-x86_64 /usr/local/mysql

# (5)启动MySQL
/etc/init.d/mysql.server start

# (6)登录数据库验证版本
select version();

# 注意,此时还没有彻底升级完成

# 查看error.log日志,会发现有如下报错
[ERROR] Column count of performance_schema.events_stages_current is wrong. Expected 12, found 10. Created with MySQL 50628, now running 50716. Please use mysql_upgrade to fix this error.
# 此报错信息提示我们,需要使用 mysql_upgrade 修复数据库

# 根据实际情况进行修复,因为MySQL5.7数据完全兼容MySQL5.6,所以这里我们只升级系统表
mysql_upgrade -s -uroot -p

# 重新启动MySQL,观察error.log日志,发现没有error信息了



MySQL降级




MySQL的配置文件

概述

  • MySQL最佳配置文件模板
  • 文件名:my.cnf(my.ini)
  • 文件性质:文本文件
  • 可有多个配置文件,遵循参数替换原则
  • 修改元数据 要执行 flush privilieges 才生效
1
2
3
[root@localhost ~]# 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 /usr/local/mysql/my.cnf ~/.my.cnf
  • MySQL启动的时候会按上述文件顺序依次读取配置文件中的配置信息(如果配置文件存在),且如果存在相同的配置,后面的配置会覆盖之前的配置


配置文件参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysqld --help --verbose

show variables like 'innodb%';
show session variables like 'innodb%';
show global variables like 'innodb%';


# 查看当前数据库的连接线程
show processlist;

use performance_schema;
select * from threads;

select * from variables_by_thread where variable_name = 'long_query_time';


用户权限管理

概述

  • MySQL的权限管理在3个维度:用户名、IP、密码

  • 管理员用户可以有所有库权限

  • 开发应用只需给相应库的权限

  • 权限校验步骤

    • 用户名、IP、密码是否正确?
    • 查看mysql.user表
    • 查看mysql.db表(指定库权限)
    • 查看mysql.table_priv表(指定表权限)
    • 查顢怊沁mysql.column__priv表(指定列权限)


常用权限

  • SQL语句:SELECT、INSERT、UPDATE、DELETE、INDEX
  • 存储过程:CREATE ROUTINE、ALTER ROUTINE、EXECUTE、TRIGGER
  • 管理权限:SUPER、RELOAD、SHOW DATABASE、SHUTDOWN、GRANT OPTION

权限相关SQL

  • 注意:虽然可以在创建用户的同时给用户授权,但不建议(因为mysql会报警,之后的mysql版本可能会取消该授权并创建用户的语法)
1
2
3
4
5
6
7
8
9
10
create user 'david'@'%' identified by '111111';
drop user 'david'@'%';

# 创建用户但没有密码
create user 'amy'@'%';

# 注意:虽然可以在创建用户的同时给用户授权,但不建议(因为mysql会报警,之后的mysql版本可能会取消该授权并创建用户的语法)
grant select,update,insert,delete on test.* to 'amy'@'%' identified by '111111';

revoke create,index on test.* from 'david'@'%';


MySQL(8.0)中的角色

1
2
3
4
5
6
7
8
9
--创建Role
create role senior dba, app dev;grant all on *.* to senior dba with grant option;grant select,insert,update,delete on wp.* to app dev;
--用户与角色绑定
create user tom@'192.168.1.%'identfied by '123';grant senior dba to tom@'192.168.1.%';
--显示用户权限
show grants for'tom'@'192.168.1.%';
'tom'@'192.168.1.%'using senior dba;show grants for
--删除角色
drop role senior dba;



SSL加密连接与密码插件(todo)




MySQL的启动与关闭

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 后台启动,会话不会阻塞
mysqld --defaults-file=/etc/my.cnf &

# mysqld_safe 是一个可执行的shell脚本,mysqld_safe 来启动mysql的话,后台会有两个进程(mysqld 和 mysqld_safe),mysqld_safe 进程是守护进程,会定期检测mysqld进程是否存在,不存在则启动该进程
mysqld_safe &

# 关闭mysql的方式
# 命令行,也需要密码登录进去才能关闭
mysql>shutdown

# 使用mysqladmin 但需要密码
mysqladmin -p -uroot shutdown

# 不需要密码(因为使用kill -0 来关闭的mysql进程)
/etc/init.d/mysql.server stop

# kill -9 强制关闭,kill -0 是一个安全关闭
  • mysqld、mysqld_safe、mysqld_multi可以看看脚本中的内容

  • MySQL忘记密码怎么办

    • 配置文件[mysqld]下添加skip-grant-tables,表示启动数据库的时候忽略授权表(不校验权限)
    • 重启mysql数据库
    • 重置密码:不能执行set password = password('111111')这个,而需要去修改mysql.user表存储密码的那个字段(注意要使用password()函数),重置密码后(删除刚配置的参数)重启数据库
1
2
3
update user set authentication_string = password('111laaA_') where user='root'and host='localhost'

flush privileges;



MySQL多实例安装

概述

  • 一台服务器上可以安装多个MySQL实例(MySQL原生很早就支持)
    • 充分利用硬件资源
    • 通过mysqld_multi程序管理多个实例即可
  • 也可以把最初安装的mysql添加到mysqld_multi进行统一管理,即可以把所有mysql实例使用mysqld_multi统一管理


MySQL5.7多实例安装实战

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vim /etc/mysql/my.cnf

# 添加如下内容

# [mysqld_multi] 是告诉mysql当前启动时调用的程序是那些,关闭时候调用的程序是哪些
[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
log = /usr/local/mysql/mysqld_multi.log

# 配置一个实例的相关信息
[mysqld3307]
port = 3307
datadir = /mdata/mysql_3307_data
socket = /tmp/mysql.sock3307
1
2
3
4
5
6
mkdir -p /mdata/mysql_3307_data
chown mysql:mysql -R /mdata/mysql_3307_data

# 注意等号前后不要有空格
# 不能使用 --initialize-insecure?
mysqld --initialize --datadir=/mdata/mysql_3307_data
1
2
3
4
5
6
7
8
9
10
11
# 查看mysql实例的状态
mysqld_multi report

# 启动mysql3307这个实例
mysqld_multi start 3307

# 查看初始密码
cat /mdata/mysql_3307_data/error.log |grep password

# 客户端登录
mysql -uroot -p -P3307 -S /tmp/mysql.sock3307


注意事项

  • 如果 mysqld_multi stop 3307 无法停止mysql,需要在配置文件的[mysqld_multi]下添加如下内容
1
2
3
[mysqld_multi]
user = root
pass = root
  • 注意:如果安装了多个实例,需要保持有一个同样的用户名和密码,否则密码或用户不匹配无法使用mysqld_multi stop 停止mysql的实例
  • 可以把所有mysql实例使用mysqld_multi统一管理


多实例安装情况下的my.cnf配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[client]
socket = /tmp/mysql.sock

[mysql]
prompt=(\\u@\\h) [\\d]>\\_

[mysqld]
port = 3306
user = mysql
datadir =/mdata/mysql_test_data
log_error = error.log


[mysqld_multi]
user = root
pass = root
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
log = /usr/local/mysql/mysqld_multi.log

[mysqld3306]
port = 3306
datadir =/mdata/mysql_test_data
socket = /tmp/mysql.sock

[mysqld3307]
port = 3307
datadir = /mdata/mysql_3307_data
socket = /tmp/mysql.sock3307

[mysqld3308]
port = 3308
datadir = /mdata/mysql_3308_data
socket = /tmp/mysql.sock3308


MySQL多实例安装不同版本

  • MySQL多实例安装MySQL5.6和MySQL8.x
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# (1)准备好mysql5.6和mysql8.0的安装包

lrwxrwxrwx. 1 root root 46 Jul 17 20:35 mysql -> /usr/local/mysql-5.7.16-linux-glibc2.5-x86_64/
lrwxrwxrwx. 1 root root 35 Jul 18 18:49 mysql56 -> mysql-5.6.28-linux-glibc2.5-x86_64/
drwxr-xr-x. 13 root root 227 Jul 18 18:52 mysql-5.6.28-linux-glibc2.5-x86_64
drwxr-xr-x. 10 root mysql 162 Jul 17 21:05 mysql-5.7.16-linux-glibc2.5-x86_64
lrwxrwxrwx. 1 root root 39 Jul 18 19:05 mysql80 -> mysql-8.0.0-dmr-linux-glibc2.12-x86_64/
drwxr-xr-x. 9 root root 129 Jul 18 19:05 mysql-8.0.0-dmr-linux-glibc2.12-x86_64

# (2)在my.cnf配置好相关模块
[mysqld2306]
server-id=2306
port=2306
innodb_buffer_pool_size=32M
basedir=/usr/local/mysql56/
datadir=/mdata/mysql_2306_data
socket=/tmp/mysql.sock2306



[mysqld4306]
server-id=4306
port=4306
innodb_buffer_pool_size=32M
basedir=/usr/local/mysql80/
datadir=/mdata/mysql_4306_data
socket=/tmp/mysql.sock4306

# (3)创建好对应的mysql data目录(注意修改权限)

# (4)初始化mysql 5.6 和 8.0
cd /usr/local/mysql80/
bin/mysqld --initialize --user=mysql --datadir=/mdata/mysql_4306_data/

cd /usr/local/mysql56/
scripts/mysql_install_db --user=mysql --datadir=/mdata/mysql_2306_data/

# (5)启动mysql5.6 和 8.0,修改密码 (注意mysql6 没有初密码且其设置密码的方式)



数据库架构

数据库与数据库实例

  • 数据库:物理操作系统文件或其他形式文件类型的集合
  • 数据库实例
    • 由数据库后台进程/线程以及一个共享内存区组成
    • 共享内存可以被运行的后台进程/线程所共享
    • 数据库实例才是真正用来操作数据库文件的
  • MySQL数据库中实例与数据库是一对一之间的关系(不同于oracle的RAC架构)


常见体系结构

  • 单进程多线程
    • Like Microsoft SOL Server
    • Oracle多进程架构
  • 插件式存储引擎架构
    • Like Linux file system
  • MySQL系统架构:略


MySQL逻辑存储结构

  • instance
  • database
  • schema
    • table
    • view


MySQL物理存储结构

  • 数据文件路径
    • 参数:datadir
  • 一个数据库对应一个文件夹
  • 每张表对应一组文件
    • .frm文件(存储数据库表结构)
    • .MYD文件
    • .MYI文件
  • mysql的information_schema库中没有表,表都是视图,存储在内存中
  • mysqld的配置文件还可以有如下配置标签
1
2
3
4
5
6
7
[mysqldump]
quick

[mysqladmin]
force

[mysqld-5.61]
  • MySQL主要文件
    • 数据库配置文件
    • 表结构定义文件
    • 错误文件
    • 慢查询日志
    • 通用日志
  • 错误日志(参数 log_error):
    • 默认名:机器名.err
    • 建议统一修改成一个固定的名称,例如mysql.err
1
2
[mysald]
log error = mysql.err
  • 可将配置错误日志到系统日志文件(不建议)
1
2
3
[mysqld safe]
syslog
syslog tag=stock #mysqld stock
  • mysql官方的mysql-utilities工具可以使用mysqlfrm来静态分析数据库的.frm文件
  • 表结构文件.frm是一个二进制文件



慢查询日志

概述

  • 将运行超过某个时间阈值的SQL语句记录到文件
    • 慢查询
    • 默认名:机器名-slow.log
  • MySQL5.1开始可以以毫秒为单位记录运行的SQl语句
  • MySQL 5.5开始可以将慢查询保存到表
  • MySQL5.6开始可以更细粒度的记录慢查询
  • MySQL5.7将时区信息写入到慢查询日志

慢查询日志相关参数

参数 说明 版本说明
slow_query_log 是否开启慢查询日志
slow_query_log_file 慢查询日志文件名
long_query_time 指定慢查询阈值 5.5 毫秒支持
min_examined_row_limit 扫描记录少于该值的SQL不记录到慢查询日志
log-queries-not-using-indexes 将没有使用索引的SQL记录到慢查询日志
log_throttle_queries_not_using_indexes 限制每分钟记录没有使用索引SQL语句的次数 5.6
log-slow-admin-statement 记录管理操作,如ALTER/ANALYZE TABLE
log_output 慢查询日志的格式,{FILE|TABLE|NONE) 5.5
log_slow_slave_statements 在从服务器上开启慢查询日志
log_timestamps 写入时区信息 5.7
  • 不建议将日志记录到表,性能开销大,数据库占用空间
1
2
3
4
5
select sleep(5)

flush slow logs

bind-address = 10.166.224.32


通用日志

  • 可以记录数据库所有相关操作
    • 参数:general_log
    • 默认文件名:机器名.og
  • 同样可以将日志保存到表
    • mysql.general log
  • 开启性能下降明显


存储引擎概念

  • 用来处理数据库的相关CRUD操作
  • 每个数据库都有存储引擎概念
  • Oracle数据库
    • 堆表
    • 簇表
    • 索引组织表


MySQL存储引擎

概述

  • 官方存储引擎
    • MyISAM
    • InnoDB
    • Memory
    • Federated
    • CSV
    • Archive
  • 第三方存储引擎
    • TokuDB
    • InfoBright
    • Spider
  • 查看当前MySQL支持的存储引擎:show engines
  • 启动时可以禁用某些存储引擎
    • –skip-archive
    • –skip-blackhole

MyISAM

  • MySQL5.1版本之前的默认存储引擎
  • 堆表数据结构
  • 表锁设计
  • 支持数据静态压缩
  • 不支持事务
  • 数据容易丢失
  • 索引容易损坏
  • 唯一的优点:数据文件可以直接拷贝到另一台服务器使用
  • 数据文件:.MYD
  • 索引文件:.MYI
  • 修复错误数据表:myisamchk

Memory

  • 全内存存储的引擎
  • 数据库启动后数据丢失
  • 支持哈希索引,哈希索引仅支持等值查询
  • 不支持事务
  • Memory存储引擎是不能禁用的
  • MySQL内部的排序操作的临时表使用该存储引擎
  • 参数max heap table size决定使用的大小:默认大小:16M
  • 内存放不下时转为MyISAM表:注意临时路径空间大小
  • 内存使用为会话级别
  • 小OOM

CSV

  • 不支持特殊字符
  • 使用相当广泛
  • CSV是一种标准文件格式
  • 文件以纯文本形式存储表格数据

Federated

  • 允许本地访问远程MySQL数据库中表的数据
  • 本地不存储任何数据文件
  • 类似于Oracle中的透明网关
    • 仅支持MySOL=>MySQL的访问
    • 不支持数据库的访问
  • Fedorated存储引擎默认不开启
  • 异构数据库远程访问
    • MariaDB
    • FedoratedX
  • 远程数据库连接字符串:scheme://user name[:password]@host name[:port num]/db_name/tbl_name


存储引擎物理特性

  • 初始分配较小的内存块,内存使用量逐渐增大
  • 哈希表使用动态哈希技术,通过链表管理空闲空间
  • 引擎采用固定长度存储数据,VARCHAR其实以CHAR方式进行存储
  • 数据类型支持,不支持BLOB和TEXT类型
  • Memory支持自增列属性,可以创建自增主键



数据类型




Reference




英文单词

1
2
3
4
5
initialize	# 初始化
insecure # 不安全的
multi # 多
report # 报告
privilege # 权限



Remark

  1. MySQL降级抽空可以了解一下
  2. information_schema 记录了元数据信息
  3. mysql 这个库 记录了用户信息,performance_schema 记录了数据库的性能监控信息
  4. sys 5.7 新增的表 对 performance_schema 的表进行整理,里面有视图
  5. MySQL自动化安装脚本(作业,待完成)
  6. mysql配置参数这块 可以参考阅读《MySQL是怎样允许的》其中讲得比较详细
  7. 了解 mysql创建用户默认有哪些权限
  8. 权限这块内容可能还需要再看一遍,并做好笔记
  9. 角色这块还需要深入了解一下
1
2
3
4
5
<font color=red></font>
![]()
<img src="" title="图片名称" alt="图片无法正常加载展示!" width="100%" height="100%" >
<img src="" width="70%">
****