首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >利用phpMyAdmin的跟踪机制迁移数据库

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

Stack Overflow用户
提问于 2012-03-06 18:23:16
回答 5查看 4.4K关注 0票数 7

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

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

然而,我找不到产生这样一份报告的功能。所有的跟踪报告都是针对单个表的,如果我必须单击所有表(20+),它就会失去此功能的好处。所有的表都不会更改,但我不想跟踪更改的内容,这就是我希望phpMyAdmin为我做的。

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

总之,这就是我要找的:

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

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

EN

回答 5

Stack Overflow用户

发布于 2012-12-03 22:22:16

解析"pma_tracking“表的BLOB字段的算法位于跟踪器级getTrackedData方法中,位于libraries/Tracker.class.php源文件中。

从这段代码开始,我编写了一个简单的PHP脚本,从"pma_tracking“表中提取所有数据定义语句( "DROP”语句除外)。

例如,假设您希望获得"test“数据库自版本”1“以来所有表的所有更改的列表:

代码语言:javascript
运行
复制
<?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,-强制继续,即使我们得到一个SQL错误。

这样做,MySQL将忽略每次遇到现有表的CREATE TABLE语句时抛出的所有“表已经存在”错误,从而只创建目标数据库中仍然不存在的表。

这种方法显然有一些缺点:

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

最后一个建议:总是在继续之前对目标数据库做一个完整的备份!

票数 3
EN

Stack Overflow用户

发布于 2012-12-01 12:14:08

我不知道如何使用phpMyAdmin来解决这个问题,但是还有其他一些工具可以帮助您实现您想要的效果。液基就是其中之一。我以前也用过几次,很不错。要掌握它的诀窍需要一点时间,但我认为它可能对你有帮助。

票数 1
EN

Stack Overflow用户

发布于 2012-11-28 04:16:35

我不太熟悉SQL工具,所以我不能推荐任何可以帮助您的东西,但是我可以尝试帮助定制工作流.

  1. 创建一个名为structure_log的表
  2. 创建一个名为print_stucture.php的PHP脚本,该脚本可以将任何信息打印到服务器上的文件中,将文件保存为时间戳(这将是您的版本号),并将名称保存在structure_log表中。
  3. 创建一个运行print_structure.php的crontab,不管您想要什么
  4. 创建一个名为delete_dups.php的structure_log脚本,它从structure_log表中获取最后两个记录,比较这两个文件,如果它们是相同的(表示结构没有变化),使用最新的时间戳(文件名)删除其中的一个,并从structure_log表中删除该记录。
  5. 创建一个运行delete_dups.php的crontab,它的运行频率是运行print_structure.php的一半

这将使您的服务器上有一个版本控制文件夹。您可以随时手动运行print_structure.php脚本,并将其与服务器文件夹中的最新版本日志进行比较,以查看您刚刚运行的数据库是否与上次运行版本检查时相同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9589619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档