为什么我的数据库导入会丢失文本小工具数据?

时间:2011-02-10 作者:Dillie-O

我已经在我们的开发机器上的WordPress中创建了一个站点。在我们使用的主题中,有许多小部件区域可以显示文本(边栏和首页)。我在所有这些区域中使用了简单的文本小部件来放置显示信息。

当我将站点迁移到生产环境时,我使用WP-DB-Backup插件对数据库进行快照。然后我编辑了结果。sql文件更新所有文件路径和URL引用,以指向我们的生产站点。

创建数据库、网站并将所有文件复制到生产站点后,我运行。从mysql命令提示符导入sql文件,将数据导入新数据库。

然而,当我进入生产站点时,一些文本会出现,而一些则不会。当我查看站点的widgets部分时,一些widget区域中的文本widget会丢失。文本小部件甚至在“非活动小部件”区域中都不可见,它们根本就不存在。

我甚至尝试使用backwup插件重复这个过程,注意到当它转储数据库时,SQL语法是不同的。

为什么在导入过程中丢失文本小部件数据?

5 个回复
最合适的回答,由SO网友:Otto 整理而成

这就是您的问题所在:

然后我编辑了结果。sql文件更新所有文件路径和URL引用,以指向我们的生产站点。

你不能那样做。WordPress将许多选项存储为“序列化数据”,其中包含事物的字符串内容及其长度。因此,当您修改URL且长度更改时,序列化的数据不再正确,PHP会拒绝它。

长期的问题是,基本上,你做错了。如果您正在设置一个将迁移其数据的开发站点,那么它应该具有与您的生产站点完全相同的URL。您可以手动编辑主机文件,为生产域(如example.com)提供不同的IP地址(如127.0.0.1),因此“生产”URL将成为开发站点,仅供您使用。然后,您可以使用该生产URL创建数据、链接和其他所有内容,并且在迁移数据时,无需对其进行任何更改。

但是,短期内,不要对SQL文件使用简单的文本搜索/替换。正如你所发现的,这会破坏一切。

虽然我不太愿意提出建议,但有一种方法可以修改WordPress核心代码来处理这些中断的序列化。您必须修改wp包含/功能。php文件,并将maybe\\u unserialize()函数更改为:

function maybe_unserialize( $original ) {
    if ( is_serialized( $original ) ) {
        $fixed = preg_replace_callback(
            \'!(?<=^|;)s:(\\d+)(?=:"(.*?)";(?:}|a:|s:|b:|i:|o:|N;))!s\',
            \'serialize_fix_callback\',
            $original );
        return @unserialize( $fixed );
    }
    return $original;
}
function serialize_fix_callback($match) { return \'s:\' . strlen($match[2]); }  
这不是一个可行的长期解决方案。它应该只用来让你现在起床工作。从长远来看,您需要修复您的开发过程,这样您就不必一开始就进行这种URL搜索。

SO网友:Subharanjan

为了解决这个问题,我总是使用WordPress Serialized Search & Replace 此处提供的工具。它工作得非常好,没有任何问题。我已经在我所有的站点迁移需求中使用了很长时间了。这确实解决了将开发数据库迁移到生产中的问题。

https://interconnectit.com/products/search-and-replace-for-wordpress-databases/

SO网友:Yoav Aner

奥托的回答很准确。我也发现了这一点。

然而,我在http://spectacu.la/search-and-replace-for-wordpress-databases/

要将wordpress和迁移到新的url/域名,请执行以下操作:

将现有wordpress的DB转储(例如使用phpmyadmin)还原到新位置(无需修改)。la进入wordpress主文件夹(它不是插件…)

  • 将浏览器指向新站点,在新站点上运行脚本,例如:。http://new-website.url/searchreplacedb.php
  • SO网友:Tom Auger

    OP在数据库导出文件上执行搜索和替换时过于热情,最终更改了一些序列化数据中出现的“wp\\uu1”。解决方案是通过在正则表达式中包含反勾号,然后在导入后手动更新数据库中剩余的键,从而在搜索和替换中更加节省。

    如果您正在迁移和更改前缀,并且喜欢更手动的方法,请执行以下操作(这只解决OPs问题,不涉及更新站点URL)

    备份数据库exportSQL文件并将其移动到新环境中(我的示例假定文件名为Backup\\YYYY-MM-DD.sql)

  • 对sql文件执行大规模搜索和替换,以更改表名以使用新前缀(在导入sql文件之前!)。一种方法是使用perl-p-i.bak-e“s/`wp\\u/` myprefix\\ug”backup\\u YYYY-MM-DD.sql之类的Perlone线性函数将sql数据导入数据库中,更新包含前缀硬编码的\\u选项中的任何键:更新myprefix\\u options setoption\\u name=concat(\'myprefix\\uu\',substr(option\\u name,4)),其中选项\\u name(wp\\u%)之类的选项更新\\u user\\u meta中的任何键包含硬编码前缀:update myprefix\\u usermeta setmeta\\u key=concat(\'myprefix\\u\',substr(meta\\u key,4)),其中meta\\u key类似于\'wp\\u%\'
  • SO网友:Ricardo Martins

    我曾经WP Migrate 插件witch取代了http和文件夹补丁。我在导入时遇到一个问题,但解决了将以下几行放在生成的sql顶部的问题:

    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8 */;
    /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
    /*!40103 SET TIME_ZONE=\'+00:00\' */;
    /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
    /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
    /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=\'NO_AUTO_VALUE_ON_ZERO\' */;
    /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
    
    我还尝试了@Yoav回复的搜索和替换工具(v2.1),但它仍然会破坏我的序列化数据。

    结束

    相关推荐

    插件的MySQL数据库帮助

    我正在使用一个名为MyReview 但我想对它做一些修改。该插件具有评论帖子的功能,用户将根据帖子的类别对帖子进行星级评分,但在该插件中,用户可以根据用户的需要对帖子进行任意次数的星级评分,这是我不想要的,我想要的是用户只需一次就可以对帖子进行星级评分,为此我与该插件的作者进行了交流,他建议我这样做,通过相同的电子邮件ID查询评论表中的任何评论,检查是否有任何附加的评分,如果有,则不接受评分。所有这些变化都将纳入多年电价节约计划。php。如果您了解PHP,并且熟悉使用phpMyAdmin来理解数据库表,那