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")
80 [ -d "/proc/$MYSQL_PID" ] && grep -q "$MYSQL_PIDFILE" /proc/$MYSQL_PID/cmdline && MYSQL_STATUS="running" || MYSQL_STATUS="not running"
83 # get mysql configuration in variables
84 # MYSQL_CONFIG MYSQL_DATA_DIR MYSQL_USER MYSQL_PIDFILE
91 config_file="/etc/mysqld/mysqld$(echo "$clusterdir" | tr '/' '-').conf"
93 # emulate old behaviour if only one cluster specified
94 if [ "$clusterdir" = "$MYSQL_DB_CLUSTERS" -a "$clusterdir" = "/var/lib/mysql" -a -f /etc/mysqld.conf ]; then
95 MYSQL_NO_CLUSTER_COMPAT=yes; export MYSQL_NO_CLUSTER_COMPAT
96 config_file=/etc/mysqld.conf
99 MYSQL_CLUSTER_DIR="$clusterdir"; export MYSQL_CLUSTER_DIR
100 MYSQL_CONFIG="$config_file"; export MYSQL_CONFIG
102 if [ ! -f "$config_file" ]; then
103 nls "Error: config file %s not found" "$config_file"
104 nls " MySQL can't be run."
109 /^[ \t]*\[.*\][ \t]*$/ {
111 section=substr($0,RSTART+1,RSTART+RLENGTH-3)
113 section=="mysqld" && $2~"=" {
115 printf("MYSQL_DATA_DIR=%s;", $3)
116 } else if ($1=="user") {
117 printf("MYSQL_USER=%s;", $3)
118 } else if ($1=="pid-file") {
119 printf("MYSQL_PIDFILE=%s;", $3)
120 } else if ($1=="socket") {
121 printf("MYSQL_SOCKET=%s;", $3)
125 print "export MYSQL_DATA_DIR MYSQL_USER MYSQL_PIDFILE MYSQL_SOCKET"
129 if [ -z "$MYSQL_DATA_DIR" -o "$MYSQL_DATA_DIR" != "$clusterdir/db" ]; then
130 nls "Error: datadir specified in %s should be %s" "$config_file" "$clusterdir/db"
131 nls " MySQL can't be run."
135 if ! is_yes "$MYSQL_NO_CLUSTER_COMPAT"; then
136 if [ -z "$MYSQL_PIDFILE" -o "$MYSQL_PIDFILE" != "$clusterdir/mysql.pid" ]; then
137 nls "Error: pid-file specified in %s should be %s" "$config_file" "$clusterdir/mysql.pid"
138 nls " MySQL can't be run."
143 if [ -z $MYSQL_USER ]; then
144 echo "$(nls 'MySQL user not configured properly')"'!' >&2
145 nls "Edit %s and configure it." "$config_file" >&2
153 mysqlgetconfig "$clusterdir"
154 if [ ! -d "$MYSQL_DATA_DIR/mysql" ]; then
155 nls "MySQL cluster %s not initialized." "$clusterdir"
156 nls "Try \`%s init %s' before start." "$0" "$clusterdir"
160 msg_starting "MySQL $clusterdir"
162 [ -z "$DEFAULT_SERVICE_RUN_NICE_LEVEL" ] && DEFAULT_SERVICE_RUN_NICE_LEVEL=0
163 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 &
165 mysqlstatus "$clusterdir"
166 if [ "$MYSQL_STATUS" != "unknown" -a "$MYSQL_PID" != "unknown" ]; then
177 mysqlstatus "$clusterdir"
178 msg_stopping "MySQL $clusterdir"
180 kill -TERM "$MYSQL_PID"
183 [ -d "/proc/$MYSQL_PID" ] && sleep 1
185 mysqlstatus "$clusterdir"
186 if [ "$MYSQL_STATUS" != "not running" ]; then
191 rm -f "$MYSQL_PIDFILE"
195 # check for running mysql instances; if any instance is running then
196 # create subsys lock file
199 # check for every defined db cluster in sysconfig file
200 for mysqldir in $DB_CLUSTERS; do
201 mysqlstatus "$mysqldir"
202 if [ "$MYSQL_STATUS" = "running" ]; then
203 touch /var/lock/subsys/mysql
207 rm -f /var/lock/subsys/mysql
212 mysqlgetconfig "$clusterdir"
214 nls "Initializing cluster %s" "$clusterdir"
216 # Check if not exist init database
217 if [ -d "$MYSQL_DATA_DIR/mysql" ]; then
218 nls "Seems that database is initialized now. Remove by hand %s" "$MYSQL_DATA_DIR/mysql"
219 nls "before initializing database."
220 nls "For now skipping cluster %s." "$clusterdir"
224 show "Creating privilege mysql tables for $MYSQL_DATA_DIR"
229 # Install this in the user table, too
230 hostname="`hostname --fqdn | tr -d '[:space:]'`"
232 # Check if hostname is valid
233 if [ -z "$hostname" ]; then
236 nls "Sorry, the host name is not configured."
237 nls "Please configure the 'hostname' command to return a hostname."
239 elif ! hostname -i >/dev/null 2>&1; then
242 nls "Sorry, the host '%s' could not be looked up." "$hostname"
243 nls "Please configure the 'hostname' command to return a correct hostname."
247 # Initialize variables
254 # Check for old tables
255 if test ! -f $MYSQL_DATA_DIR/mysql/db.frm
257 # mysqld --bootstrap wants one command/line
258 c_d="$c_d CREATE TABLE db ("
259 c_d="$c_d Host char(60) DEFAULT '' NOT NULL,"
260 c_d="$c_d Db char(64) DEFAULT '' NOT NULL,"
261 c_d="$c_d User char(16) DEFAULT '' NOT NULL,"
262 c_d="$c_d Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
263 c_d="$c_d Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
264 c_d="$c_d Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
265 c_d="$c_d Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
266 c_d="$c_d Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
267 c_d="$c_d Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
268 c_d="$c_d Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
269 c_d="$c_d References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
270 c_d="$c_d Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
271 c_d="$c_d Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
272 c_d="$c_d Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
273 c_d="$c_d Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
274 c_d="$c_d PRIMARY KEY Host (Host,Db,User),"
275 c_d="$c_d KEY User (User)"
277 c_d="$c_d comment='Database privileges';"
279 i_d="INSERT INTO db VALUES ('%','test','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');
280 INSERT INTO db VALUES ('%','test\_%','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');"
284 if test ! -f $MYSQL_DATA_DIR/mysql/host.frm
286 c_h="$c_h CREATE TABLE host ("
287 c_h="$c_h Host char(60) DEFAULT '' NOT NULL,"
288 c_h="$c_h Db char(64) DEFAULT '' NOT NULL,"
289 c_h="$c_h Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
290 c_h="$c_h Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
291 c_h="$c_h Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
292 c_h="$c_h Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
293 c_h="$c_h Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
294 c_h="$c_h Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
295 c_h="$c_h Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
296 c_h="$c_h References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
297 c_h="$c_h Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
298 c_h="$c_h Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
299 c_h="$c_h Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
300 c_h="$c_h Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
301 c_h="$c_h PRIMARY KEY Host (Host,Db)"
303 c_h="$c_h comment='Host privileges; Merged with database privileges';"
306 if test ! -f $MYSQL_DATA_DIR/mysql/user.frm
308 c_u="$c_u CREATE TABLE user ("
309 c_u="$c_u Host char(60) DEFAULT '' NOT NULL,"
310 c_u="$c_u User char(16) DEFAULT '' NOT NULL,"
311 c_u="$c_u Password char(16) DEFAULT '' NOT NULL,"
312 c_u="$c_u Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
313 c_u="$c_u Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
314 c_u="$c_u Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
315 c_u="$c_u Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
316 c_u="$c_u Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
317 c_u="$c_u Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
318 c_u="$c_u Reload_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
319 c_u="$c_u Shutdown_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
320 c_u="$c_u Process_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
321 c_u="$c_u File_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
322 c_u="$c_u Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
323 c_u="$c_u References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
324 c_u="$c_u Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
325 c_u="$c_u Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
326 c_u="$c_u Show_db_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
327 c_u="$c_u Super_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
328 c_u="$c_u Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
329 c_u="$c_u Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
330 c_u="$c_u Execute_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
331 c_u="$c_u Repl_slave_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
332 c_u="$c_u Repl_client_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
333 c_u="$c_u ssl_type enum('','ANY','X509', 'SPECIFIED') DEFAULT '' NOT NULL,"
334 c_u="$c_u ssl_cipher BLOB NOT NULL,"
335 c_u="$c_u x509_issuer BLOB NOT NULL,"
336 c_u="$c_u x509_subject BLOB NOT NULL,"
337 c_u="$c_u max_questions int(11) unsigned DEFAULT 0 NOT NULL,"
338 c_u="$c_u max_updates int(11) unsigned DEFAULT 0 NOT NULL,"
339 c_u="$c_u max_connections int(11) unsigned DEFAULT 0 NOT NULL,"
340 c_u="$c_u PRIMARY KEY Host (Host,User)"
342 c_u="$c_u comment='Users and global privileges';"
344 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);
345 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);
347 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);
348 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);
350 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);"
353 if test ! -f $MYSQL_DATA_DIR/mysql/func.frm
355 c_f="$c_f CREATE TABLE func ("
356 c_f="$c_f name char(64) DEFAULT '' NOT NULL,"
357 c_f="$c_f ret tinyint(1) DEFAULT '0' NOT NULL,"
358 c_f="$c_f dl char(128) DEFAULT '' NOT NULL,"
359 c_f="$c_f type enum ('function','aggregate') NOT NULL,"
360 c_f="$c_f PRIMARY KEY (name)"
362 c_f="$c_f comment='User defined functions';"
365 if test ! -f $MYSQL_DATA_DIR/mysql/tables_priv.frm
367 c_t="$c_t CREATE TABLE tables_priv ("
368 c_t="$c_t Host char(60) DEFAULT '' NOT NULL,"
369 c_t="$c_t Db char(64) DEFAULT '' NOT NULL,"
370 c_t="$c_t User char(16) DEFAULT '' NOT NULL,"
371 c_t="$c_t Table_name char(60) DEFAULT '' NOT NULL,"
372 c_t="$c_t Grantor char(77) DEFAULT '' NOT NULL,"
373 c_t="$c_t Timestamp timestamp(14),"
374 c_t="$c_t Table_priv set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter') DEFAULT '' NOT NULL,"
375 c_t="$c_t Column_priv set('Select','Insert','Update','References') DEFAULT '' NOT NULL,"
376 c_t="$c_t PRIMARY KEY (Host,Db,User,Table_name),"
377 c_t="$c_t KEY Grantor (Grantor)"
379 c_t="$c_t comment='Table privileges';"
382 if test ! -f $MYSQL_DATA_DIR/mysql/columns_priv.frm
384 c_c="$c_c CREATE TABLE columns_priv ("
385 c_c="$c_c Host char(60) DEFAULT '' NOT NULL,"
386 c_c="$c_c Db char(60) DEFAULT '' NOT NULL,"
387 c_c="$c_c User char(16) DEFAULT '' NOT NULL,"
388 c_c="$c_c Table_name char(60) DEFAULT '' NOT NULL,"
389 c_c="$c_c Column_name char(60) DEFAULT '' NOT NULL,"
390 c_c="$c_c Timestamp timestamp(14),"
391 c_c="$c_c Column_priv set('Select','Insert','Update','References') DEFAULT '' NOT NULL,"
392 c_c="$c_c PRIMARY KEY (Host,Db,User,Table_name,Column_name)"
394 c_c="$c_c comment='Column privileges';"
397 mkdir -p "$MYSQL_DATA_DIR" > /dev/null 2>&1
398 chown -R mysql.mysql "$MYSQL_CLUSTER_DIR" > /dev/null 2>&1
400 if /usr/sbin/mysqld --bootstrap --skip-grant-tables \
401 --datadir=$MYSQL_DATA_DIR --user=$MYSQL_USER << END_OF_DATA
402 CREATE DATABASE mysql;
423 PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL USERS!
424 This is done (after starting database) with:
426 /usr/bin/mysqladmin -u mysql password 'password'
427 /usr/bin/mysqladmin -h $hostname -u mysql password 'password'
428 /usr/bin/mysqladmin -u mysql_logrotate password 'password'
430 NOTE: mysql_logrotate password should be placed to $MYSQL_CONFIG in
431 mysqladmin section. See the manual for more instructions.
433 NOTE: if you are using cluster ability of this package you need
434 to specify different socket for each cluster (see --socket option)
440 Installation of grant tables FAILED!
442 Examine the logs in $MYSQL_DATA_DIR for more information. You can
443 also try to start the mysqld demon with:
445 /usr/sbin/mysqld --skip-grant &
447 You can use the command line tool /usr/bin/mysql to connect to the mysql
448 database and look at the grant tables:
450 shell> /usr/bin/mysql -u mysql mysql
453 Try 'mysqld --help' if you have problems with paths. Setting on
454 logging in /etc/mysqld.conf gives you a log in /var/log/mysql/log that
455 may be helpful. The latest information about MySQL is available on the
456 web at http://www.mysql.com/.
458 Please check PLD ftp site for newer versions of this package.
460 Please consult the MySQL manual section: 'Problems running
461 mysql_install_db', and the manual section that describes problems on
462 your OS. Another information source is the MySQL email archive.
463 Please check all of the above before mailing us! And if you do mail
464 us, you MUST use the /usr/bin/mysqlbug script!
473 # End of useful functions.
479 if [ ! -f $MYSQL_ERRLOG ]; then
482 chown mysql.mysql $MYSQL_ERRLOG
483 chmod 640 $MYSQL_ERRLOG
485 for mysqldir in $DB_CLUSTERS; do
486 mysqlstatus "$mysqldir"
487 if [ "$MYSQL_STATUS" = "running" ]; then
488 msg_already_running "MySQL $mysqldir"
490 mysqlstart "$mysqldir"
496 for mysqldir in $DB_CLUSTERS; do
497 mysqlstatus "$mysqldir"
498 if [ "$MYSQL_STATUS" = "not running" ]; then
499 msg_not_running "MySQL $mysqldir"
501 mysqlstop "$mysqldir"
507 for mysqldir in $DB_CLUSTERS; do
508 mysqlstatus "$mysqldir"
509 echo "MySQL cluster $mysqldir: $MYSQL_STATUS"
513 restart|force-reload)
519 for mysqldir in $DB_CLUSTERS; do
520 mysqlinit "$mysqldir"
524 msg_usage "$0 {start|stop|init|restart|force-reload|status}"