1

我需要恢复转储的数据库,但不丢弃表中的现有行。

要转储我使用:

mysqldump -u root --password --databases mydatabase > C:\mydatabase.sql

要恢复我使用 mysql 命令,因为它会丢弃所有现有的行,但显然 mysqlimport 应该可以解决问题。但是怎么做?跑步:

mysqlimport -u root -p mydatabase c:\mydatabase.sql

说“表 mydatabase.mydatabase 不存在”。为什么它会寻找表格?如何在不丢弃现有表中现有行的情况下使用整个数据库恢复转储?如果 mysqlimport 需要,我可以转储单个表。

该怎么办?

4

3 回答 3

2

如果您担心踩到现有行,则需要 mysqldump 如下:

MYSQLDUMP_OPTIONS="--no-create-info --skip-extended-insert"
mysqldump -uroot --ppassword ${MYSQLDUMP_OPTIONS} --databases mydatabase > C:\mydatabase.sql

这将执行以下操作:

  • 删除CREATE TABLE语句并仅使用 INSERT。
  • 它将一次插入一行。这有助于减轻具有重复键的行

以这种方式执行mysqldump,现在您可以像这样导入

mysql -uroot -p --force -Dtargetdb < c:\mydatabase.sql

试试看 !!!

警告:转储--skip-extended-insert会使 mysqldump 变得非常大,但至少您可以一个一个地控制每个副本。这也将增加 mysqldump 重新加载完成的时间长度。

于 2013-01-29T20:56:03.453 回答
1

我会在文本编辑器中编辑 mydatabase.sql 文件,删除引用删除表或删除行的行,然后正常使用mysql命令手动导入文件。

mysql -u username -p databasename < mydatabase.sql

mysqlimport命令设计用于使用 mysql 命令创建的转储,而SELECT INTO OUTFILE不是直接数据库转储。

于 2013-01-29T20:56:41.857 回答
0

这听起来比你描述的要复杂得多。

如果您按照您描述的方式进行备份,它会包含数据库中的所有记录。然后您说您不想从数据库中删除现有行并从备份中加载?为什么?备份文件(mysqldump 的输出)具有 drop 和 create table 命令的原因是为了确保您不会得到两个数据副本。

正确的答案是使用 mysql 客户端加载 mysqldump 输出文件。如果您不想这样做,则必须解释原因以获得更好的答案。

于 2013-01-29T20:59:30.777 回答