~ubuntu-branches/ubuntu/maverick/cluster-agents/maverick-proposed

« back to all changes in this revision

Viewing changes to heartbeat/mysql

  • Committer: Bazaar Package Importer
  • Author(s): Ante Karamatic
  • Date: 2010-02-17 21:46:00 UTC
  • Revision ID: james.westby@ubuntu.com-20100217214600-g44grvtkw7jbpciz
Tags: upstream-1.0.2
ImportĀ upstreamĀ versionĀ 1.0.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/bin/sh
 
2
#
 
3
 
4
# MySQL
 
5
#
 
6
# Description:  Manages a MySQL database as Linux-HA resource
 
7
 
 
8
#
 
9
# Author:       Alan Robertson          : DB2 Script
 
10
# Author:       Jakub Janczak           : Rewrite as MySQL
 
11
# Author:       Andrew Beekhof          : Cleanup and import
 
12
# Author:       Sebastian Reitenbach    : add OpenBSD defaults, more cleanup
 
13
# Author:  Narayan Newton      : Add Gentoo/Debian defaults
 
14
#
 
15
# Support:      linux-ha@lists.linux-ha.org
 
16
# License:      GNU General Public License (GPL)
 
17
# Copyright:    (C) 2002 - 2005 International Business Machines, Inc.
 
18
#
 
19
# An example usage in /etc/ha.d/haresources: 
 
20
#       node1  10.0.0.170 mysql
 
21
#
 
22
# See usage() function below for more details...
 
23
#
 
24
# OCF instance parameters:
 
25
#   OCF_RESKEY_binary
 
26
#   OCF_RESKEY_config
 
27
#   OCF_RESKEY_datadir
 
28
#   OCF_RESKEY_user
 
29
#   OCF_RESKEY_group
 
30
#   OCF_RESKEY_test_table
 
31
#   OCF_RESKEY_test_user
 
32
#   OCF_RESKEY_test_passwd
 
33
#   OCF_RESKEY_enable_creation
 
34
#   OCF_RESKEY_additional_parameters
 
35
#   OCF_RESKEY_log
 
36
#   OCF_RESKEY_pid
 
37
#   OCF_RESKEY_socket
 
38
#######################################################################
 
39
# Initialization:
 
40
 
 
41
: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/resource.d/heartbeat}
 
42
. ${OCF_FUNCTIONS_DIR}/.ocf-shellfuncs
 
43
 
 
44
#######################################################################
 
45
 
 
46
# Fill in some defaults if no values are specified
 
47
HOSTOS=`uname`
 
48
if [ "X${HOSTOS}" = "XOpenBSD" ];then
 
49
OCF_RESKEY_binary_default="/usr/local/bin/mysqld_safe"
 
50
OCF_RESKEY_config_default="/etc/my.cnf"
 
51
OCF_RESKEY_datadir_default="/var/mysql"
 
52
OCF_RESKEY_user_default="_mysql"
 
53
OCF_RESKEY_group_default="_mysql"
 
54
OCF_RESKEY_log_default="/var/log/mysqld.log"
 
55
OCF_RESKEY_pid_default="/var/mysql/mysqld.pid"
 
56
OCF_RESKEY_socket_default="/var/run/mysql/mysql.sock"
 
57
OCF_RESKEY_test_user_default="root"
 
58
OCF_RESKEY_test_table_default="mysql.user"
 
59
OCF_RESKEY_test_passwd_default=""
 
60
OCF_RESKEY_enable_creation_default=0
 
61
OCF_RESKEY_additional_parameters_default=""
 
62
else
 
63
OCF_RESKEY_binary_default="/usr/bin/safe_mysqld"
 
64
OCF_RESKEY_config_default="/etc/my.cnf"
 
65
OCF_RESKEY_datadir_default="/var/lib/mysql"
 
66
OCF_RESKEY_user_default="mysql"
 
67
OCF_RESKEY_group_default="mysql"
 
68
OCF_RESKEY_log_default="/var/log/mysqld.log"
 
69
OCF_RESKEY_pid_default="/var/run/mysql/mysqld.pid"
 
70
OCF_RESKEY_socket_default="/var/lib/mysql/mysql.sock"
 
71
OCF_RESKEY_test_user_default="root"
 
72
OCF_RESKEY_test_table_default="mysql.user"
 
73
OCF_RESKEY_test_passwd_default=""
 
74
OCF_RESKEY_enable_creation_default=0
 
75
OCF_RESKEY_additional_parameters_default=""
 
76
fi
 
77
 
 
78
: ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}}
 
79
MYSQL_BINDIR=`dirname ${OCF_RESKEY_binary}`
 
80
 
 
81
: ${OCF_RESKEY_config=${OCF_RESKEY_config_default}}
 
82
: ${OCF_RESKEY_datadir=${OCF_RESKEY_datadir_default}}
 
83
 
 
84
: ${OCF_RESKEY_user=${OCF_RESKEY_user_default}}
 
85
: ${OCF_RESKEY_group=${OCF_RESKEY_group_default}}
 
86
 
 
87
: ${OCF_RESKEY_log=${OCF_RESKEY_log_default}}
 
88
: ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}}
 
89
: ${OCF_RESKEY_socket=${OCF_RESKEY_socket_default}}
 
90
 
 
91
: ${OCF_RESKEY_test_user=${OCF_RESKEY_test_user_default}}
 
92
: ${OCF_RESKEY_test_table=${OCF_RESKEY_test_table_default}}
 
93
: ${OCF_RESKEY_test_passwd=${OCF_RESKEY_test_passwd_default}}
 
94
 
 
95
: ${OCF_RESKEY_enable_creation=${OCF_RESKEY_enable_creation_default}}
 
96
: ${OCF_RESKEY_additional_parameters=${OCF_RESKEY_additional_parameters_default}}
 
97
 
 
98
usage() {
 
99
  cat <<UEND
 
100
        usage: $0 (start|stop|validate-all|meta-data|monitor)
 
101
 
 
102
        $0 manages a MySQL Database as an HA resource.
 
103
 
 
104
        The 'start' operation starts the database.
 
105
        The 'stop' operation stops the database.
 
106
        The 'status' operation reports whether the database is running
 
107
        The 'monitor' operation reports whether the database seems to be working
 
108
        The 'validate-all' operation reports whether the parameters are valid
 
109
 
 
110
UEND
 
111
}
 
112
 
 
113
meta_data() {
 
114
        cat <<END
 
115
<?xml version="1.0"?>
 
116
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
 
117
<resource-agent name="mysql">
 
118
<version>1.0</version>
 
119
 
 
120
<longdesc lang="en">
 
121
Resource script for MySQL. 
 
122
It manages a MySQL Database instance as an HA resource.
 
123
</longdesc>
 
124
<shortdesc lang="en">Manages a MySQL database instance</shortdesc>
 
125
 
 
126
<parameters>
 
127
 
 
128
<parameter name="binary" unique="0" required="0">
 
129
<longdesc lang="en">
 
130
Location of the MySQL binary
 
131
</longdesc>
 
132
<shortdesc lang="en">MySQL binary</shortdesc>
 
133
<content type="string" default="${OCF_RESKEY_binary_default}" />
 
134
</parameter>
 
135
 
 
136
<parameter name="config" unique="0" required="0">
 
137
<longdesc lang="en">
 
138
Configuration file
 
139
</longdesc>
 
140
<shortdesc lang="en">MySQL config</shortdesc>
 
141
<content type="string" default="${OCF_RESKEY_config_default}" />
 
142
</parameter>
 
143
 
 
144
<parameter name="datadir" unique="0" required="0">
 
145
<longdesc lang="en">
 
146
Directory containing databases
 
147
</longdesc>
 
148
<shortdesc lang="en">MySQL datadir</shortdesc>
 
149
<content type="string" default="${OCF_RESKEY_datadir_default}" />
 
150
</parameter>
 
151
 
 
152
<parameter name="user" unique="0" required="0">
 
153
<longdesc lang="en">
 
154
User running MySQL daemon
 
155
</longdesc>
 
156
<shortdesc lang="en">MySQL user</shortdesc>
 
157
<content type="string" default="${OCF_RESKEY_user_default}" />
 
158
</parameter>
 
159
 
 
160
<parameter name="group" unique="0" required="0">
 
161
<longdesc lang="en">
 
162
Group running MySQL daemon (for logfile and directory permissions)
 
163
</longdesc>
 
164
<shortdesc lang="en">MySQL group</shortdesc>
 
165
<content type="string" default="${OCF_RESKEY_group_default}"/>
 
166
</parameter>
 
167
 
 
168
<parameter name="log" unique="0" required="0">
 
169
<longdesc lang="en">
 
170
The logfile to be used for mysqld.
 
171
</longdesc>
 
172
<shortdesc lang="en">MySQL log file</shortdesc>
 
173
<content type="string" default="${OCF_RESKEY_log_default}"/>
 
174
</parameter>
 
175
 
 
176
<parameter name="pid" unique="0" required="0">
 
177
<longdesc lang="en">
 
178
The pidfile to be used for mysqld.
 
179
</longdesc>
 
180
<shortdesc lang="en">MySQL pid file</shortdesc>
 
181
<content type="string" default="${OCF_RESKEY_pid_default}"/>
 
182
</parameter>
 
183
 
 
184
<parameter name="socket" unique="0" required="0">
 
185
<longdesc lang="en">
 
186
The socket to be used for mysqld.
 
187
</longdesc>
 
188
<shortdesc lang="en">MySQL socket</shortdesc>
 
189
<content type="string" default="${OCF_RESKEY_socket_default}"/>
 
190
</parameter>
 
191
 
 
192
<parameter name="test_table" unique="0" required="0">
 
193
<longdesc lang="en">
 
194
Table to be tested in monitor statement (in database.table notation)
 
195
</longdesc>
 
196
<shortdesc lang="en">MySQL test table</shortdesc>
 
197
<content type="string" default="${OCF_RESKEY_test_table_default}" />
 
198
</parameter>
 
199
 
 
200
<parameter name="test_user" unique="0" required="0">
 
201
<longdesc lang="en">
 
202
MySQL test user
 
203
</longdesc>
 
204
<shortdesc lang="en">MySQL test user</shortdesc>
 
205
<content type="string" default="${OCF_RESKEY_test_user_default}" />
 
206
</parameter>
 
207
 
 
208
<parameter name="test_passwd" unique="0" required="0">
 
209
<longdesc lang="en">
 
210
MySQL test user password
 
211
</longdesc>
 
212
<shortdesc lang="en">MySQL test user password</shortdesc>
 
213
<content type="string" default="${OCF_RESKEY_test_passwd_default}" />
 
214
</parameter>
 
215
 
 
216
<parameter name="enable_creation" unique="0" required="0">
 
217
<longdesc lang="en">
 
218
If the MySQL database does not exist, it will be created 
 
219
</longdesc>
 
220
<shortdesc lang="en">Create the database if it does not exist</shortdesc>
 
221
<content type="integer" default="${OCF_RESKEY_enable_creation_default}"/>
 
222
</parameter>
 
223
 
 
224
<parameter name="additional_parameters" unique="0" required="0">
 
225
<longdesc lang="en">
 
226
Additional parameters which are passed to the mysqld on startup. 
 
227
(e.g. --skip-external-locking or --skip-grant-tables)
 
228
</longdesc>
 
229
<shortdesc lang="en">Additional parameters to pass to mysqld</shortdesc>
 
230
<content type="string" default="${OCF_RESKEY_additional_parameters_default}"/>
 
231
</parameter>
 
232
 
 
233
</parameters>
 
234
 
 
235
<actions>
 
236
<action name="start" timeout="120" />
 
237
<action name="stop" timeout="120" />
 
238
<action name="status" timeout="60" />
 
239
<action name="monitor" depth="0" timeout="30" interval="10" />
 
240
<action name="validate-all" timeout="5" />
 
241
<action name="meta-data" timeout="5" />
 
242
</actions>
 
243
</resource-agent>
 
244
END
 
245
}
 
246
 
 
247
mysql_validate() {
 
248
# checking the parameters
 
249
    if [ ! -x $OCF_RESKEY_binary ]; then
 
250
        ocf_log err "mysqld binary $OCF_RESKEY_binary does not exist or is not executable";
 
251
        return $OCF_ERR_INSTALLED;
 
252
    fi
 
253
 
 
254
    if [ ! -f $OCF_RESKEY_config ]; then
 
255
        ocf_log err "Config $OCF_RESKEY_config doesn't exist";
 
256
        return $OCF_ERR_CONFIGURED;
 
257
    fi
 
258
    
 
259
    if [ ! -d $OCF_RESKEY_datadir ]; then
 
260
        ocf_log err "Datadir $OCF_RESKEY_datadir doesn't exist";
 
261
        return $OCF_ERR_CONFIGURED;
 
262
    fi
 
263
    
 
264
    getent passwd $OCF_RESKEY_user >/dev/null 2>&1
 
265
    if [ ! $? -eq 0 ]; then
 
266
        ocf_log err "User $OCF_RESKEY_user doesn't exit";
 
267
        return $OCF_ERR_INSTALLED;
 
268
    fi
 
269
    
 
270
    getent group $OCF_RESKEY_group >/dev/null 2>&1
 
271
    if [ ! $? -eq 0 ]; then
 
272
        ocf_log err "Group $OCF_RESKEY_group doesn't exist";
 
273
        return $OCF_ERR_INSTALLED;
 
274
    fi
 
275
    true
 
276
}
 
277
 
 
278
mysql_status() {
 
279
        if [ ! -e $OCF_RESKEY_pid ]; then
 
280
                ocf_log debug "MySQL is not running"
 
281
                return $OCF_NOT_RUNNING;
 
282
        fi
 
283
        
 
284
        pid=`cat $OCF_RESKEY_pid`;
 
285
        if [ -d /proc -a -d /proc/1 ]; then
 
286
                [ "u$pid" != "u" -a -d /proc/$pid ]
 
287
        else
 
288
                kill -0 $pid >/dev/null 2>&1
 
289
        fi
 
290
 
 
291
        if [ $? -eq 0 ]; then
 
292
                return $OCF_SUCCESS;
 
293
        else    
 
294
                ocf_log debug "MySQL not running: removing old PID file"
 
295
                rm -f $OCF_RESKEY_pid
 
296
                return $OCF_NOT_RUNNING;
 
297
        fi
 
298
}
 
299
 
 
300
mysql_monitor() {
 
301
    mysql_status
 
302
    rc=$?
 
303
 
 
304
    if [ $OCF_CHECK_LEVEL = 0 -o $rc != 0 ]; then
 
305
        return $rc
 
306
    fi
 
307
 
 
308
    # Do a detailed status check
 
309
    buf=`echo "SELECT * FROM $OCF_RESKEY_test_table" | mysql --user=$OCF_RESKEY_test_user --password=$OCF_RESKEY_test_passwd --socket=$OCF_RESKEY_socket -O connect_timeout=1 2>&1`
 
310
    rc=$?
 
311
    if [ ! $rc -eq 0 ]; then
 
312
        ocf_log err "MySQL $test_table monitor failed:";
 
313
        if [ ! -z "$buf" ]; then ocf_log err $buf; fi
 
314
        return $OCF_ERR_GENERIC;
 
315
    else
 
316
        ocf_log info "MySQL monitor succeeded";
 
317
        return $OCF_SUCCESS;
 
318
    fi
 
319
}
 
320
 
 
321
mysql_start() {
 
322
    mysql_status
 
323
    if [ $? = $OCF_SUCCESS ]; then
 
324
        ocf_log info "MySQL already running"
 
325
        return $OCF_SUCCESS
 
326
    fi
 
327
 
 
328
    touch $OCF_RESKEY_log
 
329
    chown $OCF_RESKEY_user:$OCF_RESKEY_group $OCF_RESKEY_log
 
330
    chmod 0640 $OCF_RESKEY_log
 
331
    [ -x /sbin/restorecon ] && /sbin/restorecon $OCF_RESKEY_log
 
332
    
 
333
    if [ "$OCF_RESKEY_enable_creation" = 1 -a ! -d $OCF_RESKEY_datadir/mysql ] ; then   
 
334
        ocf_log info "Initializing MySQL database: " 
 
335
        $MYSQL_BINDIR/mysql_install_db --datadir=$OCF_RESKEY_datadir
 
336
        rc=$?
 
337
        if [ $rc -ne 0 ] ; then
 
338
            ocf_log err "Initialization failed: $rc";
 
339
            exit $OCF_ERR_GENERIC
 
340
        fi
 
341
        chown -R $OCF_RESKEY_user:$OCF_RESKEY_group $OCF_RESKEY_datadir
 
342
    fi
 
343
 
 
344
    pid_dir=`dirname $OCF_RESKEY_pid`
 
345
    if ! su -s /bin/sh - $OCF_RESKEY_user -c "test -w $pid_dir"; then
 
346
        ocf_log err "Directory $pid_dir for pidfile $OCF_RESKEY_pid is not writable by $OCF_RESKEY_user"
 
347
        return $OCF_ERR_PERM;
 
348
    fi
 
349
    if [ ! -d $pid_dir ] ; then
 
350
        ocf_log info "Creating PID dir: $pid_dir"
 
351
        mkdir -p $pid_dir
 
352
        chown $OCF_RESKEY_user:$OCF_RESKEY_group $pid_dir
 
353
    fi
 
354
 
 
355
    socket_dir=`dirname $OCF_RESKEY_socket`
 
356
    if [ ! -d $socket_dir ] ; then
 
357
        ocf_log info "Creating socket dir: $socket_dir"
 
358
        mkdir -p $socket_dir
 
359
        chown $OCF_RESKEY_user:$OCF_RESKEY_group $socket_dir
 
360
    fi
 
361
 
 
362
    # Uncomment to perform permission clensing
 
363
    # - not convinced this should be enabled by default
 
364
    #
 
365
    #chmod 0755 $OCF_RESKEY_datadir
 
366
    #chown -R $OCF_RESKEY_user $OCF_RESKEY_datadir
 
367
    #chgrp -R $OCF_RESKEY_group $OCF_RESKEY_datadir
 
368
 
 
369
    ${OCF_RESKEY_binary}  --defaults-file=$OCF_RESKEY_config --pid-file=$OCF_RESKEY_pid --socket=$OCF_RESKEY_socket --datadir=$OCF_RESKEY_datadir --user=$OCF_RESKEY_user $OCF_RESKEY_additional_parameters >/dev/null &
 
370
    rc=$?
 
371
    
 
372
    if [ $rc != 0 ]; then
 
373
        ocf_log err "MySQL start command failed: $rc"
 
374
        return $rc
 
375
    fi
 
376
    
 
377
    # Spin waiting for the server to come up.
 
378
    # Let the CRM/LRM time us out if required
 
379
    start_wait=1
 
380
    while [ $start_wait = 1 ]; do
 
381
        mysql_status
 
382
        rc=$?
 
383
        if [ $rc = $OCF_SUCCESS ]; then
 
384
            start_wait=0
 
385
 
 
386
        elif [ $rc != $OCF_NOT_RUNNING ]; then
 
387
            ocf_log info "MySQL start failed: $rc"
 
388
            return $rc
 
389
        fi
 
390
        sleep 2
 
391
    done
 
392
    
 
393
    ocf_log info "MySQL started"
 
394
    return $OCF_SUCCESS
 
395
}
 
396
 
 
397
mysql_stop() {
 
398
    if [ ! -f $OCF_RESKEY_pid ]; then
 
399
        ocf_log info "MySQL is not running"
 
400
        return $OCF_SUCCESS
 
401
    fi
 
402
 
 
403
    pid=`cat $OCF_RESKEY_pid 2> /dev/null `
 
404
    /bin/kill $pid > /dev/null 
 
405
    rc=$?
 
406
    if [ $rc != 0 ]; then
 
407
        ocf_log err "MySQL couldn't be stopped"
 
408
        return $OCF_ERR_GENERIC
 
409
    fi
 
410
 
 
411
        # stop waiting
 
412
        shutdown_timeout=$((($OCF_RESKEY_CRM_meta_timeout/1000)-5))
 
413
        count=0
 
414
        while [ $count -lt $shutdown_timeout ]
 
415
        do
 
416
                mysql_status
 
417
                rc=$?
 
418
                if [ $rc = $OCF_NOT_RUNNING ]; then
 
419
                        break
 
420
                fi
 
421
                count=`expr $count + 1`
 
422
                sleep 1
 
423
                ocf_log debug "MySQL still hasn't stopped yet. Waiting..."
 
424
        done
 
425
 
 
426
        mysql_status
 
427
        if [ $? != $OCF_NOT_RUNNING ]; then
 
428
                ocf_log info "MySQL failed to stop after ${shutdown_timeout}s using SIGTERM. Trying SIGKILL..."
 
429
                /bin/kill -KILL $pid > /dev/null
 
430
        fi
 
431
 
 
432
    ocf_log info "MySQL stopped";
 
433
    rm -f /var/lock/subsys/mysqld
 
434
    rm -f $OCF_RESKEY_socket
 
435
    return $OCF_SUCCESS
 
436
}
 
437
 
 
438
case "$1" in
 
439
  meta-data)    meta_data
 
440
                exit $OCF_SUCCESS;;
 
441
  usage|help)   usage
 
442
                exit $OCF_SUCCESS;;
 
443
esac
 
444
 
 
445
mysql_validate
 
446
rc=$?
 
447
LSB_STATUS_STOPPED=3
 
448
if [ $rc -ne 0 ]; then
 
449
        case "$1" in
 
450
                stop) exit $OCF_SUCCESS;;
 
451
                monitor) exit $OCF_NOT_RUNNING;;
 
452
                status) exit $LSB_STATUS_STOPPED;;
 
453
                *) exit $rc;;
 
454
        esac
 
455
fi
 
456
 
 
457
# What kind of method was invoked?
 
458
case "$1" in
 
459
  start)        mysql_start;;
 
460
  stop)         mysql_stop;;
 
461
  status)       mysql_status;;
 
462
  monitor)      mysql_monitor;;
 
463
  validate-all) exit $OCF_SUCCESS;;
 
464
 
 
465
 *)             usage
 
466
                exit $OCF_ERR_UNIMPLEMENTED;;
 
467
esac