mysqld_multi
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:22k
源码类别:

MySQL数据库

开发平台:

Visual C++

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