php - 使用 phpMyAdmin 的跟踪机制迁移数据库

标签 php mysql phpmyadmin database-migration

在开发数据库中,我在所有表上启用了 phpMyAdmin 跟踪。它记录了我对表结构所做的所有更改(在这种情况下,我对数据跟踪不感兴趣。)到目前为止一切顺利。

然后我想做的是为所有跟踪的表取出一个报告,其中包含从特定版本(或者日期甚至可以工作)所做的更改,以便我可以在我的生产数据库上运行生成的 SQL ,在升级到新版本时,并确保数据库是相同的,而不必担心手动处理带来的错误。

但是,我找不到可以生成此类报告的函数。所有的跟踪报告都是针对单个表格的,如果我必须点击所有表格(20 多个),它就会失去这个功能的好处。所有表都不会更改,但我不想跟踪更改的内容,这就是我希望 phpMyAdmin 为我做的事情。

我尝试对存储更改的 pma_tracking 表进行自己的查询,并取得了部分成功。问题是一个版本的所有更改都存储为一个 BLOB,并且每个新版本都会创建一个 DROP TABLE/CREATE TABLE 语句,而且我不能删除生产数据库上的表,因为那里有数据(我是不是每次都重新创建数据库,只是添加增量更改)。我只是想升级结构,而我唯一需要 CREATE TABLE 语句的时候是在数据库中实际创建一个新表的时候。所以我想我可以用 SQL 过滤掉那些,但它被存储为博客,然后我将不得不解析和处理看起来过于复杂的 blob 文本。

总而言之,这就是我要寻找的:

  • 一个自动跟踪系统/工作流,记录所有结构更新,并可以从一个版本或时间点为整个数据库创建增量 SQL 报告。
  • 如果可能的话,我不想使用任何额外的第三方应用程序(我只想使用 phpMyAdmin 或 MySQL)

此外,如果有人有更好的想法,我很乐意对工作流程发表评论。任何帮助表示赞赏。

最佳答案

解析“pma_tracking”表的BLOB字段的算法位于getTrackedData PMA_Tracker class 的方法, 在 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 Continue even if we get an SQL error.

通过这样做,MySQL 将忽略每次遇到针对现有表的 CREATE TABLE 语句时抛出的所有“表已存在”错误,从而仅创建仍然存在的表目标数据库中不存在。
这种做法显然有一些缺点:

  1. ALL DROP TABLE 命令将被忽略(不仅是那些从 phpMyAdmin 自动插入的命令)因此,如果您删除了源数据库中的表,该表将被忽略在目标数据库中不会被删除。
  2. ALL 脚本错误将被忽略,因此可能不是 100% 负担得起。

最后的忠告:在继续之前始终对目标数据库进行完整备份!

关于php - 使用 phpMyAdmin 的跟踪机制迁移数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9589619/

相关文章:

php - 关于使用PHP在网站上进行成员(member)登录;想什么?

php - 每页一个测验项目(php/mysql 测验程序)

javascript - 如何在ajax中从php数组获取 "data"

php - 如何从一个表单向两个表中插入数据?

php - 在一个查询mysql中添加和替换

php - mysql如何将同一个表的一个字段的数据复制到另一个字段

mysql - if语句,修改输出

php - 关于在mysql数据库中存储值的疑问

MySQL 触发器 - 比较两个不同表的值

php - Xampp Lite PHPmyAdmin 不会提示要求输入用户名和密码