6
# Description: Manages a MySQL database as Linux-HA resource
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
15
# Support: linux-ha@lists.linux-ha.org
16
# License: GNU General Public License (GPL)
17
# Copyright: (C) 2002 - 2005 International Business Machines, Inc.
19
# An example usage in /etc/ha.d/haresources:
20
# node1 10.0.0.170 mysql
22
# See usage() function below for more details...
24
# OCF instance parameters:
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
38
#######################################################################
41
: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/resource.d/heartbeat}
42
. ${OCF_FUNCTIONS_DIR}/.ocf-shellfuncs
44
#######################################################################
46
# Fill in some defaults if no values are specified
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=""
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=""
78
: ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}}
79
MYSQL_BINDIR=`dirname ${OCF_RESKEY_binary}`
81
: ${OCF_RESKEY_config=${OCF_RESKEY_config_default}}
82
: ${OCF_RESKEY_datadir=${OCF_RESKEY_datadir_default}}
84
: ${OCF_RESKEY_user=${OCF_RESKEY_user_default}}
85
: ${OCF_RESKEY_group=${OCF_RESKEY_group_default}}
87
: ${OCF_RESKEY_log=${OCF_RESKEY_log_default}}
88
: ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}}
89
: ${OCF_RESKEY_socket=${OCF_RESKEY_socket_default}}
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}}
95
: ${OCF_RESKEY_enable_creation=${OCF_RESKEY_enable_creation_default}}
96
: ${OCF_RESKEY_additional_parameters=${OCF_RESKEY_additional_parameters_default}}
100
usage: $0 (start|stop|validate-all|meta-data|monitor)
102
$0 manages a MySQL Database as an HA resource.
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
115
<?xml version="1.0"?>
116
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
117
<resource-agent name="mysql">
118
<version>1.0</version>
121
Resource script for MySQL.
122
It manages a MySQL Database instance as an HA resource.
124
<shortdesc lang="en">Manages a MySQL database instance</shortdesc>
128
<parameter name="binary" unique="0" required="0">
130
Location of the MySQL binary
132
<shortdesc lang="en">MySQL binary</shortdesc>
133
<content type="string" default="${OCF_RESKEY_binary_default}" />
136
<parameter name="config" unique="0" required="0">
140
<shortdesc lang="en">MySQL config</shortdesc>
141
<content type="string" default="${OCF_RESKEY_config_default}" />
144
<parameter name="datadir" unique="0" required="0">
146
Directory containing databases
148
<shortdesc lang="en">MySQL datadir</shortdesc>
149
<content type="string" default="${OCF_RESKEY_datadir_default}" />
152
<parameter name="user" unique="0" required="0">
154
User running MySQL daemon
156
<shortdesc lang="en">MySQL user</shortdesc>
157
<content type="string" default="${OCF_RESKEY_user_default}" />
160
<parameter name="group" unique="0" required="0">
162
Group running MySQL daemon (for logfile and directory permissions)
164
<shortdesc lang="en">MySQL group</shortdesc>
165
<content type="string" default="${OCF_RESKEY_group_default}"/>
168
<parameter name="log" unique="0" required="0">
170
The logfile to be used for mysqld.
172
<shortdesc lang="en">MySQL log file</shortdesc>
173
<content type="string" default="${OCF_RESKEY_log_default}"/>
176
<parameter name="pid" unique="0" required="0">
178
The pidfile to be used for mysqld.
180
<shortdesc lang="en">MySQL pid file</shortdesc>
181
<content type="string" default="${OCF_RESKEY_pid_default}"/>
184
<parameter name="socket" unique="0" required="0">
186
The socket to be used for mysqld.
188
<shortdesc lang="en">MySQL socket</shortdesc>
189
<content type="string" default="${OCF_RESKEY_socket_default}"/>
192
<parameter name="test_table" unique="0" required="0">
194
Table to be tested in monitor statement (in database.table notation)
196
<shortdesc lang="en">MySQL test table</shortdesc>
197
<content type="string" default="${OCF_RESKEY_test_table_default}" />
200
<parameter name="test_user" unique="0" required="0">
204
<shortdesc lang="en">MySQL test user</shortdesc>
205
<content type="string" default="${OCF_RESKEY_test_user_default}" />
208
<parameter name="test_passwd" unique="0" required="0">
210
MySQL test user password
212
<shortdesc lang="en">MySQL test user password</shortdesc>
213
<content type="string" default="${OCF_RESKEY_test_passwd_default}" />
216
<parameter name="enable_creation" unique="0" required="0">
218
If the MySQL database does not exist, it will be created
220
<shortdesc lang="en">Create the database if it does not exist</shortdesc>
221
<content type="integer" default="${OCF_RESKEY_enable_creation_default}"/>
224
<parameter name="additional_parameters" unique="0" required="0">
226
Additional parameters which are passed to the mysqld on startup.
227
(e.g. --skip-external-locking or --skip-grant-tables)
229
<shortdesc lang="en">Additional parameters to pass to mysqld</shortdesc>
230
<content type="string" default="${OCF_RESKEY_additional_parameters_default}"/>
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" />
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;
254
if [ ! -f $OCF_RESKEY_config ]; then
255
ocf_log err "Config $OCF_RESKEY_config doesn't exist";
256
return $OCF_ERR_CONFIGURED;
259
if [ ! -d $OCF_RESKEY_datadir ]; then
260
ocf_log err "Datadir $OCF_RESKEY_datadir doesn't exist";
261
return $OCF_ERR_CONFIGURED;
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;
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;
279
if [ ! -e $OCF_RESKEY_pid ]; then
280
ocf_log debug "MySQL is not running"
281
return $OCF_NOT_RUNNING;
284
pid=`cat $OCF_RESKEY_pid`;
285
if [ -d /proc -a -d /proc/1 ]; then
286
[ "u$pid" != "u" -a -d /proc/$pid ]
288
kill -0 $pid >/dev/null 2>&1
291
if [ $? -eq 0 ]; then
294
ocf_log debug "MySQL not running: removing old PID file"
295
rm -f $OCF_RESKEY_pid
296
return $OCF_NOT_RUNNING;
304
if [ $OCF_CHECK_LEVEL = 0 -o $rc != 0 ]; then
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`
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;
316
ocf_log info "MySQL monitor succeeded";
323
if [ $? = $OCF_SUCCESS ]; then
324
ocf_log info "MySQL already running"
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
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
337
if [ $rc -ne 0 ] ; then
338
ocf_log err "Initialization failed: $rc";
339
exit $OCF_ERR_GENERIC
341
chown -R $OCF_RESKEY_user:$OCF_RESKEY_group $OCF_RESKEY_datadir
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;
349
if [ ! -d $pid_dir ] ; then
350
ocf_log info "Creating PID dir: $pid_dir"
352
chown $OCF_RESKEY_user:$OCF_RESKEY_group $pid_dir
355
socket_dir=`dirname $OCF_RESKEY_socket`
356
if [ ! -d $socket_dir ] ; then
357
ocf_log info "Creating socket dir: $socket_dir"
359
chown $OCF_RESKEY_user:$OCF_RESKEY_group $socket_dir
362
# Uncomment to perform permission clensing
363
# - not convinced this should be enabled by default
365
#chmod 0755 $OCF_RESKEY_datadir
366
#chown -R $OCF_RESKEY_user $OCF_RESKEY_datadir
367
#chgrp -R $OCF_RESKEY_group $OCF_RESKEY_datadir
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 &
372
if [ $rc != 0 ]; then
373
ocf_log err "MySQL start command failed: $rc"
377
# Spin waiting for the server to come up.
378
# Let the CRM/LRM time us out if required
380
while [ $start_wait = 1 ]; do
383
if [ $rc = $OCF_SUCCESS ]; then
386
elif [ $rc != $OCF_NOT_RUNNING ]; then
387
ocf_log info "MySQL start failed: $rc"
393
ocf_log info "MySQL started"
398
if [ ! -f $OCF_RESKEY_pid ]; then
399
ocf_log info "MySQL is not running"
403
pid=`cat $OCF_RESKEY_pid 2> /dev/null `
404
/bin/kill $pid > /dev/null
406
if [ $rc != 0 ]; then
407
ocf_log err "MySQL couldn't be stopped"
408
return $OCF_ERR_GENERIC
412
shutdown_timeout=$((($OCF_RESKEY_CRM_meta_timeout/1000)-5))
414
while [ $count -lt $shutdown_timeout ]
418
if [ $rc = $OCF_NOT_RUNNING ]; then
421
count=`expr $count + 1`
423
ocf_log debug "MySQL still hasn't stopped yet. Waiting..."
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
432
ocf_log info "MySQL stopped";
433
rm -f /var/lock/subsys/mysqld
434
rm -f $OCF_RESKEY_socket
448
if [ $rc -ne 0 ]; then
450
stop) exit $OCF_SUCCESS;;
451
monitor) exit $OCF_NOT_RUNNING;;
452
status) exit $LSB_STATUS_STOPPED;;
457
# What kind of method was invoked?
461
status) mysql_status;;
462
monitor) mysql_monitor;;
463
validate-all) exit $OCF_SUCCESS;;
466
exit $OCF_ERR_UNIMPLEMENTED;;