【MySQL】如何快速执行 binlog

【背景】
维护mysql的时候,总会遇到数据库恢复的例子。如果把备份集恢复出来相对比较简单。然而如果遇到恢复到时间点的例子,把一个MySQL实例恢复出来之后,需要执行binlog做增量恢复。

【方法一】
常见的办法是用mysqlbinlog解析binlog,将解析出来的内容重定向到mysql命令行执行。

#start是mysql-bin后面的数字

i=start
2.while [ $i -lt end ]
3. do
4. mysqlbinlog mysql-bin.$i | mysql -h 127.0.0.1 -P 4001 -uroot > 0550.log 2>&1
5. done

这样做确实可以,而且row模式的binlog,也可以通过这种方式来执行。但是这样做有几个缺点
1. 如果解析出来的binlog在执行的过程中报错,如何处理?直接加 -f 强制执行吗?
2. 执行中途如何停下来,下次接着跑? 比如我想调整一下MySQL的参数(需要重启)后继续跑?
3. 只能单线程执行。而且mysqlbinlog解析再通过管道执行,有比较高的性能开销。

鉴于上面的缺点 下面隆重推出执行大量binlog的另外一种方法
【方法二】
我们都知道relay-log的内容和binlog的内容其实都是一样的,那么我是否能把binlog作为relay-log来执行呢?
答案是肯定的,屡试不爽。
详细的步骤:
0. 先把实例正常shutdown
1. 把binlog上传到mysql服务器本地磁盘,放到一个固定的目录,如/home/mysql/restore_1031
2. 如果是M-S 架构,则需要修改master.info,写入如下内容

cat > $BINLOG_DIR/master.info<
2. 18

3. dummy.binlog

4. 0

5. dummy.host

6. repl

7. repl

8. 3306

9. 60

10. 0

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

21. 0

22. 0.000

23.

24.

25. 0

26.

27.

28. EOF

这里的内容需要符合规则,只要不指向slave 就好,避免应用slave的sql。
3. 修改slave-relay-log.info, 把$STAET, $START_BINLOG_POS替换成你需要开始执行的binlog的文件名和start-position

cat > $BINLOG_DIR/relay-log.info <<EOF

2. /home/mysql/restore_1031/mysql-bin.$STAET

3. $START_BINLOG_POS

4. dummy-binlog.1

5. 0

6. EOF

4. 修改slave-relay-log.index, 把你需要执行的binlog列表都放进去。

#head slave-relay-log.index 

/home/mysql/restore_1031/mysql-bin.000588

/home/mysql/restore_1031/mysql-bin.000589

/home/mysql/restore_1031/mysql-bin.000590

/home/mysql/restore_1031/mysql-bin.000591

/home/mysql/restore_1031/mysql-bin.000592

5. 启动mysql实例,执行start slave sql_thread。

使用方法二的好处:
解决了上面用mysqlbinlog解析再管道给mysql执行的各个缺陷。
1 可以随时stop slave,调整一些参数,再start slave。
2 可以选择忽略一些slave执行报错。
3 如果你的mysql版本支持多线程复制,你还可以使用它 start slave multi_sql_thread 而且这么做性能更好,在一个数据恢复的场景中,

性能对比:
使用mysqlbinlog 加管道的方式,每秒只能执行3000不到IUD,
使用mysql原生slave执行的方式,每秒可以执行8000 IUD。
缺点:修改master.info slave-relay-log.info等文件,需要重启实例才会生效。

下一次,如果你需要恢复大量binlog,你会选择哪种方式?

时间: 2024-09-10 09:41:39

【MySQL】如何快速执行 binlog的相关文章

[MySQL 5.7]:binlog --statement

binlog解析1:statement 1.配置文件设置: my.cnf [mysqld] binlog_format='statement' 2.优缺点对比: 优点: binlog 文件小 日志中包含原始SQL,方便统计审计 缺点: 导致主从不一致 对一些系统函数不能准确复制或不能复制,在不同server上执行,返回的结果是不同的,则会造成数据不一致. 3.测试: 查看事物隔离级别:设置事物隔离级别为默认RR注意:5.7版本RC级别下不能设置为binlog_format=statement;

mysql(slow-query)快速开启慢日志查询的方法

mysql(slow-query)快速开启慢日志查询的方法 mysql有一个功能就是可以log下来运行的比较慢的sql语句,默认是没有这个log的 打开 my.ini ,找到 [mysql] 在其下面添加 long_query_time = 2 log-slow-queries = D:/mysql/logs/slow.log #设置把日志写在那里,可以为空,系统会给 一个缺省的文件 #log-slow-queries = /var/youpath/slow.log linux下host_nam

CI调用存储过程很慢怎么提速,mysql存储过程本身执行很快,但是在php调用就要0.8s

问题描述 CI调用存储过程很慢怎么提速,mysql存储过程本身执行很快,但是在php调用就要0.8s $this -> db -> reconnect(); $mysqli = new mysqli(); $mysqli -> query(""SET NAMES utf8""); if (mysqli_connect_errno()) { printf('Connect failed: %s ' mysqli_connect_error()); e

MySQL开启记录执行过的SQL语句方法

  这篇文章主要介绍了MySQL开启记录执行过的SQL语句方法,配置的方法很简单,本文直接给出配置示例,需要的朋友可以参考下 概述 很多时候,我们需要知道 MySQL 执行过哪些 SQL 语句,比如 MySQL 被注入后,需要知道造成什么伤害等等.只要有 SQL 语句的记录,就能知道情况并作出对策.服务器是可以开启 MySQL 的 SQL 语句记录功能,从而就能间接地检测到客户端程序的行为. 方法 开启方法很简单:编辑/etc/my.cnf文件,在[mysqld]节下面添加:log=/var/l

数据-利用mysql内部机制执行运算问题

问题描述 利用mysql内部机制执行运算问题 mysql有没有这样的一种机制,我想用前一条数据的结果,然后插入一条新的数据:例如我这个表里有四个字段,分别是idcount0count1count2:我先查询到的前一条数据内容分别是id=1count0=1count1=2count2=3;然后我要插入一条id=2新的数据count0和count1分别加1,count2不变(id=2count0=2count1=3count2=3);如果按一般的思路,我先要查询id=1的数据,获取count0cou

mysql远程代码执行/权限提升漏洞

就我目前测试的情况来看,这个漏洞比较鸡肋,原因有以下两点: 1,使用默认方式安装的mysql,mysql用户并没有配置文件/etc/mysql/my.cnf的所属权限: 2,不关闭selinux或apparmor的话,exp脚本执行是会报错的. legalhackers原文中提到这个漏洞的前提是很多人按照错误的安装指南来进行权限配置,将配置文件的所属用户修改成了mysql.不过貌似漏洞发现者手里还藏了几个更加严重的mysql漏洞,并没有披露. I. VULNERABILITY MySQL <=

sql oracle-关于怎么快速执行10000条sql语句

问题描述 关于怎么快速执行10000条sql语句 由于我的数据库有几千万条数据,每一条查询都会花费0.5秒,但是10000条查询需要半个多小时,所以希望有快速一点的方法,求各位大神指点,下面是我的函数. /** * 这是一个横着的for循环,图的缩放级别是13,11*10方格,不同区域到不同区域的上车点数量 */ public static void CountListPointsOfOnetoOne() { ArrayList ListSql = new ArrayList(); double

MySQL的语句执行顺序

MySQL的语句执行顺序 MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对用户来说是透明的,但是只有最后一个虚拟的表才会被作为结果返回.如果没有在语句中指定某一个子句,那么将会跳过相应的步骤. 下面我们来具体分析一下查询处理的每一个阶段 FORM: 对FROM的左边的表和右边的表计算笛卡尔积.产生虚表VT1 ON: 对虚表VT1进行ON筛选,只有那些符

mysql-iis日志导入Mysql数据库快速实现方法

问题描述 iis日志导入Mysql数据库快速实现方法 做一个Iis日志统计的软件,打算通过mysql实现,刚刚开始自学,现在要将iis日志导入到mysql数据库中,目前了解到的方法是用load data infile语句,但发现速度不够理想 100M文件需要30S左右.因为知识有限不知道还有什么更好的办法,希望懂的前辈们,能多指点一下,谢谢