【问题标题】:Import SQL dump into Typo3 installation without CREATE permission在没有 CREATE 权限的情况下将 SQL 转储导入 Typo3 安装
【发布时间】:2019-06-17 11:39:33
【问题描述】:

我有一个客户的 Typo3 网站托管在网络服务器上,对数据库用户有非常严格的政策。

我想为该站点创建一个开发站点,为此,我需要复制原始站点的数据库。问题是,我可以通过phpMyAdmin使用的数据库用户没有CREATE的能力。

所以很明显地导出一个 sqldump 并将其导入到开发站点的数据库中,它不起作用,它给了我一个“#1044 access denied”错误。此外,当我只是尝试使用“数据库复制”工具中内置的 phpMyAdmin 时,我得到了同样的错误。

通过 ODBC 进行的外部访问被拒绝。虚拟主机支持对我的问题还没有太大帮助。

我的问题:您能想出什么方法可以在不使用 phpMyAdmin 或通过 ODBC 进行外部访问的情况下将 sqldump 导入空数据库或现有 Typo3 数据库吗?也许可以通过一些 PHP 脚本来实现? Typo3 使用的 DB 用户必须能够进行 DB 更改,但它只有本地访问权限,所以我不能使用它,它也与我在 phpMyAdmin 上可以使用的不同。

【问题讨论】:

  • 因此,在您可以完全控制 MySQL 的 PC 上设置您的开发站点。您喜欢 PC 上的操作系统是什么
  • 您不能在没有创建的情况下创建数据库导入/导出,但是您可以做的是从导出/导入中删除所有创建语句。但这会让您需要一个与导出数据库具有完全相同结构的数据库。
  • 开发环境对客户来说同时也是一个临时站点,所以他需要有访问权限。
  • 我尝试了将数据插入预定义数据库结构的方法,但几乎不可能设置完全相同的数据库结构,因为它非常复杂。只是一个新的 Typo3 安装与该客户站点的结构不同。
  • 因此在其中一台客户 PC 上设置开发站点。安装 Apache/MySQL/PHP,他们可以在自己的网络中将其用作测试环境。这甚至使保护它更容易

标签: php mysql database typo3 database-migration


【解决方案1】:

我找到了解决问题的方法:

当然,Typo3 本身使用的 DB 用户确实有权更改 DB,否则 Typo3 将无法正常工作。但是,该用户仅限于本地使用,因此只能从服务器使用。

我的问题的解决方案是在我上传到服务器的 PHP 脚本中使用那个 Typo3 DB 用户。该脚本导入了我通过 FTP 将其放在与脚本相同的文件夹中的 sql 转储。

脚本不是我自己写的,而是找到了here。我只是稍微改变了一下。我还有一个问题是我的 sqldump 非常大,所以这个脚本会破坏 PHP 内存上限。我解决了这个问题,只需使用一个名为 SQLDumpSplitter 的工具将转储分成几部分并逐个导入它们。

有点hacky,但它有效!

// Name of the file
$filename = 'sqldump.sql';
// MySQL host
$mysql_host = 'thehost';
// MySQL username
$mysql_username = 'dbusername';
// MySQL password
$mysql_password = 'dbpassword';
// Database name
$mysql_database = 'dbdatabase';

// Connect to MySQL server
$con = @new mysqli($mysql_host, $mysql_username, $mysql_password, $mysql_database);

// Check connection
if ($con->connect_errno) {
    echo "Failed to connect to MySQL: " . $con->connect_errno;
    echo "<br/>Error: " . $con->connect_error;
}

// Temporary variable, used to store current query
$templine = '';
// Read in entire file
$lines = file($filename);
// Loop through each line
foreach ($lines as $line) {
// Skip it if it's a comment
    if (substr($line, 0, 2) == '--' || $line == '')
        continue;

// Add this line to the current segment
    $templine .= $line;
// If it has a semicolon at the end, it's the end of the query
    if (substr(trim($line), -1, 1) == ';') {
        // Perform the query
        $con->query($templine) or print('Error performing query \'<strong>' . $templine . '\': ' . ' ' . '<br /><br />');
        // Reset temp variable to empty
        $templine = '';
    }
}
echo "Tables imported successfully";
$con->close($con);

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 2015-11-12
    • 2013-01-25
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    相关资源
    最近更新 更多