未经 CREATE 许可将 SQL 转储导入 Typo3 安装
Import SQL dump into Typo3 installation without CREATE permission
我有一个客户有一个 Typo3 网站,该网站托管在对数据库用户有非常严格政策限制的网络服务器上。
我想为该站点创建一个开发站点,为此,我需要复制原始站点的数据库。问题是,我可以通过 phpMyAdmin 使用的数据库用户没有 CREATE
能力。
所以直接导出 sqldump 并将其导入到开发站点的数据库中是行不通的,它给我一个“#1044 访问被拒绝”错误。此外,当我只是尝试使用 "database copying" 工具中内置的 phpMyAdmin 时,我得到了同样的错误。
当然拒绝通过 ODBC 进行外部访问。虚拟主机支持对我的问题还没有太大帮助。
我的问题:你能想出什么方法可以在不使用 phpMyAdmin 或通过 ODBC 进行外部访问的情况下将 sqldump 导入到空数据库或现有的 Typo3 数据库中吗?也许可以通过一些 PHP 脚本? Typo3 使用的 DB 用户必须能够进行 DB 更改,但它只有本地访问权限,所以我不能使用它,它也与我在 phpMyAdmin 上可以使用的不同。
我找到了解决问题的方法:
Typo3 本身使用的数据库用户当然有权更改数据库,否则 Typo3 将无法正常工作。但是,该用户仅限于本地使用,因此只能从服务器使用。
我的问题的解决方案是在我上传到服务器的 PHP 脚本中使用 Typo3 DB 用户。该脚本导入 sql 转储,我通过 FTP.
将其放入与脚本相同的文件夹中
脚本不是我自己写的,而是我找到的here。我只是稍微改变了它。我还遇到了 sql 转储非常大的问题,因此该脚本会打破 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);
我有一个客户有一个 Typo3 网站,该网站托管在对数据库用户有非常严格政策限制的网络服务器上。
我想为该站点创建一个开发站点,为此,我需要复制原始站点的数据库。问题是,我可以通过 phpMyAdmin 使用的数据库用户没有 CREATE
能力。
所以直接导出 sqldump 并将其导入到开发站点的数据库中是行不通的,它给我一个“#1044 访问被拒绝”错误。此外,当我只是尝试使用 "database copying" 工具中内置的 phpMyAdmin 时,我得到了同样的错误。
当然拒绝通过 ODBC 进行外部访问。虚拟主机支持对我的问题还没有太大帮助。
我的问题:你能想出什么方法可以在不使用 phpMyAdmin 或通过 ODBC 进行外部访问的情况下将 sqldump 导入到空数据库或现有的 Typo3 数据库中吗?也许可以通过一些 PHP 脚本? Typo3 使用的 DB 用户必须能够进行 DB 更改,但它只有本地访问权限,所以我不能使用它,它也与我在 phpMyAdmin 上可以使用的不同。
我找到了解决问题的方法:
Typo3 本身使用的数据库用户当然有权更改数据库,否则 Typo3 将无法正常工作。但是,该用户仅限于本地使用,因此只能从服务器使用。
我的问题的解决方案是在我上传到服务器的 PHP 脚本中使用 Typo3 DB 用户。该脚本导入 sql 转储,我通过 FTP.
将其放入与脚本相同的文件夹中脚本不是我自己写的,而是我找到的here。我只是稍微改变了它。我还遇到了 sql 转储非常大的问题,因此该脚本会打破 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);