MYSQL 使用 sql 转储克隆数据库时出错-错误 1359 (HY000):触发器已存在
MYSQL Error when cloning database with sql dump- ERROR 1359 (HY000): Trigger already exists
我有一个用于实时项目的 MySQL 数据库,我想在可用于开发目的的同一台服务器上创建它的副本。我已经使用 MySQL 转储来创建实时数据库的副本。我这样做如下:
mysqldump -u root -p mydatabase_live > mydatabase_dump.sql
然后我登录 MySQL 并创建了一个名为 mydatabase_test 的空数据库。然后我尝试通过退出 MySQL 并执行以下操作将转储复制到新创建的 database_test:
mysql -u root -p database_test < mydatabase_dump.sql
第 527 行出现错误消息 ERROR 1359 (HY000):触发器已存在。
当我重新登录 MySQL 并检查我刚刚转储的数据库上的触发器时,我看不到任何名称重复的触发器。我已经尝试重复上述过程以防初始转储中出现某种错误,但问题仍然存在。
任何人都可以解释为什么我会收到此错误消息以及如何解决这个问题吗?
我正在使用 MySQL Ver 14.14 Distrib 5.7.25,用于 Linux
* 注意在下面接受的答案中添加详细信息 *
MySQL 转储文件可以在文本编辑器中打开。我用了vim。解决方案是找到触发器并更改触发器名称的一部分,将其标识为属于您从中获取转储的模式,将其更改为您针对转储的模式。在我的例子中,这意味着将 mydatabase_live
.my_table
更改为 mydatabase_test
.my_table
。然后登录 mysql,删除测试 table 然后重新创建它,然后注销并再次执行复制命令。
触发器存储在 Information_Schema.Triggers table 上。也许这就是为什么你不能复制它们,也许用不同的名字创建一个新的?
查看此处了解更多信息
Linux
mysqldump -u root -p mydatabase_live > mydatabase_dump.sql
mysqladmin create database_test
cat mydatabase_dump.sql | sed s/`mydatabase_live`/`database_test`/g | mysql -u root -p database_test
Windows
mysqldump -u root -p mydatabase_live > mydatabase_dump.sql
mysqladmin create database_test
type mydatabase_dump.sql | sed s/`mydatabase_live`/`database_test`/g | mysql -u root -p database_test
备注
- 如果您在 Windows,您将需要
sed
的 windows 版本(例如 GnuWin32 sed)
- 我使用了 similar question at DBA Stack Exchange 中几个答案的变体。
- 我正在使用 MySQL 5.7
- mysql5.7 中的转储在导出 触发器和视图时包含 数据库名称 。
- 我把我的密码放在一个环境变量中并在命令行上传递它(我知道,我很糟糕,我明白了)。我提到它是因为我不知道当您将数据通过管道传输到 mysql 可执行文件然后它提示输入密码时会发生什么。
我有一个用于实时项目的 MySQL 数据库,我想在可用于开发目的的同一台服务器上创建它的副本。我已经使用 MySQL 转储来创建实时数据库的副本。我这样做如下:
mysqldump -u root -p mydatabase_live > mydatabase_dump.sql
然后我登录 MySQL 并创建了一个名为 mydatabase_test 的空数据库。然后我尝试通过退出 MySQL 并执行以下操作将转储复制到新创建的 database_test:
mysql -u root -p database_test < mydatabase_dump.sql
第 527 行出现错误消息 ERROR 1359 (HY000):触发器已存在。
当我重新登录 MySQL 并检查我刚刚转储的数据库上的触发器时,我看不到任何名称重复的触发器。我已经尝试重复上述过程以防初始转储中出现某种错误,但问题仍然存在。
任何人都可以解释为什么我会收到此错误消息以及如何解决这个问题吗?
我正在使用 MySQL Ver 14.14 Distrib 5.7.25,用于 Linux
* 注意在下面接受的答案中添加详细信息 *
MySQL 转储文件可以在文本编辑器中打开。我用了vim。解决方案是找到触发器并更改触发器名称的一部分,将其标识为属于您从中获取转储的模式,将其更改为您针对转储的模式。在我的例子中,这意味着将 mydatabase_live
.my_table
更改为 mydatabase_test
.my_table
。然后登录 mysql,删除测试 table 然后重新创建它,然后注销并再次执行复制命令。
触发器存储在 Information_Schema.Triggers table 上。也许这就是为什么你不能复制它们,也许用不同的名字创建一个新的?
查看此处了解更多信息
Linux
mysqldump -u root -p mydatabase_live > mydatabase_dump.sql
mysqladmin create database_test
cat mydatabase_dump.sql | sed s/`mydatabase_live`/`database_test`/g | mysql -u root -p database_test
Windows
mysqldump -u root -p mydatabase_live > mydatabase_dump.sql
mysqladmin create database_test
type mydatabase_dump.sql | sed s/`mydatabase_live`/`database_test`/g | mysql -u root -p database_test
备注
- 如果您在 Windows,您将需要
sed
的 windows 版本(例如 GnuWin32 sed) - 我使用了 similar question at DBA Stack Exchange 中几个答案的变体。
- 我正在使用 MySQL 5.7
- mysql5.7 中的转储在导出 触发器和视图时包含 数据库名称 。
- 我把我的密码放在一个环境变量中并在命令行上传递它(我知道,我很糟糕,我明白了)。我提到它是因为我不知道当您将数据通过管道传输到 mysql 可执行文件然后它提示输入密码时会发生什么。