Projecte

General

Perfil

ComOptimitzarUnaTaulaDeMySQL » Historial » Temàtica 4

Ferran Jorba, 25-06-2014 09:34

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>
136 4 Ferran Jorba
137
L'altra serà passar-nos al MariaDB quan Debian l'empaqueti com a alternativa a MySQL.  Sembla que per la propera versió de Debian, que potser instal·larem el 2015, sembla que podrem fer el canvi:
138
139
* http://mariadb.org/
140
* http://packages.debian.org/mariadb