日志的分类 | |||
error log | 错误日志 | 排错 | /var/log/mysqld.log【默认开启】,编译安装的默认在数据目录下以主机名开头以.err结尾 |
bin log | 二进制日志 | 备份 | 增量备份 DDL DML DCL 对于mysql讲非常重要,它可以做数据的备份和恢复 |
Relay log | 中继日志 | 复制 | 接收 replication master AB复制会用的 |
slow log | 慢查询日志 | 调优 | 查询时间超过指定值 给开发用的,监控查询速度比较慢的sql语句 |
Error Log
默认的日志在var/log下rpm的改位置用log-error改,在配置文件改
log-error=/var/log/mysqld.log
【注意】日志存储的目录必须修改所有者和所属组为mysql
vim /etc/my.cnf
cd /var/lib/mysql
Binary Log(用于备份恢复数据)
1.开启binlog日志
2.读取binlog日志
3.利用binlog日志恢复数据
一、开启binlog日志
开启binlog日志就开始做备份了
产生binlog日志:也是改配置文件,
vim /etc/my.cnf
log-bin=/var/log/mysql/binlog 指定bin/log的位置,写一个路径,放在/var/lib/mysql/里面,指定一个名字叫binlog。不用主动的结尾。还得写一个server id,从1开始写,只要多个服务器不一样就行,server-id=1 //mysql 5.7必须要写,5.5不用
保存,cd /var/log/mysql ls 观察一下/var/lib/mysql/ 看看这些文件有没有叫log-bin开头的文件
systemctl restart mysqld 重启服务
ls 多了一个binlog.000001文件,这个文件是刚才配置了二进制的配置,起了名叫binlog,但它给创建出来的是带了结尾的,以后在修改主配置文件的时候,不用主动的结尾。
binlog日志是不能拿vim看的,想看它的内容就用mysqlbinlog +文件名字 ,里面的/*!开头的全部都是注释(不管什么样的编程语言,只要不是正常的,基本上除了注释也就没有其他的东西) 结尾是*/。
at 后面的数字叫位置点,可以把每一条命令,都给分开,每一条命令都有一个位置点
at下面的时间叫做时间点,同一时间可能会有多条操作
一般每个位置点和时间点都是挨着的,有一个位置点,必然有一个时间点。因为在每一个时间点的下面都会有一个操作,都会有个sql语句。
进入mysql
看日志mysqlbinlog binlog.000001,
5.7加密了要去掉加密,不然不显示sql语句
去除binlog加密:
5.5不用(凡是平时操作不了的,肯定是版本问题)
vim /etc/my.cnf (在这个配置文件里,把下面两行加进去)
transaction_isolation=repeatable-read
binlog_format=mixed
【注意】如果在binlog日志看不见,写的内容就是加密了,需要去除加密。
去除binlog加密之后,再去看binlog日志,需要重新生成一下,原来的binlog日志是不能直接解密了,只有新的binlog日志才会解密。把它删了,重新启动,让它重新产生binlog日志。和第一次产生一样的,没什么有用的东西。
【注意】重启mysqld 会截断旧日志产生新的日志。
直接进入mysql
再去看binlog日志 mysqlbinlog binlog.000001,
开启binlog日志之后,mysql会记录每一条写操作。查询操作不会记录。
可以利用它记录下的信息,重新把数据找回来,怎么找回来?重新在执行一遍sql语句,记录的什么东西就给你重新执行一遍。
binlog日志可以备份数据,恢复数据,怎么做的备份?
就是把每一个写操作记录到binlog日志里面,这就是它的备份,
怎么恢复?
就是根据binlog日志里记录的操作,重新再把这些语句给你执行一遍,你的数据就恢复回来了。这是它恢复数据的原理。
为什么有位置点,时间点?
因为恢复数据,不一定要把所有的数据,全部都给恢复,有可能只需要恢复一部分数据。比如说只想恢复id=2这条数据,那就找位置点,把位置点下面的数据恢复一下就行了。其他的不恢复。
二、读取binlog日志
可以同时读取多个日志文件 就用空格把那些日志文件隔开就行
# mysqlbinlog mysql.000002 开启binlog日志就开始做备份了
按datetime读取:
# mysqlbinlog mysql.000002 --stop-datetime="2018-12-05 11:02:54" 从顶头开始,到这里结束
# mysqlbinlog mysql.000002 --start-datetime="2018-12-05 10:02:56" --stop-datetime="2018-12-05 11:02:54" 开始的时间,结束的时间
按position读取:
# mysqlbinlog mysql.000002 --start-position=260 --stop-position=930 开始的位置,结束的位置
mysqlbinlog --help 如果记不起来,去帮助找
注意:
1. 重启mysqld 会截断旧日志产生新的日志
2. 刷新日志会截断旧日志产生新的日志
mysql> flush logs
3. 删除所有binlog(禁用)
到了公司别这么干,因为binlog复制用来做备份,做ab复制,全删了不行
mysql> reset master
4. 删除部分日志(但是没用,别去操作)
mysql> PURGE BINARY LOGS TO 'mysql-bin.010';
mysql> PURGE BINARY LOGS BEFORE '2016-04-02 22:46:26';
5. 暂停binlog日志功能(仅对当前会话生效,不用去操作)
mysql> SET SQL_LOG_BIN=0;
mysql> SET SQL_LOG_BIN=1;
三、利用binlog日志恢复数据
根据binlog恢复数据,把查看的结果通过管道符交给root客户端就完毕
根据时间点恢复数据
同一时间内可能会有多条操作
# mysqlbinlog --start-datetime='2014-11-25 11:56:54' --stop-datetime='2014-11-25 11:57:41' k-bin.000001 | mysql -u root -p’Helloworld123’
时间点不如位置点精确,需要自己指定结束的时间,而且需要提前一秒,在同一秒内发生的多个操作,要么一起操作,要么不操作,不能把它隔开,最小单位是一秒,如果想把它隔开就用位置点。
根据位置点恢复数据
# mysqlbinlog --start-position=106 --stop-position=527 binlog.000001 | mysql -u root -p’Helloworld123!’
例如:插入数据8,把8删了,恢复8
看日志,恢复8,找插入数据那里恢复,不是恢复delete,精确的去找这一行,
可以选择按时间恢复,也可以选择按照位置点恢复,位置点是非常精确的,介意第一选择是位置点
恢复。位置点就是从at2042开始到下一个位置点之前结束。
在这里我没有用户名密码,所以没写-u root -p密码,如果有用户名密码加上就行。
去观察数据,发现恢复回来了
它可以恢复一条数据,也可以恢复一堆数据,看你的怎么指定位置点和时间点。
刷新bin-log日志:
#mysqladmin flush-logs //方式1
# mysql -u root -p123 -e "flush logs" //方式2