Phpmyadmin导出VIEW而不使用DATABASE_NAME或ALGORITHM

时间:2012-03-31 14:38:47

标签: php mysql phpmyadmin

使用phpmyadmin导出sql转储时,它会创建如下的VIEW表:

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER 
VIEW `database`.`table` etc..

每次我必须手动编辑sql转储以删除root用户和database名称。

7 个答案:

答案 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子句​​”选项来尝试“生成架构脚本”或“备份”工具。它将帮助您通过几个步骤生成所需的脚本:

  • 在数据库资源管理器中选择视图
  • 打开弹出菜单,然后单击“生成架构脚本...”命令
  • 找到选项'排除DEFINER和SQL SECURITY子句​​'并检查
  • 按“生成”按钮构建并打开SQL文本。

答案 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_nameview_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');
}

https://gist.github.com/kissarat/bbf33d10f9d7a3bc1adb

答案 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