ComOptimitzarUnaTaulaDeMySQL » Historial » Temàtica 3
Ferran Jorba, 25-06-2014 09:10
| 1 | 1 | Ferran Jorba | h1. Com optimitzar una taula de MySQL |
|---|---|---|---|
| 2 | |||
| 3 | Des que MySQL va passar a Oracle via adquisició de Sun, la gestió de MySQL cada cop va a pitjor. La darrera és que en Debian ja no es pot fer un «optimize table» perquè els fitxers temporals es creen amb un propietari diferent que el que gestiona el servidor MySQL i, com que en Debian no és root, no pot tornar-los a canviar de propietari. L'explicació està aquí (de la nostra tasca #2918): |
||
| 4 | |||
| 5 | * http://bugs.mysql.com/bug.php?id=61598 |
||
| 6 | * http://www.buildcube.com/tech_blog/2014/01/09/mysql-cant-change-ownership-of-the-file-errcode-1/ |
||
| 7 | |||
| 8 | Per tant, sembla ser que l'única manera que queda per fer aquesta optimització és via descarregar la taula, tal com està explicat a |
||
| 9 | |||
| 10 | * http://www.zyxware.com/articles/3064/how-to-backup-dump-and-restore-a-specific-table-in-mysql-using-the-terminal-commandline-utilities-provided-by-linu |
||
| 11 | |||
| 12 | La dificultat consisteix en trobar el moment de fer-ho, tenint backups previs i podent tallar el servei. La seqüència dels passos és aquesta: |
||
| 13 | |||
| 14 | h2. 1. Parar el bibsched, perquè no hi hagin tasques d'actualització a la base de dades |
||
| 15 | |||
| 16 | <pre> |
||
| 17 | $ bibsched stop |
||
| 18 | </pre> |
||
| 19 | |||
| 20 | 2 | Ferran Jorba | h2. 2. Backup dels fitxers físics de les taules, per si alguna cosa va molt malament |
| 21 | 1 | Ferran Jorba | |
| 22 | Com a root |
||
| 23 | |||
| 24 | <pre> |
||
| 25 | homs:/var/lib/mysql/ddduab# |
||
| 26 | homs:/var/lib/mysql/ddduab# table=idxWORD09F |
||
| 27 | homs:/var/lib/mysql/ddduab# for file in $table.???; do cp -av $file $file.0; done |
||
| 28 | `idxWORD09F.frm' -> `idxWORD09F.frm.0' |
||
| 29 | `idxWORD09F.MYD' -> `idxWORD09F.MYD.0' |
||
| 30 | `idxWORD09F.MYI' -> `idxWORD09F.MYI.0' |
||
| 31 | homs:/var/lib/mysql/ddduab# table=idxWORD09R |
||
| 32 | homs:/var/lib/mysql/ddduab# for file in $table.???; do cp -av $file $file.0; done |
||
| 33 | `idxWORD09R.frm' -> `idxWORD09R.frm.0' |
||
| 34 | `idxWORD09R.MYD' -> `idxWORD09R.MYD.0' |
||
| 35 | `idxWORD09R.MYI' -> `idxWORD09R.MYI.0' |
||
| 36 | </pre> |
||
| 37 | |||
| 38 | <pre> |
||
| 39 | homs:/var/lib/mysql/ddduab# d -h idxWORD09* |
||
| 40 | -rw-rw---- 1 mysql mysql 2.4G Jun 23 15:49 idxWORD09F.MYD |
||
| 41 | -rw-rw---- 1 mysql mysql 1.3G Jun 23 22:20 idxWORD09F.MYI |
||
| 42 | -rw-rw---- 1 mysql mysql 8.5K Jul 18 2013 idxWORD09F.frm |
||
| 43 | -rw-rw---- 1 mysql mysql 2.4G Jun 23 15:49 idxWORD09F.MYD.0 |
||
| 44 | -rw-rw---- 1 mysql mysql 1.3G Jun 23 22:20 idxWORD09F.MYI.0 |
||
| 45 | -rw-rw---- 1 mysql mysql 8.5K Jul 18 2013 idxWORD09F.frm.0 |
||
| 46 | -rw-rw---- 1 mysql mysql 842M Jun 24 22:32 idxWORD09R.MYD |
||
| 47 | -rw-rw---- 1 mysql mysql 2.0M Jun 24 22:32 idxWORD09R.MYI |
||
| 48 | -rw-rw---- 1 mysql mysql 8.5K Jul 8 2013 idxWORD09R.frm |
||
| 49 | -rw-rw---- 1 mysql mysql 842M Jun 24 22:32 idxWORD09R.MYD.0 |
||
| 50 | -rw-rw---- 1 mysql mysql 2.0M Jun 24 22:32 idxWORD09R.MYI.0 |
||
| 51 | -rw-rw---- 1 mysql mysql 8.5K Jul 8 2013 idxWORD09R.frm.0 |
||
| 52 | </pre> |
||
| 53 | |||
| 54 | 2 | Ferran Jorba | h2. 3. Dump de les taules |
| 55 | 1 | Ferran Jorba | |
| 56 | <pre> |
||
| 57 | ddd@homs:/var/backups/mysql$ db=ddduab |
||
| 58 | ddd@homs:/var/backups/mysql$ table=idxWORD09F |
||
| 59 | ddd@homs:/var/backups/mysql$ mysqldump $db $table | gzip >mysqldump.$db-$table.sql.gz |
||
| 60 | ddd@homs:/var/backups/mysql$ table=idxWORD09R |
||
| 61 | ddd@homs:/var/backups/mysql$ mysqldump $db $table | gzip >mysqldump.$db-$table.sql.gz |
||
| 62 | </pre> |
||
| 63 | |||
| 64 | h2. 4. Parar Apache, perquè les taules seran destruides i recreades |
||
| 65 | |||
| 66 | <pre> |
||
| 67 | homs:/var/lib/mysql/ddduab# /etc/init.d/apache2 stop |
||
| 68 | [ ok ] Stopping web server: apache2 ... waiting . |
||
| 69 | </pre> |
||
| 70 | |||
| 71 | h2. 5. Restaurar les taules recreant-les |
||
| 72 | |||
| 73 | <pre> |
||
| 74 | ddd@homs:/var/backups/mysql$ table=idxWORD09R |
||
| 75 | ddd@homs:/var/backups/mysql$ zcat mysqldump.$db-$table.sql.gz | mysql ddduab |
||
| 76 | ddd@homs:/var/backups/mysql$ table=idxWORD09F |
||
| 77 | ddd@homs:/var/backups/mysql$ zcat mysqldump.$db-$table.sql.gz | mysql ddduab |
||
| 78 | </pre> |
||
| 79 | |||
| 80 | 2 | Ferran Jorba | Comparar el tamany dels fitxers de les taules, els origintals (.0) i els actuals (he reordenat la sortida perquè es puguin comparar millor): |
| 81 | 1 | Ferran Jorba | |
| 82 | <pre> |
||
| 83 | homs:/var/lib/mysql/ddduab# d -h idxWORD09* |
||
| 84 | -rw-rw---- 1 mysql mysql 2.4G Jun 23 15:49 idxWORD09F.MYD.0 |
||
| 85 | 2 | Ferran Jorba | -rw-rw---- 1 mysql mysql 2.2G Jun 25 04:46 idxWORD09F.MYD |
| 86 | |||
| 87 | 1 | Ferran Jorba | -rw-rw---- 1 mysql mysql 1.3G Jun 23 22:20 idxWORD09F.MYI.0 |
| 88 | 2 | Ferran Jorba | -rw-rw---- 1 mysql mysql 1.2G Jun 25 04:47 idxWORD09F.MYI |
| 89 | |||
| 90 | 1 | Ferran Jorba | -rw-rw---- 1 mysql mysql 8.5K Jul 18 2013 idxWORD09F.frm.0 |
| 91 | 2 | Ferran Jorba | -rw-rw---- 1 mysql mysql 8.5K Jun 25 04:33 idxWORD09F.frm |
| 92 | |||
| 93 | 1 | Ferran Jorba | -rw-rw---- 1 mysql mysql 842M Jun 24 22:32 idxWORD09R.MYD.0 |
| 94 | 2 | Ferran Jorba | -rw-rw---- 1 mysql mysql 815M Jun 25 04:32 idxWORD09R.MYD |
| 95 | |||
| 96 | 1 | Ferran Jorba | -rw-rw---- 1 mysql mysql 2.0M Jun 24 22:32 idxWORD09R.MYI.0 |
| 97 | 2 | Ferran Jorba | -rw-rw---- 1 mysql mysql 1.3M Jun 25 04:32 idxWORD09R.MYI |
| 98 | |||
| 99 | 1 | Ferran Jorba | -rw-rw---- 1 mysql mysql 8.5K Jul 8 2013 idxWORD09R.frm.0 |
| 100 | 2 | Ferran Jorba | -rw-rw---- 1 mysql mysql 8.5K Jun 25 04:31 idxWORD09R.frm |
| 101 | 1 | Ferran Jorba | </pre> |
| 102 | |||
| 103 | 2 | Ferran Jorba | h2. 6. Reiniciar MySQL i Apache |
| 104 | 1 | Ferran Jorba | |
| 105 | 2 | Ferran Jorba | Així ens assegurem que MySQL confirma que tot està bé: |
| 106 | 1 | Ferran Jorba | |
| 107 | Com a root: |
||
| 108 | |||
| 109 | <pre> |
||
| 110 | homs:/var/lib/mysql/ddduab# /etc/init.d/apache2 stop && /etc/init.d/mysql restart && /etc/init.d/apache2 start |
||
| 111 | [ ok ] Stopping web server: apache2 ... waiting . |
||
| 112 | [....] Stopping MySQL database server: mysqldchown: cannot access `/var/run/wsgi/socket.*': No such file or directory |
||
| 113 | . ok |
||
| 114 | [ ok ] Starting MySQL database server: mysqld . .. |
||
| 115 | [info] Checking for tables which need an upgrade, are corrupt or were |
||
| 116 | not closed cleanly.. |
||
| 117 | [ ok ] Starting web server: apache2. |
||
| 118 | homs:/var/lib/mysql/ddduab# |
||
| 119 | </pre> |
||
| 120 | |||
| 121 | h2. 7. Reiniciar bibsched |
||
| 122 | |||
| 123 | <pre> |
||
| 124 | $ bibsched start |
||
| 125 | </pre> |
||
| 126 | |||
| 127 | (fer-ho també per a Traces i IFMuc, que al reiniciar MySQL els bibscheds han mort!) |
||
| 128 | 3 | Ferran Jorba | |
| 129 | h2. Alternatives? |
||
| 130 | |||
| 131 | Potser seria més senzill optimitzar tota la base de dades, ja que tenim el backup? |
||
| 132 | |||
| 133 | <pre> |
||
| 134 | $ zcat /var/backups/mysql/ddduab-dbdump-2014-06-25_03:00:02.sql.gz | mysql ddduab |
||
| 135 | </pre> |