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_log和general_log这两个表就没了,当你再执行 set global slow_query_log=1; 时,就会提示slow_log不存在而无法完成。
因此使用这种方法需要备份这两个表,source完成后再拷回mysql目录。
分享到:
相关推荐
#mysqldump -d -A –add-drop-table -uroot -p >xxx.sql 1.导出结构不导出数据 代码如下: mysqldump –opt -d 数据库名 -u root -p > xxx.sql 2.导出数据不导出结构 代码如下: mysqldump
#mysqldump –help 1.mysqldump的几种常用方法: (1)导出整个数据库(包括数据库中的数据) mysqldump -u username -p dbname > dbname.sql (2)导出数据库结构(不含数据) mysqldump -u username -p -d ...
mysqldump --add-drop-table -uusername -ppassword databasename > backupfile.sql 该命令将备份整个 MySQL 数据库,并在还原时删除已有的表。 3. 直接将 MySQL 数据库压缩备份 mysqldump -hhostname -uusername...
mysqldump -–add-drop-table -uusername -ppassword databasename > backupfile.sql 直接将MySQL数据库压缩备份 mysqldump -hhostname -uusername -ppassword databasename | gzip > backupfile.sql.gz 备份MySQL...
mysqldump -–add-drop-table -uusername -ppassword databasename > backupfile.sql 该命令将备份数据库,并在备份文件中添加 DROP TABLE 语句,以便在恢复时删除原有表。 直接将 MySQL 数据库压缩备份 可以使用...
总结起来,数据库备份和恢复是IT运维的关键环节,正确掌握MySQL和Oracle的备份与恢复命令能确保数据安全,减少因意外导致的数据丢失风险。同时,了解如何在程序中自动化这些操作,可以提高工作效率并降低人为错误的...
— -add-drop-table 在每个创建数据库表语句前添加删除数据库表的语句 — -add-locks 备份数据库表时锁定数据库表 — -all-databases 备份MySQL服务器上的所有数据库 — -comments 添加注释信息 — -compact...
备份MySQL数据库的命令 ...mysqldump —add-drop-table -uusername -ppassword databasename > backupfile.sql 直接将MySQL数据库压缩备份 mysqldump -hhostname -uusername -ppassword databasenam
本篇文章将深入探讨MySQL的备份与恢复策略,包括常见的工具和参数,特别是对`mysqldump`工具的详细使用。 1. **mysqldump**:这是MySQL的逻辑备份工具,通过SQL语句生成数据的脚本文件。它适用于不同MySQL版本之间...
mysqldump -u root -p -d --add-drop-table database_name > backup_structure.sql ``` 这个命令将只导出数据库的表结构,不包含数据。 接下来是数据库的恢复操作,通常使用`mysql`命令来导入SQL文件: 1. 导入...
mysqldump -u wcnc -p -d –add-drop-table smgp_apps_wcnc >d:wcnc_db.sql -d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table 4.导入数据库 A:常用source 命令 进入mysql数据库控制台, 如...
mysqldump --add-drop-table -uusername -ppassword databasename > backupfile.sql ``` 这将使得在恢复备份时,可以先删除已存在的表,然后再创建新的结构。 为了节省存储空间,可以使用`gzip`命令对备份文件进行...
mysqldump -u wcnc -p -d –add-drop-table smgp_apps_wcnc >d:wcnc_db.sql -d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table 四、导入数据库 A:常用source 命令 进入mysql数据库控制台, 如...
3. 导出数据库结构:使用 mysqldump 命令可以导出数据库的结构,例如:mysqldump -u 用户名 -p -d –add-drop-table 数据库名 > 导出的文件名 4. 导入数据库:可以使用 source 命令、mysqldump 命令和 mysql 命令来...
- 如果只需要导出数据库的结构而不包含数据,可以加上`-d`选项,例如`mysqldump -u wcnc -p -d --add-drop-table smgp_apps_wcnc wcnc_db.sql`。 4. **数据导入**: - 通过`source`命令可以在MySQL命令行客户端...
- `--add-drop-table` 参数会在每个创建表的语句前添加删除表的语句,确保在导入时先删除已有表。 2. **导入数据库** - 使用`source`命令导入数据库,例如: - `mysql -u root -p` 登录MySQL,然后 `use 数据库...
`mysqldump -u wcnc -p -d –add-drop-table smgp_apps_wcnc >d:wcnc_db.sql` `-d`选项只导出表结构,`--add-drop-table`在每个CREATE语句前添加DROP TABLE语句,确保导入时先删除已存在的表。 4. **导入数据库**...
- 导出数据库结构而不包括数据,使用 `-d` 参数:`mysqldump -u wcnc -p -d –add-drop-table smgp_apps_wcnc > d:wcnc_db.sql`。 - 导入数据库时,可以在MySQL客户端中使用 `source` 命令,例如 `mysql> source d...