1
/* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008 MySQL
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
/* maintaince of drizzle databases */
1
/* Copyright (C) 2000-2006 MySQL AB
3
This program is free software; you can redistribute it and/or modify
4
it under the terms of the GNU General Public License as published by
5
the Free Software Foundation; version 2 of the License.
7
This program is distributed in the hope that it will be useful,
8
but WITHOUT ANY WARRANTY; without even the implied warranty of
9
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
GNU General Public License for more details.
12
You should have received a copy of the GNU General Public License
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
16
/* maintaince of mysql databases */
23
18
#include "client_priv.h"
24
19
#include <signal.h>
25
#include <mysys/my_pthread.h> /* because of signal() */
20
#include <my_pthread.h> /* because of signal() */
26
21
#include <sys/stat.h>
28
/* Added this for string translation. */
29
#include <libdrizzle/gettext.h>
31
23
#define ADMIN_VERSION "8.42"
24
#define MAX_MYSQL_VAR 256
32
25
#define SHUTDOWN_DEF_TIMEOUT 3600 /* Wait for shutdown */
34
char *host= NULL, *user= NULL, *opt_password= NULL;
35
static bool interrupted= false, opt_verbose= false,tty_password= false;
36
static uint32_t tcp_port= 0, option_wait= 0, option_silent= 0;
37
static uint32_t my_end_arg;
38
static uint32_t opt_connect_timeout, opt_shutdown_timeout;
26
#define MAX_TRUNC_LENGTH 3
28
char *host= NULL, *user= 0, *opt_password= 0,
29
*default_charset= NULL;
30
char truncated_var_names[MAX_MYSQL_VAR][MAX_TRUNC_LENGTH];
31
char ex_var_names[MAX_MYSQL_VAR][FN_REFLEN];
32
uint64_t last_values[MAX_MYSQL_VAR];
33
static int interval=0;
34
static bool option_force=0,interrupted=0,new_line=0,
35
opt_compress=0, opt_relative=0, opt_verbose=0, opt_vertical=0,
36
tty_password= 0, opt_nobeep;
37
static bool debug_info_flag= 0, debug_check_flag= 0;
38
static uint tcp_port = 0, option_wait = 0, option_silent=0, nr_iterations;
39
static uint opt_count_iterations= 0, my_end_arg;
40
static ulong opt_connect_timeout, opt_shutdown_timeout;
41
static char * unix_port=0;
44
static char *shared_memory_base_name=0;
46
static uint opt_protocol=0;
39
47
static myf error_flags; /* flags to pass to my_printf_error, like ME_BELL */
50
When using extended-status relatively, ex_val_max_len is the estimated
51
maximum length for any relative value printed by extended-status. The
52
idea is to try to keep the length of output as short as possible.
55
static uint ex_val_max_len[MAX_MYSQL_VAR];
56
static bool ex_status_printed = 0; /* First output is not relative. */
57
static uint ex_var_count, max_var_length, max_val_length;
59
static void print_version(void);
44
60
static void usage(void);
45
static void print_version(void);
46
extern "C" RETSIGTYPE endprog(int signal_number);
47
61
extern "C" bool get_one_option(int optid, const struct my_option *opt,
49
static int execute_commands(DRIZZLE *drizzle,int argc, char **argv);
50
static bool sql_connect(DRIZZLE *drizzle, uint wait);
63
static bool sql_connect(MYSQL *mysql, uint wait);
64
static int execute_commands(MYSQL *mysql,int argc, char **argv);
65
static int drop_db(MYSQL *mysql,const char *db);
66
extern "C" sig_handler endprog(int signal_number);
67
static void nice_time(ulong sec,char *buff);
68
static void print_header(MYSQL_RES *result);
69
static void print_top(MYSQL_RES *result);
70
static void print_row(MYSQL_RES *result,MYSQL_ROW cur, uint row);
71
static void print_relative_row(MYSQL_RES *result, MYSQL_ROW cur, uint row);
72
static void print_relative_row_vert(MYSQL_RES *result, MYSQL_ROW cur, uint row);
73
static void print_relative_header();
74
static void print_relative_line();
75
static void truncate_names();
76
static bool get_pidfile(MYSQL *mysql, char *pidfile);
77
static bool wait_pidfile(char *pidfile, time_t last_modified,
78
struct stat *pidfile_status);
79
static void store_values(MYSQL_RES *result);
53
82
The order of commands must be the same as command_names,
87
ADMIN_CREATE, ADMIN_DROP, ADMIN_SHUTDOWN,
88
ADMIN_RELOAD, ADMIN_REFRESH, ADMIN_VER,
89
ADMIN_PROCESSLIST, ADMIN_STATUS, ADMIN_KILL,
90
ADMIN_DEBUG, ADMIN_VARIABLES, ADMIN_FLUSH_LOGS,
91
ADMIN_FLUSH_HOSTS, ADMIN_FLUSH_TABLES, ADMIN_PASSWORD,
92
ADMIN_PING, ADMIN_EXTENDED_STATUS, ADMIN_FLUSH_STATUS,
93
ADMIN_FLUSH_PRIVILEGES, ADMIN_START_SLAVE, ADMIN_STOP_SLAVE,
94
ADMIN_FLUSH_THREADS, ADMIN_OLD_PASSWORD
62
96
static const char *command_names[]= {
97
"create", "drop", "shutdown",
98
"reload", "refresh", "version",
99
"processlist", "status", "kill",
100
"debug", "variables", "flush-logs",
101
"flush-hosts", "flush-tables", "password",
102
"ping", "extended-status", "flush-status",
103
"flush-privileges", "start-slave", "stop-slave",
104
"flush-threads","old-password",
68
108
static TYPELIB command_typelib=
69
{ array_elements(command_names)-1,"commands", command_names, NULL };
109
{ array_elements(command_names)-1,"commands", command_names, NULL};
71
111
static struct my_option my_long_options[] =
73
{"help", '?', N_("Display this help and exit."), 0, 0, 0, GET_NO_ARG,
114
"Number of iterations to make. This works with -i (--sleep) only.",
115
(char**) &nr_iterations, (char**) &nr_iterations, 0, GET_UINT,
116
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
117
{"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit .",
118
(char**) &debug_check_flag, (char**) &debug_check_flag, 0,
119
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
120
{"debug-info", OPT_DEBUG_INFO, "Print some debug info at exit.",
121
(char**) &debug_info_flag, (char**) &debug_info_flag,
122
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
124
"Don't ask for confirmation on drop database; with multiple commands, continue even if an error occurs.",
125
(char**) &option_force, (char**) &option_force, 0, GET_BOOL, NO_ARG, 0, 0,
127
{"compress", 'C', "Use compression in server/client protocol.",
128
(char**) &opt_compress, (char**) &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0,
130
{"character-sets-dir", OPT_CHARSETS_DIR,
131
"Directory where character sets are.", (char**) &charsets_dir,
132
(char**) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
133
{"default-character-set", OPT_DEFAULT_CHARSET,
134
"Set the default character set.", (char**) &default_charset,
135
(char**) &default_charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
136
{"help", '?', "Display this help and exit.", 0, 0, 0, GET_NO_ARG,
74
137
NO_ARG, 0, 0, 0, 0, 0, 0},
75
{"host", 'h', N_("Connect to host."), (char**) &host, (char**) &host, 0, GET_STR,
138
{"host", 'h', "Connect to host.", (char**) &host, (char**) &host, 0, GET_STR,
76
139
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
140
{"no-beep", 'b', "Turn off beep on error.", (char**) &opt_nobeep,
141
(char**) &opt_nobeep, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
78
N_("Password to use when connecting to server. If password is not given it's asked from the tty."),
143
"Password to use when connecting to server. If password is not given it's asked from the tty.",
79
144
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
80
{"port", 'P', N_("Port number to use for connection or 0 for default to, in "
81
"order of preference, my.cnf, $DRIZZLE_TCP_PORT, "
82
"built-in default (" STRINGIFY_ARG(DRIZZLE_PORT) ")."),
145
{"port", 'P', "Port number to use for connection or 0 for default to, in "
146
"order of preference, my.cnf, $MYSQL_TCP_PORT, "
147
#if MYSQL_PORT_DEFAULT == 0
150
"built-in default (" STRINGIFY_ARG(MYSQL_PORT) ").",
83
151
(char**) &tcp_port,
84
152
(char**) &tcp_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
85
{"silent", 's', N_("Silently exit if one can't connect to server."),
153
{"protocol", OPT_MYSQL_PROTOCOL, "The protocol of connection (tcp,socket,pipe,memory).",
154
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
156
"Show difference between current and previous values when used with -i. Currently works only with extended-status.",
157
(char**) &opt_relative, (char**) &opt_relative, 0, GET_BOOL, NO_ARG, 0, 0, 0,
159
{"set-variable", 'O',
160
"Change the value of a variable. Please note that this option is deprecated; you can set variables directly with --variable-name=value.",
161
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
163
{"shared-memory-base-name", OPT_SHARED_MEMORY_BASE_NAME,
164
"Base name of shared memory.", (char**) &shared_memory_base_name, (char**) &shared_memory_base_name,
165
0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
167
{"silent", 's', "Silently exit if one can't connect to server.",
86
168
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
169
{"socket", 'S', "Socket file to use for connection.",
170
(char**) &unix_port, (char**) &unix_port, 0, GET_STR, REQUIRED_ARG, 0, 0, 0,
172
{"sleep", 'i', "Execute commands again and again with a sleep between.",
173
(char**) &interval, (char**) &interval, 0, GET_INT, REQUIRED_ARG, 0, 0, 0, 0,
87
175
#ifndef DONT_ALLOW_USER_CHANGE
88
{"user", 'u', N_("User for login if not current user."), (char**) &user,
176
{"user", 'u', "User for login if not current user.", (char**) &user,
89
177
(char**) &user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
91
{"verbose", 'v', N_("Write more information."), (char**) &opt_verbose,
179
{"verbose", 'v', "Write more information.", (char**) &opt_verbose,
92
180
(char**) &opt_verbose, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
93
{"version", 'V', N_("Output version information and exit."), 0, 0, 0, GET_NO_ARG,
181
{"version", 'V', "Output version information and exit.", 0, 0, 0, GET_NO_ARG,
94
182
NO_ARG, 0, 0, 0, 0, 0, 0},
95
{"wait", 'w', N_("Wait and retry if connection is down."), 0, 0, 0, GET_UINT,
184
"Print output vertically. Is similar to --relative, but prints output vertically.",
185
(char**) &opt_vertical, (char**) &opt_vertical, 0, GET_BOOL, NO_ARG, 0, 0, 0,
187
{"wait", 'w', "Wait and retry if connection is down.", 0, 0, 0, GET_UINT,
96
188
OPT_ARG, 0, 0, 0, 0, 0, 0},
97
189
{"connect_timeout", OPT_CONNECT_TIMEOUT, "", (char**) &opt_connect_timeout,
98
190
(char**) &opt_connect_timeout, 0, GET_ULONG, REQUIRED_ARG, 3600*12, 0,
251
405
if (!option_silent)
254
host= (char*) LOCAL_HOST;
256
my_printf_error(0,_("connect to server at '%s' failed\nerror: '%s'"),
257
error_flags, host, drizzle_error(drizzle));
259
if (drizzle_errno(drizzle) == CR_CONN_HOST_ERROR ||
260
drizzle_errno(drizzle) == CR_UNKNOWN_HOST)
262
fprintf(stderr,_("Check that drizzled is running on %s"),host);
263
fprintf(stderr,_(" and that the port is %d.\n"),
264
tcp_port ? tcp_port: drizzle_get_default_port());
265
fprintf(stderr,_("You can check this by doing 'telnet %s %d'\n"),
266
host, tcp_port ? tcp_port: drizzle_get_default_port());
408
host= (char*) LOCAL_HOST;
409
my_printf_error(0,"connect to server at '%s' failed\nerror: '%s'",
410
error_flags, host, mysql_error(mysql));
411
if (mysql_errno(mysql) == CR_CONNECTION_ERROR)
414
"Check that mysqld is running and that the socket: '%s' exists!\n",
415
unix_port ? unix_port : mysql_unix_port);
417
else if (mysql_errno(mysql) == CR_CONN_HOST_ERROR ||
418
mysql_errno(mysql) == CR_UNKNOWN_HOST)
420
fprintf(stderr,"Check that mysqld is running on %s",host);
421
fprintf(stderr," and that the port is %d.\n",
422
tcp_port ? tcp_port: mysql_port);
423
fprintf(stderr,"You can check this by doing 'telnet %s %d'\n",
424
host, tcp_port ? tcp_port: mysql_port);
271
if (wait != UINT32_MAX)
429
if (wait != (uint) ~0)
272
430
wait--; /* One less retry */
273
if ((drizzle_errno(drizzle) != CR_CONN_HOST_ERROR) &&
274
(drizzle_errno(drizzle) != CR_CONNECTION_ERROR))
431
if ((mysql_errno(mysql) != CR_CONN_HOST_ERROR) &&
432
(mysql_errno(mysql) != CR_CONNECTION_ERROR))
276
fprintf(stderr,_("Got error: %s\n"), drizzle_error(drizzle));
434
fprintf(stderr,"Got error: %s\n", mysql_error(mysql));
278
438
else if (!option_silent)
283
fputs(_("Waiting for Drizzle server to answer"),stderr);
284
(void) fflush(stderr);
443
fputs("Waiting for MySQL server to answer",stderr);
444
(void) fflush(stderr);
289
(void) fflush(stderr);
449
(void) fflush(stderr);
297
458
Execute a command.
299
460
-1 on retryable error
302
static int execute_commands(DRIZZLE *drizzle,int argc, char **argv)
464
static int execute_commands(MYSQL *mysql,int argc, char **argv)
306
DRIZZLE documentation relies on the fact that drizzleadmin will
307
execute commands in the order specified.
468
MySQL documentation relies on the fact that mysqladmin will
469
execute commands in the order specified, e.g.
470
mysqladmin -u root flush-privileges password "newpassword"
471
to reset a lost root password.
308
472
If this behaviour is ever changed, Docs should be notified.
475
struct rand_struct rand_st;
310
477
for (; argc > 0 ; argv++,argc--)
312
479
switch (find_type(argv[0],&command_typelib,2)) {
482
char buff[FN_REFLEN+20];
485
my_printf_error(0, "Too few arguments to create", error_flags);
488
sprintf(buff,"create database `%.*s`",FN_REFLEN,argv[1]);
489
if (mysql_query(mysql,buff))
491
my_printf_error(0,"CREATE DATABASE failed; error: '%-.200s'",
492
error_flags, mysql_error(mysql));
502
my_printf_error(0, "Too few arguments to drop", error_flags);
505
if (drop_db(mysql,argv[1]))
313
510
case ADMIN_SHUTDOWN:
316
printf(_("shutting down drizzled...\n"));
318
if (drizzle_shutdown(drizzle))
320
my_printf_error(0, _("shutdown failed; error: '%s'"), error_flags,
321
drizzle_error(drizzle));
324
drizzle_close(drizzle); /* Close connection to avoid error messages */
329
argc=1; /* Force SHUTDOWN to be the last command */
512
char pidfile[FN_REFLEN];
514
time_t last_modified= 0;
515
struct stat pidfile_status;
518
Only wait for pidfile on local connections
519
If pidfile doesn't exist, continue without pid file checking
521
if (mysql->unix_socket && (got_pidfile= !get_pidfile(mysql, pidfile)) &&
522
!stat(pidfile, &pidfile_status))
523
last_modified= pidfile_status.st_mtime;
525
if (mysql_shutdown(mysql, SHUTDOWN_DEFAULT))
527
my_printf_error(0, "shutdown failed; error: '%s'", error_flags,
531
mysql_close(mysql); /* Close connection to avoid error messages */
532
argc=1; /* force SHUTDOWN to be the last command */
536
printf("Shutdown signal sent to server; Waiting for pid file to disappear\n");
538
/* Wait until pid file is gone */
539
if (wait_pidfile(pidfile, last_modified, &pidfile_status))
544
case ADMIN_FLUSH_PRIVILEGES:
546
if (mysql_query(mysql,"flush privileges"))
548
my_printf_error(0, "reload failed; error: '%s'", error_flags,
554
if (mysql_refresh(mysql,
555
(uint) ~(REFRESH_GRANT | REFRESH_STATUS |
556
REFRESH_READ_LOCK | REFRESH_SLAVE |
559
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
564
case ADMIN_FLUSH_THREADS:
565
if (mysql_refresh(mysql,(uint) REFRESH_THREADS))
567
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
575
puts("Copyright (C) 2000-2006 MySQL AB");
576
puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license\n");
577
printf("Server version\t\t%s\n", mysql_get_server_info(mysql));
578
printf("Protocol version\t%d\n", mysql_get_proto_info(mysql));
579
printf("Connection\t\t%s\n",mysql_get_host_info(mysql));
580
if (mysql->unix_socket)
581
printf("UNIX socket\t\t%s\n", mysql->unix_socket);
583
printf("TCP port\t\t%d\n", mysql->port);
584
status=mysql_stat(mysql);
588
pos= (char*) strchr(status,' ');
590
printf("%s\t\t\t",status); /* print label */
591
if ((status=str2int(pos,10,0,LONG_MAX,(long*) &sec)))
594
puts(buff); /* print nice time */
595
while (*status == ' ') status++; /* to next info */
602
case ADMIN_PROCESSLIST:
607
if (mysql_query(mysql, (opt_verbose ? "show full processlist" :
608
"show processlist")) ||
609
!(result = mysql_store_result(mysql)))
611
my_printf_error(0, "process list failed; error: '%s'", error_flags,
615
print_header(result);
616
while ((row=mysql_fetch_row(result)))
617
print_row(result,row,0);
619
mysql_free_result(result);
624
status=mysql_stat(mysql);
634
my_printf_error(0, "Too few arguments to 'kill'", error_flags);
640
if (mysql_kill(mysql,(ulong) atol(pos)))
642
my_printf_error(0, "kill failed on %ld; error: '%s'", error_flags,
643
atol(pos), mysql_error(mysql));
646
if (!(pos=strchr(pos,',')))
656
if (mysql_dump_debug_info(mysql))
658
my_printf_error(0, "debug failed; error: '%s'", error_flags,
663
case ADMIN_VARIABLES:
669
if (mysql_query(mysql,"show /*!40003 GLOBAL */ variables") ||
670
!(res=mysql_store_result(mysql)))
672
my_printf_error(0, "unable to show variables; error: '%s'", error_flags,
677
while ((row=mysql_fetch_row(res)))
678
print_row(res,row,0);
680
mysql_free_result(res);
683
case ADMIN_EXTENDED_STATUS:
688
void (*func) (MYSQL_RES*, MYSQL_ROW, uint);
691
if (mysql_query(mysql, "show /*!50002 GLOBAL */ status") ||
692
!(res = mysql_store_result(mysql)))
694
my_printf_error(0, "unable to show status; error: '%s'", error_flags,
702
if (!ex_status_printed)
705
truncate_names(); /* Does some printing also */
709
print_relative_line();
710
print_relative_header();
711
print_relative_line();
715
/* void (*func) (MYSQL_RES*, MYSQL_ROW, uint); */
716
if (opt_relative && !opt_vertical)
717
func = print_relative_row;
718
else if (opt_vertical)
719
func = print_relative_row_vert;
723
while ((row = mysql_fetch_row(res)))
724
(*func)(res, row, rownr++);
727
if (ex_status_printed)
730
print_relative_line();
736
ex_status_printed = 1; /* From now on the output will be relative */
737
mysql_free_result(res);
740
case ADMIN_FLUSH_LOGS:
742
if (mysql_refresh(mysql,REFRESH_LOG))
744
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
750
case ADMIN_FLUSH_HOSTS:
752
if (mysql_query(mysql,"flush hosts"))
754
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
760
case ADMIN_FLUSH_TABLES:
762
if (mysql_query(mysql,"flush tables"))
764
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
770
case ADMIN_FLUSH_STATUS:
772
if (mysql_query(mysql,"flush status"))
774
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
780
case ADMIN_OLD_PASSWORD:
783
char buff[128],crypted_pw[64];
785
/* Do initialization the same way as we do in mysqld */
786
start_time=time((time_t*) 0);
787
randominit(&rand_st,(ulong) start_time,(ulong) start_time/2);
791
my_printf_error(0, "Too few arguments to change password", error_flags);
797
bool old= (find_type(argv[0], &command_typelib, 2) ==
800
If we don't already know to use an old-style password, see what
805
if (mysql_query(mysql, "SHOW VARIABLES LIKE 'old_passwords'"))
807
my_printf_error(0, "Could not determine old_passwords setting from server; error: '%s'",
808
error_flags, mysql_error(mysql));
813
MYSQL_RES *res= mysql_store_result(mysql);
817
"Could not get old_passwords setting from "
818
"server; error: '%s'",
819
error_flags, mysql_error(mysql));
822
if (!mysql_num_rows(res))
826
MYSQL_ROW row= mysql_fetch_row(res);
827
old= !strncmp(row[1], "ON", 2);
829
mysql_free_result(res);
833
make_scrambled_password_323(crypted_pw, pw);
835
make_scrambled_password(crypted_pw, pw);
838
crypted_pw[0]=0; /* No password */
839
sprintf(buff,"set password='%s',sql_log_off=0",crypted_pw);
841
if (mysql_query(mysql,"set sql_log_off=1"))
843
my_printf_error(0, "Can't turn off logging; error: '%s'",
844
error_flags, mysql_error(mysql));
847
if (mysql_query(mysql,buff))
849
if (mysql_errno(mysql)!=1290)
851
my_printf_error(0,"unable to change password; error: '%s'",
852
error_flags, mysql_error(mysql));
858
We don't try to execute 'update mysql.user set..'
859
because we can't perfectly find out the host
861
my_printf_error(0,"\n"
862
"You cannot use 'password' command as mysqld runs\n"
863
" with grant tables disabled (was started with"
864
" --skip-grant-tables).\n"
865
"Use: \"mysqladmin flush-privileges password '*'\""
866
" instead", error_flags);
874
case ADMIN_START_SLAVE:
875
if (mysql_query(mysql, "START SLAVE"))
877
my_printf_error(0, "Error starting slave: %s", error_flags,
882
puts("Slave started");
884
case ADMIN_STOP_SLAVE:
885
if (mysql_query(mysql, "STOP SLAVE"))
887
my_printf_error(0, "Error stopping slave: %s", error_flags,
892
puts("Slave stopped");
333
drizzle->reconnect=0; /* We want to know of reconnects */
334
if (!drizzle_ping(drizzle))
896
mysql->reconnect=0; /* We want to know of reconnects */
897
if (!mysql_ping(mysql))
336
if (option_silent < 2)
337
puts(_("drizzled is alive"));
899
if (option_silent < 2)
900
puts("mysqld is alive");
341
if (drizzle_errno(drizzle) == CR_SERVER_GONE_ERROR)
343
drizzle->reconnect=1;
344
if (!drizzle_ping(drizzle))
345
puts(_("connection was down, but drizzled is now alive"));
349
my_printf_error(0,_("drizzled doesn't answer to ping, error: '%s'"),
350
error_flags, drizzle_error(drizzle));
904
if (mysql_errno(mysql) == CR_SERVER_GONE_ERROR)
907
if (!mysql_ping(mysql))
908
puts("connection was down, but mysqld is now alive");
912
my_printf_error(0,"mysqld doesn't answer to ping, error: '%s'",
913
error_flags, mysql_error(mysql));
354
drizzle->reconnect=1; /* Automatic reconnect is default */
917
mysql->reconnect=1; /* Automatic reconnect is default */
358
my_printf_error(0, _("Unknown command: '%-.60s'"), error_flags, argv[0]);
920
my_printf_error(0, "Unknown command: '%-.60s'", error_flags, argv[0]);
927
#include <help_start.h>
365
929
static void print_version(void)
367
printf(_("%s Ver %s Distrib %s, for %s on %s\n"),my_progname,ADMIN_VERSION,
368
drizzle_get_client_info(),SYSTEM_TYPE,MACHINE_TYPE);
931
printf("%s Ver %s Distrib %s, for %s on %s\n",my_progname,ADMIN_VERSION,
932
MYSQL_SERVER_VERSION,SYSTEM_TYPE,MACHINE_TYPE);
371
936
static void usage(void)
374
puts(_("Copyright (C) 2000-2008 MySQL AB"));
375
puts(_("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license\n"));
376
puts(_("Administration program for the drizzled daemon."));
377
printf(_("Usage: %s [OPTIONS] command command....\n"), my_progname);
939
puts("Copyright (C) 2000-2006 MySQL AB");
940
puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license\n");
941
puts("Administration program for the mysqld daemon.");
942
printf("Usage: %s [OPTIONS] command command....\n", my_progname);
378
943
my_print_help(my_long_options);
380
ping Check if server is down\n\
381
shutdown Take server down\n"));
944
my_print_variables(my_long_options);
945
print_defaults("my",load_default_groups);
946
puts("\nWhere command is a one or more of: (Commands may be shortened)\n\
947
create databasename Create a new database\n\
948
debug Instruct server to write debug information to log\n\
949
drop databasename Delete a database and all its tables\n\
950
extended-status Gives an extended status message from the server\n\
951
flush-hosts Flush all cached hosts\n\
952
flush-logs Flush all logs\n\
953
flush-status Clear status variables\n\
954
flush-tables Flush all tables\n\
955
flush-threads Flush the thread cache\n\
956
flush-privileges Reload grant tables (same as reload)\n\
957
kill id,id,... Kill mysql threads");
958
#if MYSQL_VERSION_ID >= 32200
960
password new-password Change old password to new-password, MySQL 4.1 hashing.\n\
961
old-password new-password Change old password to new-password in old format.\n");
964
ping Check if mysqld is alive\n\
965
processlist Show list of active threads in server\n\
966
reload Reload grant tables\n\
967
refresh Flush all tables and close and open logfiles\n\
968
shutdown Take server down\n\
969
status Gives a short status message from the server\n\
970
start-slave Start slave\n\
971
stop-slave Stop slave\n\
972
variables Prints variables available\n\
973
version Get version info from server");
976
#include <help_end.h>
978
static int drop_db(MYSQL *mysql, const char *db)
980
char name_buff[FN_REFLEN+20], buf[10];
983
puts("Dropping the database is potentially a very bad thing to do.");
984
puts("Any data stored in the database will be destroyed.\n");
985
printf("Do you really want to drop the '%s' database [y/N] ",db);
987
VOID(fgets(buf,sizeof(buf)-1,stdin));
988
if ((*buf != 'y') && (*buf != 'Y'))
990
puts("\nOK, aborting database drop!");
994
sprintf(name_buff,"drop database `%.*s`",FN_REFLEN,db);
995
if (mysql_query(mysql,name_buff))
997
my_printf_error(0, "DROP DATABASE %s failed;\nerror: '%s'", error_flags,
998
db,mysql_error(mysql));
1001
printf("Database \"%s\" dropped\n",db);
1006
static void nice_time(ulong sec,char *buff)
1010
if (sec >= 3600L*24)
1014
buff=int10_to_str(tmp, buff, 10);
1015
buff=strmov(buff,tmp > 1 ? " days " : " day ");
1021
buff=int10_to_str(tmp, buff, 10);
1022
buff=strmov(buff,tmp > 1 ? " hours " : " hour ");
1028
buff=int10_to_str(tmp, buff, 10);
1029
buff=strmov(buff," min ");
1031
strmov(int10_to_str(sec, buff, 10)," sec");
1035
static void print_header(MYSQL_RES *result)
1040
mysql_field_seek(result,0);
1042
while ((field = mysql_fetch_field(result)))
1044
printf(" %-*s|",(int) field->max_length+1,field->name);
1051
static void print_top(MYSQL_RES *result)
1057
mysql_field_seek(result,0);
1058
while((field = mysql_fetch_field(result)))
1060
if ((length=(uint) strlen(field->name)) > field->max_length)
1061
field->max_length=length;
1063
length=field->max_length;
1064
for (i=length+2 ; i--> 0 ; )
1072
/* 3.rd argument, uint row, is not in use. Don't remove! */
1073
static void print_row(MYSQL_RES *result, MYSQL_ROW cur,
1074
uint row __attribute__((unused)))
1080
mysql_field_seek(result,0);
1081
for (i=0 ; i < mysql_num_fields(result); i++)
1083
field = mysql_fetch_field(result);
1084
length=field->max_length;
1085
printf(" %-*s|",length+1,cur[i] ? (char*) cur[i] : "");
1091
static void print_relative_row(MYSQL_RES *result, MYSQL_ROW cur, uint row)
1097
mysql_field_seek(result, 0);
1098
field = mysql_fetch_field(result);
1099
printf("| %-*s|", (int) field->max_length + 1, cur[0]);
1101
field = mysql_fetch_field(result);
1102
tmp = cur[1] ? strtoull(cur[1], NULL, 10) : (uint64_t) 0;
1103
printf(" %-*s|\n", (int) field->max_length + 1,
1104
llstr((tmp - last_values[row]), buff));
1105
last_values[row] = tmp;
1109
static void print_relative_row_vert(MYSQL_RES *result __attribute__((unused)),
1111
uint row __attribute__((unused)))
1120
tmp = cur[1] ? strtoull(cur[1], NULL, 10) : (uint64_t) 0;
1121
printf(" %-*s|", ex_val_max_len[row] + 1,
1122
llstr((tmp - last_values[row]), buff));
1124
/* Find the minimum row length needed to output the relative value */
1125
if ((length=(uint) strlen(buff) > ex_val_max_len[row]) && ex_status_printed)
1126
ex_val_max_len[row] = length;
1127
last_values[row] = tmp;
1131
static void store_values(MYSQL_RES *result)
1137
field = mysql_fetch_field(result);
1138
max_var_length = field->max_length;
1139
field = mysql_fetch_field(result);
1140
max_val_length = field->max_length;
1142
for (i = 0; (row = mysql_fetch_row(result)); i++)
1144
strmov(ex_var_names[i], row[0]);
1145
last_values[i]=strtoull(row[1],NULL,10);
1146
ex_val_max_len[i]=2; /* Default print width for values */
1153
static void print_relative_header()
1158
for (i = 0; i < ex_var_count; i++)
1159
printf(" %-*s|", ex_val_max_len[i] + 1, truncated_var_names[i]);
1164
static void print_relative_line()
1169
for (i = 0; i < ex_var_count; i++)
1172
for (j = 0; j < ex_val_max_len[i] + 2; j++)
1180
static void truncate_names()
1183
char *ptr,top_line[MAX_TRUNC_LENGTH+4+NAME_LEN+22+1],buff[22];
1187
ptr=strfill(ptr,max_var_length+2,'-');
1189
ptr=strfill(ptr,MAX_TRUNC_LENGTH+2,'-');
1191
ptr=strfill(ptr,max_val_length+2,'-');
1196
for (i = 0 ; i < ex_var_count; i++)
1199
printf("| %-*s|", max_var_length + 1, ex_var_names[i]);
1200
ptr = ex_var_names[i];
1201
/* Make sure no two same truncated names will become */
1202
for (j = 0; j < i; j++)
1203
if (*truncated_var_names[j] == *ptr)
1206
truncated_var_names[i][0]= *ptr; /* Copy first var char */
1207
int10_to_str(sfx, truncated_var_names[i]+1,10);
1208
printf(" %-*s|", MAX_TRUNC_LENGTH + 1, truncated_var_names[i]);
1209
printf(" %-*s|\n", max_val_length + 1, llstr(last_values[i],buff));
1216
static bool get_pidfile(MYSQL *mysql, char *pidfile)
1220
if (mysql_query(mysql, "SHOW VARIABLES LIKE 'pid_file'"))
1222
my_printf_error(0, "query failed; error: '%s'", error_flags,
1223
mysql_error(mysql));
1225
result = mysql_store_result(mysql);
1228
MYSQL_ROW row=mysql_fetch_row(result);
1230
strmov(pidfile, row[1]);
1231
mysql_free_result(result);
1232
return row == 0; /* Error if row = 0 */
1234
return 1; /* Error */
1238
Return 1 if pid file didn't disappear or change
1241
static bool wait_pidfile(char *pidfile, time_t last_modified,
1242
struct stat *pidfile_status)
1244
char buff[FN_REFLEN];
1249
system_filename(buff, pidfile);
1253
if ((fd= my_open(buff, O_RDONLY, MYF(0))) < 0)
1258
(void) my_close(fd,MYF(0));
1259
if (last_modified && !stat(pidfile, pidfile_status))
1261
if (last_modified != pidfile_status->st_mtime)
1263
/* File changed; Let's assume that mysqld did restart */
1265
printf("pid file '%s' changed while waiting for it to disappear!\nmysqld did probably restart\n",
1271
if (count++ == opt_shutdown_timeout)
1274
} while (!interrupted);
1279
"Warning; Aborted waiting on pid file: '%s' after %d seconds\n",