一、日志管理
1.错误日志
错误日志存放路径:默认路径存放在数据路径下的以主机名开头的.err结尾的文件
使用select @@log_error可以查看错误日志存放路径
配置文件中:log_error=/xx/xx 可以指定错误日志存放目录
2.binlog日志
又称二进制日志,作用是提供数据恢复,主从复制。
使用select @@log_bin可以查看binlog是否开启
配置文件中:log_bin=/xxx/xx 可以指定binlog日志的的路径
- binlog记录了数据库中所有的变更类操作比如DDL,DCL,DML
对于DDL和DCL语句,记录发生过的语句。
对于DML记录insert,updata,delete
所有的前提是已提交的事务 - 记录格式
ROW:RBR行记录格式,记录行的变化(默认)
STATEMENT : SBR 语句记录模式,记录操作语句
若是按时间恢复,语句中如果有关于时间的函数,可能会出现数据错误
MIXED :MBR混合记录模式 - 详解
RBR:逐行记录日志,日志量很大,可读性差,但足够严谨,不会出现记录错误(默认)
SBR:只记录语句本身,日质量很少,可读性好。对于函数类操作,将来恢复可能造成错误。
3.查看二进制日志内容
查看路径:select @@log_bin_basename;
查看是否开启:select @@log_bin;
查看正在使用的binlog日志 : show binary logs;
确认当前正在使用的binlog:show master status;
查看部分binlog内容:show binlog events in '当前再使用的binlog'
每一行都是一个事件
log_name :事件名
pos:事件开始的position
event_type:事件类型
server_id:发生在哪台机器的事件
end_log_pos 事件结束
命令行;mysqlbinlog 可查看二进制内容
mysqlbinlog mysql-bin.000002 |grep -v "SET" >/tmp/aa.txt
mysqlbinlog --base64-output=decode-rows -vvv mysql-bin.000003
4.按需截取日志
- 基于position号截取
--start-position=起始号
--stop-position=结束号
截取的核心时找到起始点和终点
mysqlbinlog --start-position=xxx --stop-position=xxx /日志 >/tmp/xxx.sql
因为开启了binlog日志,在我们回复日志时,会产生新的binlog日志占用空间。可临时关闭binlog日志。
ser sql_log_bin=0 只在当前窗口有效。 - 基于时间点截取
--start-datetime=起始时间点
--stop-datetime=结束时间点
5.开启GTID日志管理
GTID:全局事务号
在mysql 5.6新加的特性。5.7中做了加强
5.6中默认关闭,5.7默认开启
对于一个已经提交的事务,会生成一个全局唯一的事务编号。
对于DDL,DCL 一条语句(事件)就是一个事务,占用一个GTID号,DML一个完整的事务。(begin--commit)占用一个GTID号
- 开启GTID
gtid-mode=no
enforce-gtid-consistency=true
以上写入/etc/my.cnf 可实现永久开启GTID
auto.cnf中记录了GTID的前半部分
mysqlbinlog --skip-gtids --include-gtids='a54819fc-8deb-11e9-938f-000c294cbee7:1-7' /data/binlog/mysql-bin.000004 >/tmp/gg.sql
可以使用--exclude-gtids='xxxxx'排除不需要的事务,排除不相连的需要用,隔开,截取
跳过某些gtid不截取
mysqlbinlog --skip-gtids --include-gtids='ee956c61-9653-11e9-8518-000c29099eb6:1-5' --exclude-gtids='ee956c61-9653-11e9-8518-000c29099eb6:2,ee956c61-9653-11e9-8518-000c29099eb6:4' /data/binlog/mysql-bin.000003 >/tmp/gtids.sql
因为gtid有幂等性
需要加入--skip-gtids 跳过已有gtid
自动清理
select @@expire_log_days; 查看自动清理参数
设置依据为一个全备周期+1企业建议至少2个全备周期
写入配置文件 expire_logs_days=8 每8天一清
不要手动rm 文件
日志滚动
1.每次重启数据库会刷出新的binlog日志
2.flush logs
3.mysqladmin -uroot -p flush-logs 命令行滚动日志
4.show variables like '%max_binlog_size%' 查看日志默认大小
慢日志捕捉
slowlog日志
记录慢SQL语句日志,定位低效SQL语句
开启慢日志:
vim /etc/my.cnf
slow_query_log=1
slow_query_log_file=/data/mysql/slow.log
long_query_time=0.1
log_queries_not_using_indexes
有限针对影响范围大的语句
mysqldumpslow -s c -t 10 /data/mysql/data/slow.log
指定排序方式 c 执行次数 -t top
搜集执行计划 然后优化
mysqldumpslow -s c -t 10 /data/mysql/data/slow.log
mysqldump
本地备份连接方式
-S 指定sock文件
远程备份连接方式
mysqldump -uroot -p密码 -hIP -P端口
基本备份参数:
-A 全库备份
-B 备份单独的库
库名 表名 :备份某个库下的1张或多张表
例子: 备份world数据库下的city和country表
mysqldump -uroot -p密码 库 表1 表2 >xxx.sql
此方法只会备份建表+插入语句 因此 恢复前需要把库建好且use进库
以上无法上生产
必加参数(1):
-R 在备份是,同时备份存储的过程和函数,如果没有会自动忽略
-E 备份时 同时备份event 如果没有会忽略
--triggers 备份时 同时备份触发器 如果没有好会忽略
必加参数(2):
--master-data=2
记录备份开始时position号可以作为将来做日志截取的起点
自动锁表
配合--single-transaction 减少锁的(innodb引擎)
--single-transaction
对于innodb的表 实现快照备份不需要锁表
--set-gtid-purged=
使用场景:
--set-gtid-purged=off 可以使用在日常备份参数中
mysqldump -uroot -p -A -R -E --triggers --master-data=2 --single-transaction --set-gtid-purged=off >/data/backup/full.sql
auto,on:在构建主从环境时
mysqldump -uroot -p -A -R -E --triggers --master=data=2 --single-transaction --set-gtid-purged=no >/data/backup/full.sql
主从复制时需要注意不可使用off否则导致数据断层
--max-allowed-packet=
如果备份大表报错 可设置数据包大小
恢复备份与迁移
1、设计备份策略
2、日常备份检查
备份存在性
备份空间是否够用
3、定期恢复演练(测试库)
4、故障恢复:通过现有备份,能够将数据恢复到故障发生的时间点
5.迁移
mysqldump优缺点
优点:
1.不需要下载安装
2.备份出来的是sql,文本格式,可读性高,便于备份
3.压缩比较高,节省备份的磁盘空间
缺点:
依赖于数据库引擎,需要从磁盘读取数据
然后转换成sql进行转储,比较耗资源,数据量大的情况下
效率较低
建议:
100G以内使用mysqldump
超过TB 使用mysqldump配合分布式系统
xtrabackup (XBK)
优点:
1.类似于直接cp数据文件,不需要逻辑结构,相对来说性能高
缺点:
压缩比低
备份策略
备份方式:
全备:全库备份,备份所有数据
增量:备份变化数据
逻辑备份=mysqldump+mysqlbinlog
物理备份=xtrabackup_full+binlog
周期:根据数据量设计备份周期
其他:通过主从复制备份实时同步