Magento 1.7如何删除现有的多余网站和商店

时间:2014-03-24 17:04:40

标签: mysql magento magento-1.7

在我正在开展的一个大型Magento项目上(继承自前一个代理商),该安装在18个网站上拥有41家商店。

该网站拥有4万种产品和5k类别 - 因此您可以想象数据库臃肿无法相信。

我想删除除2个网站和2个商店视图之外的所有网站(每个网站一个),但使用GUI失败 - 在删除商店视图时,页面变为空白。尽管db确实从core_store表中删除了存储,但它感觉很脆弱。我也无法删除其网站的默认商店视图 - 即使有问题的网站不是安装的默认网站。

尝试删除某个网站会产生“此时无法删除该网站,请稍后再试”。

是否有一种干净,安全的方法可以直接从数据库中删除所有多余的商店,他们的父网站以及与之关联的所有数据?

谢谢。

4 个答案:

答案 0 :(得分:4)

我自己在我继承的遗留系统上面对同样的任务。我删除实际商店的过程非常简单:只需进入数据库并从core_website删除该行。这将触发级联删除,该删除会清除core_storestore_group中的相应记录,从而触发任何商店/网站范围的EAV值的其他级联删除,以及其他各种事情。您可以通过运行此查询找到完整列表(用您的数据库名称代替your_magento_database):

SELECT table_name 
FROM   referential_constraints 
WHERE  constraint_schema = 'your_magento_database' 
       AND referenced_table_name IN( 'core_store', 'core_website' ) 
       AND delete_rule = 'CASCADE' 

史蒂夫罗宾斯提到,即使在删除这些内容之后,你最终也会遇到很多孤儿"此级联删除未删除的记录。下面列出了在删除网站/商店后我经历过(通常是手动)清理的事情。

  • 客户群(每个客户群都有自己的价格指数;导致巨大的数据库膨胀)
  • 产品
      

    DELETE FROM catalog_product_entity WHERE entity_id NOT IN (SELECT product_id FROM catalog_product_website);

  • 类别
  • 目录规则
      

    DELETE FROM catalogrule WHERE rule_id NOT IN (SELECT DISTINCT rule_id FROM catalogrule_website);

  • 购物车价格规则
      

    DELETE FROM salesrule WHERE (rule_id NOT IN (SELECT DISTINCT rule_id FROM salesrule_website));

  • 配置数据(看起来像Magento 1.9自动删除了这些,但这里是一个确认的查询)
      

    SELECT * FROM core_config_data WHERE (scope="stores" AND scope_id NOT IN (SELECT store_id FROM core_store)) OR (scope="websites" AND scope_id NOT IN (SELECT website_id FROM core_website));

  • CMS页面
      

    DELETE FROM cms_page WHERE page_id NOT IN (SELECT DISTINCT page_id FROM cms_page_store);

  • 静态块
      

    DELETE FROM cms_block WHERE block_id NOT IN (SELECT DISTINCT block_id FROM cms_block_store);

  • 小部件实例
  • 扁平类别/产品表
  • 电子邮件模板
  • 税收规则,税收等级,税率
  • 管理员用户,管理员角色
  • API用户
  • 订单:我更愿意留下这些,因为性能优势很小,您可能希望以后获得这些数据,但只有您知道什么是最适合您的项目。
      

    DELETE FROM sales_flat_order WHERE store_id IS NULL

我希望这可以作为进行多店清理的其他人的有用信息。我计划更新这个答案,因为我找到了更有效的方法来进行清理。

答案 1 :(得分:1)

通过数据库手动执行。如果你从core_store表(即删除商店)执行此操作,我认为它将确保其他表中与商店相关的任何记录也将被删除。这将是你的数据库密集,并花费大量的时间,因为magento中的大多数东西都引用了商店ID,并且通过你的数字,你将拥有解决关系所需的大量数据。确保在执行任何此操作之前先备份数据库,禁用任何索引并在执行这些操作时停止写入任何数据。我建议一次做一个商店并检查结果,你仍然可以运行索引等。

其他选项当然是启动一个新的数据库实例(即只将结构复制到一个新数据库),并只将您想要的旧数据传输到新数据库中。祝好运。 : - )

答案 2 :(得分:1)

最安全的"方法是通过System>删除商店管理商店。你说过一段时间后你会得到一个白页。您可能已经耗尽内存或页面执行时间。请尝试检查错误日志,看看是否可以通过此操作。

或者,您可以删除/删除数据库中的表/记录。完成完整备份后,请使用

查看core_store
show create table core_store

在最后几行中你应该看到类似

的内容
CONSTRAINT `FK_CORE_STORE_GROUP_ID_CORE_STORE_GROUP_GROUP_ID` FOREIGN KEY (`group_id`) REFERENCES `core_store_group` (`group_id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_CORE_STORE_WEBSITE_ID_CORE_WEBSITE_WEBSITE_ID` FOREIGN KEY (`website_id`) REFERENCES `core_website` (`website_id`) ON DELETE CASCADE ON UPDATE CASCADE

ON DELETE CASCADE表示它将转到那些表引用并删除相关记录。

如果您手动删除core_store的行,则会使用其他数据。但是,它仍然遗失了很多。您可能最终会在CMS页面,块,产品,类别,根目录,客户,订单等中找到孤立数据。

请记住还要删除相关的category_flatproduct_flat表。

答案 3 :(得分:-1)

感谢您的反馈。

我在沙箱环境中使用了各种方法,并且从core_store表中删除记录确实已经级联,所以这很有效。

其他任何人这样做的注意事项;在您删除了所有商店后,您将无法删除多余的core_websites记录,直到您执行完整的重新索引(定价表上的FK约束)。

修剪除2个商店和2个网站以外的所有商店后,整个数据库已经减少了30%的规模,在core_url_rewrite表中获得了最大的胜利 - 从125万条记录减少到相对轻量级的325k!类别页面加载时间现在平均快2秒。那些多余的Magento商店Mage People:)

再次感谢您的帮助。