在我正在开展的一个大型Magento项目上(继承自前一个代理商),该安装在18个网站上拥有41家商店。
该网站拥有4万种产品和5k类别 - 因此您可以想象数据库臃肿无法相信。
我想删除除2个网站和2个商店视图之外的所有网站(每个网站一个),但使用GUI失败 - 在删除商店视图时,页面变为空白。尽管db确实从core_store表中删除了存储,但它感觉很脆弱。我也无法删除其网站的默认商店视图 - 即使有问题的网站不是安装的默认网站。
尝试删除某个网站会产生“此时无法删除该网站,请稍后再试”。
是否有一种干净,安全的方法可以直接从数据库中删除所有多余的商店,他们的父网站以及与之关联的所有数据?
谢谢。
答案 0 :(得分:4)
我自己在我继承的遗留系统上面对同样的任务。我删除实际商店的过程非常简单:只需进入数据库并从core_website
删除该行。这将触发级联删除,该删除会清除core_store
和store_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));
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));
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);
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_flat
和product_flat
表。
答案 3 :(得分:-1)
感谢您的反馈。
我在沙箱环境中使用了各种方法,并且从core_store表中删除记录确实已经级联,所以这很有效。
其他任何人这样做的注意事项;在您删除了所有商店后,您将无法删除多余的core_websites记录,直到您执行完整的重新索引(定价表上的FK约束)。
修剪除2个商店和2个网站以外的所有商店后,整个数据库已经减少了30%的规模,在core_url_rewrite表中获得了最大的胜利 - 从125万条记录减少到相对轻量级的325k!类别页面加载时间现在平均快2秒。那些多余的Magento商店Mage People:)再次感谢您的帮助。