Mysqldump add drop table?

时间:2012-08-22 作者:AlxVallejo

我注意到在Codex中显示了用于备份数据库的--add drop table选项。在我搞砸之前,这是否意味着在最终导入备份时,如果目标数据库中存在这些表,它们将被覆盖?

我不想在备份桌子时把它们弄掉!

user@linux:~/files/blog> mysqldump --add-drop-table -h mysqlhostserver
 -u mysqlusername -p databasename (tablename tablename tablename) | bzip2
 -c > blog.bak.sql.bz2

Enter password: (enter your mysql password)
user@linux~/files/blog>

http://codex.wordpress.org/Backing_Up_Your_Database#Using_Straight_MySQL_Commands

4 个回复
最合适的回答,由SO网友:Jake 整理而成

它只影响所创建文件中MySQL转储的输出。

这是没有必要的。它就在那里,因此如果您将创建的转储文件导入到已经有同名表的数据库中,它将删除该表,然后在其位置添加新表。否则,将出现错误,并且不会导入转储文件。

它在转储文件中的create table语句之前添加此行:

DROP TABLE IF EXISTS `tablename`;
如果您计划将转储文件导入到新的数据库中,这无关紧要。

SO网友:user2063478

那是因为overall syntax 类似于:

mysql>mysqldump --opt --all-databses > all.sql
--opt 默认情况下已启用(这意味着:--add-drop-table) 如MySQL文档中所述。

SO网友:Markus

在此语法中删除--add drop table时,无论如何都会使用,-add drop table,因为--opt是默认值(除非使用--skip opt)和--opt includes--add drop table。请参见此处:https://dev.mysql.com/doc/refman/5.6/en/mysqldump.html#option_mysqldump_opt

而且,如上所述,这并不意味着在备份时删除表,但删除表的命令包含在sql文件中,因为这是转储所需的,因此可以导入转储,而不会出现表已经存在的错误。

SO网友:Adeel Raza Azeemi

是的,这将完全按照它所说的做,即如果表已经存在,它将删除该表。请记住,您正在创建要导入的转储(有两种情况);

如果在创建新数据库(或表)时,drop table语句不会产生任何影响,因为首先没有要删除的表。

但跳过已创建表的删除;改用--跳过add drop table。(也可以使用--no create info with--skip add drop table,因为您也不需要create table语句)即。

mysqldump--跳过添加-删除表--无创建信息-h mysqlhostserver-u mysqlusername-p databasename tablename | bzip2-c>;博客贝克。sql。bz2型

仅供参考:不能使用(tablename、tablename、tablename)导出多个表。要么导出所有表,要么在databasename之后不使用任何tablename,要么只使用一个tablename。

请注意,如果您的表很大,那么明智的做法是将其分部分导出。i、 e.使用以下命令创建一个包含80k(八万)条记录(大约等于10 Mb)的转储文件;仅供参考:我使用where to mysqldump拆分了导出。

mysqldump -h mysqlhostserver -u mysqlusername -p --add-drop-table --add-drop-trigger --skip-triggers --dump-date --single-transaction --where=\'1 limit 0,80000\' databasename tablename > /home/blog1.bak.sql
mysqldump mysqlhostserver -u mysqlusername -p --skip-add-drop-table --no-create-info --dump-date --single-transaction --where=\'1 limit 80000,999999\' databasename tablename > /home/blog2.bak.sql
上面的命令首先创建第一个80K记录文件blog1。贝克。sql文件(请注意,我跳过了此转储中的触发器。我后来发现了这一点,因为如果第一次转储在插入或更新时有任何关联的触发器,这会让我发疯。然后在导入第一个转储文件时,

它将创建表,并在新创建的表中插入记录

  • 创建与此表关联的触发器,并强制执行它们,以便在第一次导入其他转储文件之后导入其他转储文件;它将强制执行触发器(目前无法禁用触发器;除非重写这些触发器并添加复杂的代码来禁用触发器以进行调试或导入)。触发器通常有与其他表连接的代码;在此导入之前可能无法导入,因此导致导入失败。

  • 结束