简单数据库迁移操作
迁移方案
迁移方案很简单, 首先将旧的库dump下来, 然后在新库中导入旧的库 dump 下来的文件.
# 旧库dump的指令
mysqldump -h host -P post -u user -p database > database_backup.sql
# 新库导入的命令
mysql -h host -P post -u user -p database < database_backup.sql
在这个简单的方案中, 我需要一些问题如下:
mysqldump 1449 错误
在使用mysqldump命令的时候, 出现报错如下:
Got error: 1449: The user specified as a definer ('some_user'@'%') does not exist when using LOCK TABLES
上面的some_user
是我自己替换的.
错误的原因
在进行一次数据库迁移的操作中, mysqldump默认操作会将视图View也复制迁移到新的数据库中, 这个复制实际上是在新的数据库中重新创造一个视图, 但是重新创造的过程中, 这个View的DEFINER
仍然是旧库中建立这个视图的那个用户.
举例就是数据库A中, 我们用户 user1 使用下面的命令新建了一个视图,
-- 创建视图, 该视图View的DEFINER 为user1
CREATE VIEW temp_view AS SELECT * FROM some_table;
然后我们将这个数据库A使用 mysqldump 迁移到数据库B, 这时, mysqldump会生成一个在数据库B上新建一个View的命令, 但是这个命令是这个样子的:
CREATE ALGORITHM=UNDEFINED
DEFINER=`user1`@`%` SQL SECURITY DEFINER
VIEW `temp_view` AS SELECT * FROM some_table;
可以看到, 数据库B中新建的视图的DEFINER
仍然是 user1
. 但是, 数据库B可能压根不存在这个用户.
这样导致一个问题就是, 当我们再次使用 mysqldump dump数据库B的时候, 由于数据库B的用户是 user2
, 并且不存在用户 user1
, 因此在dump该数据库B的时候, 复制这个视图的时候, 使用 LOCK TABLES
的时候会找不到用户user1
, 报错. 也就是上面的错误 Got error: 1449: The user specified as a definer ('some_user'@'%') does not exist when using LOCK TABLES
.
如何解决错误
创建缺失用户
既然当前数据库B中没有这个用户, 那么新建这个用户不就解决了吗, 实际上这是最暴力的方式了.
修改视图View的DEFINER
这种方法实际是将我们需要拷贝的视图的DEFINER修改为我们存在的用户, 或者拷贝的用户.
标签:遇到,数据库,用户,视图,mysqldump,迁移,DEFINER,user From: https://www.cnblogs.com/wevolf/p/18347663