binary log 日志
查询二进制日志位置
show varsables like "%log_bin%"
刷新重新生成一个binary_log
flush logs;
查看已有的二进制日志文件
show binary logs;
可以查看目前正在使用的哪个二进制日志
show master status;
查看二进制日志模式
select @@binlog_format
MIXED 混合模式 MBR
ROW 行模式 RBR 5.7版默认 推荐用
statment 原语句模式 SBR 5.6版默认
输出事务信息
SHOW BINLOG EVENTS IN 'mysql-bin.000009';
..可以查看事务的开始at位置号,结束at位置号
查看二进制日志内容
mysqlbinlog mysql-bin.000009;
mysqlbinlog --base64-output=decode-rows -vvv mysql-binlog.000009;
找到建表起始点和删除之前为结束点的at号进行恢复(-d 库名)
mysqlbinlog -d 库名 --skip-gtids --start-position=219 --stop-position=335 mysql-binlog.000009 >/tmp/xx.sql
..起始点at219,结束点at335
恢复前临时关闭当前会话二进制日志
set sql_log_bin=0;
source /tmp/xx.sql;
set sql_log_bin=1;
gtid记录模式的管理
组成
server_uuid:tid
保存在./data/auto.cnf
GTID幂等性
如果拿有GTID的日志去恢复时,检查当前系统中是否有相同的GTID号,如果有相同的就是自动跳过
会影响到binlog恢复和主从复制
GTID开启和配置
gtid-mode=on
enforce-gtid-consistency=true
GTID恢复
mysqlbinlog --skip-gtids --include-gtids='3ca79ab5-3e4d-11e9-a709-000c293b577e:7-12' mysql-bin.000004> /tmp/bin.sql
7-12表示从7到12的gtid子号
--skip-gtids 表示导出时忽略原有的gtid信息,恢复时生产最新的gtid信息,不忽略就会跳过导入,最终失败。
set sql_log_bin=0
source /tmp/bin.sql
set sql_log_bin=1
mysqlbinlog 其他参数--exclude-gtids排除(用于排除删除操作例如drop table),多段日志编号用逗号分开
slowlog 慢日志
开关:
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/slow.log
过滤出 按照语句被执行次数排序,top10
mysqldump备份
备份恢复思路
先找个临时库,采用之前时间点的全备份恢复
然后使用binlog 恢复 全备份点之后新增的数据
注意难点:全备份中--master-data可以看到备份截止at点,或者是gtid点(show binlog event in 'mysql-bin.00000*')
最后用测试库顶替,或者是导出需要的部分表,再导入到生产
mysqldump命令备份
mysqldump -uroot -p123 -A -R --triggers --master-data=2 --single-transaction|gzip > /backup/full_$(date +%F).sql.gz
mysqldump -uroot -p123 -A -R --triggers --master-data=2 --single-transaction|gzip > /backup/full_$(date +%F-%T).sql.gz
-R存储过程 || --triggers 触发器
--master-data=2
*(1)记录备份时刻的binlog信息
*(2)自动锁表,不加--single-transaction,就是温备份
*加了--single-transaction ,对与innodb表不锁表,一致性快照备份,(快照备份)
扩展参数
--set-gtid-purged=auto/on 保存gtid信息
--set-gtid-purged=off 里面不保存gtid,单机数据库使用没有问题,但是主从环境下必须开启on
--max_allowed_packet=128M 传输数据包较大时使用
从mysqldump 全备中获取库和表的备份
1、获得表结构
*sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE zabbix
/!d;q' full.sql>createtable.sql
2、获得insert into 语句,用于数据的恢复
*grep -i 'INSERT INTO zabbix
' full.sql>data.sql &
3、获取单库的备份
*sed -n '/^-- Current Database: world
/,/^-- Current Database: `/p' all.sql>world.sql