我有一个包含一些表、视图和例程的数据库(InnoDB) .
我定期使用命令行进行备份:
mysqldump -u user -ppassword --routines db_name > backup.sql
但是我在使用工作台创建备份时也遇到了问题。
顺便说一句,备份进程结束时没有问题,也没有警告.
在恢复之后,我遇到了一些问题,恢复过程很好地结束了,没有错误,但是一些视图被破坏了。
我不能改变风景本身。
我怎么才能修好它?为什么我有这个问题?
我使用MySQL Workbench 5.2.35 CE.得到一个空白/空的结果。
使用简单的sql (描述view_name),我得到了以下错误:
错误代码: 1356。查看“db.view_name”引用无效表(S)或列(S)或函数(AC.26)或定义者/调用者缺乏使用它们的权限
但是select * from view_name
仍然返回预期的结果
SHOW CREATE VIEW view_name
错误代码: 1356。视图'view_name‘引用无效表(S)或列(S)或函数(AC.26)>或定义者/调用者缺乏使用它们的权限
SELECT * FROM INFORMATION_SCHEMA.TABLES where table_schema = 'db_name' and table_name = 'view_name'
TABLE_CATALOG def
TABLE_SCHEMA db_name
TABLE_NAME view_name
TABLE_TYPE VIEW
ENGINE VERSION NULL
ROW_FORMAT NULL
TABLE_ROWS NULL
AVG_ROW_LENGTH NULL
DATA_LENGTH NULL
MAX_DATA_LENGTH NULL
INDEX_LENGTH NULL
DATA_FREE NULL
AUTO_INCREMENT NULL
CREATE_TIME NULL
UPDATE_TIME NULL
CHECK_TIME NULL
TABLE_COLLATION NULL
CHECKSUM NULL
CREATE_OPTIONS NULL
TABLE_COMMENT 'View ''db_name.view_name'' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them'
此视图是由其他视图相互连接而生成的视图。
发布于 2012-05-02 07:14:49
视图的定义必须包含在转储文件中。
要查看定义,在dumpfile上运行以下命令:
cat backup.sql | grep -A 3 "CREATE ALGORITHM" > backup_views.sql
cat backup_views.sql
然后,您可以删除“冒犯”视图(S)并手动重新创建它们。
如果您的另一台服务器已经建立了视图,则应该只使用mysqldump模式。它也将包含视图。@DTest和我以前写过这方面的文章。
视图总是在mysqldump中最后处理(在所有表之后)。
如果一个视图引用另一个视图,而创建视图的顺序没有考虑到这一点,也可能会出现这个问题。
发布于 2019-12-19 07:15:51
实际上,作为错误报告,这可以与视图定义器/调用者相关。通常发生在备份视图定义器为db1
的user1
时,然后以不同的名称(例如db2
)还原此备份,这样user1
就不会对这个新数据库具有权限。
在这种情况下,您可以将user1
映射到db2
,或者在backup.sql文件中使用user2
替换user1
,然后运行restore (假设user2
对db2
具有必要的权限--通常情况下,进行生产数据库备份,然后将其还原为测试数据库)。
您可以在这个答案中阅读更多细节。
https://dba.stackexchange.com/questions/17352
复制相似问题