二进制binlog文件恢复数据库出现主键重复的问题

CCSOY 2011-08-28 12:31:40
之前修改一个A数据库的配置文件,开启二进制文件功能,然后把A数据库关闭,把mysql目录下的a,b,c数据库文件cp到本地的其他目录,再开启A数据库,这时对A数据库的操作都会写进binlog文件中,再把cp到其他目录a,b,c数据库文件转到其他服务器的B数据库myslq目录下,过一天,A数据库生成了大概20个binlog文件(设置了binlog的max_size) 共200M的数据,把这20个binlog文件转到B的mysql目录下,B对之前A转过来得数据没有做任何操作,

在B中执行恢复命令:mysqlbinlog mysql-bin.000001 ......mysql-bin.000020 |mysql -uroot -p123456
发现执行大概4分钟的时候停止,并报错: ERROR 1062 (23000) at line 53294: Duplicate entry '13243693' for key 1

是主键重复的问题,可问题是在A都已经执行成功的sql语句(保存在binlog文件中),搬到B上做恢复怎么还会主键冲突(B对A传过了来的数据没有做任何操作),要怎么才能解决。

谢谢各位朋友了。
...全文
1113 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
CCSOY 2011-08-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 acmain_chm 的回复:]

你的原表中数据有没有事先清理过?
[/Quote]
能不能是传过来的数据库中的表有些没有自增了
CCSOY 2011-08-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 acmain_chm 的回复:]

你的原表中数据有没有事先清理过?
[/Quote]
清理? 什么意思
我只把传过了的tar.gz的数据库文件直接解压到mysql目录下,然后就恢复的
要怎么清理
CCSOY 2011-08-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 acmain_chm 的回复:]

你的原表中数据有没有事先清理过?
[/Quote]
清理? 什么意思
我只把传过了的tar.gz的数据库文件直接解压到mysql目录下,然后就恢复的
要怎么清理
ACMAIN_CHM 2011-08-28
  • 打赏
  • 举报
回复
你的原表中数据有没有事先清理过?
CCSOY 2011-08-28
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 rucypli 的回复:]

引用 12 楼 ccsoy 的回复:
引用 11 楼 rucypli 的回复:
看不太清楚你的步骤 你写清楚点吧

引用 8 楼 ccsoy 的回复:
引用 5 楼 rucypli 的回复:


步骤:
1.把A库停下来,修改配置文件,cp数据库文件。
2.开启A库,此时对A的操作都会写入binlog文件中,并把之前cp出的数据库文件传到B库的mysql目录下(tar包).
……
[/Quote]
A的slave之前做好了 虽然同步上没有出现问题,但是我在slave的配置文件中添加了slave-skip-errors=all选项,所以我就但是 表面上没有问题,其实slave是把所有的问题都给跳过忽略了.而同步的数据还是存在问题.
那我如果把binlog文件用mysqlbinlog做成一个sql文件,然后-f强制导入数据库,对数据文件会造出什么损害吗.
rucypli 2011-08-28
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ccsoy 的回复:]
引用 11 楼 rucypli 的回复:
看不太清楚你的步骤 你写清楚点吧

引用 8 楼 ccsoy 的回复:
引用 5 楼 rucypli 的回复:


步骤:
1.把A库停下来,修改配置文件,cp数据库文件。
2.开启A库,此时对A的操作都会写入binlog文件中,并把之前cp出的数据库文件传到B库的mysql目录下(tar包).
3.一天后,A生成20个binlog文……
[/Quote]

你的步骤看不出什么问题,我看你还是重新在线做一个A的slave吧
CCSOY 2011-08-28
  • 打赏
  • 举报
回复
求牛人指点呀
CCSOY 2011-08-28
  • 打赏
  • 举报
回复
发现公司的mysql版本是5.0.21 好像5.1.5版本的MySQL才开始支持row level的复制 肿么办解决呀
CCSOY 2011-08-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 rucypli 的回复:]
看不太清楚你的步骤 你写清楚点吧

引用 8 楼 ccsoy 的回复:
引用 5 楼 rucypli 的回复:

[/Quote]
步骤:
1.把A库停下来,修改配置文件,cp数据库文件。
2.开启A库,此时对A的操作都会写入binlog文件中,并把之前cp出的数据库文件传到B库的mysql目录下(tar包).
3.一天后,A生成20个binlog文件(200M),把这20个binlog文件cp出并传到B库的mysql目录下.
4.在B库中进行binlog恢复数据. mysqlbinlog mysql-bin.000001 .....|mysql -uroot -p 123456

然后过了4分钟 停止下来
报错:ERROR 1062 (23000) at line 53294: Duplicate entry '13243693' for key 1

(是不是之前设置A的配置文件时没有指定binlog的模式,查了一下资料,说是RBR模式 能处理很多主键重复的问题,而binlog默认的是SBR的模式)
rucypli 2011-08-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ccsoy 的回复:]
引用 5 楼 rucypli 的回复:

怎么做的这么复杂啊 完全可以直接mysqldump --single-transaction -F -master-data=2做一个全备

然后还原到B上 然后B change master to ..... 接上A 成为A的slave就可以了

我做这个只是测试一下以后做增量备份时候的binlog恢复速度,但是一测试发现出现这个问题,有办法……
[/Quote]
看不太清楚你的步骤 你写清楚点吧
rucypli 2011-08-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ccsoy 的回复:]
引用 5 楼 rucypli 的回复:

怎么做的这么复杂啊 完全可以直接mysqldump --single-transaction -F -master-data=2做一个全备

然后还原到B上 然后B change master to ..... 接上A 成为A的slave就可以了

我做这个只是测试一下以后做增量备份时候的binlog恢复速度,但是一测试发现出现这个问题,有办法……
[/Quote]
做增量备份你得确定你的binlog确实是增量 而没有和全备有重复的数据
所以全备的时候只要要flush log一下 以产生新的binlog文件

用mysqldump备份可以-F
CCSOY 2011-08-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 rucypli 的回复:]

引用 4 楼 ccsoy 的回复:
引用 1 楼 acmain_chm 的回复:


把binlog_改成statment模式 就没有自增了
[/Quote]
之前设置配置文件时,没有指定binlog的模式,如果默认的格式不支持自增,那问题是不是出现在这里
CCSOY 2011-08-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 rucypli 的回复:]

怎么做的这么复杂啊 完全可以直接mysqldump --single-transaction -F -master-data=2做一个全备

然后还原到B上 然后B change master to ..... 接上A 成为A的slave就可以了
[/Quote]
我做这个只是测试一下以后做增量备份时候的binlog恢复速度,但是一测试发现出现这个问题,有办法解决吗 苹果大哥
rucypli 2011-08-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ccsoy 的回复:]
引用 1 楼 acmain_chm 的回复:

你的原表中数据有没有事先清理过?

能不能是传过来的数据库中的表有些没有自增了
[/Quote]
把binlog_改成statment模式 就没有自增了
CCSOY 2011-08-28
  • 打赏
  • 举报
回复
在线等呀
rucypli 2011-08-28
  • 打赏
  • 举报
回复
怎么做的这么复杂啊 完全可以直接mysqldump --single-transaction -F -master-data=2做一个全备

然后还原到B上 然后B change master to ..... 接上A 成为A的slave就可以了

57,063

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧