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 */
18
#include "client_priv.h"
20
#include <my_pthread.h> /* because of signal() */
24
#ifdef LATER_HAVE_NDBCLUSTER_DB
25
#include "../ndb/src/mgmclient/ndb_mgmclient.h"
28
#define ADMIN_VERSION "8.42"
29
#define MAX_MYSQL_VAR 256
30
#define SHUTDOWN_DEF_TIMEOUT 3600 /* Wait for shutdown */
31
#define MAX_TRUNC_LENGTH 3
33
char *host= NULL, *user= 0, *opt_password= 0,
34
*default_charset= NULL;
35
char truncated_var_names[MAX_MYSQL_VAR][MAX_TRUNC_LENGTH];
36
char ex_var_names[MAX_MYSQL_VAR][FN_REFLEN];
37
ulonglong last_values[MAX_MYSQL_VAR];
38
static int interval=0;
39
static my_bool option_force=0,interrupted=0,new_line=0,
40
opt_compress=0, opt_relative=0, opt_verbose=0, opt_vertical=0,
41
tty_password= 0, opt_nobeep;
42
static my_bool debug_info_flag= 0, debug_check_flag= 0;
43
static uint tcp_port = 0, option_wait = 0, option_silent=0, nr_iterations;
44
static uint opt_count_iterations= 0, my_end_arg;
45
static ulong opt_connect_timeout, opt_shutdown_timeout;
46
static char * unix_port=0;
47
#ifdef LATER_HAVE_NDBCLUSTER_DB
48
static my_bool opt_ndbcluster=0;
49
static char *opt_ndb_connectstring=0;
53
static char *shared_memory_base_name=0;
55
static uint opt_protocol=0;
56
static myf error_flags; /* flags to pass to my_printf_error, like ME_BELL */
59
When using extended-status relatively, ex_val_max_len is the estimated
60
maximum length for any relative value printed by extended-status. The
61
idea is to try to keep the length of output as short as possible.
64
static uint ex_val_max_len[MAX_MYSQL_VAR];
65
static my_bool ex_status_printed = 0; /* First output is not relative. */
66
static uint ex_var_count, max_var_length, max_val_length;
68
static void print_version(void);
69
static void usage(void);
70
extern "C" my_bool get_one_option(int optid, const struct my_option *opt,
72
static my_bool sql_connect(MYSQL *mysql, uint wait);
73
static int execute_commands(MYSQL *mysql,int argc, char **argv);
74
static int drop_db(MYSQL *mysql,const char *db);
75
extern "C" sig_handler endprog(int signal_number);
76
static void nice_time(ulong sec,char *buff);
77
static void print_header(MYSQL_RES *result);
78
static void print_top(MYSQL_RES *result);
79
static void print_row(MYSQL_RES *result,MYSQL_ROW cur, uint row);
80
static void print_relative_row(MYSQL_RES *result, MYSQL_ROW cur, uint row);
81
static void print_relative_row_vert(MYSQL_RES *result, MYSQL_ROW cur, uint row);
82
static void print_relative_header();
83
static void print_relative_line();
84
static void truncate_names();
85
static my_bool get_pidfile(MYSQL *mysql, char *pidfile);
86
static my_bool wait_pidfile(char *pidfile, time_t last_modified,
87
struct stat *pidfile_status);
88
static void store_values(MYSQL_RES *result);
91
The order of commands must be the same as command_names,
96
ADMIN_CREATE, ADMIN_DROP, ADMIN_SHUTDOWN,
97
ADMIN_RELOAD, ADMIN_REFRESH, ADMIN_VER,
98
ADMIN_PROCESSLIST, ADMIN_STATUS, ADMIN_KILL,
99
ADMIN_DEBUG, ADMIN_VARIABLES, ADMIN_FLUSH_LOGS,
100
ADMIN_FLUSH_HOSTS, ADMIN_FLUSH_TABLES, ADMIN_PASSWORD,
101
ADMIN_PING, ADMIN_EXTENDED_STATUS, ADMIN_FLUSH_STATUS,
102
ADMIN_FLUSH_PRIVILEGES, ADMIN_START_SLAVE, ADMIN_STOP_SLAVE,
103
ADMIN_FLUSH_THREADS, ADMIN_OLD_PASSWORD
104
#ifdef LATER_HAVE_NDBCLUSTER_DB
108
static const char *command_names[]= {
109
"create", "drop", "shutdown",
110
"reload", "refresh", "version",
111
"processlist", "status", "kill",
112
"debug", "variables", "flush-logs",
113
"flush-hosts", "flush-tables", "password",
114
"ping", "extended-status", "flush-status",
115
"flush-privileges", "start-slave", "stop-slave",
116
"flush-threads","old-password",
117
#ifdef LATER_HAVE_NDBCLUSTER_DB
123
static TYPELIB command_typelib=
124
{ array_elements(command_names)-1,"commands", command_names, NULL};
126
static struct my_option my_long_options[] =
129
"Number of iterations to make. This works with -i (--sleep) only.",
130
(uchar**) &nr_iterations, (uchar**) &nr_iterations, 0, GET_UINT,
131
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
133
{"debug", '#', "Output debug log. Often this is 'd:t:o,filename'.",
134
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
136
{"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit .",
137
(uchar**) &debug_check_flag, (uchar**) &debug_check_flag, 0,
138
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
139
{"debug-info", OPT_DEBUG_INFO, "Print some debug info at exit.",
140
(uchar**) &debug_info_flag, (uchar**) &debug_info_flag,
141
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
143
"Don't ask for confirmation on drop database; with multiple commands, continue even if an error occurs.",
144
(uchar**) &option_force, (uchar**) &option_force, 0, GET_BOOL, NO_ARG, 0, 0,
146
{"compress", 'C', "Use compression in server/client protocol.",
147
(uchar**) &opt_compress, (uchar**) &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0,
149
{"character-sets-dir", OPT_CHARSETS_DIR,
150
"Directory where character sets are.", (uchar**) &charsets_dir,
151
(uchar**) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
152
{"default-character-set", OPT_DEFAULT_CHARSET,
153
"Set the default character set.", (uchar**) &default_charset,
154
(uchar**) &default_charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
155
{"help", '?', "Display this help and exit.", 0, 0, 0, GET_NO_ARG,
156
NO_ARG, 0, 0, 0, 0, 0, 0},
157
{"host", 'h', "Connect to host.", (uchar**) &host, (uchar**) &host, 0, GET_STR,
158
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
159
{"no-beep", 'b', "Turn off beep on error.", (uchar**) &opt_nobeep,
160
(uchar**) &opt_nobeep, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
162
"Password to use when connecting to server. If password is not given it's asked from the tty.",
163
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
164
{"port", 'P', "Port number to use for connection or 0 for default to, in "
165
"order of preference, my.cnf, $MYSQL_TCP_PORT, "
166
#if MYSQL_PORT_DEFAULT == 0
169
"built-in default (" STRINGIFY_ARG(MYSQL_PORT) ").",
171
(uchar**) &tcp_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
172
{"protocol", OPT_MYSQL_PROTOCOL, "The protocol of connection (tcp,socket,pipe,memory).",
173
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
175
"Show difference between current and previous values when used with -i. Currently works only with extended-status.",
176
(uchar**) &opt_relative, (uchar**) &opt_relative, 0, GET_BOOL, NO_ARG, 0, 0, 0,
178
{"set-variable", 'O',
179
"Change the value of a variable. Please note that this option is deprecated; you can set variables directly with --variable-name=value.",
180
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
182
{"shared-memory-base-name", OPT_SHARED_MEMORY_BASE_NAME,
183
"Base name of shared memory.", (uchar**) &shared_memory_base_name, (uchar**) &shared_memory_base_name,
184
0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
186
{"silent", 's', "Silently exit if one can't connect to server.",
187
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
188
{"socket", 'S', "Socket file to use for connection.",
189
(uchar**) &unix_port, (uchar**) &unix_port, 0, GET_STR, REQUIRED_ARG, 0, 0, 0,
191
{"sleep", 'i', "Execute commands again and again with a sleep between.",
192
(uchar**) &interval, (uchar**) &interval, 0, GET_INT, REQUIRED_ARG, 0, 0, 0, 0,
194
#ifndef DONT_ALLOW_USER_CHANGE
195
{"user", 'u', "User for login if not current user.", (uchar**) &user,
196
(uchar**) &user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
198
{"verbose", 'v', "Write more information.", (uchar**) &opt_verbose,
199
(uchar**) &opt_verbose, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
200
{"version", 'V', "Output version information and exit.", 0, 0, 0, GET_NO_ARG,
201
NO_ARG, 0, 0, 0, 0, 0, 0},
203
"Print output vertically. Is similar to --relative, but prints output vertically.",
204
(uchar**) &opt_vertical, (uchar**) &opt_vertical, 0, GET_BOOL, NO_ARG, 0, 0, 0,
206
{"wait", 'w', "Wait and retry if connection is down.", 0, 0, 0, GET_UINT,
207
OPT_ARG, 0, 0, 0, 0, 0, 0},
208
{"connect_timeout", OPT_CONNECT_TIMEOUT, "", (uchar**) &opt_connect_timeout,
209
(uchar**) &opt_connect_timeout, 0, GET_ULONG, REQUIRED_ARG, 3600*12, 0,
211
{"shutdown_timeout", OPT_SHUTDOWN_TIMEOUT, "", (uchar**) &opt_shutdown_timeout,
212
(uchar**) &opt_shutdown_timeout, 0, GET_ULONG, REQUIRED_ARG,
213
SHUTDOWN_DEF_TIMEOUT, 0, 3600*12, 0, 1, 0},
214
#ifdef LATER_HAVE_NDBCLUSTER_DB
215
{"ndbcluster", OPT_NDBCLUSTER, ""
216
"", (uchar**) &opt_ndbcluster,
217
(uchar**) &opt_ndbcluster, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
218
{"ndb-connectstring", OPT_NDB_CONNECTSTRING, ""
219
"", (uchar**) &opt_ndb_connectstring,
220
(uchar**) &opt_ndb_connectstring, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
222
{ 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
226
static const char *load_default_groups[]= { "mysqladmin","client",0 };
229
get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
236
opt_count_iterations= 1;
241
char *start=argument;
242
my_free(opt_password,MYF(MY_ALLOW_ZERO_PTR));
243
opt_password=my_strdup(argument,MYF(MY_FAE));
244
while (*argument) *argument++= 'x'; /* Destroy argument */
246
start[1]=0; /* Cut length of argument */
256
DBUG_PUSH(argument ? argument : "d:t:o,/tmp/mysqladmin.trace");
265
if ((option_wait=atoi(argument)) <= 0)
269
option_wait= ~(uint)0;
275
case OPT_CHARSETS_DIR:
276
#if MYSQL_VERSION_ID > 32300
277
charsets_dir = argument;
280
case OPT_MYSQL_PROTOCOL:
281
opt_protocol= find_type_or_exit(argument, &sql_protocol_typelib,
294
int main(int argc,char *argv[])
296
int error= 0, ho_error;
298
char **commands, **save_argv;
302
load_defaults("my",load_default_groups,&argc,&argv);
303
save_argv = argv; /* Save for free_defaults */
304
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
306
free_defaults(save_argv);
310
my_end_arg= MY_CHECK_ERROR | MY_GIVE_INFO;
311
if (debug_check_flag)
312
my_end_arg= MY_CHECK_ERROR;
321
opt_password = get_tty_password(NullS);
323
VOID(signal(SIGINT,endprog)); /* Here if abort */
324
VOID(signal(SIGTERM,endprog)); /* Here if abort */
327
mysql_options(&mysql,MYSQL_OPT_COMPRESS,NullS);
328
if (opt_connect_timeout)
330
uint tmp=opt_connect_timeout;
331
mysql_options(&mysql,MYSQL_OPT_CONNECT_TIMEOUT, (char*) &tmp);
334
mysql_options(&mysql,MYSQL_OPT_PROTOCOL,(char*)&opt_protocol);
336
if (shared_memory_base_name)
337
mysql_options(&mysql,MYSQL_SHARED_MEMORY_BASE_NAME,shared_memory_base_name);
340
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, default_charset);
341
error_flags= (myf)(opt_nobeep ? 0 : ME_BELL);
343
if (sql_connect(&mysql, option_wait))
345
unsigned int err= mysql_errno(&mysql);
346
if (err >= CR_MIN_ERROR && err <= CR_MAX_ERROR)
350
/* Return 0 if all commands are PING */
351
for (; argc > 0; argv++, argc--)
353
if (find_type(argv[0], &command_typelib, 2) != ADMIN_PING)
363
while (!interrupted && (!opt_count_iterations || nr_iterations))
366
if ((error=execute_commands(&mysql,argc,commands)))
369
break; /* Wrong command error */
372
if (option_wait && !interrupted)
375
if (!sql_connect(&mysql, option_wait))
377
sleep(1); /* Don't retry too rapidly */
378
continue; /* Retry */
390
if (opt_count_iterations)
398
my_free(opt_password,MYF(MY_ALLOW_ZERO_PTR));
399
my_free(user,MYF(MY_ALLOW_ZERO_PTR));
401
my_free(shared_memory_base_name,MYF(MY_ALLOW_ZERO_PTR));
403
free_defaults(save_argv);
409
sig_handler endprog(int signal_number __attribute__((unused)))
415
static my_bool sql_connect(MYSQL *mysql, uint wait)
421
if (mysql_real_connect(mysql,host,user,opt_password,NullS,tcp_port,
428
(void) fflush(stderr);
438
host= (char*) LOCAL_HOST;
439
my_printf_error(0,"connect to server at '%s' failed\nerror: '%s'",
440
error_flags, host, mysql_error(mysql));
441
if (mysql_errno(mysql) == CR_CONNECTION_ERROR)
444
"Check that mysqld is running and that the socket: '%s' exists!\n",
445
unix_port ? unix_port : mysql_unix_port);
447
else if (mysql_errno(mysql) == CR_CONN_HOST_ERROR ||
448
mysql_errno(mysql) == CR_UNKNOWN_HOST)
450
fprintf(stderr,"Check that mysqld is running on %s",host);
451
fprintf(stderr," and that the port is %d.\n",
452
tcp_port ? tcp_port: mysql_port);
453
fprintf(stderr,"You can check this by doing 'telnet %s %d'\n",
454
host, tcp_port ? tcp_port: mysql_port);
459
if (wait != (uint) ~0)
460
wait--; /* One less retry */
461
if ((mysql_errno(mysql) != CR_CONN_HOST_ERROR) &&
462
(mysql_errno(mysql) != CR_CONNECTION_ERROR))
464
fprintf(stderr,"Got error: %s\n", mysql_error(mysql));
468
else if (!option_silent)
473
fputs("Waiting for MySQL server to answer",stderr);
474
(void) fflush(stderr);
479
(void) fflush(stderr);
490
-1 on retryable error
494
static int execute_commands(MYSQL *mysql,int argc, char **argv)
498
MySQL documentation relies on the fact that mysqladmin will
499
execute commands in the order specified, e.g.
500
mysqladmin -u root flush-privileges password "newpassword"
501
to reset a lost root password.
502
If this behaviour is ever changed, Docs should be notified.
505
struct rand_struct rand_st;
507
for (; argc > 0 ; argv++,argc--)
509
switch (find_type(argv[0],&command_typelib,2)) {
512
char buff[FN_REFLEN+20];
515
my_printf_error(0, "Too few arguments to create", error_flags);
518
sprintf(buff,"create database `%.*s`",FN_REFLEN,argv[1]);
519
if (mysql_query(mysql,buff))
521
my_printf_error(0,"CREATE DATABASE failed; error: '%-.200s'",
522
error_flags, mysql_error(mysql));
532
my_printf_error(0, "Too few arguments to drop", error_flags);
535
if (drop_db(mysql,argv[1]))
542
char pidfile[FN_REFLEN];
543
my_bool got_pidfile= 0;
544
time_t last_modified= 0;
545
struct stat pidfile_status;
548
Only wait for pidfile on local connections
549
If pidfile doesn't exist, continue without pid file checking
551
if (mysql->unix_socket && (got_pidfile= !get_pidfile(mysql, pidfile)) &&
552
!stat(pidfile, &pidfile_status))
553
last_modified= pidfile_status.st_mtime;
555
if (mysql_shutdown(mysql, SHUTDOWN_DEFAULT))
557
my_printf_error(0, "shutdown failed; error: '%s'", error_flags,
561
mysql_close(mysql); /* Close connection to avoid error messages */
562
argc=1; /* force SHUTDOWN to be the last command */
566
printf("Shutdown signal sent to server; Waiting for pid file to disappear\n");
568
/* Wait until pid file is gone */
569
if (wait_pidfile(pidfile, last_modified, &pidfile_status))
574
case ADMIN_FLUSH_PRIVILEGES:
576
if (mysql_query(mysql,"flush privileges"))
578
my_printf_error(0, "reload failed; error: '%s'", error_flags,
584
if (mysql_refresh(mysql,
585
(uint) ~(REFRESH_GRANT | REFRESH_STATUS |
586
REFRESH_READ_LOCK | REFRESH_SLAVE |
589
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
594
case ADMIN_FLUSH_THREADS:
595
if (mysql_refresh(mysql,(uint) REFRESH_THREADS))
597
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
605
puts("Copyright (C) 2000-2006 MySQL AB");
606
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");
607
printf("Server version\t\t%s\n", mysql_get_server_info(mysql));
608
printf("Protocol version\t%d\n", mysql_get_proto_info(mysql));
609
printf("Connection\t\t%s\n",mysql_get_host_info(mysql));
610
if (mysql->unix_socket)
611
printf("UNIX socket\t\t%s\n", mysql->unix_socket);
613
printf("TCP port\t\t%d\n", mysql->port);
614
status=mysql_stat(mysql);
618
pos= (char*) strchr(status,' ');
620
printf("%s\t\t\t",status); /* print label */
621
if ((status=str2int(pos,10,0,LONG_MAX,(long*) &sec)))
624
puts(buff); /* print nice time */
625
while (*status == ' ') status++; /* to next info */
632
case ADMIN_PROCESSLIST:
637
if (mysql_query(mysql, (opt_verbose ? "show full processlist" :
638
"show processlist")) ||
639
!(result = mysql_store_result(mysql)))
641
my_printf_error(0, "process list failed; error: '%s'", error_flags,
645
print_header(result);
646
while ((row=mysql_fetch_row(result)))
647
print_row(result,row,0);
649
mysql_free_result(result);
654
status=mysql_stat(mysql);
664
my_printf_error(0, "Too few arguments to 'kill'", error_flags);
670
if (mysql_kill(mysql,(ulong) atol(pos)))
672
my_printf_error(0, "kill failed on %ld; error: '%s'", error_flags,
673
atol(pos), mysql_error(mysql));
676
if (!(pos=strchr(pos,',')))
686
if (mysql_dump_debug_info(mysql))
688
my_printf_error(0, "debug failed; error: '%s'", error_flags,
693
case ADMIN_VARIABLES:
699
if (mysql_query(mysql,"show /*!40003 GLOBAL */ variables") ||
700
!(res=mysql_store_result(mysql)))
702
my_printf_error(0, "unable to show variables; error: '%s'", error_flags,
707
while ((row=mysql_fetch_row(res)))
708
print_row(res,row,0);
710
mysql_free_result(res);
713
case ADMIN_EXTENDED_STATUS:
718
void (*func) (MYSQL_RES*, MYSQL_ROW, uint);
721
if (mysql_query(mysql, "show /*!50002 GLOBAL */ status") ||
722
!(res = mysql_store_result(mysql)))
724
my_printf_error(0, "unable to show status; error: '%s'", error_flags,
732
if (!ex_status_printed)
735
truncate_names(); /* Does some printing also */
739
print_relative_line();
740
print_relative_header();
741
print_relative_line();
745
/* void (*func) (MYSQL_RES*, MYSQL_ROW, uint); */
746
if (opt_relative && !opt_vertical)
747
func = print_relative_row;
748
else if (opt_vertical)
749
func = print_relative_row_vert;
753
while ((row = mysql_fetch_row(res)))
754
(*func)(res, row, rownr++);
757
if (ex_status_printed)
760
print_relative_line();
766
ex_status_printed = 1; /* From now on the output will be relative */
767
mysql_free_result(res);
770
case ADMIN_FLUSH_LOGS:
772
if (mysql_refresh(mysql,REFRESH_LOG))
774
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
780
case ADMIN_FLUSH_HOSTS:
782
if (mysql_query(mysql,"flush hosts"))
784
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
790
case ADMIN_FLUSH_TABLES:
792
if (mysql_query(mysql,"flush tables"))
794
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
800
case ADMIN_FLUSH_STATUS:
802
if (mysql_query(mysql,"flush status"))
804
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
810
case ADMIN_OLD_PASSWORD:
813
char buff[128],crypted_pw[64];
815
/* Do initialization the same way as we do in mysqld */
816
start_time=time((time_t*) 0);
817
randominit(&rand_st,(ulong) start_time,(ulong) start_time/2);
821
my_printf_error(0, "Too few arguments to change password", error_flags);
827
bool old= (find_type(argv[0], &command_typelib, 2) ==
830
If we don't already know to use an old-style password, see what
835
if (mysql_query(mysql, "SHOW VARIABLES LIKE 'old_passwords'"))
837
my_printf_error(0, "Could not determine old_passwords setting from server; error: '%s'",
838
error_flags, mysql_error(mysql));
843
MYSQL_RES *res= mysql_store_result(mysql);
847
"Could not get old_passwords setting from "
848
"server; error: '%s'",
849
error_flags, mysql_error(mysql));
852
if (!mysql_num_rows(res))
856
MYSQL_ROW row= mysql_fetch_row(res);
857
old= !strncmp(row[1], "ON", 2);
859
mysql_free_result(res);
863
make_scrambled_password_323(crypted_pw, pw);
865
make_scrambled_password(crypted_pw, pw);
868
crypted_pw[0]=0; /* No password */
869
sprintf(buff,"set password='%s',sql_log_off=0",crypted_pw);
871
if (mysql_query(mysql,"set sql_log_off=1"))
873
my_printf_error(0, "Can't turn off logging; error: '%s'",
874
error_flags, mysql_error(mysql));
877
if (mysql_query(mysql,buff))
879
if (mysql_errno(mysql)!=1290)
881
my_printf_error(0,"unable to change password; error: '%s'",
882
error_flags, mysql_error(mysql));
888
We don't try to execute 'update mysql.user set..'
889
because we can't perfectly find out the host
891
my_printf_error(0,"\n"
892
"You cannot use 'password' command as mysqld runs\n"
893
" with grant tables disabled (was started with"
894
" --skip-grant-tables).\n"
895
"Use: \"mysqladmin flush-privileges password '*'\""
896
" instead", error_flags);
904
case ADMIN_START_SLAVE:
905
if (mysql_query(mysql, "START SLAVE"))
907
my_printf_error(0, "Error starting slave: %s", error_flags,
912
puts("Slave started");
914
case ADMIN_STOP_SLAVE:
915
if (mysql_query(mysql, "STOP SLAVE"))
917
my_printf_error(0, "Error stopping slave: %s", error_flags,
922
puts("Slave stopped");
926
mysql->reconnect=0; /* We want to know of reconnects */
927
if (!mysql_ping(mysql))
929
if (option_silent < 2)
930
puts("mysqld is alive");
934
if (mysql_errno(mysql) == CR_SERVER_GONE_ERROR)
937
if (!mysql_ping(mysql))
938
puts("connection was down, but mysqld is now alive");
942
my_printf_error(0,"mysqld doesn't answer to ping, error: '%s'",
943
error_flags, mysql_error(mysql));
947
mysql->reconnect=1; /* Automatic reconnect is default */
949
#ifdef LATER_HAVE_NDBCLUSTER_DB
954
my_printf_error(0, "Too few arguments to ndb-mgm", error_flags);
958
Ndb_mgmclient_handle cmd=
959
ndb_mgmclient_handle_create(opt_ndb_connectstring);
960
ndb_mgmclient_execute(cmd, --argc, ++argv);
961
ndb_mgmclient_handle_destroy(cmd);
968
my_printf_error(0, "Unknown command: '%-.60s'", error_flags, argv[0]);
975
#include <help_start.h>
977
static void print_version(void)
979
printf("%s Ver %s Distrib %s, for %s on %s\n",my_progname,ADMIN_VERSION,
980
MYSQL_SERVER_VERSION,SYSTEM_TYPE,MACHINE_TYPE);
984
static void usage(void)
987
puts("Copyright (C) 2000-2006 MySQL AB");
988
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");
989
puts("Administration program for the mysqld daemon.");
990
printf("Usage: %s [OPTIONS] command command....\n", my_progname);
991
my_print_help(my_long_options);
992
my_print_variables(my_long_options);
993
print_defaults("my",load_default_groups);
994
puts("\nWhere command is a one or more of: (Commands may be shortened)\n\
995
create databasename Create a new database\n\
996
debug Instruct server to write debug information to log\n\
997
drop databasename Delete a database and all its tables\n\
998
extended-status Gives an extended status message from the server\n\
999
flush-hosts Flush all cached hosts\n\
1000
flush-logs Flush all logs\n\
1001
flush-status Clear status variables\n\
1002
flush-tables Flush all tables\n\
1003
flush-threads Flush the thread cache\n\
1004
flush-privileges Reload grant tables (same as reload)\n\
1005
kill id,id,... Kill mysql threads");
1006
#if MYSQL_VERSION_ID >= 32200
1008
password new-password Change old password to new-password, MySQL 4.1 hashing.\n\
1009
old-password new-password Change old password to new-password in old format.\n");
1012
ping Check if mysqld is alive\n\
1013
processlist Show list of active threads in server\n\
1014
reload Reload grant tables\n\
1015
refresh Flush all tables and close and open logfiles\n\
1016
shutdown Take server down\n\
1017
status Gives a short status message from the server\n\
1018
start-slave Start slave\n\
1019
stop-slave Stop slave\n\
1020
variables Prints variables available\n\
1021
version Get version info from server");
1024
#include <help_end.h>
1026
static int drop_db(MYSQL *mysql, const char *db)
1028
char name_buff[FN_REFLEN+20], buf[10];
1031
puts("Dropping the database is potentially a very bad thing to do.");
1032
puts("Any data stored in the database will be destroyed.\n");
1033
printf("Do you really want to drop the '%s' database [y/N] ",db);
1035
VOID(fgets(buf,sizeof(buf)-1,stdin));
1036
if ((*buf != 'y') && (*buf != 'Y'))
1038
puts("\nOK, aborting database drop!");
1042
sprintf(name_buff,"drop database `%.*s`",FN_REFLEN,db);
1043
if (mysql_query(mysql,name_buff))
1045
my_printf_error(0, "DROP DATABASE %s failed;\nerror: '%s'", error_flags,
1046
db,mysql_error(mysql));
1049
printf("Database \"%s\" dropped\n",db);
1054
static void nice_time(ulong sec,char *buff)
1058
if (sec >= 3600L*24)
1062
buff=int10_to_str(tmp, buff, 10);
1063
buff=strmov(buff,tmp > 1 ? " days " : " day ");
1069
buff=int10_to_str(tmp, buff, 10);
1070
buff=strmov(buff,tmp > 1 ? " hours " : " hour ");
1076
buff=int10_to_str(tmp, buff, 10);
1077
buff=strmov(buff," min ");
1079
strmov(int10_to_str(sec, buff, 10)," sec");
1083
static void print_header(MYSQL_RES *result)
1088
mysql_field_seek(result,0);
1090
while ((field = mysql_fetch_field(result)))
1092
printf(" %-*s|",(int) field->max_length+1,field->name);
1099
static void print_top(MYSQL_RES *result)
1105
mysql_field_seek(result,0);
1106
while((field = mysql_fetch_field(result)))
1108
if ((length=(uint) strlen(field->name)) > field->max_length)
1109
field->max_length=length;
1111
length=field->max_length;
1112
for (i=length+2 ; i--> 0 ; )
1120
/* 3.rd argument, uint row, is not in use. Don't remove! */
1121
static void print_row(MYSQL_RES *result, MYSQL_ROW cur,
1122
uint row __attribute__((unused)))
1128
mysql_field_seek(result,0);
1129
for (i=0 ; i < mysql_num_fields(result); i++)
1131
field = mysql_fetch_field(result);
1132
length=field->max_length;
1133
printf(" %-*s|",length+1,cur[i] ? (char*) cur[i] : "");
1139
static void print_relative_row(MYSQL_RES *result, MYSQL_ROW cur, uint row)
1145
mysql_field_seek(result, 0);
1146
field = mysql_fetch_field(result);
1147
printf("| %-*s|", (int) field->max_length + 1, cur[0]);
1149
field = mysql_fetch_field(result);
1150
tmp = cur[1] ? strtoull(cur[1], NULL, 10) : (ulonglong) 0;
1151
printf(" %-*s|\n", (int) field->max_length + 1,
1152
llstr((tmp - last_values[row]), buff));
1153
last_values[row] = tmp;
1157
static void print_relative_row_vert(MYSQL_RES *result __attribute__((unused)),
1159
uint row __attribute__((unused)))
1168
tmp = cur[1] ? strtoull(cur[1], NULL, 10) : (ulonglong) 0;
1169
printf(" %-*s|", ex_val_max_len[row] + 1,
1170
llstr((tmp - last_values[row]), buff));
1172
/* Find the minimum row length needed to output the relative value */
1173
if ((length=(uint) strlen(buff) > ex_val_max_len[row]) && ex_status_printed)
1174
ex_val_max_len[row] = length;
1175
last_values[row] = tmp;
1179
static void store_values(MYSQL_RES *result)
1185
field = mysql_fetch_field(result);
1186
max_var_length = field->max_length;
1187
field = mysql_fetch_field(result);
1188
max_val_length = field->max_length;
1190
for (i = 0; (row = mysql_fetch_row(result)); i++)
1192
strmov(ex_var_names[i], row[0]);
1193
last_values[i]=strtoull(row[1],NULL,10);
1194
ex_val_max_len[i]=2; /* Default print width for values */
1201
static void print_relative_header()
1206
for (i = 0; i < ex_var_count; i++)
1207
printf(" %-*s|", ex_val_max_len[i] + 1, truncated_var_names[i]);
1212
static void print_relative_line()
1217
for (i = 0; i < ex_var_count; i++)
1220
for (j = 0; j < ex_val_max_len[i] + 2; j++)
1228
static void truncate_names()
1231
char *ptr,top_line[MAX_TRUNC_LENGTH+4+NAME_LEN+22+1],buff[22];
1235
ptr=strfill(ptr,max_var_length+2,'-');
1237
ptr=strfill(ptr,MAX_TRUNC_LENGTH+2,'-');
1239
ptr=strfill(ptr,max_val_length+2,'-');
1244
for (i = 0 ; i < ex_var_count; i++)
1247
printf("| %-*s|", max_var_length + 1, ex_var_names[i]);
1248
ptr = ex_var_names[i];
1249
/* Make sure no two same truncated names will become */
1250
for (j = 0; j < i; j++)
1251
if (*truncated_var_names[j] == *ptr)
1254
truncated_var_names[i][0]= *ptr; /* Copy first var char */
1255
int10_to_str(sfx, truncated_var_names[i]+1,10);
1256
printf(" %-*s|", MAX_TRUNC_LENGTH + 1, truncated_var_names[i]);
1257
printf(" %-*s|\n", max_val_length + 1, llstr(last_values[i],buff));
1264
static my_bool get_pidfile(MYSQL *mysql, char *pidfile)
1268
if (mysql_query(mysql, "SHOW VARIABLES LIKE 'pid_file'"))
1270
my_printf_error(0, "query failed; error: '%s'", error_flags,
1271
mysql_error(mysql));
1273
result = mysql_store_result(mysql);
1276
MYSQL_ROW row=mysql_fetch_row(result);
1278
strmov(pidfile, row[1]);
1279
mysql_free_result(result);
1280
return row == 0; /* Error if row = 0 */
1282
return 1; /* Error */
1286
Return 1 if pid file didn't disappear or change
1289
static my_bool wait_pidfile(char *pidfile, time_t last_modified,
1290
struct stat *pidfile_status)
1292
char buff[FN_REFLEN];
1295
DBUG_ENTER("wait_pidfile");
1297
system_filename(buff, pidfile);
1301
if ((fd= my_open(buff, O_RDONLY, MYF(0))) < 0)
1306
(void) my_close(fd,MYF(0));
1307
if (last_modified && !stat(pidfile, pidfile_status))
1309
if (last_modified != pidfile_status->st_mtime)
1311
/* File changed; Let's assume that mysqld did restart */
1313
printf("pid file '%s' changed while waiting for it to disappear!\nmysqld did probably restart\n",
1319
if (count++ == opt_shutdown_timeout)
1322
} while (!interrupted);
1326
DBUG_PRINT("warning",("Pid file didn't disappear"));
1328
"Warning; Aborted waiting on pid file: '%s' after %d seconds\n",