Projecte

General

Perfil

ComOptimitzarUnaTaulaDeMySQL » Historial » Temàtica 5

Ferran Jorba, 30-06-2014 08:52

1 1 Ferran Jorba
h1. Com optimitzar una taula de MySQL
2
3 5 Ferran Jorba
_Al final d'aquest document, explico l'alternativa: *Com optimitzar tota una base de dades MySQL*_
4
5 1 Ferran Jorba
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):
6
7
* http://bugs.mysql.com/bug.php?id=61598
8
* http://www.buildcube.com/tech_blog/2014/01/09/mysql-cant-change-ownership-of-the-file-errcode-1/
9
10
Per tant, sembla ser que l'única manera que queda per fer aquesta optimització és via descarregar la taula, tal com està explicat a 
11
12
* 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
13
14
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:
15
16
h2. 1. Parar el bibsched, perquè no hi hagin tasques d'actualització a la base de dades
17
18
<pre>
19
$ bibsched stop
20
</pre>
21
22 2 Ferran Jorba
h2. 2. Backup dels fitxers físics de les taules, per si alguna cosa va molt malament
23 1 Ferran Jorba
24
Com a root
25
26
<pre>
27
homs:/var/lib/mysql/ddduab# 
28
homs:/var/lib/mysql/ddduab# table=idxWORD09F
29
homs:/var/lib/mysql/ddduab# for file in $table.???; do cp -av $file $file.0; done
30
`idxWORD09F.frm' -> `idxWORD09F.frm.0'
31
`idxWORD09F.MYD' -> `idxWORD09F.MYD.0'
32
`idxWORD09F.MYI' -> `idxWORD09F.MYI.0'
33
homs:/var/lib/mysql/ddduab# table=idxWORD09R
34
homs:/var/lib/mysql/ddduab# for file in $table.???; do cp -av $file $file.0; done
35
`idxWORD09R.frm' -> `idxWORD09R.frm.0'
36
`idxWORD09R.MYD' -> `idxWORD09R.MYD.0'
37
`idxWORD09R.MYI' -> `idxWORD09R.MYI.0'
38
</pre>
39
40
<pre>
41
homs:/var/lib/mysql/ddduab# d -h idxWORD09*
42
-rw-rw---- 1 mysql mysql 2.4G Jun 23 15:49 idxWORD09F.MYD
43
-rw-rw---- 1 mysql mysql 1.3G Jun 23 22:20 idxWORD09F.MYI
44
-rw-rw---- 1 mysql mysql 8.5K Jul 18  2013 idxWORD09F.frm
45
-rw-rw---- 1 mysql mysql 2.4G Jun 23 15:49 idxWORD09F.MYD.0
46
-rw-rw---- 1 mysql mysql 1.3G Jun 23 22:20 idxWORD09F.MYI.0
47
-rw-rw---- 1 mysql mysql 8.5K Jul 18  2013 idxWORD09F.frm.0
48
-rw-rw---- 1 mysql mysql 842M Jun 24 22:32 idxWORD09R.MYD
49
-rw-rw---- 1 mysql mysql 2.0M Jun 24 22:32 idxWORD09R.MYI
50
-rw-rw---- 1 mysql mysql 8.5K Jul  8  2013 idxWORD09R.frm
51
-rw-rw---- 1 mysql mysql 842M Jun 24 22:32 idxWORD09R.MYD.0
52
-rw-rw---- 1 mysql mysql 2.0M Jun 24 22:32 idxWORD09R.MYI.0
53
-rw-rw---- 1 mysql mysql 8.5K Jul  8  2013 idxWORD09R.frm.0
54
</pre>
55
56 2 Ferran Jorba
h2. 3. Dump de les taules
57 1 Ferran Jorba
58
<pre>
59
ddd@homs:/var/backups/mysql$ db=ddduab  
60
ddd@homs:/var/backups/mysql$ table=idxWORD09F  
61
ddd@homs:/var/backups/mysql$ mysqldump $db $table | gzip >mysqldump.$db-$table.sql.gz  
62
ddd@homs:/var/backups/mysql$ table=idxWORD09R
63
ddd@homs:/var/backups/mysql$ mysqldump $db $table | gzip >mysqldump.$db-$table.sql.gz
64
</pre>
65
66
h2. 4. Parar Apache, perquè les taules seran destruides i recreades
67
68
<pre>
69
homs:/var/lib/mysql/ddduab# /etc/init.d/apache2 stop
70
[ ok ] Stopping web server: apache2 ... waiting .
71
</pre>
72
73
h2. 5. Restaurar les taules recreant-les
74
75
<pre>
76
ddd@homs:/var/backups/mysql$ table=idxWORD09R
77
ddd@homs:/var/backups/mysql$ zcat mysqldump.$db-$table.sql.gz | mysql ddduab
78
ddd@homs:/var/backups/mysql$ table=idxWORD09F
79
ddd@homs:/var/backups/mysql$ zcat mysqldump.$db-$table.sql.gz | mysql ddduab
80
</pre>
81
82 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):
83 1 Ferran Jorba
84
<pre>
85
homs:/var/lib/mysql/ddduab# d -h idxWORD09*
86
-rw-rw---- 1 mysql mysql 2.4G Jun 23 15:49 idxWORD09F.MYD.0
87 2 Ferran Jorba
-rw-rw---- 1 mysql mysql 2.2G Jun 25 04:46 idxWORD09F.MYD
88
89 1 Ferran Jorba
-rw-rw---- 1 mysql mysql 1.3G Jun 23 22:20 idxWORD09F.MYI.0
90 2 Ferran Jorba
-rw-rw---- 1 mysql mysql 1.2G Jun 25 04:47 idxWORD09F.MYI
91
92 1 Ferran Jorba
-rw-rw---- 1 mysql mysql 8.5K Jul 18  2013 idxWORD09F.frm.0
93 2 Ferran Jorba
-rw-rw---- 1 mysql mysql 8.5K Jun 25 04:33 idxWORD09F.frm
94
95 1 Ferran Jorba
-rw-rw---- 1 mysql mysql 842M Jun 24 22:32 idxWORD09R.MYD.0
96 2 Ferran Jorba
-rw-rw---- 1 mysql mysql 815M Jun 25 04:32 idxWORD09R.MYD
97
98 1 Ferran Jorba
-rw-rw---- 1 mysql mysql 2.0M Jun 24 22:32 idxWORD09R.MYI.0
99 2 Ferran Jorba
-rw-rw---- 1 mysql mysql 1.3M Jun 25 04:32 idxWORD09R.MYI
100
101 1 Ferran Jorba
-rw-rw---- 1 mysql mysql 8.5K Jul  8  2013 idxWORD09R.frm.0
102 2 Ferran Jorba
-rw-rw---- 1 mysql mysql 8.5K Jun 25 04:31 idxWORD09R.frm
103 1 Ferran Jorba
</pre>
104
105 2 Ferran Jorba
h2. 6. Reiniciar MySQL i Apache
106 1 Ferran Jorba
107 2 Ferran Jorba
Així ens assegurem que MySQL confirma que tot està bé:
108 1 Ferran Jorba
109
Com a root:
110
111
<pre>
112
homs:/var/lib/mysql/ddduab# /etc/init.d/apache2 stop && /etc/init.d/mysql restart && /etc/init.d/apache2 start  
113
[ ok ] Stopping web server: apache2 ... waiting .
114
[....] Stopping MySQL database server: mysqldchown: cannot access `/var/run/wsgi/socket.*': No such file or directory
115
. ok 
116
[ ok ] Starting MySQL database server: mysqld . ..
117
[info] Checking for tables which need an upgrade, are corrupt or were 
118
not closed cleanly..
119
[ ok ] Starting web server: apache2.
120
homs:/var/lib/mysql/ddduab# 
121
</pre>
122
123
h2. 7. Reiniciar bibsched
124
125
<pre>
126
$ bibsched start
127
</pre>
128
129
(fer-ho també per a Traces i IFMuc, que al reiniciar MySQL els bibscheds han mort!)
130 3 Ferran Jorba
131
h2. Alternatives?
132
133
Potser seria més senzill optimitzar tota la base de dades, ja que tenim el backup?
134
135
<pre>
136
$ zcat /var/backups/mysql/ddduab-dbdump-2014-06-25_03:00:02.sql.gz | mysql ddduab
137
</pre>
138 4 Ferran Jorba
139
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:
140
141
* http://mariadb.org/
142
* http://packages.debian.org/mariadb
143 5 Ferran Jorba
144
----
145
146
h1. Com optimitzar tota una base de dades MySQL
147
148
Es tracta d'aprofitar un backup ben recent (minuts, poquetes hores si es fa de matinada), i seguir aquests passos:
149
150
h2. A. Parar el bibsched, perquè no hi hagin tasques d'actualització a la base de dades
151
152
<pre>
153
$ bibsched stop
154
</pre>
155
156
h2. B. Parar Apache, perquè les taules seran destruides i recreades
157
158
<pre>
159
homs:/var/lib/mysql/ddduab# /etc/init.d/apache2 stop
160
[ ok ] Stopping web server: apache2 ... waiting .
161
</pre>
162
163
h2. C. Restaurar les taules recreant-les
164
165
<pre>
166
ddd@homs:/var/backups/mysql$ date; time zcat ddduab-dbdump-2014-06-30_03\:00\:01.sql.gz | mysql ddduab
167
Mon Jun 30 05:19:19 CEST 2014
168
real    47m41.990s
169
user    6m56.566s
170
sys     0m25.598s
171
</pre>
172
173
h2. C. Reiniciar MySQL i Apache
174
175
Així ens assegurem que MySQL confirma que tot està bé:
176
177
Com a root:
178
179
<pre>
180
homs:/var/lib/mysql/ddduab# /etc/init.d/apache2 stop && /etc/init.d/mysql restart && /etc/init.d/apache2 start  
181
[ ok ] Stopping web server: apache2 ... waiting .
182
[....] Stopping MySQL database server: mysqldchown: cannot access `/var/run/wsgi/socket.*': No such file or directory
183
. ok 
184
[ ok ] Starting MySQL database server: mysqld . ..
185
[info] Checking for tables which need an upgrade, are corrupt or were 
186
not closed cleanly..
187
[ ok ] Starting web server: apache2.
188
homs:/var/lib/mysql/ddduab# 
189
</pre>
190
191
h2. D. Reiniciar bibsched
192
193
<pre>
194
$ bibsched start
195
</pre>
196
197
(fer-ho també per a Traces i IFMuc, que al reiniciar MySQL els bibscheds han mort!)