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

前端之家收集整理的这篇文章主要介绍了使用phpMyAdmin的跟踪机制迁移数据库前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在开发数据库中,我在所有表上启用了PHPMyAdmin Tracking.它记录了我对表结构所做的所有更改(在这种情况下,我对数据跟踪不感兴趣.)到目前为止一切顺利.

我想要做的是为所有跟踪表取出一个报告,使用特定版本(或者日期甚至可以工作)进行更改,以便在升级时可以在生产数据库上运行生成sql到新版本,并确保数据库是相同的,而不用担心手动处理这些错误.

但是,我找不到生成此类报告的功能.所有跟踪报告都是针对单个表格的,如果我必须点击所有表格(20),它就会带走这个功能的好处.所有表都没有改变,但我不想跟踪改变的内容,这就是我想要PHPMyAdmin为我做的事情.

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

所以,作为总结,这正是我正在寻找的:

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

此外,如果有人有更好的想法,我会喜欢对工作流程的评论.任何帮助赞赏.

用于解析“pma_tracking”表的BLOB字段的算法位于library / Tracker.class.PHP文件中的 PMA_Tracker classgetTrackedData方法中.
从该代码开始,我编写了一个简单的PHP脚本来从“pma_tracking”表中提取所有数据定义语句(“DROP TABLE”语句除外).
例如,假设您要获取自版本“1”以来“test”数据库的所有表的所有更改的列表:
<?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,11) != "DROP TABLE ") {
                echo "{$statement}\n";
            }
        }
    }
}

?>

通过重定向文件上的脚本输出,您将获得一个sql命令文件,其中包含(几乎)复制目标(例如生产)数据库上的模式更改所需的所有语句;必须通过指定“-f”(强制)MysqL选项来执行此文件

-f,–force Continue even if we get an sql error.

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

>将忽略所有DROP TABLE命令(不仅是那些从PHPMyAdmin自动插入的命令),因此,如果您删除了源数据库中的表,则不会在目标数据库删除该表.
>所有脚本错误都将被忽略,因此可能无法100%承受.

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

猜你在找的PHP相关文章