2009-12-15 7 views
4

J'ai quelques (5) renommage déclarations contenues dans un script plsqlOracle 11g renommer. Garanti d'être atomique?

drop table new; 
rename old to new; 

tables "vieilles" tenir des informations très précieuses. Comme je le vois, si la commande rename est garantie pour être atomique, alors un problème pourrait être résolu.

Est-ce atomique? Sinon, existe-t-il un moyen de renommer "sûr"?

Merci à l'avance

+0

S'agit-il d'une opération ponctuelle (c'est-à-dire que vous pouvez demander à l'entreprise d'effectuer une opération de maintenance du système) ou quelque chose que vous allez faire régulièrement? –

+0

@Jeffrey. C'est un processus quotidien. Cela fait partie du processus de post-traitement, seulement exécuté si le processus principal a fini correctement (donc, j'espère qu'il s'exécutera tous les soirs) – Tom

Répondre

7

RENAME est une commande DDL. Il s'agit donc d'une seule transaction discrète, si c'est ce que vous entendez par «atomique» dans ce contexte. Par conséquent, il est à peu près aussi sûr que n'importe quoi. Je ne peux pas imaginer comment un changement de nom vous ferait perdre vos données. Mais si vous vous sentez paranoïaque, souvenez-vous que c'est la raison pour laquelle la nature nous a donné une sauvegarde et un rétablissement.

modifier

La façon d'être sûr que vous ne perdez pas de données si le DROP réussit et l'RENAME échoue est de déployer RENAME deux fois:

SQL> rename old_table to something_else; 
SQL> rename new_table to old_table; 
SQL> drop table something_else; 

De cette façon, vous avez vos données en ligne . Cela minimise également les temps d'arrêt.

1

Rename sera atomique, donc ça devrait aller. Comme APC l'a noté,

Je ne peux pas imaginer comment un changement de nom entraînerait la perte de vos données.

La seule chose que je peux voir dans votre script serait le temps après la chute et avant le changement de nom, il n'y a pas de table new, donc potentiellement une SQL peut échouer. Cependant, ce temps sera assez court et n'importe quoi de plus compliqué (comme un Insert From Select) serait encore plus problématique.

+0

Oui, je suis inquiet au sujet des lapsus entre les déclarations de baisse et de renommer. – Tom

+0

Ma première réaction est "qu'est-ce qui peut aller mal" ... mais alors quelque chose le fait probablement. Combien de temps voyez-vous entre le début de drop table et la fin du renommer? Et si c'est trop long, faites le double renommer comme suggéré par APC. Je ne peux toujours pas voir quelque chose de vraiment mauvais qui pourrait échouer dans l'intervalle. Peut-être pourriez-vous donner un exemple de ce qui vous préoccupe afin que nous puissions répondre à ces préoccupations? – Thorsten

1

Je suppose que vous craignez que le DML concurrent (insertions/mises à jour/suppressions) sur l'ancienne table puisse être manqué pendant le renommage? Dans ce cas, ne vous inquiétez pas - RENAME est DDL et verrouille la table pour la durée.

3

Compte tenu de vos commentaires «C'est un processus quotidien » et « Oui, je suis inquiet au sujet de la Lapsus entre la goutte et renomme déclarations »

Combien d'argent avez-vous (ou plus précisément, vous avez le partitionnement option)? Si oui, regardez partition exchange

Vous avez votre table permanente constituée d'une seule cloison. À la fin de la journée, vous échangez cette partition avec la table (en une seule déclaration atomique). En ne supprimant/en renommant pas votre table principale, vous ne devez pas invalider les paquets, etc. (bien que cela puisse dépendre de la version DB).

A défaut d'utiliser une vue et de créer une vue CREATE OR REPLACE VIEW AS SELECT * FROM table_a et chaque nuit vous remplacez la vue par une nouvelle sur la table différente. Cela va probablement invalider les paquets.

1

Si vous êtes préoccupé par le délai entre le dépôt et le changement de nom, voici une autre idée: Utilisez une vue qui pointe vers la "table sous-jacente correcte".

Vous commenceriez avec

CREATE VIEW someName as Select * From OldTable; 

Ensuite, vous pouvez configurer votre NEWTABLE. Lorsque vous êtes prêt, puis juste

CREATE OR REPLACE View someName as Select * From NewTable; 

Ensuite, vous pouvez supprimer votre OldTable. La prochaine fois que vous obtiendrez de nouvelles données, créez un autre NewTable_2 (ou réutilisez OldTable .. alors il est probablement préférable d'utiliser Table1 et Table2) et redéfinissez la vue à nouveau.

La vue est aussi simple que possible, elle devrait donc pouvoir être mise à jour sans problème. La seule chose délicate est de toujours construire une nouvelle table (ou basculer entre deux tables), mais cela ne devrait pas être trop difficile à configurer et probablement plus facile que d'éviter totalement les problèmes qui pourraient survenir avec votre suggestion originale.

Questions connexes