2016-05-12 30 views
4

我在AWS上使用了一个大型数据库几个月,但因为它开始变得昂贵而被迫关闭。恢复MySQL数据库时'系统表无法在系统表上创建触发器'错误

现在,我的硬盘上有一个32GB文件,在关闭实例上运行的MySQL数据库之前导出。

我想在我的笔记本电脑上导入400万行左右的本地MySQL。

使用MySQL Workbench,我试图做到这一点。但首先,我在本地重新创建了完全相同的模式(只有3个表格)。然后,使用“数据导入”选项,我选择“从自备文件导入”,并指向我的文件。我让它撕裂 - 只有收到这个令人沮丧的信息作为回应:

01:56:30 PM Restoring /home/monica/dumps/Dump20160406.sql 
Running: mysql --defaults-file="/tmp/tmpMJpTQj/extraparams.cnf" --protocol=tcp --host=127.0.0.1 --user=root --port=3306 --default-character-set=utf8 --comments --database=my_db < "/home/monica/dumps/Dump20160406.sql" 
ERROR 1465 (HY000) at line 488: Triggers can not be created on system tables 
Operation failed with exitcode 1 

它看起来像触发器有问题吗?首先我有点困惑,因为我的数据库从来没有任何触发器开始。

为了排除故障,我找到了t his SO question,我试了一下建议 - 我编辑了my.conf文件,但没有任何区别。

其他搜索导致我空白。我可以找到的这个错误真的没有什么。

如果有人有任何建议,那就太好了。谢谢。

编辑

我从@Solarflare的评论中使用的一些建议和使用这样的说法:

mysql -u root -p for_import -o < /home/monica/dumps/Dump20160406.sql

其实,我发现了一个叫Pipe Viewer它提供一个进度条,酷工具 - - 视觉证明(我希望)事情正在发生。所以我改写线这样的:

pv /home/monica/dumps/Dump20160406.sql | mysql -u root -p -o for_import

果然,它看起来像事情工作,5分钟左右后,进口完成:

34.1GB 0时08分19秒[ 69.9MB/s] [==================================>] 100%

不错! 但是:当我show databases然后use for_import然后show tables,我得到:

Empty set (0.00 sec)我的心脏坏了。 :(

+1

只是为了确保并尝试帮助,如果你以某种方式错过了,就像我经常这样做 - 因为所提到的答案表示触发器问题是通过mysql conf设置更改解决的 - 这看起来像是一个权限问题:您是否重新启动你的mysql服务器编辑完mysql后?第二个问题,而不是工作台 - 我不信任 - 你是否尝试命令行来恢复数据库?无需创建模式,只需要空白数据库。我希望你解决了它,我可以告诉你对此感觉如何。 – smozgur

+0

您可以添加选项'-o'或'--one-database'来忽略所有不针对数据库'my_db'(假设它具有相同名称)的所有内容,所以基本上只需使用'mysql --defaults- file =“/ tmp/tmpMJpTQj/extraparams.cnf”--protocol = tcp --host = 127.0.0.1 --user = root --port = 3306 --default-character-set = utf8 --comments --database = my_db -o <“/home/monica/dumps/Dump20160406.sql”'(你可以直接在命令行执行) – Solarflare

+0

@Solarflare:谢谢你!我的问题是,'file =“/ tmp/tmpMJpTQj/extraparams.cnf”'从哪里来的? –

回答

5

可以使用参数-o--one-database跳过这并不意味着默认的数据库一切你想导入:

mysql -u root -p -D mydb -o < /home/monica/dumps/Dump20160406.sql 

将您的文件导入数据库mydb并跳过所有其他人,特别是导致你的麻烦的系统数据库。名称mydb必须在您的文件和数据库中相同。

0

我认为你的转储可以在系统表上有触发器,就像错误文本说的那样。打开你的SQL转储(使用任何文本编辑器)并删除涉及系统数据库(mysql,perfomance_schema,information_schema)的所有内容。你可以删除所有的触发器。

1

另一种选择是导入mysql -f来忽略并跳过失败的定义。