使用phpmyadmin导出sql转储时,它会创建如下的VIEW表:
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER
VIEW `database`.`table` etc..
每次我必须手动编辑sql转储以删除root
用户和database
名称。
答案 0 :(得分:12)
也许我不理解......但这一直对我有用。没有对数据库名称的引用,并且所有定义器都被清除,因此从它生成的文件中恢复非常容易:
mysqldump -uUSERNAME -pPASSWORD database | sed -e 's/DEFINER=[^*]*\*/\*/' > backup.sql
要恢复:
mysql -uUSERNAME -pPASSWORD database < backup.sql
只要您要恢复的数据库存在(空或不存在),就像魅力一样。
答案 1 :(得分:1)
要从结果中删除数据库名称,您应该设置默认数据库名称,例如 -
USE db_name;
SHOW CREATE VIEW view_name;
您将获得类似(没有数据库名称的DDL) -
之类的内容CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY DEFINER VIEW `view1`
AS SELECT `table1`.`column1` AS `column1` FROM `table1`
definer是一个view属性,我没有看到任何可以从SHOW CREATE VIEW结果中删除此属性的选项。因此,您需要解析文本并手动修改它。
此外,您可以使用dbForge Studio for MySQL中的“排除DEFINER和SQL SECURITY子句”选项来尝试“生成架构脚本”或“备份”工具。它将帮助您通过几个步骤生成所需的脚本:
答案 2 :(得分:1)
使用phpmyadmin导出sql转储时,它会创建如下的VIEW表:
我已经使用mysqldump
进行了检查,这完全相同。 mysqldump和PHPMyAdmin似乎都执行SHOW CREATE,这导致在create语句中有一个安全定义器。我认为没有办法“关掉它”。
每次我必须手动编辑sql转储以删除root用户和数据库名称。
这是我可以提供帮助的地方。手动编辑SQL文件是很糟糕的,而且它太容易出错。在我想要导入的平台上不存在导出用户之前,我遇到过这些问题。我需要编辑的唯一内容就是CREATE和VIEW之间的所有内容。
现在,既然你已经用php
标记了你的问题,我想你知道如何在命令行中使用它。这是一个用空字符串替换所有非必要值的脚本:
<?php
$string = 'CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER
VIEW `database`.`table` AS';
$string = preg_replace(
'/CREATE .*(TABLE|VIEW) `[^`]+`\.(`[^`]+`)/s',
'CREATE $1 $2',
$string
);
var_dump( $string );
可能不是您问题的直接答案,但它可以防止您必须手动编辑转储。
答案 3 :(得分:1)
只用了8年,但是phpmyadmin现在包括一个防止出现此问题的选项:-
排除当前用户的定义
它显示在CREATE VIEW部分下,选择它,您将获得一个可以正常工作的摘录。
答案 4 :(得分:0)
它使用DEFINER = {user |创建一个VIEW CURRENT_USER}和完全限定的表名,因为在导出期间,VIEW PHPMyADMIN执行SHOW CREATE VIEW database_name
。view_name
;返回所有这些值,因为它是SHOW CREATE VIEW结果的一部分。
请参阅this。
答案 5 :(得分:0)
我使用这个简单的脚本在使用mysqldump导出后删除
<?php
$file = file_get_contents($argv[1]);
$position = strpos($file, 'Final view structure for view');
if (false !== $position) {
echo substr($file, 0, $position);
}
else {
die('not found');
}
答案 6 :(得分:-1)
在linux中,删除文本文件中不需要的信息非常简单。鉴于CREATE VIEW
创建了类似的东西:
CREATE ALGORITHM = UNDEFINED DEFINER =
USER
@HOST
SQL安全定义视图VIEWNAME
...等等。
您可以使用以下sed:
sed -e 's/ALGORITHM.*DEFINER VIEW/VIEW/' backup-mysqldump.sql > backup.sql
您还可以在一个命令中使用mysqldump
,并使用管道:
mysqldump -uUSERNAME -pPASSWORD database |sed -e 's/ALGORITHM.*DEFINER VIEW/VIEW/' > backup.sql