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

2023-11-26

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

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

但是,我找不到生成此类报告的函数。所有跟踪报告均针对各个表,如果我必须单击所有表(20+),则会失去此功能的优势。所有表都不会更改,但我不想跟踪更改的内容,这就是我希望 phpMyAdmin 为我做的事情。

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

所以,总而言之,这就是我正在寻找的:

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

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


解析“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遇到现有表的语句,因此仅创建目标数据库中仍然不存在的表。
这种方法显然有一些缺点:

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

最后的建议:在继续之前,请务必对目标数据库进行完整备份!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 phpMyAdmin 的跟踪机制迁移数据库 的相关文章

随机推荐

  • Excel 多个条件的中位数

    基本上在Excel中我想要一张表格 就像下面右边给出的那样 我的数据规模比给出的例子大得多 它有每个主题 每个条件的中位数 例如TADA TADP TPDA TPDP 理想情况下 我会使用数据透视表 但是 Excel 不会在数据透视表中执行
  • Python3双向串口通信:读入数据

    我正在尝试通过Python3建立双向通信 我的 USB 端口之一插入了一个激光测距仪 我想向其发送 接收命令 我有一张可以发送的命令以及它们将返回的内容 因此这部分已经存在 我需要的是一种实时方便的方法 到目前为止我有以下代码 import
  • GameKit 无线网络连接?

    我读到 从 iPhone OS 3 1 开始 GameKit 支持 wifi 连接 但文档指出 如果您的应用程序配置了 对等选择器允许互联网 连接 您的应用程序必须 还解雇同行选择器和 提供自己的配置界面 互联网连接 这还成立吗 如果是这样
  • 为什么我的类型化数据集不喜欢临时表?

    我正在尝试将表适配器添加到 SQL Server 2005 Express 中的存储过程 然而 存储过程使用一个名为 temp 的临时表 创建表适配器时 Visual Studio 抱怨 未知对象 temp 并表示存储过程返回 0 列 这是
  • 如何静音“其类型使用匿名命名空间 [-Werror]”gcc 版本 4.8.2

    在我的项目的一个头文件中 以下行包含在inline method typedef boost archive iterators transform width
  • Codeigniter/PHP 会话安全问题

    我正在使用 Codeigniter 开发一个 Web 应用程序 当用户通过我的网站进行身份验证时 我当前将他们的 用户标识符 存储在我的会话 cookie 中 我已启用加密 我的几个模型类使用会话 cookie 的 用户标识符 参数中的值来
  • 如何放大矩形中绘制的填充样式? [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我正在使用 Net 绘图来绘制图表 它本质上是一个堆积条形图 我遇到的问题是 我想减少填充样式中的线条数量 以便在某种程度上放大它以使其更清晰 我环顾四周 但没有发现任何可以帮助我的东
  • 如何在 vtkStructuredGrid 上设置数据值

    我正在尝试用分析字段填充结构化网格 但是尽管阅读了 vtk 文档 我还没有找到如何在网格点实际设置标量值或设置网格的间距 原点信息 从下面的代码开始 我该如何 将空间信息与网格相关联 即单元格 0 0 0 位于坐标 0 0 0 每个方向的间
  • 使用selenium保存页面中的图像

    我正在使用 Selenium 和 Google Chrome 驱动程序以编程方式打开页面 每个页面上都有一个我想下载的动态生成的图像 目前 我正在等待页面完成加载 然后获取图像 URL 并使用 System Net WebClient 下载
  • 如何创建线程安全的ContentProvider?

    Android 文档说 可以从各种 ContentResolver 调用 ContentProvider 方法 不同进程和线程中的对象 必须实现它们 以线程安全的方式 我在 Stackoverflow 上找到了这篇文章Android sql
  • go float 零除编译器错误

    这种行为有何意义 只打印编译器警告而不是错误不是更有意义吗 func main var y float64 0 0 var x float64 4 0 y fmt Println x Inf func main var x float64
  • 如何仅更改 javafx css 中的左填充

    我经常使用 html css 但我对 javafx css 完全陌生 所以这将是一个新手问题 但我在任何地方都找不到答案 我有一个充满标签的大网格窗格 除了其他标签之外 我可以为所有这些标签设置填充 例如 GridPane containe
  • C++ 中的越界和未定义的行为

    我知道在 C 中 超出缓冲区范围的访问是未定义的行为 这是来自 cppreference 的示例 int table 4 bool exists in table int v return true in one of the first
  • 两个字符相加产生 int

    我制作了一个简单的程序并使用 GCC 4 4 4 5 编译它 如下所示 int main char u 10 char x x char i u x return 0 g c Wconversion a cpp 我有以下内容 a cpp I
  • Jackson JSON - 反序列化 Commons MultiMap

    我想使用 JSON 序列化和反序列化 MultiMap Apache Commons 4 要测试的代码段 MultiMap
  • 非常量复制构造函数和返回值的隐式转换

    考虑以下 C 代码 struct B struct A A int A A missing const is intentional A B operator B A f return A 1 compiles fine return 1
  • 粘性灵活的页脚和页眉 CSS 在 WebKit 中工作正常,但在 Gecko 中不行

    我正在尝试构建一个允许灵活高度的页眉和页脚的布局 中间的部分占用剩余空间 中间的任何溢出都应该为该中间部分提供一个滚动条 我的适用于 Safari 和 Chrome 的代码是
  • Angular:构建后是否可以读取json文件

    我正在开发一个 Angular 7 项目 该项目需要在不同的服务器上运行 我需要从环境文件中读取服务器 URL 并且无法设置为静态变量 我尝试读取 JSON 文件 但一旦我ng build该项目 它将 JSON 的内容复制为 main js
  • MVC 中 OnChange 事件的 AJAX 调用

    我必须对作为视图一部分的下拉列表的 onchange 事件进行 AJAX 调用 在更改事件中 我需要调用数据库 进行一些计算以显示 UI 然后使用计算来填充图表控件 UI 显示按此顺序 图表 下拉类别列表 带有评分的子类别列表 因此 我需要
  • 使用 phpMyAdmin 的跟踪机制迁移数据库

    在开发数据库中 我在所有表上启用了 phpMyAdmin 跟踪 它记录了我对表结构所做的所有更改 在本例中我对数据跟踪不感兴趣 到目前为止一切顺利 然后我想要做的是为所有跟踪的表取出一份报告 其中包含特定版本 或者日期甚至可以工作 所做的更