如何通过命令行导入MySQL转储文件并覆盖原有数据

27

我搜索了很多,但没有找到任何有关它的信息!

[root@someday backups]# mysql -u username_1 -p db_1 < tables_to_import/tables.sql 
ERROR 1050 (42S01) at line 19: Table 'ps_customer' already exists

使用 mysql -f 命令是相同的。我希望能够简单地导入那个 .sql 文件并重写那些表,有人可以帮助我吗?

附言:我知道在导出数据库时可以选择 "DROP TABLE" 选项,但如果我有一个备份,没有这个声明怎么办?我该如何强制执行?谢谢。

4个回答

60

当你执行 mysqldump 时,加上 --add-drop-table 参数(就像 twihoX 提到的那样)。然后像平常一样导入。因此,类似以下操作:

mysqldump --add-drop-table -u user -p db_1 > dumpfile.sql

mysql -u user -p db_1 < dumpfile.sql 

这是哪个版本的MySQL?我正在使用5.7.11,但它给了我mysql:[ERROR] unknown option '--add-drop-table'。 - kloddant
很抱歉,那是很久以前的事情了,所以我记不清了。我现在没有使用mysql来进行准确的测试。 - DrewB
1
在你的 mysql 命令行中,你忘记在 -p 开关后面加上数据库名称了。应该像这样:mysql -u 用户名 -p 数据库名称 < dumpfile.sql - Volomike

8
你是否想要覆盖整个数据库?如果是这样的话,你可以手动删除所有表格,然后运行导入脚本。在phpMyAdmin中很容易实现。如果你正在使用CLI,最快的方法是使用DROP DATABASE databasename,然后create database,但我认为你可能需要重新授予任何非root用户的权限。
另一个选择是打开你的转储文件,在每个CREATE TABLE命令之前添加DROP TABLE tablename。你可能可以通过一些聪明的正则表达式来轻松实现这一点。

嗨,Octern!不,我只想覆盖 tables.sql 中包含的表(在这个 .sql 文件中,我导出了 6 张表,所以我只想覆盖这些),从逻辑角度来看,这是可能的吗?或者我可能漏掉了什么吗? - CalfCrusher
2
然后使用我的第二个建议,在tables.sql中的每个CREATE TABLE命令中添加一个DROP TABLE命令。你可以编写一个shell脚本来完成这个任务,但如果只有6个表,你应该能够在不到一分钟的时间内手动完成它。 - octern

2
今日免费次数已满, 请开通会员/明日再来

根据 https://wordpress.stackexchange.com/a/62736/10453,`--add-drop-table` 是用于导出数据库的选项。因此,基于这个假设,如果要导入的数据库中没有包含删除表 SQL 命令,则该选项对导入没有影响。 - therobyouknow

1

我知道这个问题有点老,而且已经被正确回答了,但是我想为那些(像我一样)在导出时没有使用--add-drop-table的人添加一些内容。

你可以登录到MySQL并删除你计划覆盖的表,然后在导入时使用--force参数。

所以登录到MySQL。

mysql -h HOSTNAME - USERNAME -p

然后告诉MySQL你希望使用哪个数据库

mysql> use DATABASE_NAME

删除您想要覆盖的表

mysql> DROP TABLE my_images;

然后你就可以进行导入了,退出mysql返回上传SQL文件的位置并运行以下命令。

$ mysql --force -uDB_USER -p DB_NAME < myuploadedfile.sql

这将强制MySQL继续导入任何新表,并忽略“表已经存在的错误”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接