~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to scripts/mysqld_multi.sh

  • Committer: Brian Aker
  • Date: 2008-07-08 21:36:11 UTC
  • mfrom: (77.1.34 codestyle)
  • Revision ID: brian@tangent.org-20080708213611-b0k2zy8eldttqct3
Merging up Monty's changes

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/usr/bin/perl
2
 
 
3
 
use Getopt::Long;
4
 
use POSIX qw(strftime);
5
 
 
6
 
$|=1;
7
 
$VER="2.16";
8
 
 
9
 
my @defaults_options;   #  Leading --no-defaults, --defaults-file, etc.
10
 
 
11
 
$opt_example       = 0;
12
 
$opt_help          = 0;
13
 
$opt_log           = undef();
14
 
$opt_mysqladmin    = "@bindir@/mysqladmin";
15
 
$opt_mysqld        = "@libexecdir@/mysqld";
16
 
$opt_no_log        = 0;
17
 
$opt_password      = undef();
18
 
$opt_tcp_ip        = 0;
19
 
$opt_user          = "root";
20
 
$opt_version       = 0;
21
 
$opt_silent        = 0;
22
 
$opt_verbose       = 0;
23
 
 
24
 
my $my_print_defaults_exists= 1;
25
 
my $logdir= undef();
26
 
 
27
 
my ($mysqld, $mysqladmin, $groupids, $homedir, $my_progname);
28
 
 
29
 
$homedir = $ENV{HOME};
30
 
$my_progname = $0;
31
 
$my_progname =~ s/.*[\/]//;
32
 
 
33
 
main();
34
 
 
35
 
####
36
 
#### main sub routine
37
 
####
38
 
 
39
 
sub main
40
 
{
41
 
  my $flag_exit= 0;
42
 
 
43
 
  if (!defined(my_which(my_print_defaults)))
44
 
  {
45
 
    # We can't throw out yet, since --version, --help, or --example may
46
 
    # have been given
47
 
    print "WARNING: my_print_defaults command not found.\n";
48
 
    print "Please make sure you have this command available and\n";
49
 
    print "in your path. The command is available from the latest\n";
50
 
    print "MySQL distribution.\n";
51
 
    $my_print_defaults_exists= 0;
52
 
  }
53
 
 
54
 
  # Remove leading defaults options from @ARGV
55
 
  while (@ARGV > 0)
56
 
  {
57
 
    last unless $ARGV[0] =~
58
 
      /^--(?:no-defaults$|(?:defaults-file|defaults-extra-file)=)/;
59
 
    push @defaults_options, (shift @ARGV);
60
 
  }
61
 
 
62
 
  # Handle deprecated --config-file option: convert to --defaults-extra-file
63
 
  foreach my $arg (@ARGV)
64
 
  {
65
 
    if ($arg =~ m/^--config-file=(.*)/)
66
 
    {
67
 
      # Put it at the beginning of the list, so it has lower precedence
68
 
      # than a correct --defaults-extra-file option
69
 
 
70
 
      unshift @defaults_options, "--defaults-extra-file=$1";
71
 
    }
72
 
  }
73
 
 
74
 
  foreach (@defaults_options)
75
 
  {
76
 
    $_ = quote_shell_word($_);
77
 
  }
78
 
 
79
 
  # Add [mysqld_multi] options to front of @ARGV, ready for GetOptions()
80
 
  unshift @ARGV, defaults_for_group('mysqld_multi');
81
 
 
82
 
  # The --config-file option can be ignored; if passed on the command
83
 
  # line, it's already handled; if specified in the configuration file,
84
 
  # it's redundant and not useful
85
 
  @ARGV= grep { not /^--config-file=/ } @ARGV;
86
 
 
87
 
  # We've already handled --no-defaults, --defaults-file, etc.
88
 
  if (!GetOptions("help", "example", "version", "mysqld=s", "mysqladmin=s",
89
 
                  "user=s", "password=s", "log=s", "no-log",
90
 
                  "tcp-ip",  "silent", "verbose"))
91
 
  {
92
 
    $flag_exit= 1;
93
 
  }
94
 
  usage() if ($opt_help);
95
 
 
96
 
  if ($opt_verbose && $opt_silent)
97
 
  {
98
 
    print "Both --verbose and --silent have been given. Some of the warnings ";
99
 
    print "will be disabled\nand some will be enabled.\n\n";
100
 
  }
101
 
 
102
 
  init_log() if (!defined($opt_log));
103
 
  $groupids = $ARGV[1];
104
 
  if ($opt_version)
105
 
  {
106
 
    print "$my_progname version $VER by Jani Tolonen\n";
107
 
    exit(0);
108
 
  }
109
 
  example() if ($opt_example);
110
 
  if ($flag_exit)
111
 
  {
112
 
    print "Error with an option, see $my_progname --help for more info.\n";
113
 
    exit(1);
114
 
  }
115
 
  if (!defined(my_which(my_print_defaults)))
116
 
  {
117
 
    print "ABORT: Can't find command 'my_print_defaults'.\n";
118
 
    print "This command is available from the latest MySQL\n";
119
 
    print "distribution. Please make sure you have the command\n";
120
 
    print "in your PATH.\n";
121
 
    exit(1);
122
 
  }
123
 
  usage() if (!defined($ARGV[0]) ||
124
 
              (!($ARGV[0] =~ m/^start$/i) &&
125
 
               !($ARGV[0] =~ m/^stop$/i) &&
126
 
               !($ARGV[0] =~ m/^report$/i)));
127
 
 
128
 
  if (!$opt_no_log)
129
 
  {
130
 
    w2log("$my_progname log file version $VER; run: ",
131
 
          "$opt_log", 1, 0);
132
 
  }
133
 
  else
134
 
  {
135
 
    print "$my_progname log file version $VER; run: ";
136
 
    print strftime "%a %b %e %H:%M:%S %Y", localtime;
137
 
    print "\n";
138
 
  }
139
 
  if ($ARGV[0] =~ m/^start$/i)
140
 
  {
141
 
    if (!defined(($mysqld= my_which($opt_mysqld))) && $opt_verbose)
142
 
    {
143
 
      print "WARNING: Couldn't find the default mysqld binary.\n";
144
 
      print "Tried: $opt_mysqld\n";
145
 
      print "This is OK, if you are using option \"mysqld=...\" in ";
146
 
      print "groups [mysqldN] separately for each.\n\n";
147
 
    }
148
 
    start_mysqlds();
149
 
  }
150
 
  else
151
 
  {
152
 
    if (!defined(($mysqladmin= my_which($opt_mysqladmin))) && $opt_verbose)
153
 
    {
154
 
      print "WARNING: Couldn't find the default mysqladmin binary.\n";
155
 
      print "Tried: $opt_mysqladmin\n";
156
 
      print "This is OK, if you are using option \"mysqladmin=...\" in ";
157
 
      print "groups [mysqldN] separately for each.\n\n";
158
 
    }
159
 
    if ($ARGV[0] =~ m/^report$/i)
160
 
    {
161
 
      report_mysqlds();
162
 
    }
163
 
    else
164
 
    {
165
 
      stop_mysqlds();
166
 
    }
167
 
  }
168
 
}
169
 
 
170
 
#
171
 
# Quote word for shell
172
 
#
173
 
 
174
 
sub quote_shell_word
175
 
{
176
 
  my ($option)= @_;
177
 
 
178
 
  $option =~ s!([^\w=./-])!\\$1!g;
179
 
  return $option;
180
 
}
181
 
 
182
 
sub defaults_for_group
183
 
{
184
 
  my ($group) = @_;
185
 
 
186
 
  return () unless $my_print_defaults_exists;
187
 
 
188
 
  my $com= join ' ', 'my_print_defaults', @defaults_options, $group;
189
 
  my @defaults = `$com`;
190
 
  chomp @defaults;
191
 
  return @defaults;
192
 
}
193
 
 
194
 
####
195
 
#### Init log file. Check for appropriate place for log file, in the following
196
 
#### order:  my_print_defaults mysqld datadir, @datadir@
197
 
####
198
 
 
199
 
sub init_log
200
 
{
201
 
  foreach my $opt (defaults_for_group('mysqld'))
202
 
  {
203
 
    if ($opt =~ m/^--datadir=(.*)/ && -d "$1" && -w "$1")
204
 
    {
205
 
      $logdir= $1;
206
 
    }
207
 
  }
208
 
  if (!defined($logdir))
209
 
  {
210
 
    $logdir= "@datadir@" if (-d "@datadir@" && -w "@datadir@");
211
 
  }
212
 
  if (!defined($logdir))
213
 
  {
214
 
    # Log file was not specified and we could not log to a standard place,
215
 
    # so log file be disabled for now.
216
 
    if (!$opt_silent)
217
 
    {
218
 
      print "WARNING: Log file disabled. Maybe directory or file isn't writable?\n";
219
 
    }
220
 
    $opt_no_log= 1;
221
 
  }
222
 
  else
223
 
  {
224
 
    $opt_log= "$logdir/mysqld_multi.log";
225
 
  }
226
 
}
227
 
 
228
 
####
229
 
#### Report living and not running MySQL servers
230
 
####
231
 
 
232
 
sub report_mysqlds
233
 
{
234
 
  my (@groups, $com, $i, @options, $pec);
235
 
 
236
 
  print "Reporting MySQL servers\n";
237
 
  if (!$opt_no_log)
238
 
  {
239
 
    w2log("\nReporting MySQL servers","$opt_log",0,0);
240
 
  }
241
 
  @groups = &find_groups($groupids);
242
 
  for ($i = 0; defined($groups[$i]); $i++)
243
 
  {
244
 
    $com= get_mysqladmin_options($i, @groups);
245
 
    $com.= " ping >> /dev/null 2>&1";
246
 
    system($com);
247
 
    $pec = $? >> 8;
248
 
    if ($pec)
249
 
    {
250
 
      print "MySQL server from group: $groups[$i] is not running\n";
251
 
      if (!$opt_no_log)
252
 
      {
253
 
        w2log("MySQL server from group: $groups[$i] is not running",
254
 
              "$opt_log", 0, 0);
255
 
      }
256
 
    }
257
 
    else
258
 
    {
259
 
      print "MySQL server from group: $groups[$i] is running\n";
260
 
      if (!$opt_no_log)
261
 
      {
262
 
        w2log("MySQL server from group: $groups[$i] is running",
263
 
              "$opt_log", 0, 0);
264
 
      }
265
 
    }
266
 
  }
267
 
  if (!$i)
268
 
  {
269
 
    print "No groups to be reported (check your GNRs)\n";
270
 
    if (!$opt_no_log)
271
 
    {
272
 
      w2log("No groups to be reported (check your GNRs)", "$opt_log", 0, 0);
273
 
    }
274
 
  }
275
 
}
276
 
 
277
 
####
278
 
#### start multiple servers
279
 
####
280
 
 
281
 
sub start_mysqlds()
282
 
{
283
 
  my (@groups, $com, $tmp, $i, @options, $j, $mysqld_found, $info_sent);
284
 
 
285
 
  if (!$opt_no_log)
286
 
  {
287
 
    w2log("\nStarting MySQL servers\n","$opt_log",0,0);
288
 
  }
289
 
  else
290
 
  {
291
 
    print "\nStarting MySQL servers\n";
292
 
  }
293
 
  @groups = &find_groups($groupids);
294
 
  for ($i = 0; defined($groups[$i]); $i++)
295
 
  {
296
 
    @options = defaults_for_group($groups[$i]);
297
 
 
298
 
    $mysqld_found= 1; # The default
299
 
    $mysqld_found= 0 if (!length($mysqld));
300
 
    $com= "$mysqld";
301
 
    for ($j = 0, $tmp= ""; defined($options[$j]); $j++)
302
 
    {
303
 
      if ("--mysqladmin=" eq substr($options[$j], 0, 13))
304
 
      {
305
 
        # catch this and ignore
306
 
      }
307
 
      elsif ("--mysqld=" eq substr($options[$j], 0, 9))
308
 
      {
309
 
        $options[$j]=~ s/\-\-mysqld\=//;
310
 
        $com= $options[$j];
311
 
        $mysqld_found= 1;
312
 
      }
313
 
      else
314
 
      {
315
 
        $options[$j]= quote_shell_word($options[$j]);
316
 
        $tmp.= " $options[$j]";
317
 
      }
318
 
    }
319
 
    if ($opt_verbose && $com =~ m/\/safe_mysqld$/ && !$info_sent)
320
 
    {
321
 
      print "WARNING: safe_mysqld is being used to start mysqld. In this case you ";
322
 
      print "may need to pass\n\"ledir=...\" under groups [mysqldN] to ";
323
 
      print "safe_mysqld in order to find the actual mysqld binary.\n";
324
 
      print "ledir (library executable directory) should be the path to the ";
325
 
      print "wanted mysqld binary.\n\n";
326
 
      $info_sent= 1;
327
 
    }
328
 
    $com.= $tmp;
329
 
    $com.= " >> $opt_log 2>&1" if (!$opt_no_log);
330
 
    $com.= " &";
331
 
    if (!$mysqld_found)
332
 
    {
333
 
      print "\n";
334
 
      print "FATAL ERROR: Tried to start mysqld under group [$groups[$i]], ";
335
 
      print "but no mysqld binary was found.\n";
336
 
      print "Please add \"mysqld=...\" in group [mysqld_multi], or add it to ";
337
 
      print "group [$groups[$i]] separately.\n";
338
 
      exit(1);
339
 
    }
340
 
    system($com);
341
 
  }
342
 
  if (!$i && !$opt_no_log)
343
 
  {
344
 
    w2log("No MySQL servers to be started (check your GNRs)",
345
 
          "$opt_log", 0, 0);
346
 
  }
347
 
}
348
 
 
349
 
####
350
 
#### stop multiple servers
351
 
####
352
 
 
353
 
sub stop_mysqlds()
354
 
{
355
 
  my (@groups, $com, $i, @options);
356
 
 
357
 
  if (!$opt_no_log)
358
 
  {
359
 
    w2log("\nStopping MySQL servers\n","$opt_log",0,0);
360
 
  }
361
 
  else
362
 
  {
363
 
    print "\nStopping MySQL servers\n";
364
 
  }
365
 
  @groups = &find_groups($groupids);
366
 
  for ($i = 0; defined($groups[$i]); $i++)
367
 
  {
368
 
    $com= get_mysqladmin_options($i, @groups);
369
 
    $com.= " shutdown";
370
 
    $com.= " >> $opt_log 2>&1" if (!$opt_no_log);
371
 
    $com.= " &";
372
 
    system($com);
373
 
  }
374
 
  if (!$i && !$opt_no_log)
375
 
  {
376
 
    w2log("No MySQL servers to be stopped (check your GNRs)",
377
 
          "$opt_log", 0, 0);
378
 
  }
379
 
}
380
 
 
381
 
####
382
 
#### Sub function for mysqladmin option parsing
383
 
####
384
 
 
385
 
sub get_mysqladmin_options
386
 
{
387
 
  my ($i, @groups)= @_;
388
 
  my ($mysqladmin_found, $com, $tmp, $j);
389
 
 
390
 
  @options = defaults_for_group($groups[$i]);
391
 
 
392
 
  $mysqladmin_found= 1; # The default
393
 
  $mysqladmin_found= 0 if (!length($mysqladmin));
394
 
  $com = "$mysqladmin";
395
 
  $tmp = " -u $opt_user";
396
 
  if (defined($opt_password)) {
397
 
    my $pw= $opt_password;
398
 
    # Protect single quotes in password
399
 
    $pw =~ s/'/'"'"'/g;
400
 
    $tmp.= " -p'$pw'";
401
 
  }
402
 
  $tmp.= $opt_tcp_ip ? " -h 127.0.0.1" : "";
403
 
  for ($j = 0; defined($options[$j]); $j++)
404
 
  {
405
 
    if ("--mysqladmin=" eq substr($options[$j], 0, 13))
406
 
    {
407
 
      $options[$j]=~ s/\-\-mysqladmin\=//;
408
 
      $com= $options[$j];
409
 
      $mysqladmin_found= 1;
410
 
    }
411
 
    elsif ((($options[$j] =~ m/^(\-\-socket\=)(.*)$/) && !$opt_tcp_ip) ||
412
 
           ($options[$j] =~ m/^(\-\-port\=)(.*)$/))
413
 
    {
414
 
      $tmp.= " $options[$j]";
415
 
    }
416
 
  }
417
 
  if (!$mysqladmin_found)
418
 
  {
419
 
    print "\n";
420
 
    print "FATAL ERROR: Tried to use mysqladmin in group [$groups[$i]], ";
421
 
    print "but no mysqladmin binary was found.\n";
422
 
    print "Please add \"mysqladmin=...\" in group [mysqld_multi], or ";
423
 
    print "in group [$groups[$i]].\n";
424
 
    exit(1);
425
 
  }
426
 
  $com.= $tmp;
427
 
  return $com;
428
 
}
429
 
 
430
 
# Return a list of option files which can be opened.  Similar, but not
431
 
# identical, to behavior of my_search_option_files()
432
 
sub list_defaults_files
433
 
{
434
 
  my %opt;
435
 
  foreach (@defaults_options)
436
 
  {
437
 
    return () if /^--no-defaults$/;
438
 
    $opt{$1} = $2 if /^--defaults-(extra-file|file)=(.*)$/;
439
 
  }
440
 
 
441
 
  return ($opt{file}) if exists $opt{file};
442
 
 
443
 
  my %seen;  # Don't list the same file more than once
444
 
  return grep { defined $_ and not $seen{$_}++ and -f $_ and -r $_ }
445
 
              ('/etc/my.cnf',
446
 
               '/etc/mysql/my.cnf',
447
 
               '@sysconfdir@/my.cnf',
448
 
               ($ENV{MYSQL_HOME} ? "$ENV{MYSQL_HOME}/my.cnf" : undef),
449
 
               $opt{'extra-file'},
450
 
               ($ENV{HOME} ? "$ENV{HOME}/.my.cnf" : undef));
451
 
}
452
 
 
453
 
 
454
 
# Takes a specification of GNRs (see --help), and returns a list of matching
455
 
# groups which actually are mentioned in a relevant config file
456
 
sub find_groups
457
 
{
458
 
  my ($raw_gids) = @_;
459
 
 
460
 
  my %gids;
461
 
  my @groups;
462
 
 
463
 
  if (defined($raw_gids))
464
 
  {
465
 
    # Make a hash of the wanted group ids
466
 
    foreach my $raw_gid (split ',', $raw_gids)
467
 
    {
468
 
      # Match 123 or 123-456
469
 
      my ($start, $end) = ($raw_gid =~ /^\s*(\d+)(?:\s*-\s*(\d+))?\s*$/);
470
 
      $end = $start if not defined $end;
471
 
      if (not defined $start or $end < $start or $start < 0)
472
 
      {
473
 
        print "ABORT: Bad GNR: $raw_gid; see $my_progname --help\n";
474
 
        exit(1);
475
 
      }
476
 
 
477
 
      foreach my $i ($start .. $end)
478
 
      {
479
 
        # Use $i + 0 to normalize numbers (002 + 0 -> 2)
480
 
        $gids{$i + 0}= 1;
481
 
      }
482
 
    }
483
 
  }
484
 
 
485
 
  my @defaults_files = list_defaults_files();
486
 
  #warn "@{[sort keys %gids]} -> @defaults_files\n";
487
 
  foreach my $file (@defaults_files)
488
 
  {
489
 
    next unless open CONF, "< $file";
490
 
 
491
 
    while (<CONF>)
492
 
    {
493
 
      if (/^\s*\[\s*(mysqld)(\d+)\s*\]\s*$/)
494
 
      {
495
 
        #warn "Found a group: $1$2\n";
496
 
        # Use $2 + 0 to normalize numbers (002 + 0 -> 2)
497
 
        if (not defined($raw_gids) or $gids{$2 + 0})
498
 
        {
499
 
          push @groups, "$1$2";
500
 
        }
501
 
      }
502
 
    }
503
 
 
504
 
    close CONF;
505
 
  }
506
 
  return @groups;
507
 
}
508
 
 
509
 
####
510
 
#### w2log: Write to a logfile.
511
 
#### 1.arg: append to the log file (given string, or from a file. if a file,
512
 
####        file will be read from $opt_logdir)
513
 
#### 2.arg: logfile -name (w2log assumes that the logfile is in $opt_logdir).
514
 
#### 3.arg. 0 | 1, if true, print current date to the logfile. 3. arg will
515
 
####        be ignored, if 1. arg is a file.
516
 
#### 4.arg. 0 | 1, if true, first argument is a file, else a string
517
 
####
518
 
 
519
 
sub w2log
520
 
{
521
 
  my ($msg, $file, $date_flag, $is_file)= @_;
522
 
  my (@data);
523
 
 
524
 
  open (LOGFILE, ">>$opt_log")
525
 
    or die "FATAL: w2log: Couldn't open log file: $opt_log\n";
526
 
 
527
 
  if ($is_file)
528
 
  {
529
 
    open (FROMFILE, "<$msg") && (@data=<FROMFILE>) &&
530
 
      close(FROMFILE)
531
 
        or die "FATAL: w2log: Couldn't open file: $msg\n";
532
 
    foreach my $line (@data)
533
 
    {
534
 
      print LOGFILE "$line";
535
 
    }
536
 
  }
537
 
  else
538
 
  {
539
 
    print LOGFILE "$msg";
540
 
    print LOGFILE strftime "%a %b %e %H:%M:%S %Y", localtime if ($date_flag);
541
 
    print LOGFILE "\n";
542
 
  }
543
 
  close (LOGFILE);
544
 
  return;
545
 
}
546
 
 
547
 
####
548
 
#### my_which is used, because we can't assume that every system has the
549
 
#### which -command. my_which can take only one argument at a time.
550
 
#### Return values: requested system command with the first found path,
551
 
#### or undefined, if not found.
552
 
####
553
 
 
554
 
sub my_which
555
 
{
556
 
  my ($command) = @_;
557
 
  my (@paths, $path);
558
 
 
559
 
  return $command if (-f $command && -x $command);
560
 
  @paths = split(':', $ENV{'PATH'});
561
 
  foreach $path (@paths)
562
 
  {
563
 
    $path .= "/$command";
564
 
    return $path if (-f $path && -x $path);
565
 
  }
566
 
  return undef();
567
 
}
568
 
 
569
 
 
570
 
####
571
 
#### example
572
 
####
573
 
 
574
 
sub example
575
 
{
576
 
  print <<EOF;
577
 
# This is an example of a my.cnf file for $my_progname.
578
 
# Usually this file is located in home dir ~/.my.cnf or /etc/my.cnf
579
 
#
580
 
# SOME IMPORTANT NOTES FOLLOW:
581
 
#
582
 
# 1.COMMON USER
583
 
#
584
 
#   Make sure that the MySQL user, who is stopping the mysqld services, has
585
 
#   the same password to all MySQL servers being accessed by $my_progname.
586
 
#   This user needs to have the 'Shutdown_priv' -privilege, but for security
587
 
#   reasons should have no other privileges. It is advised that you create a
588
 
#   common 'multi_admin' user for all MySQL servers being controlled by
589
 
#   $my_progname. Here is an example how to do it:
590
 
#
591
 
#   GRANT SHUTDOWN ON *.* TO multi_admin\@localhost IDENTIFIED BY 'password'
592
 
#
593
 
#   You will need to apply the above to all MySQL servers that are being
594
 
#   controlled by $my_progname. 'multi_admin' will shutdown the servers
595
 
#   using 'mysqladmin' -binary, when '$my_progname stop' is being called.
596
 
#
597
 
# 2.PID-FILE
598
 
#
599
 
#   If you are using mysqld_safe to start mysqld, make sure that every
600
 
#   MySQL server has a separate pid-file. In order to use mysqld_safe
601
 
#   via $my_progname, you need to use two options:
602
 
#
603
 
#   mysqld=/path/to/mysqld_safe
604
 
#   ledir=/path/to/mysqld-binary/
605
 
#
606
 
#   ledir (library executable directory), is an option that only mysqld_safe
607
 
#   accepts, so you will get an error if you try to pass it to mysqld directly.
608
 
#   For this reason you might want to use the above options within [mysqld#]
609
 
#   group directly.
610
 
#
611
 
# 3.DATA DIRECTORY
612
 
#
613
 
#   It is NOT advised to run many MySQL servers within the same data directory.
614
 
#   You can do so, but please make sure to understand and deal with the
615
 
#   underlying caveats. In short they are:
616
 
#   - Speed penalty
617
 
#   - Risk of table/data corruption
618
 
#   - Data synchronising problems between the running servers
619
 
#   - Heavily media (disk) bound
620
 
#   - Relies on the system (external) file locking
621
 
#   - Is not applicable with all table types. (Such as InnoDB)
622
 
#     Trying so will end up with undesirable results.
623
 
#
624
 
# 4.TCP/IP Port
625
 
#
626
 
#   Every server requires one and it must be unique.
627
 
#
628
 
# 5.[mysqld#] Groups
629
 
#
630
 
#   In the example below the first and the fifth mysqld group was
631
 
#   intentionally left out. You may have 'gaps' in the config file. This
632
 
#   gives you more flexibility.
633
 
#
634
 
# 6.MySQL Server User
635
 
#
636
 
#   You can pass the user=... option inside [mysqld#] groups. This
637
 
#   can be very handy in some cases, but then you need to run $my_progname
638
 
#   as UNIX root.
639
 
#
640
 
# 7.A Start-up Manage Script for $my_progname
641
 
#
642
 
#   In the recent MySQL distributions you can find a file called
643
 
#   mysqld_multi.server.sh. It is a wrapper for $my_progname. This can
644
 
#   be used to start and stop multiple servers during boot and shutdown.
645
 
#
646
 
#   You can place the file in /etc/init.d/mysqld_multi.server.sh and
647
 
#   make the needed symbolic links to it from various run levels
648
 
#   (as per Linux/Unix standard). You may even replace the
649
 
#   /etc/init.d/mysql.server script with it.
650
 
#
651
 
#   Before using, you must create a my.cnf file either in @sysconfdir@/my.cnf
652
 
#   or /root/.my.cnf and add the [mysqld_multi] and [mysqld#] groups.
653
 
#
654
 
#   The script can be found from support-files/mysqld_multi.server.sh
655
 
#   in MySQL distribution. (Verify the script before using)
656
 
#
657
 
 
658
 
[mysqld_multi]
659
 
mysqld     = @bindir@/mysqld_safe
660
 
mysqladmin = @bindir@/mysqladmin
661
 
user       = multi_admin
662
 
password   = my_password
663
 
 
664
 
[mysqld2]
665
 
socket     = /tmp/mysql.sock2
666
 
port       = 3307
667
 
pid-file   = @localstatedir@2/hostname.pid2
668
 
datadir    = @localstatedir@2
669
 
language   = @datadir@/mysql/english
670
 
user       = unix_user1
671
 
 
672
 
[mysqld3]
673
 
mysqld     = /path/to/safe_mysqld/safe_mysqld
674
 
ledir      = /path/to/mysqld-binary/
675
 
mysqladmin = /path/to/mysqladmin/mysqladmin
676
 
socket     = /tmp/mysql.sock3
677
 
port       = 3308
678
 
pid-file   = @localstatedir@3/hostname.pid3
679
 
datadir    = @localstatedir@3
680
 
language   = @datadir@/mysql/swedish
681
 
user       = unix_user2
682
 
 
683
 
[mysqld4]
684
 
socket     = /tmp/mysql.sock4
685
 
port       = 3309
686
 
pid-file   = @localstatedir@4/hostname.pid4
687
 
datadir    = @localstatedir@4
688
 
language   = @datadir@/mysql/estonia
689
 
user       = unix_user3
690
 
 
691
 
[mysqld6]
692
 
socket     = /tmp/mysql.sock6
693
 
port       = 3311
694
 
pid-file   = @localstatedir@6/hostname.pid6
695
 
datadir    = @localstatedir@6
696
 
language   = @datadir@/mysql/japanese
697
 
user       = unix_user4
698
 
EOF
699
 
  exit(0);
700
 
}
701
 
 
702
 
####
703
 
#### usage
704
 
####
705
 
 
706
 
sub usage
707
 
{
708
 
  print <<EOF;
709
 
$my_progname version $VER by Jani Tolonen
710
 
 
711
 
Description:
712
 
$my_progname can be used to start, or stop any number of separate
713
 
mysqld processes running in different TCP/IP ports and UNIX sockets.
714
 
 
715
 
$my_progname can read group [mysqld_multi] from my.cnf file. You may
716
 
want to put options mysqld=... and mysqladmin=... there.  Since
717
 
version 2.10 these options can also be given under groups [mysqld#],
718
 
which gives more control over different versions.  One can have the
719
 
default mysqld and mysqladmin under group [mysqld_multi], but this is
720
 
not mandatory. Please note that if mysqld or mysqladmin is missing
721
 
from both [mysqld_multi] and [mysqld#], a group that is tried to be
722
 
used, $my_progname will abort with an error.
723
 
 
724
 
$my_progname will search for groups named [mysqld#] from my.cnf (or
725
 
the given --config-file=...), where '#' can be any positive integer
726
 
starting from 1. These groups should be the same as the regular
727
 
[mysqld] group, but with those port, socket and any other options
728
 
that are to be used with each separate mysqld process. The number
729
 
in the group name has another function; it can be used for starting,
730
 
stopping, or reporting any specific mysqld server.
731
 
 
732
 
Usage: $my_progname [OPTIONS] {start|stop|report} [GNR,GNR,GNR...]
733
 
or     $my_progname [OPTIONS] {start|stop|report} [GNR-GNR,GNR,GNR-GNR,...]
734
 
 
735
 
The GNR means the group number. You can start, stop or report any GNR,
736
 
or several of them at the same time. (See --example) The GNRs list can
737
 
be comma separated or a dash combined. The latter means that all the
738
 
GNRs between GNR1-GNR2 will be affected. Without GNR argument all the
739
 
groups found will either be started, stopped, or reported. Note that
740
 
syntax for specifying GNRs must appear without spaces.
741
 
 
742
 
Options:
743
 
 
744
 
These options must be given before any others:
745
 
--no-defaults      Do not read any defaults file
746
 
--defaults-file=...  Read only this configuration file, do not read the
747
 
                   standard system-wide and user-specific files
748
 
--defaults-extra-file=...  Read this configuration file in addition to the
749
 
                   standard system-wide and user-specific files
750
 
Using:  @{[join ' ', @defaults_options]}
751
 
 
752
 
--config-file=...  Deprecated, please use --defaults-extra-file instead
753
 
--example          Give an example of a config file with extra information.
754
 
--help             Print this help and exit.
755
 
--log=...          Log file. Full path to and the name for the log file. NOTE:
756
 
                   If the file exists, everything will be appended.
757
 
                   Using: $opt_log
758
 
--mysqladmin=...   mysqladmin binary to be used for a server shutdown.
759
 
                   Since version 2.10 this can be given within groups [mysqld#]
760
 
                   Using: $mysqladmin
761
 
--mysqld=...       mysqld binary to be used. Note that you can give mysqld_safe
762
 
                   to this option also. The options are passed to mysqld. Just
763
 
                   make sure you have mysqld in your PATH or fix mysqld_safe.
764
 
                   Using: $mysqld
765
 
                   Please note: Since mysqld_multi version 2.3 you can also
766
 
                   give this option inside groups [mysqld#] in ~/.my.cnf,
767
 
                   where '#' stands for an integer (number) of the group in
768
 
                   question. This will be recognised as a special option and
769
 
                   will not be passed to the mysqld. This will allow one to
770
 
                   start different mysqld versions with mysqld_multi.
771
 
--no-log           Print to stdout instead of the log file. By default the log
772
 
                   file is turned on.
773
 
--password=...     Password for mysqladmin user.
774
 
--silent           Disable warnings.
775
 
--tcp-ip           Connect to the MySQL server(s) via the TCP/IP port instead
776
 
                   of the UNIX socket. This affects stopping and reporting.
777
 
                   If a socket file is missing, the server may still be
778
 
                   running, but can be accessed only via the TCP/IP port.
779
 
                   By default connecting is done via the UNIX socket.
780
 
--user=...         mysqladmin user. Using: $opt_user
781
 
--verbose          Be more verbose.
782
 
--version          Print the version number and exit.
783
 
EOF
784
 
  exit(0);
785
 
}