Mysql基本运维知识总结
Mysql参数查询
1 | 方法1. select @@[参数名] |
Mysql版本的问题
Mysql的发行版有哪些
- Mysql官方版本(社区版,企业版)
- Percona Mysql
- 与mysql官方版本兼容
- 具有mysql企业版的功能
- 性能比社区版的好
- 版本会比mysql官方版落后
- MariaDB
- 不完全兼容mysql官方版本
各个发行版本之间的区别
服务器特性
特性 | Mysql | Percona Mysql | MariaDB |
---|---|---|---|
是否开源 | 开源 | 开源 | 开源 |
是否支持分区表 | 支持 | 支持 | 支持 |
使用的引擎 | InnoDB | XtraDB | XtraDB |
运维监控工具 | 企业版提供,社区版不提供 | Percon Monitor工具 | Monyog |
高可用特性
Mysql | Percona Mysql | MariaDB |
---|---|---|
基于日志点复制 | 基于日志点复制 | 基于日志点复制 |
基于Gtid复制 | 基于Gtid复制 | 基于Gtid复制,但Gtid同Mysql不兼容 |
MGR | MGR & PXC | Galera Cluster |
Mysql Router | Proxy SQL | MaxScale |
安全性
Mysql | Percona Mysql | MariaDB |
---|---|---|
企业版防火墙 | ProxySQL FireWall | MaxScale FireWall |
企业版用户审计 | 审计日志 | 审计日志 |
用户密码生命周期 | 用户密码生命周期 | - |
sha256_passwordcaching_sha2_password | sha256_passwordcaching_sha2_password | ed25519sha256_password |
开发及管理
Mysql | Percona Mysql | MariaDB |
---|---|---|
窗口函数(8.0) | 窗口函数(8.0) | 窗口函数(10.2) |
- | - | 支持基于日志回滚 |
- | - | 支持记在表中记录修改 |
Super read_only | Super read_only | - |
Mysql8.0版本的新特性
服务器功能
- 所有元数据使用InnoDB引擎存储,无frm文件
- 系统表采用InnoDB存储并采用独立表空间
- 支持定义资源管理资源组(目前仅支持CPU(2019-01-22))
- 支持不可见索引和降序索引,支持直方图优化
- 支持窗口函数
- 支持在线修改全局参数持久化
用户及安全
- 默认使用caching_sha2_password认证插件
- 新增支持定义角色(role)
- 新增密码历史记录功能,限制重复使用密码
InnoDB功能
- InnoDB DDL语句支持原子操作
- 支持在线修改UNDO表空间
- 新增管理视图用于监控InnoDB表状态
- 新增innodb_dedicated_server配置项
Mysql升级的问题
升级前需要考虑的问题
- 升级可以给业务带来的益处
- 升级可能对业务带来的影响
- 数据库升级方案的制定
- 升级失败的回滚方案
1. 升级可以给业务带来的益处
- 是否可以解决业务上某一方面的痛点
- 是否可以解决运维上某一方面的痛点
2. 升级可能对业务带来的影响
- 对原业务程序的支持是否有影响
- 对原业务程序的性能是否有影响
3. 数据库升级方案的制定
- 评估受影响的业务系统
- 升级的详细步骤
- 升级后的数据库环境检查
- 升级后的业务检查
4. 升级失败的回滚方案
- 升级失败回滚的步骤
- 回滚后的数据库环境检查
- 回滚后的业务检查
Mysql用户管理的问题
Mysql数据库账户定义
- 用户名@可访问控制列表
- 可访问控制列表
- %: 代表可以从所有外部主机访问
- 192.168.1.%: 表示可以从192.168.1 网段访问
- localhost: DB服务器本地访问
- 可访问控制列表
- 使用
Create User
命令建立用户 (\h Create User
查看帮助)
Mysql常用的用户权限
Admin
- Create User : 建立新的用户的权限
- Grant option : 为其他用户授权的权限
- Super : 管理服务器的权限
DDL
- Create : 新建数据库,表的权限
- Alter : 修改表结构的权限
- Drop : 删除数据库和表的权限
- Index : 建立和删除索引的权限
DML
- Select : 查询表中数据的权限
- Insert : 向表中插入数据的权限
- Update : 更新表中数据的权限
- delete : 删除表中数据的权限
- Execute : 执行存储过程的权限
如何为用户授权
- 遵循最小权限原则
- 使用Grant命令对用户授权
- 授权:
grant Select,insert,update,delete on [数据库名].[表名(*全部表)] to user@ip;
- 收回:
revoke delete on [数据库名].[表名(*全部表)] from user@ip;
- 授权:
如何保证数据账户的安全
- 数据库用户管理流程规范
- 最小权限原则
- 密码强度策略
- 密码过期原则
- 限制历史密码重用原则
迁移数据库账户
- 导出用户建立及授权语句
pt-show-grants u=root,p=123456,h=localhost
用户管理问题
问题1: Access denied for user ‘root‘@’xxx.xxx.xxx.xxx’ (using password: YES)
问题原因:账户无法外网访问
1 | mysql -uroot -p |
Mysql服务器配置的问题
SQL_MODE
- 配置Mysql处理Sql的方式
- set [session/global/persist] sql_mode=’xxxxx’
- [mysqld] sql_mode=xxxx
- 查看当前sql_mode的设置:
show variables like 'sql_mode'
常用的sql Mode
SQL_MODE | 说明 |
---|---|
ONLY_FULL_GROUP_BY | 对于Group By聚合操作,如果出现在Select中的列,Having或者Order By子句的非聚合列,没有在Group By中出现,那么这个sql语法检查报错 |
ANSI_QUOTES | 禁止用双引号来引用字符串 |
REAL_AS_FLOAT | Real作为float的同义词 |
PIPES_AS_CONCAT | 将 ` |
STRICT_TRANS_TABLES / STRICT_ALL_TABLES | 在事务存储引擎 / 所有存储引擎上启用严格模式出现,那么这个sql语法检查报错 |
ERROR_FOR_DIVISION_BY_ZERO | 不允许0作为除数 |
NO_AUTO_CREATE_USER | 在用户不存在时不允许grant语句自动建立应用 |
NO_ZERO_IN_DATE / NO_ZERO_DATE | 日期数据内 / 日期数据不能含0 |
NO_ENGINE_SUBSTITUTION | 当指定的存储引擎不可用时报错 |
Mysql常见的性能参数
服务器配置参数
参数 | 说明 |
---|---|
max_connections | 设置Mysql允许访问的最大连接数量 |
interactive_timeout | 设置交互连接的timeout时间 |
wait_timeout | 设置非交互连接的timeout时间 |
max_allowed_packet | 控制mysql可以接收的数据包的大小 |
sync_binlog | 表示每写多少次缓冲会向磁盘同步一次binlog |
sort_buffer_size | 设置每个会话使用的排序缓冲区的大小 |
join_bugger_size | 设置每个会话使用的连接缓冲的大小 |
read_buffer_size | 指定了当对一个MYISAM进行表扫描时所分配的读缓存池的大小 |
read_rnd_buffer_size | 设置控制索引缓冲区的大小 |
binlog_cache_size | 设置每个会话用于缓存未提交的事务缓存大小 |
存储引擎参数
参数 | 说明 |
---|---|
innodb_flush_log_at_trx_commit | 0:每秒进行一次重做日志的磁盘刷新操作,1:每次事务提交都会刷新事务日志到磁盘中,2:每次事务提交写入系统缓存每秒向磁盘刷新一次 (默认为1) |
innodb_buffer_pool_size | 设置Innodb缓存池的大小,应为系统可用内存的75% |
innodb_buffer_pool_instances | InnoDB缓冲池的实例个数,每个实例的大小(建议不要超过8个) |
innodb_file_per_table | 设置每个表独立使用一个表空间(建议启动) |
Mysql日志类问题
Mysq常用的日志类型
日志名称 | 作用 |
---|---|
错误日志(error_log) | 记录mysql在启动,运行或停止时出现的问题 |
常规日志(general_log) | 记录所有发向mysql的请求 |
慢查日志(slow_query_log) | 记录符合条件的查询 |
二进制日志(binary_log) | 记录全部有效的数据修改日志 |
中继日志(relay_log) | 用于主从复制,临时存储从主库同步的二进制日志 |
错误日志(error_log)
作用
- 分析排除Mysql运行错误
- 记录未经授权的访问
配置参数
配置和查询参数的方法
1
2
3
4
5
6
7
8
9# 配置
set persist [参数名称]=[内容];
# 例
set persist log_timestamps='SYSTEM';
# 查看
select @@[参数];
#例
select @@log_timestamps配置日志文件的位置:log_error
1
2
3
4
5# 例:
log_error = $mysql/sql_log/mysql-error.log\
# 查看日志文件位置
select @@log_error;配置日志记录信息的级别
1
2
3
4
5# 配置日志级别
log_error_verbosity= [1,2,3]
# 查看日志级别
select @@log_error_verbosity;verbosity 作用 1 Error messages 2 Eeeor and warning messages 3 Error,warning and note messages 配置日志时间使用系统时间
1
2
3log_timestamps='SYSTEM'
# 查看日志时间
select @@log_timestamps;Msql日志服务组件配置(Mysql8.0以上)
1
2
3
4log_error_services=[日志服务组件;日志服务组件]
# 查看日志服务组件
select @@log_error_services;组件名称 作用 log_filter_internal 默认的日志过滤组件,依赖log_error_verbosity log_sink_internal 默认的日志输出组件,依赖log_error log_sink_json 将错误日志输出到json文件 log_sink_syseventlog 将错误日志输出到系统日志文件
常规日志(general_log)
作用
- 分析客户端发送到Msql的实际请求
配置参数
- 配置和查询参数的方法
1
2
3
4
5
6
7
8
9# 配置
set global [参数名称]=[内容];
# 例
set global general_log='ON';
# 查看
select @@[参数];
#例
select @@log_timestamps - 日志开启和关闭(默认关闭)
1
general_log=[ON|OFF]
- 指定日志文件地址
1
general_log_file= $mysql/sql_log/general.log
- 日志存储的方式
1
2# FILE:存储到文件,TABLE:存储到数据库表中(mysql库的general_log表中)
log_output=[FILE|TABLE|NONE]慢查日志(slow_query_log)
作用
- 将执行成功并符合条件的查询记录到日志中
- 找的需要优化的sql
配置参数
配置和查询参数的方法
1
2
3
4
5
6
7
8
9# 配置
set global [参数名称]=[内容];
# 例
set global slow_query_log='ON';
# 查看
select @@[参数];
#例
select @@slow_query_log日志开启和关闭(默认关闭)
1
slow_query_log=[ON|OFF]
日志存储位置
1
slow_query_log_file=$mysql/sql_log/showlog.log
查询超时时间
1
2# 单位(秒)
long_query_time=0.001是否将没使用索引的sql记录下来(默认关闭)
1
log_queries_not_using_indexes=[ON|OFF]
是否记录管理数据库管理命令(默认关闭)
1
log_slow_admin_statements=[ON|OFF]
二进制日志(binary_log)
作用
记录所有对数据库中数据的修改
基于时间点的备份和恢复
主从复制
配置参数
- 开启设置日志
1
log-bin = [base_name]
- 日志格式(默认ROW)
1
binlog_format=[ROW|STATEMENT|MIXED]
- 日志格式记录的方式(默认FULL)
1
binlog_row_image=[FULL|MINIMAL|NOBLOB]
- 日志加入实际提交的sql(默认OFF)
1
binlog_rows_query_log_events=[ON|OFF]
- 日志清理
1
2
3
4
5
6
7
8# 定时清理,单位(天)
exprie_logs_days= days
# 指定清理(从000到009删除)
PURGE BINARY LOGS TO 'mysql-bin.010'
# 将指定时间之前的删除
PURGE BINARY LOGS BEFORE '2018-O9-02 13:22:21'查看配置信息命令
sql语句 | 作用 |
---|---|
show variables like 'log_bin'; |
查询binlog日志是否开启 |
show variables like 'binlog_format'; |
查看日志格式 |
show master logs; |
查看所有 Binlog 的日志列表 |
show master status; |
查看最后一个 Binlog 日志的编号名称,及最后一个事件结束的位置(pos) |
flush logs; |
刷新 Binlog,此刻开始产生一个新编号的 Binlog 日志文件 |
reset master; |
清空所有的 Binlog 日志 |
show binlog events; |
查看第一个 Binlog 日志 |
show binlog events in ‘binlog.000030’; |
查看指定的 Binlog日志 |
show binlog events in ‘binlog.000030’ from 931; |
从指定的位置开始,查看指定的 Binlog 日志 |
show binlog events in ‘binlog.000030’ from 931 limit 2; |
从指定的位置开始,查看指定的Binlog日志,限制查询的条数 |
show binlog events in ‘binlog.000030’ from 931 limit 1, 2; |
从指定的位置开始,带有偏移,查看指定的 Binlog 日志,限制查询的条数 |
binlog日志格式
Event Type | 事件 | 重要程度 |
---|---|---|
QUERY_EVENT | 与数据无关的操作, begin、drop table、truncate table 等 | 了解即可 |
XID_EVENT | 标记事务提交 | 了解即可 |
TABLE_MAP_EVENT | 记录下一个操作所对应的表信息,存储了数据库名和表名 | 非常重要 |
WRITE_ROWS_EVENT | 插入数据,即 insert 操作 | 非常重要 |
UPDATE_ROWS_EVENT | 更新数据,即 update 操作 | 非常重要 |
DELETE_ROWS_EVENT | 删除数据,即 delete 操作 | 非常重要 |
Mysql存储引擎的问题
Mysql常用的存储引擎
引擎名称 | 事务 | 说明 |
---|---|---|
MYISAM | N | Mysql5.6之前的默认引擎,最常用的非事务型存储引擎 |
CSV | N | 以CSV格式存储的非事务型存储引擎 |
Archive | N | 只允许查询和新增数据而不允许修改的非事务型存储引擎 |
Memory | N | 是一种易失性非事务型存储引擎 |
InnoDB | Y | 最常用的事务型存储引擎 |
NDB | Y | Mysql集群所使用的内存型事务存储引擎 |
InnoDB
- 事务型存储引擎支持ACID
- 数据按主键聚集存储
- 支持行级锁及MVCC
- 支持Btree和自适应Hash索引
- 支持全文和空间索引
问题
- Innodb不支持在线修改表结构的场景
操作 语法 加全文索引 CREATE FULLTEXT INDEX name ON table(column); 加空间索引 ALTER TABLE geom ADD SPATIAL INDEX(g) 删除主键 ALTER TABKE tbl_name DROP PRIMARY KEY 增加自增列 ALTER TABLE t add column id int auto_increment not null primary key 修改列类型 ALTER TABLE tbl_name CHANGE c1 c1 NEW_TYPE 改表字符集 ALTER TABLE tbl_name CHARACTER SET = charset_name
事务和并发控制
并发所带来的问题
脏读
一个事务读取了另一个事务未提交的数据
不可重复读
一个事务前后两次读取的同一数据不一致
幻读
指一个事务两次查询的结果集记录数不一致
事务的隔离性
Innodb的隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 | 隔离性 | 并发性 |
---|---|---|---|---|---|
顺序读(SERIALIZABLE ) |
N | N | N | 最高 | 最低 |
可重复读(REPEATABLE READ ) 默认 |
N | N | N | ||
读以提交(READ COMMITTED ) |
N | Y | Y | ||
读未提交(READ UNCONNITTRED ) |
Y | Y | Y | 最低 | 最高 |
设置事务隔离级别
1 | # 语法 |
-
PERSIST
:对所有新的连接生效,而且重启不会失效 GLOBAL
:对所有新的连接生效,重启会失效SESSION
(开发人员使用):只对当前连接生效
innodb中的锁
- 查询需要对资源加共享锁(S)
- 数据修改需要对资源加排它锁(x)
排它锁 | 共享锁 | |
---|---|---|
排它锁 | 不兼容 | 不兼容 |
共享锁 | 不兼容 | 兼容 |
Mysql备份和恢复类的问题
常用的备份工具
名称 | 特点 |
---|---|
mysqldump | 最常用的逻辑备份工具,支持全量备份及条件备份 |
mysqlpump | 多线程逻辑备份工具,mysqldump的增强版本 |
xtrabackup | InnoDB在线物理备份工具,支持多线程和增量备份 |
mysqldump
- 优点
- 备份结构为可读的sql文件,可用于跨平台跨版本恢复数据
- 备份文件的尺寸小于物理备份,便于长时间存储
- Mysql发行版自带工具,无需安装第三方软件
- 缺点
- 只能单线程执行备份恢复任务,备份恢复速度较慢
- 为完成一致性备份需要对备份表加锁,容易造成阻塞
- 会对InnoDB Buffer Pool造成污染
mysqlpump
- 优点
- 语法同mysqldump高度兼容,学习成本低
- 支持基于库和表的并行备份,可以提高逻辑备份的性能
- 支持使用ZLIB和LZ4算法对备份进行压缩
- 缺点
- 基于表进行并行备份,对于大表来说性能较差
- 5.7.11之前版本不支持一致性并行备份
- 会对InnoDB Buffer Pool造成污染
xtrabackup
- 优点
- 支持InnoDB存储引擎的在线热备份,对innodb缓冲没有影响
- 支持并行对数据库的全备和增量备份.
- 备份和恢复效率比逻辑备份高
- 缺点
- 做单表恢复时比较复杂
- 完整的数据文件拷贝,故备份文件比逻辑备份大
- 对跨平台和数据库版本的备份恢复支持度不如逻辑备份
Mysql优化和异常处理
数据库服务器负载过大的原因
- 服务器磁盘IO超负荷
- 存在大量阻塞线程
- 存在大量并发慢查询
- 存在其他占用CPU的服务
- 服务器硬件资源原因
排查方法
慢查询造成的磁盘IO爆表的原因
- Mysql输出大量日志
- Mysql正在进行大批量写
- 慢查询产生了大量的磁盘临时表
慢查询产生了大量的磁盘临时表排查
1 | grep /tmp mysql_2018_0908_15.txt |
慢查询产生了大量的磁盘临时表解决方式
- 优化慢查询,减少使用磁盘临时表
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Chc-个人数据程序主页!