3 # mysql A very fast and reliable SQL database engine
5 # chkconfig: 2345 84 25
7 # description: A very fast and reliable SQL database engine.
10 # Source function library
11 . /etc/rc.d/init.d/functions
14 . /etc/sysconfig/network
17 if [ -f /etc/sysconfig/mysql ]; then
18 . /etc/sysconfig/mysql
20 nls "Error: %s not found" /etc/sysconfig/mysql
21 nls " MySQL can't be run."
25 if [ ! "$MYSQL_DB_CLUSTERS" ]; then
26 nls "Error: MYSQL_DB_CLUSTERS not found or is empty"
27 nls " MySQL can't be run."
31 # Check that networking is up
32 if is_yes "${NETWORKING}"; then
33 if [ ! -f /var/lock/subsys/network -a "$1" != stop -a "$1" != status -a "$1" != init ]; then
34 msg_network_down MySQL
42 if [ -f /etc/sysconfig/mysql ]; then
43 . /etc/sysconfig/mysql
48 # any db cluster as command line argument?
51 # perform action for specified clusters only
54 DB_CLUSTERS="$MYSQL_DB_CLUSTERS"
57 MYSQL_ERRLOG=/var/log/mysql/err
64 # check for mysql status
70 # MYSQL_STATUS = running | not running
71 # MYSQL_PID = pid of mysqld process
75 mysqlgetconfig "$clusterdir"
76 MYSQL_STATUS="unknown"
79 [ -f "$MYSQL_PIDFILE" ] && MYSQL_PID=$(cat "$MYSQL_PIDFILE")
81 if [ ! -d "/proc/$MYSQL_PID" -a "$MYSQL_PID" != "unknown" ]; then
83 elif [ -d "/proc/$MYSQL_PID" ]; then
84 grep -q "$MYSQL_PIDFILE" /proc/$MYSQL_PID/cmdline && MYSQL_STATUS="running" || MYSQL_STATUS="not running"
88 # get mysql configuration in variables
89 # MYSQL_CONFIG MYSQL_DATA_DIR MYSQL_USER MYSQL_PIDFILE
96 config_file="/etc/mysqld/mysqld$(echo "$clusterdir" | tr '/' '-').conf"
98 # emulate old behaviour if only one cluster specified
99 if [ "$clusterdir" = "$MYSQL_DB_CLUSTERS" -a "$clusterdir" = "/var/lib/mysql" -a -f /etc/mysqld.conf ]; then
100 MYSQL_NO_CLUSTER_COMPAT=yes; export MYSQL_NO_CLUSTER_COMPAT
101 config_file=/etc/mysqld.conf
104 MYSQL_CLUSTER_DIR="$clusterdir"; export MYSQL_CLUSTER_DIR
105 MYSQL_CONFIG="$config_file"; export MYSQL_CONFIG
107 if [ ! -f "$config_file" ]; then
108 nls "Error: config file %s not found" "$config_file"
109 nls " MySQL can't be run."
114 /^[ \t]*\[.*\][ \t]*$/ {
116 section=substr($0,RSTART+1,RSTART+RLENGTH-3)
118 section=="mysqld" && $2~"=" {
120 printf("MYSQL_DATA_DIR=%s;", $3)
121 } else if ($1=="user") {
122 printf("MYSQL_USER=%s;", $3)
123 } else if ($1=="pid-file") {
124 printf("MYSQL_PIDFILE=%s;", $3)
125 } else if ($1=="socket") {
126 printf("MYSQL_SOCKET=%s;", $3)
130 print "export MYSQL_DATA_DIR MYSQL_USER MYSQL_PIDFILE MYSQL_SOCKET"
134 if [ -z "$MYSQL_DATA_DIR" -o "$MYSQL_DATA_DIR" != "$clusterdir/db" ]; then
135 nls "Error: datadir specified in %s should be %s" "$config_file" "$clusterdir/db"
136 nls " MySQL can't be run."
140 if ! is_yes "$MYSQL_NO_CLUSTER_COMPAT"; then
141 if [ -z "$MYSQL_PIDFILE" -o "$MYSQL_PIDFILE" != "$clusterdir/mysql.pid" ]; then
142 nls "Error: pid-file specified in %s should be %s" "$config_file" "$clusterdir/mysql.pid"
143 nls " MySQL can't be run."
148 if [ -z $MYSQL_USER ]; then
149 echo "$(nls 'MySQL user not configured properly')"'!' >&2
150 nls "Edit %s and configure it." "$config_file" >&2
158 mysqlgetconfig "$clusterdir"
159 if [ ! -d "$MYSQL_DATA_DIR/mysql" ]; then
160 nls "MySQL cluster %s not initialized." "$clusterdir"
161 nls "Try \`%s init %s' before start." "$0" "$clusterdir"
165 msg_starting "MySQL $clusterdir"
167 [ -z "$DEFAULT_SERVICE_RUN_NICE_LEVEL" ] && DEFAULT_SERVICE_RUN_NICE_LEVEL=0
168 TMPDIR=/tmp nice -n ${SERVICE_RUN_NICE_LEVEL:-$DEFAULT_SERVICE_RUN_NICE_LEVEL} /usr/sbin/mysqld --defaults-file=$MYSQL_CONFIG --datadir=$MYSQL_DATA_DIR --pid-file=$MYSQL_PIDFILE >> $MYSQL_ERRLOG 2>&1 &
170 mysqlstatus "$clusterdir"
171 if [ "$MYSQL_STATUS" = "running" -a "$MYSQL_PID" != "unknown" ]; then
173 elif [ "$MYSQL_STATUS" = "died" ]; then
185 mysqlstatus "$clusterdir"
186 msg_stopping "MySQL $clusterdir"
188 [ "$MYSQL_PID" != "unknown" ] && kill -TERM "$MYSQL_PID" 2> /dev/null
191 [ -d "/proc/$MYSQL_PID" ] && sleep 1
193 mysqlstatus "$clusterdir"
194 if [ "$MYSQL_STATUS" = "died" ]; then
196 elif [ "$MYSQL_STATUS" = "running" ]; then
201 rm -f "$MYSQL_PIDFILE"
205 # check for running mysql instances; if any instance is running then
206 # create subsys lock file
209 # check for every defined db cluster in sysconfig file
210 for mysqldir in $DB_CLUSTERS; do
211 mysqlstatus "$mysqldir"
212 if [ "$MYSQL_STATUS" = "running" ]; then
213 touch /var/lock/subsys/mysql
217 rm -f /var/lock/subsys/mysql
222 mysqlgetconfig "$clusterdir"
224 nls "Initializing cluster %s" "$clusterdir"
226 # Check if not exist init database
227 if [ -d "$MYSQL_DATA_DIR/mysql" ]; then
228 nls "Seems that database is initialized now. Remove by hand %s" "$MYSQL_DATA_DIR/mysql"
229 nls "before initializing database."
230 nls "For now skipping cluster %s." "$clusterdir"
234 show "Creating privilege mysql tables for $MYSQL_DATA_DIR"
239 # Install this in the user table, too
240 hostname="`hostname --fqdn | tr -d '[:space:]'`"
242 # Check if hostname is valid
243 if [ -z "$hostname" ]; then
246 nls "Sorry, the host name is not configured."
247 nls "Please configure the 'hostname' command to return a hostname."
249 elif ! hostname -i >/dev/null 2>&1; then
252 nls "Sorry, the host '%s' could not be looked up." "$hostname"
253 nls "Please configure the 'hostname' command to return a correct hostname."
257 # Initialize variables
264 # Check for old tables
265 if test ! -f $MYSQL_DATA_DIR/mysql/db.frm
267 # mysqld --bootstrap wants one command/line
268 c_d="$c_d CREATE TABLE db ("
269 c_d="$c_d Host char(60) DEFAULT '' NOT NULL,"
270 c_d="$c_d Db char(64) DEFAULT '' NOT NULL,"
271 c_d="$c_d User char(16) DEFAULT '' NOT NULL,"
272 c_d="$c_d Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
273 c_d="$c_d Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
274 c_d="$c_d Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
275 c_d="$c_d Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
276 c_d="$c_d Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
277 c_d="$c_d Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
278 c_d="$c_d Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
279 c_d="$c_d References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
280 c_d="$c_d Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
281 c_d="$c_d Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
282 c_d="$c_d Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
283 c_d="$c_d Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
284 c_d="$c_d PRIMARY KEY Host (Host,Db,User),"
285 c_d="$c_d KEY User (User)"
287 c_d="$c_d comment='Database privileges';"
289 i_d="INSERT INTO db VALUES ('%','test','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');
290 INSERT INTO db VALUES ('%','test\_%','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');"
294 if test ! -f $MYSQL_DATA_DIR/mysql/host.frm
296 c_h="$c_h CREATE TABLE host ("
297 c_h="$c_h Host char(60) DEFAULT '' NOT NULL,"
298 c_h="$c_h Db char(64) DEFAULT '' NOT NULL,"
299 c_h="$c_h Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
300 c_h="$c_h Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
301 c_h="$c_h Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
302 c_h="$c_h Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
303 c_h="$c_h Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
304 c_h="$c_h Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
305 c_h="$c_h Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
306 c_h="$c_h References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
307 c_h="$c_h Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
308 c_h="$c_h Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
309 c_h="$c_h Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
310 c_h="$c_h Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
311 c_h="$c_h PRIMARY KEY Host (Host,Db)"
313 c_h="$c_h comment='Host privileges; Merged with database privileges';"
316 if test ! -f $MYSQL_DATA_DIR/mysql/user.frm
318 c_u="$c_u CREATE TABLE user ("
319 c_u="$c_u Host char(60) DEFAULT '' NOT NULL,"
320 c_u="$c_u User char(16) DEFAULT '' NOT NULL,"
321 c_u="$c_u Password char(16) DEFAULT '' NOT NULL,"
322 c_u="$c_u Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
323 c_u="$c_u Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
324 c_u="$c_u Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
325 c_u="$c_u Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
326 c_u="$c_u Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
327 c_u="$c_u Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
328 c_u="$c_u Reload_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
329 c_u="$c_u Shutdown_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
330 c_u="$c_u Process_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
331 c_u="$c_u File_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
332 c_u="$c_u Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
333 c_u="$c_u References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
334 c_u="$c_u Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
335 c_u="$c_u Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
336 c_u="$c_u Show_db_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
337 c_u="$c_u Super_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
338 c_u="$c_u Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
339 c_u="$c_u Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
340 c_u="$c_u Execute_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
341 c_u="$c_u Repl_slave_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
342 c_u="$c_u Repl_client_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
343 c_u="$c_u ssl_type enum('','ANY','X509', 'SPECIFIED') DEFAULT '' NOT NULL,"
344 c_u="$c_u ssl_cipher BLOB NOT NULL,"
345 c_u="$c_u x509_issuer BLOB NOT NULL,"
346 c_u="$c_u x509_subject BLOB NOT NULL,"
347 c_u="$c_u max_questions int(11) unsigned DEFAULT 0 NOT NULL,"
348 c_u="$c_u max_updates int(11) unsigned DEFAULT 0 NOT NULL,"
349 c_u="$c_u max_connections int(11) unsigned DEFAULT 0 NOT NULL,"
350 c_u="$c_u PRIMARY KEY Host (Host,User)"
352 c_u="$c_u comment='Users and global privileges';"
354 i_u="INSERT INTO user VALUES ('localhost','mysql','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0);
355 INSERT INTO user VALUES ('$hostname','mysql','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0);
357 REPLACE INTO user VALUES ('localhost','mysql','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0);
358 REPLACE INTO user VALUES ('$hostname','mysql','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0);
360 INSERT INTO user VALUES ('localhost','mysql_logrotate','','N','N','N','N','N','N','Y','N','N','N','N','N','N','N','N','N','N','N','N','N','N','','','','',0,0,0);"
363 if test ! -f $MYSQL_DATA_DIR/mysql/func.frm
365 c_f="$c_f CREATE TABLE func ("
366 c_f="$c_f name char(64) DEFAULT '' NOT NULL,"
367 c_f="$c_f ret tinyint(1) DEFAULT '0' NOT NULL,"
368 c_f="$c_f dl char(128) DEFAULT '' NOT NULL,"
369 c_f="$c_f type enum ('function','aggregate') NOT NULL,"
370 c_f="$c_f PRIMARY KEY (name)"
372 c_f="$c_f comment='User defined functions';"
375 if test ! -f $MYSQL_DATA_DIR/mysql/tables_priv.frm
377 c_t="$c_t CREATE TABLE tables_priv ("
378 c_t="$c_t Host char(60) DEFAULT '' NOT NULL,"
379 c_t="$c_t Db char(64) DEFAULT '' NOT NULL,"
380 c_t="$c_t User char(16) DEFAULT '' NOT NULL,"
381 c_t="$c_t Table_name char(60) DEFAULT '' NOT NULL,"
382 c_t="$c_t Grantor char(77) DEFAULT '' NOT NULL,"
383 c_t="$c_t Timestamp timestamp(14),"
384 c_t="$c_t Table_priv set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter') DEFAULT '' NOT NULL,"
385 c_t="$c_t Column_priv set('Select','Insert','Update','References') DEFAULT '' NOT NULL,"
386 c_t="$c_t PRIMARY KEY (Host,Db,User,Table_name),"
387 c_t="$c_t KEY Grantor (Grantor)"
389 c_t="$c_t comment='Table privileges';"
392 if test ! -f $MYSQL_DATA_DIR/mysql/columns_priv.frm
394 c_c="$c_c CREATE TABLE columns_priv ("
395 c_c="$c_c Host char(60) DEFAULT '' NOT NULL,"
396 c_c="$c_c Db char(60) DEFAULT '' NOT NULL,"
397 c_c="$c_c User char(16) DEFAULT '' NOT NULL,"
398 c_c="$c_c Table_name char(60) DEFAULT '' NOT NULL,"
399 c_c="$c_c Column_name char(60) DEFAULT '' NOT NULL,"
400 c_c="$c_c Timestamp timestamp(14),"
401 c_c="$c_c Column_priv set('Select','Insert','Update','References') DEFAULT '' NOT NULL,"
402 c_c="$c_c PRIMARY KEY (Host,Db,User,Table_name,Column_name)"
404 c_c="$c_c comment='Column privileges';"
407 mkdir -p "$MYSQL_DATA_DIR" > /dev/null 2>&1
408 chown -R mysql.mysql "$MYSQL_CLUSTER_DIR" > /dev/null 2>&1
410 if /usr/sbin/mysqld --bootstrap --skip-grant-tables \
411 --datadir=$MYSQL_DATA_DIR --user=$MYSQL_USER << END_OF_DATA
412 CREATE DATABASE mysql;
433 PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL USERS!
434 This is done (after starting database) with:
436 /usr/bin/mysqladmin -u mysql password 'password'
437 /usr/bin/mysqladmin -h $hostname -u mysql password 'password'
438 /usr/bin/mysqladmin -u mysql_logrotate password 'password'
440 NOTE: mysql_logrotate password should be placed to $MYSQL_CONFIG in
441 mysqladmin section. See the manual for more instructions.
443 NOTE: if you are using cluster ability of this package you need
444 to specify different socket for each cluster (see --socket option)
450 Installation of grant tables FAILED!
452 Examine the logs in $MYSQL_DATA_DIR for more information. You can
453 also try to start the mysqld demon with:
455 /usr/sbin/mysqld --skip-grant &
457 You can use the command line tool /usr/bin/mysql to connect to the mysql
458 database and look at the grant tables:
460 shell> /usr/bin/mysql -u mysql mysql
463 Try 'mysqld --help' if you have problems with paths. Setting on
464 logging in /etc/mysqld.conf gives you a log in /var/log/mysql/log that
465 may be helpful. The latest information about MySQL is available on the
466 web at http://www.mysql.com/.
468 Please check PLD ftp site for newer versions of this package.
470 Please consult the MySQL manual section: 'Problems running
471 mysql_install_db', and the manual section that describes problems on
472 your OS. Another information source is the MySQL email archive.
473 Please check all of the above before mailing us! And if you do mail
474 us, you MUST use the /usr/bin/mysqlbug script!
483 # End of useful functions.
489 if [ ! -f $MYSQL_ERRLOG ]; then
492 chown mysql.mysql $MYSQL_ERRLOG
493 chmod 640 $MYSQL_ERRLOG
495 for mysqldir in $DB_CLUSTERS; do
496 mysqlstatus "$mysqldir"
497 if [ "$MYSQL_STATUS" = "running" ]; then
498 msg_already_running "MySQL $mysqldir"
500 mysqlstart "$mysqldir"
506 for mysqldir in $DB_CLUSTERS; do
507 mysqlstatus "$mysqldir"
508 if [ "$MYSQL_STATUS" = "not running" ]; then
509 msg_not_running "MySQL $mysqldir"
511 mysqlstop "$mysqldir"
517 for mysqldir in $DB_CLUSTERS; do
518 mysqlstatus "$mysqldir"
519 echo "MySQL cluster $mysqldir: $MYSQL_STATUS"
523 restart|force-reload)
529 for mysqldir in $DB_CLUSTERS; do
530 mysqlinit "$mysqldir"
534 msg_usage "$0 {start|stop|init|restart|force-reload|status}"