2010-10-05 3 views
1

J'ai un problème où une instruction RENAME se heurte à une instruction CREATE TABLE pour provoquer un blocage.Problème avec les instructions MySQL RENAME et CREATE TABLE en conflit

J'ai cela peut prendre CREATE TABLE de la forme

CREATE TABLE `ProductTitles` 
(
    PRIMARY KEY (`ProductId`), 
    INDEX (`Title`, `ProductScore`) 
)  
SELECT p.ProductId, p.Title, ps.ProductScore 
FROM Products p 
JOIN ProductScores ps USING (ProductId) 

En raison de la taille des tables, environ 30 minutes.

Le problème se produit lorsque cette déclaration est en cours d'exécution lorsqu'un autre processus pour remplacer la table des produits en utilisant une instruction RENAME du formulaire:

RENAME TABLE 
Products TO ProductsOld, 
ProductsNew TO Products 

Cette déclaration de changement de nom verrouille alors la table Produits pour lit et écrit jusqu'à ce que le L'instruction CREATE TABLE est terminée.

Ma question est de savoir comment éviter cette situation?

Est-il possible d'utiliser des verrous, ou peut-être d'interroger la présence d'une instruction CREATE TABLE, pour éviter d'exécuter l'instruction RENAME jusqu'à ce que l'instruction CREATE soit terminée?

Pour autant que je sache, cela se produit si vous utilisez MyISAM ou InnoDb. Il doit y avoir un mécanisme pour se protéger contre cela.

Répondre

0

Si vous utilisez le nombre MyISAM() est très rapide, vous pouvez comparer les tailles des produits à ProductTitles avant de tenter le changement de nom

0

tables renommage est pas la meilleure façon de faire ce que vous faites. Il vaudrait mieux utiliser un script pour écrire toutes les données de Products to ProductsOld et les supprimer des produits.

Questions connexes