解析“pma_tracking”表的BLOB字段的算法位于获取追踪数据的方法PMA_Tracker 类, 在里面libraries/Tracker.class.php
源文件。
从该代码开始,我编写了一个简单的 PHP 脚本来从“pma_tracking”表中提取所有数据定义语句(“DROP TABLE”语句除外)。
例如,假设您想要获取“test”数据库自版本“1”以来所有表的所有更改的列表:
<?php
$link = mysqli_init();
// Adjust hostname, username, password and db name before use!
$db = mysqli_real_connect($link, "localhost", "myuser", "mypass", "phpmyadmin")
or die(mysqli_connect_error());
// Adjust also target db name and tracking version
$db_name = "test";
$version = "1";
$sql = "SELECT schema_sql FROM pma_tracking
WHERE db_name='{$db_name}' AND version>='{$version}'
ORDER BY version,date_created";
$result = mysqli_query($link, $sql) or die(mysqli_error($link));
while ($myrow = mysqli_fetch_assoc($result)) {
$log_schema_entries = explode('# log ', $myrow['schema_sql']);
foreach ($log_schema_entries as $log_entry) {
if (trim($log_entry) != '') {
$statement = trim(strstr($log_entry, "\n"));
if (substr($statement, 0, 11) != "DROP TABLE ") {
echo "{$statement}\n";
}
}
}
}
?>
通过将脚本输出重定向到文件,您将获得一个 SQL 命令文件,其中包含(几乎)在目标(例如生产)数据库上复制架构更改所需的所有语句;该文件必须通过指定“-f”(强制)MySQL 选项来执行:
-f, --force 即使出现 SQL 错误也继续。
通过这样做,MySQL 将忽略每次执行操作时抛出的所有“表已存在”错误。CREATE TABLE
遇到现有表的语句,因此仅创建目标数据库中仍然不存在的表。
这种方法显然有一些缺点:
-
ALL the
DROP TABLE
命令将被忽略(不仅是那些从 phpMyAdmin 自动插入的命令),因此,如果您删除了源数据库中的表,则该表不会在目标数据库中删除。
-
ALL脚本错误将被忽略,因此它可能不是 100% 负担得起的。
最后的建议:在继续之前,请务必对目标数据库进行完整备份!