我用mysqldump备份的整个数据库,恢复备份文件时,会替换数据库中原有的记录。
因为备份时备份了表的主键,恢复时的INSERT语句中也包含了主键的值。数据库中记录的主键和备份文件的主键相同时,前者就被后者替换。
可是我要的不是这种效果,我想恢复时,数据库中已有的记录不动,备份文件恢复时是增量的。目前我的解决办法是用程序代码直接修改备份文件,去掉INSERT语句中的主键部分。但算法一直有问题,而且感觉这样效率很低。大家有什么办法吗?比如在备份时就直接忽略主键?

解决方案 »

  1.   

    1、
    binlog是实现增量备份的好方法
    要想进行增量备份,我们需要保存增量更改。应使用--log-bin选项启动MySQL服务器,以便更新数据时将这些更改保存到文件中。该选项启用二进制日志,因此服务器写将每个更新数据的SQL语句写入MySQL二进制日志。让我们看看用--log-bin选项启动的已经运行多日的MySQL服务器的数据目录。我们找到以下MySQL二进制日志文件:一个变通的办法是启用binlog(二进制日志),然后每天刷新一下,产生新的binlog,把旧的日志备份起来,就相当于增量备份了。
      

  2.   

    1. 启用 MySQL 二进制日志功能(enable binary logging)。 在 MySQL 配置文件,My.ini 或 my.cnf 中加入 log-bin 配置。
      

  3.   

    可是我要的不是这种效果,我想恢复时,数据库中已有的记录不动,备份文件恢复时是增量的。要主键,假设为ID
    导入到另一个数据库中的表中,用
    INSERT INTO NEWTT
    SELECT A.* FROM LSB A LEFT JOIN NEWTT B ON A.ID=B.ID WHERE B.IS IS NULL这种方法不如直接用增量备份
      

  4.   

    我用mysqldump备份的整个数据库,恢复备份文件时,会替换数据库中原有的记录。 
    因为备份时备份了表的主键,恢复时的INSERT语句中也包含了主键的值--------------------------
    你这样是全量备份了
    其实你这样的需求,用差异备份恢复就可以轻松实现了:只需要第一次进行全量备份恢复,之后都用增量备份恢复就可以了,至于“增量备份恢复”的方法,前面几楼的都说得很清楚了
      

  5.   

    你的数据库不止一个表,用SQL语句一张表一张表导入,效率低,用增量备份恢复的方法是
    最好的解决方法
      

  6.   

    谢谢各位的及时回复,在解决其他问题和客户沟通。所以回复的有点慢。我先说一下客户的实际需求,然后慢慢理解各位所说的,看看能不能达到我的要求。我写的软件每个月产生新的纪录,备份后删除。继续产生下个月新数据。而产生的备份文件被导入另一台专门用于备份的机器中。就是说A机器只保持每个月的新纪录,而B机器需要增量导入A产生的备份。其实只要主键不存在重复的可能性,用mysqldump产生的备份文件可以达到我的要求。但我不能保证每个月产生的新纪录和以前记录的主键不重复。
      

  7.   

    在 备份的机器中 另建一表 tableImport结构和原表相同,然后新数据先导入到这个表中,然后再导入到备份表,备份表中加上月份标志 insert into 备份表 select 'xx month',* from tableImport
      

  8.   

    增量备份:
    先执行FLUSH LOGS刷新日志,同步日志缓存到磁盘,关闭当前的日志并产生新的日志文件。
    拷贝上一次完整备份或增量备份后的一个或一些日志文件到一个安全的地方。
    这样就制作了一个增量备份。增量恢复:
    使用mysqlbinlog执行增量备份的日志文件。