ALTER TABLE en caliente y sin parada de servicio

El funcionamiento de un ALTER TABLE es sencillo:

1- MySQL bloquea la tabla que se desea modificar.
2- Crea una nueva tabla vacia con la nueva estructura.
3- Copia los datos de la antigua a la nueva.
4- Borra la antigua.
5- Renombra la nueva tabla con el nombre original.

Esto en tablas pequeñas puede ser un proceso de segundos o minutos. En tablas muy grandes, podemos estar hablando de horas. Horas en las cuales las consultas a dicha tabla estarán bloqueadas y las conexiones y peticiones se encolarán. Por lo tanto, hacer un ALTER TABLE en producción puede tener consecuencias bastante desastrosas.

Si tenemos replicación master-slave, podemos hacer el ALTER TABLE por fases. Primero lo hacemos en el esclavo. Cuando termine, promocionamos el esclavo a maestro y el maestro a esclavo. Y vuelta a lanzar el ALTER TABLE en el antiguo maestro (ahora esclavo).

¿Y si no tenemos replicación? Eso es lo que voy a explicar ahora 😀

Estamos ante esta situación... nuestros amigos desarrolladores han tenido la magnifica idea de hacer un ALTER TABLE para modificar el tipo de dato de una columna, a las 15:00 de la tarde y sin posibilidad de parada. La primera opción es cagarnos en sus madres. Una vez terminado ese primer e indispensable paso, haremos uso de las herramientas openark para disminuir las posibilidades de parada al mínimo.

La herramienta que nos ayudará será oak-online-alter-table. Su funcionamiento a alto nivel es el siguiente:

1- Crea una tabla fantasma (o también llamada delta) sobre la que poco a poco va copiando filas de la original.
2- Cuando la copia se completa, se crean triggers AFTER INSERT, AFTER UPDATE, AFTER DELETE en la tabla original.
3- Cuando la sincronización se completa, se cambia una tabla por otra.

Para que esto funcione correctamente se deben cumplir una serie de requisitos:

  • La tabla debe tener al menos una columna con UNIQUE KEY.
  • La nueva tabla comparte una columna UNIQUE KEY con la tabla original.
  • En la tabla original no deben existir triggers AFTER.
  • La tabla no puede tener claves foráneas.
  • El nombre de la tabla no puede superar los 57 carácteres.

En la documentación se ven varios ejemplos de su funcionamiento:

Añadir una key

oak-online-alter-table --table=world.City --alter="ADD KEY(Population)"

Añadir una key v2.0

oak-online-alter-table --table=world.City --alter="ADD KEY(Population)" --chunk-size=5000 --sleep=20

En este caso, hay dos opciones importantes. --chunk-size indica que la primera sincronización se hará en grupos de 5000 filas. Contra más grande sea el número, menos tardará el alter table, pero se producirán bloqueos de tabla más largo. Y al contrario, contra menos filas copiemos, menos bloqueos pero más largo será el proceso. Si es MyISAM se bloqueará la tabla (READ LOCK) durante la copia de dichas filas, si es INNODB se bloquearán únicamente las filas que se están copiando.

--sleep por su parte indica cuantos milisegundos esperar entre cada copia de grupos de filas.

Vamos a lanzar, por ejemplo, el alter table en una tabla llamada "salaries" con casi 3 millones de registros:

CREATE TABLE `salaries` (
  `emp_no` int(11) NOT NULL,
  `salary` int(11) NOT NULL,
  `from_date` date NOT NULL,
  `to_date` date NOT NULL,
  PRIMARY KEY (`emp_no`,`from_date`)
  KEY `emp_no_idx` (`emp_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Antes de poder hacer uso de ella he elimindo las claves foráneas. Procedemos a lanzar el ALTER TABLE como hemos hecho siempre:

mysql> ALTER TABLE salaries MODIFY emp_no VARCHAR(40);
Query OK, 2844047 rows affected (57.75 sec)
Records: 2844047  Duplicates: 0  Warnings: 0

Un minuto ha tardado el proceso. Esto, en una página web con cientos de visitantes concurrentes, puede ser un desastre. Ahora, hagamoslo online:

[root@miguelangelnieto scripts]# time ./oak-online-alter-table --table employees.salaries 
--alter="MODIFY emp_no VARCHAR(40)" -H 127.0.0.1 -u root --ask-pass -q -c 50000
Password: 
real    4m25.628s
user    0m0.138s
sys 0m0.040s

Como vemos, ha tardado 4 minutos siendo un proceso más lento, pero en este caso no hemos tenido parada ni bloqueos largos de la tabla. Nadie se ha enterado y nosotros hemos hecho un ALTER TABLE en producción.

Durante el proceso nos crea la tabla fantasma __oak_salaries:

mysql> show tables;
+---------------------+
| Tables_in_employees |
+---------------------+
| __oak_salaries      |
| departments         |
| dept_emp            |
| dept_manager        |
| employees           |
| salaries            |
| titles              |
+---------------------+
7 rows in set (0.00 sec)

Para los administradores que prefieran PHP, Mark Callaghan de Facebook ha publicado su propio script para realizar ALTER TABLE's online, siguiendo un método muy similar al explicado aquí:

Script PHP Documentación en Facebook


Comments

    フルラ 財布期間限定SALE http://furlagood.nigellane.org/ 販売を興味があれば、是非 弊社へ見てください ナイキ スニーカー

    ナイキ スニーカー on

    人気ブランドの コーチ 財布 メンズ http://www.greenwicharts.org/word/d/mall/coach.php の商品を紹介しています。 ワンピースの在庫限り

    ワンピースの在庫限り on

    フルラ ポーチ セット特集一覧 http://www.sayrevolution.net/list/pure/furla.html ご購入でゴールドポイント取得! フルラ バッグ 新作

    フルラ バッグ 新作 on

    ケイトスペード 財布 二つ折り爆買い! http://www.faroscreen.net/ja/list/katespade/ みなさまに安心して、喜んで買ってもらいましょう!!! ボッテガヴェネタ 財布 メンズ

    ボッテガヴェネタ 財布 メンズ on

    輝く高品質なコンバース ハイカット http://potsdampolice.com/images/converse.html 品数豊富に激安価格でご提供!品質保証!購入へ ようこそ! アディダス スニーカー キッズ

    アディダス スニーカー キッズ on

    トゥミ スーツケースによるデータはここにある: http://jones-terwilliger-galleries.com/Contact/r/li/tumi.html 絶対にあなたの一番選択! ケイトスペード バッグ 新作

    ケイトスペード バッグ 新作 on

    絶対一番安いMCM 財布 新作 http://mcmdiscount.ghmcc.co.uk/ 正規品激安大集合!100%品質保証! ロレックス GMT コピー

    ロレックス GMT コピー on

    ガガミラノ 人気爆買いバーゲン! http://www.indemipe.com/chemie/sell/gaga.html 気軽に注文ください プーマ スニーカー スエード

    プーマ スニーカー スエード on

    大人気の多数入荷: http://raybanstore.my-style-blog.com/ 超激安価格で大放出セール中! ガガミラノ 時計 レディース

    ガガミラノ 時計 レディース on

    メリッサ サンダル ジグザグブランド公式通販! http://jkgroup.net/jsl/p/shop/melissa/ コーチ 財布

    コーチ 財布 on

    ニューバランス キッズ 574衝撃価格 http://www.parrottalkdesign.net/shop/nb/ 超大きな驚きをもたらすことができます。 メリッサ 靴 店舗

    メリッサ 靴 店舗 on

    当社はお提供している シャネル財布 新作 http://www.wafernet.com/xxnrdy/hot/item/gucci.php 激安商品は種類豊富でございます! グッチ バッグ デニム

    グッチ バッグ デニム on

    激安ブランドgagamilano 通販 http://gagamilano-eshop.com/ 高品質と安心をお届けいたします! gagamilanoランキング

    gagamilanoランキング on

    】綿ウールニットフードロングカーディガン1106433・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・姉妹サイトママとキッズのナチュラルファッション館ナチュラル系ファッション&雑貨情報をご紹介しています特集ページママ・フォーマルキッズフォーマルお受験・準備手作りバッグ用品特集学習机・子ども部屋フレンチカントリーな子ども部屋ランチグッズ・キャラ弁手作りグッズ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・。 茶色のレザーとタッセルの組み合わせであっても、ヴィンテージスタイルはおさまっていません。 ショップ店員から身を起こしたコースは「現代は一日の中でも寒暖や状況の変化が激しく、自由に組み合わせて対応できる服が求められている。 http://www.jcee-eg.net/general.asp

    http://www.jcee-eg.net/general.asp on

    グレーターチャイナ地域のゼネラルマネージャー、コリン·カリーは、グローバル起業家を言った: 下層都市の消費者は高品位支出を求めていると、彼らはより高級な製品を購入したい、私たちは、がそのフランチャイザーや他の協同組合の仲間が取るために助けることができると確信しています市場シェアを引き継ぐために、この機会を最大限に活用。 お客様が集まるチラシの作り方初心者~上級者まぐまぐ前回のお約束は、私がサムネール制作を教える。 対照的に、GYREの場合はズレがフロアごとに違った性格を与えるきっかけをつくっているように思える*2さらに、エントランスは表参道のメイン・ストリートに面した箇所に設けられるだけではなく、東側の小道やキャットストリート沿いには階段が設けられ、そこから各フロアにアクセスできるようになっている。 http://www.dfm-eg.com/css/home.asp

    http://www.dfm-eg.com/css/home.asp on

    NIKE スニーカー 黒をお持ちしたくなると、 http://stroimaterial.by/Administration/skins/kama/nike.htmlに来てください。 ガガミラノ 時計 メンズ 新作

    ガガミラノ 時計 メンズ 新作 on

    ガガミラノ 時計 メンズ 人気 に関する詳細情報をみつけるには、こちらへ http://www.sayrevolution.net/watch/ja/gaga.html トリーバーチ バッグ アウトレット

    トリーバーチ バッグ アウトレット on

    フルラ 財布 新作 2014正規取扱店 http://furla.madisonloungemanchester.com/ 全商品大幅お値下げ! フルラ 財布

    フルラ 財布 on

    http://pescemandya.org/highslide/graphics/p/best/gaga.htmlを訪問すれば についてもっとしることができる。 toms サンダル メンズ

    toms サンダル メンズ on

    ヴィクトリアシークレット 水着新作専門店! http://victoriasstore.voir-film.com/ 期間限定ショップなので、ぜひお早めにお越しください! クリスチャンルブタン メンズ

    クリスチャンルブタン メンズ on

    コンバース スニーカー は http://www.tekstilteknik.com/design/r/sit/adidas.php 激安価格で販売しています アナスイ 財布 人気

    アナスイ 財布 人気 on

    フルラ 財布 新作 2014が購入できる店 http://furla.madisonloungemanchester.com/ 驚きの低価格で提供しております! サマンサタバサ 財布 新作 2014

    サマンサタバサ 財布 新作 2014 on

    目玉レイバン http://raybanshop.michianabiztalk.com/ ラグジュアリーな感触を 楽しんで! レイバン メガネ 人気 [url=http://wenger-lacke.ch/mod_shop/media/r/rayban/]レイバン メガネ 人気[/url]

    レイバン メガネ 人気 on
Next → Page 1 of 14