mysql日志恢复数据_mysql利用binlog日志恢复数据操作记录

1,binlog日志:mysql的二进制日志,它记录了所有的DDL 和DML 语句,以事件形式记录,还包括了语句所执行的时间,mysql的二进制日志是事务安全性的。

DDL--Data Definition Language 数据库定义语言

主要命令有CREATE、ALTER、DROP等,主要是用在定义或者改变表的结构,数据类型,

表之间的链接和约束等初始化工作上

DML--Data Manipulation Language 数据库操纵语言

主要命令有SELECT,UPDATE, INSERT,DELETE,用来对数据库里的数据进行操作

mysqlbinlog常见的选项有以下几个:

--start-datetime:从二进制日志读取指定等于时间戳或者晚于本地计算机的时间

--stop-datetime:从二进制日志读取指定小于时间戳或者等于本地计算机的时间

--start-position:从二进制日志中读取指定position事件位置作为开始

--stop-position:从二进制日志中读取指定position时间位置作为事件截止位置

一般来说开启binlog日志会有大概1%的性能损耗

binlog日志有两个重要使用场景

1,mysql主从复制:

Mysql Replication在Maste端开启binlog, Master把它的二进制日志传递给Slaves来达到

master-slaves数据一致的目的

2,数据恢复,使用mysqlbinlog工具来使数据恢复

binlog日志包括两类文件:

a,二进制日志索引文件,用于记录所有的二进制文件(后缀名为.index)

b,二进制日志文件,记录数据库所有的DDL和DML(除select)语句事件(后缀为.0000*)

开启binlog日志

1)打开编辑 mysql配置文件 /etc/my.cnf

[root@iZ2zeim71fvtr79a4hpx1lZ ~]# vim /etc/my.cnf

在mysqld区块添加

log-bin=mysql-bin

2)重启mysql服务使之生效

[root@iZ2zeim71fvtr79a4hpx1lZ ~]# /etc/init.d/mysqld stop

[root@iZ2zeim71fvtr79a4hpx1lZ ~]# /etc/init.d/mysqld restart

Stopping mysqld: [ OK ]

Starting mysqld: [ OK ]

3)查看binlog日志是否开启

mysql> show variables like 'log_%';

+----------------------------------------+---------------------------------------+

| Variable_name | Value |

+----------------------------------------+---------------------------------------+

| log_bin | ON |

| log_bin_basename | /mnt/data/mysql-bin |

| log_bin_index | /mnt/data/mysql-bin.index |

| log_bin_trust_function_creators | OFF |

| log_bin_use_v1_row_events | OFF |

| log_error | /mnt/data/iZ2zeim71fvtr79a4hpx1lZ.err |

| log_output | FILE |

| log_queries_not_using_indexes | OFF |

| log_slave_updates | OFF |

| log_slow_admin_statements | OFF |

| log_slow_slave_statements | OFF |

| log_throttle_queries_not_using_indexes | 0 |

| log_warnings | 1 |

+----------------------------------------+---------------------------------------+

13 rows in set (0.00 sec)

常用binlog日志操作命令

1)查看所有binlog日志

mysql> show master logs;

+------------------+-----------+

| Log_name | File_size |

+------------------+-----------+

| mysql-bin.000001 | 128921 |

| mysql-bin.000002 | 14661 |

| mysql-bin.000003 | 143 |

| mysql-bin.000004 | 66209 |

| mysql-bin.000005 | 52771 |

| mysql-bin.000006 | 143 |

| mysql-bin.000007 | 5670 |

| mysql-bin.000008 | 53782912 |

+------------------+-----------+

8 rows in set (0.00 sec)

2)查看master状态,即最后(最新)一个binlog日志的编号名称及其最后一个操作时间pos结束点值

mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000008 | 53784272 | | | |

+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.00 sec)

3)刷新log日志,自此刻起开始产生一个新编号的binlog日志

mysql> flush logs;

Query OK, 0 rows affected (0.09 sec)

注意:当mysql服务器重启时,会自动执行此命令,刷新binlog日志

在mysqldump备份时加 -F 选项也会刷新binlog日志

4)重置清空所有日志

mysql> reset master;

Query OK, 0 rows affected (0.12 sec)

mysql> show master logs;

+------------------+-----------+

| Log_name | File_size |

+------------------+-----------+

| mysql-bin.000001 | 106 |

+------------------+-----------+

1 row in set (0.00 sec)

查看binlog日志内容,常用有两种方法:

1)使用mysqlbinlog自带命令查看

注意:a)binlog日志是二进制文件,普通的文件查看命令cat、vim、more等都无法打开,

必须使用自带的mysqlbinlog命令查看

b)binlog日志文件与数据库文件在同目录

c)mysql5.5以下版本使用mysqlbinlog出错时添加 --no-defaults 选项

查看mysql数据日志存放目录 --data-dir

[root@iZ2zeim71fvtr79a4hpx1lZ ~]# ps -ef | grep mysql

root 1513 1 0 Aug22 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/mnt/data --pid-file=/mnt/data/iZ2zeim71fvtr79a4hpx1lZ.pid

mysql 1684 1513 0 Aug22 ? 00:25:49 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/mnt/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/mnt/data/iZ2zeim71fvtr79a4hpx1lZ.err --pid-file=/mnt/data/iZ2zeim71fvtr79a4hpx1lZ.pid

root 10671 9436 0 10:42 pts/0 00:00:00 grep mysql

使用mysqlbinlog查看日志文件内容

[root@iZ2zeim71fvtr79a4hpx1lZ ~]# mysqlbinlog mysql-bin.000002

# at 67353

#170816 17:13:10 server id 1 end_log_pos 67436 CRC32 0xbe1d0ec9

Querythread_id=3631exec_time=0error_code=0

SET TIMESTAMP=1502874790/*!*/;

BEGIN

/*!*/;

# at 67436

#170816 17:13:10 server id 1 end_log_pos 67579 CRC32 0x6a4a8e76

Querythread_id=3631exec_time=0error_code=0

SET TIMESTAMP=1502874790/*!*/;

UPDATE `users_ext` SET `longitude`='116.417526' WHERE (`uid`='4')

/*!*/;

# at 67579

#170816 17:13:10 server id 1 end_log_pos 67610 CRC32 0x6299412b

Xid = 15199

COMMIT/*!*/;

解释:

server id 1 : 数据库主机的服务号;

end_log_pos 796: sql结束时的pos节点

thread_id=11: 线程号

2)上面这种方式读取的binlog日志内容比较多,不容易分辨查看pos点信息

mysql> show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];

参数解释:

IN 'log_name' :指定要查询的binlog文件名(不指定就是第一个binlog文件)

FROM pos :指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)

LIMIT [offset,] :偏移量(不指定就是0)

row_count :查询总条数(不指定就是所有行)

mysql> show binlog events in 'mysql-bin.000009'\G;

*************************** 186. row ***************************

Log_name: mysql-bin.000009

Pos: 19401

Event_type: Query

Server_id: 1

End_log_pos: 19711

Info: use `line_test`; INSERT INTO `services_data`

(`source_id` , `comment_count` , `avg_star` , `hot`)

SELECT '65','1','5.0000','1' UNION ALL SELECT '66','3','5.0000','3' UNION ALL

SELECT '71','2','5.0000','2' UNION ALL SELECT '72','1','5.0000','1'

*************************** 187. row ***************************

Log_name: mysql-bin.000009

Pos: 19711

Event_type: Xid

Server_id: 1

End_log_pos: 19742

Info: COMMIT /* xid=2257658 */

187 rows in set (0.00 sec)

ERROR:

No query specified

面这条语句可以将指定的binlog日志文件,分成有效事件行的方式返回,

并可使用limit指定pos点的起始偏移,查询条数!

重点来啦!!!利用binlog日志回复数据

下面进行场景模拟:

line_test 会在每天凌晨4点进行一次完全备份的定时计划任务

[root@iZ2zeim71fvtr79a4hpx1lZ ~]# crontab -l

0 4 * * * /usr/bin/mysqldump -uroot -p -B -F -R -x --master-data=2 line_test |gzip

\n >/mnt/backup/line_test_$(date +%F).sql.gz

手动执行以下

[root@iZ2zeim71fvtr79a4hpx1lZ mnt]# /usr/local/mysql/bin/mysqldump -uroot -p -B -F

\n -R -x --master-data=2 line_test |gzip >/mnt/backup/line_test_$(date +%F).sql.gz

Enter password:

[root@iZ2zeim71fvtr79a4hpx1lZ mnt]# ls /mnt/backup/

line_test_2017-11-08.sql.gz

参数说明:

-B:指定数据库

-F:刷新日志

-R:备份存储过程等

-x:锁表

--master-data:在备份语句里添加CHANGE MASTER语句以及binlog文件及位置点信息

出问题时,先备份最后一个binlog

[root@iZ2zeim71fvtr79a4hpx1lZ mnt]# cp -v /mnt/data/mysql-bin.000010 /mnt/backup/

`/mnt/data/mysql-bin.000010' -> `/mnt/backup/mysql-bin.000010'

刷新日志信息生成新的日志

mysql> flush logs;

Query OK, 0 rows affected (0.01 sec)

查看新日志信息

mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000011 | 120 | | | |

+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.00 sec)

恢复已备份好的数据:

解压缩备份文件

[root@iZ2zeim71fvtr79a4hpx1lZ backup]# ls

line_test_2017-11-08.sql.gz mysql-bin.000010

You have mail in /var/spool/mail/root

[root@iZ2zeim71fvtr79a4hpx1lZ backup]# gzip -d line_test_2017-11-08.sql.gz

[root@iZ2zeim71fvtr79a4hpx1lZ backup]# ls

line_test_2017-11-08.sql mysql-bin.000010

恢复备份好的数据

[root@iZ2zeim71fvtr79a4hpx1lZ ~]# mysql -uroot -p -v < line_test_2017-11-08.sql

读取binlog信息,分析日志回复出现问题的数据

1)使用mysqlbinlog读取binlog日志:

[root@iZ2zeim71fvtr79a4hpx1lZ mnt]# mysqlbinlog --no-defaults backup/mysql-bin.000010

2)登录服务器并查看(推荐)

mysql> show binlog events in 'mysql-bin.000010';

mysql> show binlog events in 'mysql-bin.000010'\G;

查看日志发现

[root@iZ2zeim71fvtr79a4hpx1lZ backup]# /usr/local/mysql/bin/mysqlbinlog

\n --no-defaults --stop-position=6628 --database=line_test

\n /mnt/data/mysql-bin.000013 | /usr/local/mysql/bin/mysql -u root -p -v line_test

按照时间回复数据

[root@iZ2zeim71fvtr79a4hpx1lZ ~]# /usr/local/mysql/bin/mysqlbinlog

\n --no-defaults --start-datetime='2017-11-08 21:58:56'

\n --stop-datetime='2017-11-08 23:58:56' --database=line_test

\n /mnt/data/mysql-bin.000013 | /usr/local/mysql/bin/mysql -u root -p -v line_test

Xtrabackup :一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写)

一个菜鸟的操作日志记录,仅供参考,欢迎指正!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值