我遇到一个问题,即RENAME语句与CREATE TABLE语句冲突导致死锁。
我有一个表单
的CREATE TABLE语句CREATE TABLE `ProductTitles`
(
PRIMARY KEY (`ProductId`),
INDEX ( `Title`, `ProductScore` )
)
SELECT p.ProductId, p.Title, ps.ProductScore
FROM Products p
JOIN ProductScores ps USING (ProductId)
由于表格大小,这可能需要大约30分钟才能完成。
当另一个进程尝试使用表单的RENAME语句替换Products表时,如果此语句正在运行,则会出现此问题:
RENAME TABLE
Products TO ProductsOld,
ProductsNew TO Products
然后,此重命名语句锁定Products表以进行读取和写入,直到CREATE TABLE语句完成。
我的问题是如何避免这种情况?
是否可以使用锁,或者可能查询是否存在CREATE TABLE语句,以避免在CREATE语句完成之前运行RENAME语句?
据我所知,无论是使用MyISAM还是InnoDb都会出现这种情况。必须有一些机制来防止这种情况发生。
答案 0 :(得分:0)
如果您使用myisam count()非常快,您可以在尝试重命名之前将Products的大小与ProductTitles进行比较
答案 1 :(得分:0)
重命名表格并不是您正在做的事情的最佳方式。最好使用脚本将Products中的所有数据写入ProductsOld并从Products中删除。