`
丁林.tb
  • 浏览: 790580 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

mysqldump add-drop-database导致恢复失败原因和处理

阅读更多

1、问题

  通常用mysqldump+source做数据备份和恢复。如果想要完全恢复备份时的状态,要删掉新表,一般思路就是让mysqldump生成drop database + create database.

       bin/mysqldump  -Srun/mysql.sock -uroot  --all-databases --add-drop-database &>data.sql

 

       但在将生成的data.sql执行source作恢复操作时,会发现报错。

"ERROR 1580 .... You cannot 'DROP' a log table if logging is enabled"

 

2、原因

在正常执行的服务中,我们会打开慢查询日志。在log_slow_queries on时,mysql.slow_log这个表不允许删除,因此,当source命令执行到drop database if exists mysql 时,就报上面的这个错。

同样的问题会出现在mysql.general_log这个表。只是平时服务中一般不会query_log

 

3、影响

由于source是按行执行的,执行到这个语句报错并不影响已经完成的恢复动作。就是说如果有个库叫’ab’,则执行出错前已经恢复,出错后并不回滚。可能导致数据不一致。

而且dump+source作为标准操作,上述的这个现象看上去比较bug.

 

4、处理

一种处理方法是在dump出来的文件中,将drop database if exists mysql这句话删除掉。

这麻烦一些,还需要人工或这脚本。也可以简单修改mysqldump.c。策略上对于mysql这个库,不要生成drop database语句。简单如下:

 

4105c4105
<       if (opt_drop_database)
---
>       if (opt_drop_database && my_strcasecmp(qdatabase, quote_name("mysql", qbuf,
opt_quoted))!=0)
4115c4115
<       if (opt_drop_database)
---
>       if (opt_drop_database && my_strcasecmp(qdatabase, quote_name("mysql", qbuf,
opt_quoted))!=0)

  

 

5、注意

有的同学会提出在source的时候先把slow_log关掉,这样执行drop mysql这个库的时候就能通过。

需要注意一点是这样source完成后slow_loggeneral_log这两个表就没了,当你再执行 set global slow_query_log=1; 时,就会提示slow_log不存在而无法完成。

因此使用这种方法需要备份这两个表,source完成后再拷回mysql目录。

3
0
分享到:
评论
2 楼 丁林.tb 2012-03-22  
nofreezou 写道
将mysql与其他数据库分开备份即可。

改源代码不如写个脚本直接删掉那行语句- -


你说的也是一种方法 
1 楼 nofreezou 2012-03-10  
将mysql与其他数据库分开备份即可。

改源代码不如写个脚本直接删掉那行语句- -

相关推荐

    mysql mysqldump只导出表结构或只导出数据的实现方法

    #mysqldump -d -A –add-drop-table -uroot -p &gt;xxx.sql 1.导出结构不导出数据 代码如下: mysqldump –opt -d 数据库名 -u root -p &gt; xxx.sql 2.导出数据不导出结构 代码如下: mysqldump 

    浅谈mysqldump使用方法(MySQL数据库的备份与恢复)

    #mysqldump –help 1.mysqldump的几种常用方法: (1)导出整个数据库(包括数据库中的数据) mysqldump -u username -p dbname &gt; dbname.sql  (2)导出数据库结构(不含数据) mysqldump -u username -p -d ...

    mysql_备份还原,基本操作,双机热备,数据同步,远程连接 文档集合

    mysqldump -–add-drop-table -uusername -ppassword databasename &gt; backupfile.sql 直接将MySQL数据库压缩备份 mysqldump -hhostname -uusername -ppassword databasename | gzip &gt; backupfile.sql.gz 备份MySQL...

    mysqldump命令 MySQL数据库备份

    — -add-drop-table 在每个创建数据库表语句前添加删除数据库表的语句 — -add-locks 备份数据库表时锁定数据库表 — -all-databases 备份MySQL服务器上的所有数据库 — -comments 添加注释信息 — -compact...

    MySQL数据库备份和还原的常用命令小结

    备份MySQL数据库的命令 ...mysqldump —add-drop-table -uusername -ppassword databasename &gt; backupfile.sql 直接将MySQL数据库压缩备份 mysqldump -hhostname -uusername -ppassword databasenam

    邓炜MYSQL常用操作命令

    mysqldump -u wcnc -p -d –add-drop-table smgp_apps_wcnc &gt;d:wcnc_db.sql -d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table 4.导入数据库 A:常用source 命令 进入mysql数据库控制台, 如...

    最全Mysql数据库命令

    mysqldump -u wcnc -p -d –add-drop-table smgp_apps_wcnc &gt;d:wcnc_db.sql -d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table 四、导入数据库 A:常用source 命令 进入mysql数据库控制台, 如...

    MySQL 入门学习 ——基础教程

    在indows环境下构筑和调试MySQL数据库是许多网站开发者的一种首选。本人在Windows98环境下初学MySQL,现将学习过程与经验总结出来供大家参考。 1、下载mysql-3.23.35-win.zip并解压; 2、运行setup.exe;选择d:\...

    mysql数据库备份命令分享(mysql压缩数据库备份)

    备份MySQL数据库的命令 代码如下:... 代码如下:mysqldump -–add-drop-table -uusername -ppassword databasename &gt; backupfile.sql 直接将MySQL数据库压缩备份 代码如下:mysqldump -hhostname -uusername -ppas

    MYSQL常用命令大全

    mysqldump -u wcnc -p -d –add-drop-table smgp_apps_wcnc &gt;d:wcnc_db.sql -d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table 4.导入数据库 A:常用source 命令 进入mysql数据库控制台, 如...

    MySQL命令大全

    mysqldump -u wcnc -p -d –add-drop-table smgp_apps_wcnc &gt;d:wcnc_db.sql -d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table 4.导入数据库 A:常用source 命令 进入mysql数据库控制台, ...

    cmd操作命令和linux命令大全收集

    arp 查看和处理ARP缓存,ARP是名字解析的意思,负责把一个IP解析成一个物理性的MAC地址。arp -a将显示出全部信息 start 程序名或命令 /max 或/min 新开一个新窗口并最大化(最小化)运行某程序或命令 mem 查看cpu...

    mysql基础只是总结

    2、drop database 数据库名称 【表的创建、修改和删除】 1、创建 create table [if not exists] 表名( 字段名称 类型(大小) 属性, 字段名称 类型(大小) 属性, 字段名称 类型(大小) 属性, ⋯⋯ )engine=...

Global site tag (gtag.js) - Google Analytics