5

我在 Wordpress 论坛上四处寻找,但没有找到任何东西,所以我想我可以在这里试试。

如果您有一个用于测试新插件等的 staging/dev Wordpress 设置,您如何将 staging 数据库中的数据迁移回生产数据库?是否有“Wordpress 最佳实践”方法可以做到这一点,或者我是否仅限于必须手动将表从一个数据库迁移到另一个?

4

6 回答 6

3

我有一个脚本,它 mysqldumps 我的生产 Wordpress 数据库的副本,通过我的测试 Wordpress 安装恢复它,然后更正测试数据库中的所有“生产”设置和 url。

我的生产和测试数据库都位于同一台服务器上,但是您可以更改 mysqldump 设置以从远程 mysql 服务器转储并轻松恢复到本地服务器。

这是我的脚本:

overwrite_test.coach_db_with_coache_db.sh

#!/bin/bash 
dbUser="co*******"
dbPassword="*****"
dbSource="coach_production"
dbDest="coach_test"
tmpDumpFile="/tmp/$dbSource.sql"

mysqldump --add-drop-table --extended-insert --user=$dbUser --password=$dbPassword --routines --result-file=$tmpDumpFile $dbSource
mysql --user=$dbUser --password=$dbPassword $dbDest < $tmpDumpFile
mysql --user=$dbUser --password=$dbPassword $dbDest < /AdminScripts/change_coach_to_test.coach.sql

change_coach_to_test.coach.sql

-- Change all db references from @oldDomain to @newDomain

SET @oldDomain = 'coach.co.za';
SET @newDomain = 'test.coach.co.za';
SET @testUsersPassword = 'password';

UPDATE `wp_1_options` SET `option_value` = REPLACE(`option_value`,@oldDomain,@newDomain) WHERE `option_name` IN ('siteurl','home','fileupload_url');
UPDATE `wp_1_posts` SET `post_content` = REPLACE(`post_content`,@oldDomain,@newDomain);
UPDATE `wp_1_posts` SET `guid` = REPLACE(`guid`,@oldDomain,@newDomain);
UPDATE `wp_blogs` SET `domain` = @newDomain WHERE `domain` = @oldDomain;
UPDATE `wp_users` SET `user_pass` = MD5( @testUsersPassword );

-- Only valid for main wpmu site
UPDATE `wp_site` SET `domain` = @newDomain WHERE `domain` = @oldDomain;
于 2010-08-22T00:21:20.820 回答
1

我想将数据库从我的生产 wordpress 网站拉到我台式机上的离线开发副本中,这样我就可以修改网站并使用全套现有博客内容和历史对其进行测试。

这被证明是有问题的,因为简单地对数据库进行离线备份并将其导入本地开发数据库是行不通的。

克服将数据从生产数据库移动到开发数据库的这些问题可能也可以用于另一种方式 - 所以我认为您也可以将这些指南用于您想做的事情 - 只需从开发数据开始并移动它来刺激。

这里的问题是:

  1. 博客文章的永久链接名称都存储在数据库中,就像它们用于在线版本一样,但我的离线副本不在域地址中,而是在 localhost 目录中。因此,当我在本地启动站点时,尽管 css 格式和图像都已就位(图像链接是相对的),但实际的博客文章并没有出现。
  2. 整个站点的许多链接都链接回互联网,因此,如果您尝试导航到档案、评论、类别或主要帖子,您将被发送回互联网,而不是留在数据库中本地机器。

为了确保我做对了,我吹掉了我在本地机器上安装的 wordpress 并从头开始重新启动。

一旦我有一个干净的、新的 wordpress 安装和全新的默认新创建的本地数据库,我在 phpMyAdmin 中打开了数据库并查看了 wp_posts

桌子。在那里,每条记录(换句话说,每条帖子)都有一个标题为“guid”的列,它显示了该帖子的位置。例如,新鲜的,默认的第一个

install 包含这个“guid”值:

http://localhost/wordpress/?p=1

如果您查看在线版本的 wp_posts 表,您将在此位置看到您在线网站的 url。

您不能只将表批量导入本地安装,因为您将导入所有这些外部引用。这将使您的本地版本无法在本地导航。

因此,我创建了在线站点数据库的备份副本,并将其保存为本地 .sql 文件。然后我在文本编辑器中打开了该文件(我使用了notepad++,一个很棒的免费软件,但你可以使用任何文本编辑器)。我需要注意的事情:

  • 无论出于何种原因,我在线网站上的表格不仅仅是“wp_posts” - 它们是“wp_something_posts”......表格名称中有一些额外的字母。
  • 对 http://... 的任何引用,其中包含我的在线 url 而不是 localhost/wordpress

为了简单起见,我们只做帖子。在您为在线数据库制作的 .sql 备份副本中,找到 wp_posts 表的开头。它看起来像这样:

--

-- Table structure for table `wp_posts`

--



DROP TABLE IF EXISTS `wp_posts`;

CREATE TABLE `wp_posts` (

...等等。突出显示上面的所有内容,直到文件顶部标记数据库开头的注释下方(它将显示 -- Database: 'your database name')并将其删除。然后转到您的 wp_posts 表的末尾,然后删除它之后的所有内容,直到文件的底部。现在您的文件只包含您的帖子,没有其他内容。

将此保存为单独的文档。称它为posts.sql或类似的东西。

现在,在这个posts.sql文件中,您需要执行两个查找/替换操作。

  1. 查找表名称 wp_something_posts 的每个实例,并将其替换为 wp_posts。仅当在线数据库的备份副本与表名不匹配您的干净本地安装时,您才需要执行此操作。您希望此文件中的表名与本地安装的 wordpress 数据库作为此表名的名称相匹配。如果您不使这些名称匹配,您最终会将帖子导入到一个新的、不同名称的表中,这对您完全没有用处。
  2. 找到 http://... 的每个实例(用您的 url 替换省略号)并将其替换为 http://localhost/wordpress(或您的网站开发版本的本地 url)

现在再次保存此文件,以确保您已设置这些更改。

现在您已经完成了,使用 phpMyAdmin 进入本地计算机上的 wordpress 数据库,选择“导入”选项卡并将选择器导航到您刚刚创建的posts.sql文件,然后将其导入。这会将该文件中的所有数据提取到您的本地 wp_posts 表中。

完成后,浏览您当地的 wordpress 网站。你现在会在那里看到你所有的帖子。万岁!

如果您想引入您创建的评论、标签、类别和静态页面等,您可能需要对其他一些表格执行类似的操作。

我意识到这是一个复杂的过程。某处可能有一种工具可以使这项活动更容易,如果有人知道我很想了解它。如果有人知道比我所描述的更好的手动执行此操作的方法,我也很想知道!

在那之前,这就是我想出的方法。希望它可以帮助您朝着正确的方向前进。

于 2009-11-10T10:16:49.703 回答
1

这两种方法是使用工具下的导出/导入功能或复制数据库。我每周使用 WordPress 数据库备份插件给自己发送一份生产数据库的副本。

导入功能对于移动 wordpress 博客可能会有问题,因为您必须经常配置 php.ini 文件,因为您可以在托管 php 实现上上传的文件的默认值默认情况下往往太小。

于 2009-09-19T04:08:42.250 回答
1

也许你只是在寻找错误的东西。备份插件不会轻松处理这个问题吗?我知道它们存在于所有大型 CMS 软件包中......

于 2009-09-18T23:03:44.253 回答
0

您需要处理序列化的对象。这是一个处理它的客户端 HTML5 实用程序。因为它都是javascript,所以速度非常快。

另一种方法是将 bash 脚本挂接到您的部署中。因此,一旦站点被部署,数据库就会被备份并使用新域进行反序列化。

于 2012-03-22T20:52:34.740 回答
0

这大约总结了wordpress核心架构的问题......但我写了一个插件,解决了域名和绝对url存储在数据库中的问题:

http://wordpress.org/extend/plugins/root-relative-urls/

这将解决@oddbill 列出的问题。虽然不要太担心 url 在 GUID 列中,因为该字段从不用于链接生成。

@markratledge 提供了一些指向一些冗长文档的链接,这些文档基本上是这样说的:

//出口

mysqldump -u[username] -p[password] [database] > backup.sql

//进口

mysql -u[username] -p[password] [database] < backup.sql

如果您从 staging 推送到生产环境,您将希望排除 comments/comments_meta 表,这样您就不会丢失所有评论和引用(@DavidLaing 的方法将清除这些。)这假设您只在您的登台环境。如果您想在生产和暂存环境中进行更改,则需要编写同步数据的脚本,而不是批量覆盖它……祝您好运,我建议您在投资之前添加创建和修改的时间戳列当前架构的时间太多。

最后,@RussellStuever 的方法适用于大多数情况,只要确保知道您何时浏览主机映射站点与生产站点。并且真的要确定这一点,因为有些浏览器会缓存 dns 查找数天,直到您物理关闭它们并开始一个新进程。此时切换主机可能需要一些时间,并且频繁切换可能会令人沮丧。如果您需要使用 iPhone 进行测试,则需要先实时发布站点,或者使用可以将出站 Internet 请求重新映射到本地服务器的良好路由器,因为您无法在大多数移动设备上修改主机文件。

我的插件允许您从http://localhost/http://staging.server.local/http://www.production.com进行开发和测试,而不会遇到任何常见的陷阱。然后迁移数据,就像导出和导入数据一样简单,无需搜索和替换步骤或数据库设置调整。

并且不要依赖导入/导出工具,它不会捕获典型 wordpress 安装中的所有内容,并且仍然需要不必要的搜索和替换步骤。

于 2011-11-09T06:10:01.907 回答