Je hebt blijkbaar geen ervaring met MySQL?
Een structurele wijziging aan een tabel (zelfs het hernoemen van een kolom) betekent namelijk dat de tabel opnieuw uitgeschreven wordt. Dat geldt ook voor het toevoegen, veranderen en verwijderen van kolommen en indexen.
Tijdens zo'n situatie van opnieuw uitschrijven doet MySQL bovendien erg lastig met locks op die tabellen, ondanks dat reads zogenaamd nog op de oude situatie door mogen gaan.
Als je dan dus een veelgebruikte tabel van 2GB wijzigt, duurt dat in mijn ervaring wel wat meer dan een paar seconde. En we hebben vier wijzigingen nodig; kolom toevoegen, nieuwe kolom vullen adhv een oude kolom, index aanpassen/toevoegen om nieuwe kolom te gebruiken, oude kolom verwijderen en nieuwe kolom hernoemen naar oude.
Alleen die laatste stap is niet noodzakelijk, maar bespaard ons wel een hoop code doorlopen/aanpassen. En ja, als al die legacy code niet had bestaan had ook dat niet gehoeven, maar die bestaat nou eenmaal
Ik ben heel benieuwd hoe jij dat in een paar seconde voor je ziet? Want als we iets over het hoofd zien, doen we het graag anders.
In PostgreSQL zou het inderdaad zonder noemenswaardige downtime moeten kunnen, aangezien ieder van die wijzigingen daarin wel via het versiebeheer gaan. En wellicht de grote jongens als SQL-server, DB2 en Oracle ook wel. Maar we draaien MySQL... En ook dat kunnen we niet transparant in een paar seconde wijzigen

[Reactie gewijzigd door ACM]
Op een Sybase of Oracle system zou ik het volgende doen, kopie maken van de tabel en die gelijk houden met de orgineele tabel (via replicatie) dan de kolom toevoegen aan de kopie, trigger plaatsen voor de nieuwe entries, nieuwe kolom vullen aan de hand van de oude. Index bouwen/aanpassen.
Dan de replicatie breken (wel de que blijven vullen natuurlijk), drop trigger, hernoem kolom, trigger toevoegen voor de records die nog in de replicatie que zitten. En als de replicatie weer in sync is de orgineele tabel en de kopie van naam veranderen in een transactie.
De outage is een paar seconde en niemand die hier iets van merkt. Met MySQL weet ik het inderdaad zo net nog niet maar ik heb het idee dat het ook met MySQL heel goed te doen zou moeten zijn.
ps, 2GB is een kleine tabel, ales onder de 60GB is nog steeds niet echt groot, lastig dat zeker maar niet zo groot.
Ooit ga ik ook nog leren spellen
[Reactie gewijzigd door Rob Coops]
2GB is inderdaad niet groot

Maar wel groot genoeg om meer dan een paar seconden te nemen per bewerking.
En helaas vindt MySQL gewoon dat een wijziging aan de tabelstructuur niet in een transactie hoeft (en kan) en dat je mede daardoor dus alle writers al laat wachten tot je klaar bent. Tegelijkertijd kent MySQL dergelijke zaken als triggers niet of zit je wederom ermee dat je me de niet-transactionele wijzigingen aan tabellen zit.
't Zal allemaal vast wat handiger gekund hebben, maar of dat met een nog redelijke inspanning in MySQL met onze situatie kan betwijfel ik eigenlijk.