2009-09-18 71 views
5

我环顾了这个Wordpress论坛,并没有找到任何东西,所以我想我可能会在这里尝试。WordPress的数据库迁移

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

回答

1

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

1

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

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

1

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

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

克服将数据从生产数据移动到开发数据库的这些问题可能也可能用于其他方式 - 所以我认为您可以将这些准则用于您想要执行的操作 - 只需从开始开发数据并将其移至prod。这里

的问题是:

  1. 为 博客文章都存储在数据库 ,因为他们会为 在线版本的永久链接名称,但我的离线复制 不在域名地址,而不是 它位于localhost目录中。所以 当我在本地推出该网站时, 虽然css格式和 图片全部到位(图片 链接是相对的),实际 博客文章没有显示。
  2. 许多整个 站点链接的链接的退了出去到互联网, 所以如果你尝试导航到 档案,或评论,或 类别或主要岗位,你 送回到到互联网而不是停留在本地机器上的数据库 中。

为了确保我这样做正确,我吹掉了我在本地机器上的wordpress安装并重新启动。

我曾有过一个干净,新的WordPress的安装和全新的默认新创建的本地数据库,我在phpMyAdmin打开了数据库,并采取了看看wp_posts

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

安装包含此“GUID”值:

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

如果您在您的在线版本的wp_posts表看,你会看到,而不是在这个位置网址到您的网站在线。

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

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

  • 无论出于何种原因,我 在线网站的表不仅仅是,例如, “wp_posts” - 他们是 “wp_something_posts” ......有 表名中有一些额外的字母。
  • 到http任何引用:包含我的在线网址,而不是本地主机/ WordPress的// ...

为了简单起见,让我们只是做只是职位。在您的联机数据库的.sql的备份副本中,找到wp_posts表的开头。它看起来像这样:

-- 

-- Table structure for table `wp_posts` 

-- 



DROP TABLE IF EXISTS `wp_posts`; 

CREATE TABLE `wp_posts` (

...等等。突出显示文件顶部标记数据库开头的注释(它会说 - 数据库:'您的数据库名称')之上的所有内容并将其删除。然后转到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网站。你现在会看到你所有的帖子。万岁!

您可能需要做其他几桌类似的东西,如果你想在你的注释,标记,类别和静态页面,使您创建等

我意识到这是一个令人费解的过程。在那里可能有一个工具可以让这个活动更容易,如果有人知道一个我想知道的。如果有人知道比我描述的更好的手动操作方式,我也很想知道!

在此之前,这是我想出如何去做的方式。希望它能帮助你朝着正确的方向前进。

3

我有一个脚本,mysqldumps我生产的Wordpress数据库的副本,恢复它在我的测试WordPress的安装&然后更正测试数据库中的所有“生产”设置&网址。

我的生产&测试数据库生活在同一台服务器上,但你可以更改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; 
0

这大概总结了与WordPress的问题核心架构......但我写了一个解决问题的插件有域名和绝对URL MS存储在数据库中:

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

这将解决由@oddbill概括的问题。尽管不要过多关注GUID列中的url,因为该字段从未用于链接生成。

@markratledge提供了一些链接到一些冗长的文件,基本上这样说:

//出口

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

//进口

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

你如果您从分段推送到产品,则需要排除comments/comments_meta表格不会丢失你所有的评论和引用(@DavidLaing的方法会将这些内容全部清除掉)。而且这种做法假设你只是在暂存环境中进行内容更改。如果您想在生产环境和暂存环境中进行更改,则需要编写同步数据而不是批量覆盖数据的脚本......祝您好运,可以建议在投资之前添加创建&修改过的时间戳列与当前模式有太多时间。

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

我的插件可以让你开发和测试http://localhost/http://staging.server.local/http://www.production.com没有任何常见的陷阱。然后迁移数据,就像导出和导入数据一样简单,没有搜索&替代必要的步骤或数据库设置调整。

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

0

您需要处理序列化的对象。这是一个client side HTML5 utility来处理它。因为它全是javascript,所以速度很快。

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