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"
21
#include <my_pthread.h> /* because of signal() */
26
#ifdef LATER_HAVE_NDBCLUSTER_DB
27
#include "../ndb/src/mgmclient/ndb_mgmclient.h"
30
#define ADMIN_VERSION "8.42"
31
#define MAX_MYSQL_VAR 256
32
#define SHUTDOWN_DEF_TIMEOUT 3600 /* Wait for shutdown */
33
#define MAX_TRUNC_LENGTH 3
35
char *host= NULL, *user= 0, *opt_password= 0,
36
*default_charset= NULL;
37
char truncated_var_names[MAX_MYSQL_VAR][MAX_TRUNC_LENGTH];
38
char ex_var_names[MAX_MYSQL_VAR][FN_REFLEN];
39
ulonglong last_values[MAX_MYSQL_VAR];
40
static int interval=0;
41
static my_bool option_force=0,interrupted=0,new_line=0,
42
opt_compress=0, opt_relative=0, opt_verbose=0, opt_vertical=0,
43
tty_password= 0, opt_nobeep;
44
static my_bool debug_info_flag= 0, debug_check_flag= 0;
45
static uint tcp_port = 0, option_wait = 0, option_silent=0, nr_iterations;
46
static uint opt_count_iterations= 0, my_end_arg;
47
static ulong opt_connect_timeout, opt_shutdown_timeout;
48
static char * unix_port=0;
49
#ifdef LATER_HAVE_NDBCLUSTER_DB
50
static my_bool opt_ndbcluster=0;
51
static char *opt_ndb_connectstring=0;
55
static char *shared_memory_base_name=0;
57
static uint opt_protocol=0;
58
static myf error_flags; /* flags to pass to my_printf_error, like ME_BELL */
61
When using extended-status relatively, ex_val_max_len is the estimated
62
maximum length for any relative value printed by extended-status. The
63
idea is to try to keep the length of output as short as possible.
66
static uint ex_val_max_len[MAX_MYSQL_VAR];
67
static my_bool ex_status_printed = 0; /* First output is not relative. */
68
static uint ex_var_count, max_var_length, max_val_length;
70
static void print_version(void);
71
static void usage(void);
72
extern "C" my_bool get_one_option(int optid, const struct my_option *opt,
74
static my_bool sql_connect(MYSQL *mysql, uint wait);
75
static int execute_commands(MYSQL *mysql,int argc, char **argv);
76
static int drop_db(MYSQL *mysql,const char *db);
77
extern "C" sig_handler endprog(int signal_number);
78
static void nice_time(ulong sec,char *buff);
79
static void print_header(MYSQL_RES *result);
80
static void print_top(MYSQL_RES *result);
81
static void print_row(MYSQL_RES *result,MYSQL_ROW cur, uint row);
82
static void print_relative_row(MYSQL_RES *result, MYSQL_ROW cur, uint row);
83
static void print_relative_row_vert(MYSQL_RES *result, MYSQL_ROW cur, uint row);
84
static void print_relative_header();
85
static void print_relative_line();
86
static void truncate_names();
87
static my_bool get_pidfile(MYSQL *mysql, char *pidfile);
88
static my_bool wait_pidfile(char *pidfile, time_t last_modified,
89
struct stat *pidfile_status);
90
static void store_values(MYSQL_RES *result);
93
The order of commands must be the same as command_names,
98
ADMIN_CREATE, ADMIN_DROP, ADMIN_SHUTDOWN,
99
ADMIN_RELOAD, ADMIN_REFRESH, ADMIN_VER,
100
ADMIN_PROCESSLIST, ADMIN_STATUS, ADMIN_KILL,
101
ADMIN_DEBUG, ADMIN_VARIABLES, ADMIN_FLUSH_LOGS,
102
ADMIN_FLUSH_HOSTS, ADMIN_FLUSH_TABLES, ADMIN_PASSWORD,
103
ADMIN_PING, ADMIN_EXTENDED_STATUS, ADMIN_FLUSH_STATUS,
104
ADMIN_FLUSH_PRIVILEGES, ADMIN_START_SLAVE, ADMIN_STOP_SLAVE,
105
ADMIN_FLUSH_THREADS, ADMIN_OLD_PASSWORD
106
#ifdef LATER_HAVE_NDBCLUSTER_DB
110
static const char *command_names[]= {
111
"create", "drop", "shutdown",
112
"reload", "refresh", "version",
113
"processlist", "status", "kill",
114
"debug", "variables", "flush-logs",
115
"flush-hosts", "flush-tables", "password",
116
"ping", "extended-status", "flush-status",
117
"flush-privileges", "start-slave", "stop-slave",
118
"flush-threads","old-password",
119
#ifdef LATER_HAVE_NDBCLUSTER_DB
125
static TYPELIB command_typelib=
126
{ array_elements(command_names)-1,"commands", command_names, NULL};
128
static struct my_option my_long_options[] =
131
{"autoclose", OPT_AUTO_CLOSE, "Auto close the screen on exit for Netware.",
132
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
135
"Number of iterations to make. This works with -i (--sleep) only.",
136
(uchar**) &nr_iterations, (uchar**) &nr_iterations, 0, GET_UINT,
137
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
139
{"debug", '#', "Output debug log. Often this is 'd:t:o,filename'.",
140
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
142
{"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit .",
143
(uchar**) &debug_check_flag, (uchar**) &debug_check_flag, 0,
144
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
145
{"debug-info", OPT_DEBUG_INFO, "Print some debug info at exit.",
146
(uchar**) &debug_info_flag, (uchar**) &debug_info_flag,
147
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
149
"Don't ask for confirmation on drop database; with multiple commands, continue even if an error occurs.",
150
(uchar**) &option_force, (uchar**) &option_force, 0, GET_BOOL, NO_ARG, 0, 0,
152
{"compress", 'C', "Use compression in server/client protocol.",
153
(uchar**) &opt_compress, (uchar**) &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0,
155
{"character-sets-dir", OPT_CHARSETS_DIR,
156
"Directory where character sets are.", (uchar**) &charsets_dir,
157
(uchar**) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
158
{"default-character-set", OPT_DEFAULT_CHARSET,
159
"Set the default character set.", (uchar**) &default_charset,
160
(uchar**) &default_charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
161
{"help", '?', "Display this help and exit.", 0, 0, 0, GET_NO_ARG,
162
NO_ARG, 0, 0, 0, 0, 0, 0},
163
{"host", 'h', "Connect to host.", (uchar**) &host, (uchar**) &host, 0, GET_STR,
164
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
165
{"no-beep", 'b', "Turn off beep on error.", (uchar**) &opt_nobeep,
166
(uchar**) &opt_nobeep, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
168
"Password to use when connecting to server. If password is not given it's asked from the tty.",
169
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
171
{"pipe", 'W', "Use named pipes to connect to server.", 0, 0, 0, GET_NO_ARG,
172
NO_ARG, 0, 0, 0, 0, 0, 0},
174
{"port", 'P', "Port number to use for connection or 0 for default to, in "
175
"order of preference, my.cnf, $MYSQL_TCP_PORT, "
176
#if MYSQL_PORT_DEFAULT == 0
179
"built-in default (" STRINGIFY_ARG(MYSQL_PORT) ").",
181
(uchar**) &tcp_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
182
{"protocol", OPT_MYSQL_PROTOCOL, "The protocol of connection (tcp,socket,pipe,memory).",
183
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
185
"Show difference between current and previous values when used with -i. Currently works only with extended-status.",
186
(uchar**) &opt_relative, (uchar**) &opt_relative, 0, GET_BOOL, NO_ARG, 0, 0, 0,
188
{"set-variable", 'O',
189
"Change the value of a variable. Please note that this option is deprecated; you can set variables directly with --variable-name=value.",
190
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
192
{"shared-memory-base-name", OPT_SHARED_MEMORY_BASE_NAME,
193
"Base name of shared memory.", (uchar**) &shared_memory_base_name, (uchar**) &shared_memory_base_name,
194
0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
196
{"silent", 's', "Silently exit if one can't connect to server.",
197
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
198
{"socket", 'S', "Socket file to use for connection.",
199
(uchar**) &unix_port, (uchar**) &unix_port, 0, GET_STR, REQUIRED_ARG, 0, 0, 0,
201
{"sleep", 'i', "Execute commands again and again with a sleep between.",
202
(uchar**) &interval, (uchar**) &interval, 0, GET_INT, REQUIRED_ARG, 0, 0, 0, 0,
204
#ifndef DONT_ALLOW_USER_CHANGE
205
{"user", 'u', "User for login if not current user.", (uchar**) &user,
206
(uchar**) &user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
208
{"verbose", 'v', "Write more information.", (uchar**) &opt_verbose,
209
(uchar**) &opt_verbose, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
210
{"version", 'V', "Output version information and exit.", 0, 0, 0, GET_NO_ARG,
211
NO_ARG, 0, 0, 0, 0, 0, 0},
213
"Print output vertically. Is similar to --relative, but prints output vertically.",
214
(uchar**) &opt_vertical, (uchar**) &opt_vertical, 0, GET_BOOL, NO_ARG, 0, 0, 0,
216
{"wait", 'w', "Wait and retry if connection is down.", 0, 0, 0, GET_UINT,
217
OPT_ARG, 0, 0, 0, 0, 0, 0},
218
{"connect_timeout", OPT_CONNECT_TIMEOUT, "", (uchar**) &opt_connect_timeout,
219
(uchar**) &opt_connect_timeout, 0, GET_ULONG, REQUIRED_ARG, 3600*12, 0,
221
{"shutdown_timeout", OPT_SHUTDOWN_TIMEOUT, "", (uchar**) &opt_shutdown_timeout,
222
(uchar**) &opt_shutdown_timeout, 0, GET_ULONG, REQUIRED_ARG,
223
SHUTDOWN_DEF_TIMEOUT, 0, 3600*12, 0, 1, 0},
224
#ifdef LATER_HAVE_NDBCLUSTER_DB
225
{"ndbcluster", OPT_NDBCLUSTER, ""
226
"", (uchar**) &opt_ndbcluster,
227
(uchar**) &opt_ndbcluster, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
228
{"ndb-connectstring", OPT_NDB_CONNECTSTRING, ""
229
"", (uchar**) &opt_ndb_connectstring,
230
(uchar**) &opt_ndb_connectstring, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
232
{ 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
236
static const char *load_default_groups[]= { "mysqladmin","client",0 };
239
get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
247
setscreenmode(SCR_AUTOCLOSE_ON_EXIT);
251
opt_count_iterations= 1;
256
char *start=argument;
257
my_free(opt_password,MYF(MY_ALLOW_ZERO_PTR));
258
opt_password=my_strdup(argument,MYF(MY_FAE));
259
while (*argument) *argument++= 'x'; /* Destroy argument */
261
start[1]=0; /* Cut length of argument */
272
opt_protocol = MYSQL_PROTOCOL_PIPE;
276
DBUG_PUSH(argument ? argument : "d:t:o,/tmp/mysqladmin.trace");
285
if ((option_wait=atoi(argument)) <= 0)
289
option_wait= ~(uint)0;
295
case OPT_CHARSETS_DIR:
296
#if MYSQL_VERSION_ID > 32300
297
charsets_dir = argument;
300
case OPT_MYSQL_PROTOCOL:
301
opt_protocol= find_type_or_exit(argument, &sql_protocol_typelib,
314
int main(int argc,char *argv[])
316
int error= 0, ho_error;
318
char **commands, **save_argv;
322
load_defaults("my",load_default_groups,&argc,&argv);
323
save_argv = argv; /* Save for free_defaults */
324
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
326
free_defaults(save_argv);
330
my_end_arg= MY_CHECK_ERROR | MY_GIVE_INFO;
331
if (debug_check_flag)
332
my_end_arg= MY_CHECK_ERROR;
341
opt_password = get_tty_password(NullS);
343
VOID(signal(SIGINT,endprog)); /* Here if abort */
344
VOID(signal(SIGTERM,endprog)); /* Here if abort */
347
mysql_options(&mysql,MYSQL_OPT_COMPRESS,NullS);
348
if (opt_connect_timeout)
350
uint tmp=opt_connect_timeout;
351
mysql_options(&mysql,MYSQL_OPT_CONNECT_TIMEOUT, (char*) &tmp);
355
mysql_ssl_set(&mysql, opt_ssl_key, opt_ssl_cert, opt_ssl_ca,
356
opt_ssl_capath, opt_ssl_cipher);
357
mysql_options(&mysql,MYSQL_OPT_SSL_VERIFY_SERVER_CERT,
358
(char*)&opt_ssl_verify_server_cert);
361
mysql_options(&mysql,MYSQL_OPT_PROTOCOL,(char*)&opt_protocol);
363
if (shared_memory_base_name)
364
mysql_options(&mysql,MYSQL_SHARED_MEMORY_BASE_NAME,shared_memory_base_name);
367
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, default_charset);
368
error_flags= (myf)(opt_nobeep ? 0 : ME_BELL);
370
if (sql_connect(&mysql, option_wait))
372
unsigned int err= mysql_errno(&mysql);
373
if (err >= CR_MIN_ERROR && err <= CR_MAX_ERROR)
377
/* Return 0 if all commands are PING */
378
for (; argc > 0; argv++, argc--)
380
if (find_type(argv[0], &command_typelib, 2) != ADMIN_PING)
390
while (!interrupted && (!opt_count_iterations || nr_iterations))
393
if ((error=execute_commands(&mysql,argc,commands)))
396
break; /* Wrong command error */
399
if (option_wait && !interrupted)
402
if (!sql_connect(&mysql, option_wait))
404
sleep(1); /* Don't retry too rapidly */
405
continue; /* Retry */
417
if (opt_count_iterations)
425
my_free(opt_password,MYF(MY_ALLOW_ZERO_PTR));
426
my_free(user,MYF(MY_ALLOW_ZERO_PTR));
428
my_free(shared_memory_base_name,MYF(MY_ALLOW_ZERO_PTR));
430
free_defaults(save_argv);
437
sig_handler endprog(int signal_number __attribute__((unused)))
443
static my_bool sql_connect(MYSQL *mysql, uint wait)
449
if (mysql_real_connect(mysql,host,user,opt_password,NullS,tcp_port,
456
(void) fflush(stderr);
466
host= (char*) LOCAL_HOST;
467
my_printf_error(0,"connect to server at '%s' failed\nerror: '%s'",
468
error_flags, host, mysql_error(mysql));
469
if (mysql_errno(mysql) == CR_CONNECTION_ERROR)
472
"Check that mysqld is running and that the socket: '%s' exists!\n",
473
unix_port ? unix_port : mysql_unix_port);
475
else if (mysql_errno(mysql) == CR_CONN_HOST_ERROR ||
476
mysql_errno(mysql) == CR_UNKNOWN_HOST)
478
fprintf(stderr,"Check that mysqld is running on %s",host);
479
fprintf(stderr," and that the port is %d.\n",
480
tcp_port ? tcp_port: mysql_port);
481
fprintf(stderr,"You can check this by doing 'telnet %s %d'\n",
482
host, tcp_port ? tcp_port: mysql_port);
487
if (wait != (uint) ~0)
488
wait--; /* One less retry */
489
if ((mysql_errno(mysql) != CR_CONN_HOST_ERROR) &&
490
(mysql_errno(mysql) != CR_CONNECTION_ERROR))
492
fprintf(stderr,"Got error: %s\n", mysql_error(mysql));
496
else if (!option_silent)
501
fputs("Waiting for MySQL server to answer",stderr);
502
(void) fflush(stderr);
507
(void) fflush(stderr);
518
-1 on retryable error
522
static int execute_commands(MYSQL *mysql,int argc, char **argv)
526
MySQL documentation relies on the fact that mysqladmin will
527
execute commands in the order specified, e.g.
528
mysqladmin -u root flush-privileges password "newpassword"
529
to reset a lost root password.
530
If this behaviour is ever changed, Docs should be notified.
533
struct rand_struct rand_st;
535
for (; argc > 0 ; argv++,argc--)
537
switch (find_type(argv[0],&command_typelib,2)) {
540
char buff[FN_REFLEN+20];
543
my_printf_error(0, "Too few arguments to create", error_flags);
546
sprintf(buff,"create database `%.*s`",FN_REFLEN,argv[1]);
547
if (mysql_query(mysql,buff))
549
my_printf_error(0,"CREATE DATABASE failed; error: '%-.200s'",
550
error_flags, mysql_error(mysql));
560
my_printf_error(0, "Too few arguments to drop", error_flags);
563
if (drop_db(mysql,argv[1]))
570
char pidfile[FN_REFLEN];
571
my_bool got_pidfile= 0;
572
time_t last_modified= 0;
573
struct stat pidfile_status;
576
Only wait for pidfile on local connections
577
If pidfile doesn't exist, continue without pid file checking
579
if (mysql->unix_socket && (got_pidfile= !get_pidfile(mysql, pidfile)) &&
580
!stat(pidfile, &pidfile_status))
581
last_modified= pidfile_status.st_mtime;
583
if (mysql_shutdown(mysql, SHUTDOWN_DEFAULT))
585
my_printf_error(0, "shutdown failed; error: '%s'", error_flags,
589
mysql_close(mysql); /* Close connection to avoid error messages */
590
argc=1; /* force SHUTDOWN to be the last command */
594
printf("Shutdown signal sent to server; Waiting for pid file to disappear\n");
596
/* Wait until pid file is gone */
597
if (wait_pidfile(pidfile, last_modified, &pidfile_status))
602
case ADMIN_FLUSH_PRIVILEGES:
604
if (mysql_query(mysql,"flush privileges"))
606
my_printf_error(0, "reload failed; error: '%s'", error_flags,
612
if (mysql_refresh(mysql,
613
(uint) ~(REFRESH_GRANT | REFRESH_STATUS |
614
REFRESH_READ_LOCK | REFRESH_SLAVE |
617
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
622
case ADMIN_FLUSH_THREADS:
623
if (mysql_refresh(mysql,(uint) REFRESH_THREADS))
625
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
633
puts("Copyright (C) 2000-2006 MySQL AB");
634
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");
635
printf("Server version\t\t%s\n", mysql_get_server_info(mysql));
636
printf("Protocol version\t%d\n", mysql_get_proto_info(mysql));
637
printf("Connection\t\t%s\n",mysql_get_host_info(mysql));
638
if (mysql->unix_socket)
639
printf("UNIX socket\t\t%s\n", mysql->unix_socket);
641
printf("TCP port\t\t%d\n", mysql->port);
642
status=mysql_stat(mysql);
646
pos= (char*) strchr(status,' ');
648
printf("%s\t\t\t",status); /* print label */
649
if ((status=str2int(pos,10,0,LONG_MAX,(long*) &sec)))
652
puts(buff); /* print nice time */
653
while (*status == ' ') status++; /* to next info */
660
case ADMIN_PROCESSLIST:
665
if (mysql_query(mysql, (opt_verbose ? "show full processlist" :
666
"show processlist")) ||
667
!(result = mysql_store_result(mysql)))
669
my_printf_error(0, "process list failed; error: '%s'", error_flags,
673
print_header(result);
674
while ((row=mysql_fetch_row(result)))
675
print_row(result,row,0);
677
mysql_free_result(result);
682
status=mysql_stat(mysql);
692
my_printf_error(0, "Too few arguments to 'kill'", error_flags);
698
if (mysql_kill(mysql,(ulong) atol(pos)))
700
my_printf_error(0, "kill failed on %ld; error: '%s'", error_flags,
701
atol(pos), mysql_error(mysql));
704
if (!(pos=strchr(pos,',')))
714
if (mysql_dump_debug_info(mysql))
716
my_printf_error(0, "debug failed; error: '%s'", error_flags,
721
case ADMIN_VARIABLES:
727
if (mysql_query(mysql,"show /*!40003 GLOBAL */ variables") ||
728
!(res=mysql_store_result(mysql)))
730
my_printf_error(0, "unable to show variables; error: '%s'", error_flags,
735
while ((row=mysql_fetch_row(res)))
736
print_row(res,row,0);
738
mysql_free_result(res);
741
case ADMIN_EXTENDED_STATUS:
746
void (*func) (MYSQL_RES*, MYSQL_ROW, uint);
749
if (mysql_query(mysql, "show /*!50002 GLOBAL */ status") ||
750
!(res = mysql_store_result(mysql)))
752
my_printf_error(0, "unable to show status; error: '%s'", error_flags,
760
if (!ex_status_printed)
763
truncate_names(); /* Does some printing also */
767
print_relative_line();
768
print_relative_header();
769
print_relative_line();
773
/* void (*func) (MYSQL_RES*, MYSQL_ROW, uint); */
774
if (opt_relative && !opt_vertical)
775
func = print_relative_row;
776
else if (opt_vertical)
777
func = print_relative_row_vert;
781
while ((row = mysql_fetch_row(res)))
782
(*func)(res, row, rownr++);
785
if (ex_status_printed)
788
print_relative_line();
794
ex_status_printed = 1; /* From now on the output will be relative */
795
mysql_free_result(res);
798
case ADMIN_FLUSH_LOGS:
800
if (mysql_refresh(mysql,REFRESH_LOG))
802
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
808
case ADMIN_FLUSH_HOSTS:
810
if (mysql_query(mysql,"flush hosts"))
812
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
818
case ADMIN_FLUSH_TABLES:
820
if (mysql_query(mysql,"flush tables"))
822
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
828
case ADMIN_FLUSH_STATUS:
830
if (mysql_query(mysql,"flush status"))
832
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
838
case ADMIN_OLD_PASSWORD:
841
char buff[128],crypted_pw[64];
843
/* Do initialization the same way as we do in mysqld */
844
start_time=time((time_t*) 0);
845
randominit(&rand_st,(ulong) start_time,(ulong) start_time/2);
849
my_printf_error(0, "Too few arguments to change password", error_flags);
855
bool old= (find_type(argv[0], &command_typelib, 2) ==
858
uint pw_len= strlen(pw);
859
if (pw_len > 1 && pw[0] == '\'' && pw[pw_len-1] == '\'')
860
printf("Warning: single quotes were not trimmed from the password by"
861
" your command\nline client, as you might have expected.\n");
864
If we don't already know to use an old-style password, see what
869
if (mysql_query(mysql, "SHOW VARIABLES LIKE 'old_passwords'"))
871
my_printf_error(0, "Could not determine old_passwords setting from server; error: '%s'",
872
error_flags, mysql_error(mysql));
877
MYSQL_RES *res= mysql_store_result(mysql);
881
"Could not get old_passwords setting from "
882
"server; error: '%s'",
883
error_flags, mysql_error(mysql));
886
if (!mysql_num_rows(res))
890
MYSQL_ROW row= mysql_fetch_row(res);
891
old= !strncmp(row[1], "ON", 2);
893
mysql_free_result(res);
897
make_scrambled_password_323(crypted_pw, pw);
899
make_scrambled_password(crypted_pw, pw);
902
crypted_pw[0]=0; /* No password */
903
sprintf(buff,"set password='%s',sql_log_off=0",crypted_pw);
905
if (mysql_query(mysql,"set sql_log_off=1"))
907
my_printf_error(0, "Can't turn off logging; error: '%s'",
908
error_flags, mysql_error(mysql));
911
if (mysql_query(mysql,buff))
913
if (mysql_errno(mysql)!=1290)
915
my_printf_error(0,"unable to change password; error: '%s'",
916
error_flags, mysql_error(mysql));
922
We don't try to execute 'update mysql.user set..'
923
because we can't perfectly find out the host
925
my_printf_error(0,"\n"
926
"You cannot use 'password' command as mysqld runs\n"
927
" with grant tables disabled (was started with"
928
" --skip-grant-tables).\n"
929
"Use: \"mysqladmin flush-privileges password '*'\""
930
" instead", error_flags);
938
case ADMIN_START_SLAVE:
939
if (mysql_query(mysql, "START SLAVE"))
941
my_printf_error(0, "Error starting slave: %s", error_flags,
946
puts("Slave started");
948
case ADMIN_STOP_SLAVE:
949
if (mysql_query(mysql, "STOP SLAVE"))
951
my_printf_error(0, "Error stopping slave: %s", error_flags,
956
puts("Slave stopped");
960
mysql->reconnect=0; /* We want to know of reconnects */
961
if (!mysql_ping(mysql))
963
if (option_silent < 2)
964
puts("mysqld is alive");
968
if (mysql_errno(mysql) == CR_SERVER_GONE_ERROR)
971
if (!mysql_ping(mysql))
972
puts("connection was down, but mysqld is now alive");
976
my_printf_error(0,"mysqld doesn't answer to ping, error: '%s'",
977
error_flags, mysql_error(mysql));
981
mysql->reconnect=1; /* Automatic reconnect is default */
983
#ifdef LATER_HAVE_NDBCLUSTER_DB
988
my_printf_error(0, "Too few arguments to ndb-mgm", error_flags);
992
Ndb_mgmclient_handle cmd=
993
ndb_mgmclient_handle_create(opt_ndb_connectstring);
994
ndb_mgmclient_execute(cmd, --argc, ++argv);
995
ndb_mgmclient_handle_destroy(cmd);
1002
my_printf_error(0, "Unknown command: '%-.60s'", error_flags, argv[0]);
1009
#include <help_start.h>
1011
static void print_version(void)
1013
printf("%s Ver %s Distrib %s, for %s on %s\n",my_progname,ADMIN_VERSION,
1014
MYSQL_SERVER_VERSION,SYSTEM_TYPE,MACHINE_TYPE);
1015
NETWARE_SET_SCREEN_MODE(1);
1019
static void usage(void)
1022
puts("Copyright (C) 2000-2006 MySQL AB");
1023
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");
1024
puts("Administration program for the mysqld daemon.");
1025
printf("Usage: %s [OPTIONS] command command....\n", my_progname);
1026
my_print_help(my_long_options);
1027
my_print_variables(my_long_options);
1028
print_defaults("my",load_default_groups);
1029
puts("\nWhere command is a one or more of: (Commands may be shortened)\n\
1030
create databasename Create a new database\n\
1031
debug Instruct server to write debug information to log\n\
1032
drop databasename Delete a database and all its tables\n\
1033
extended-status Gives an extended status message from the server\n\
1034
flush-hosts Flush all cached hosts\n\
1035
flush-logs Flush all logs\n\
1036
flush-status Clear status variables\n\
1037
flush-tables Flush all tables\n\
1038
flush-threads Flush the thread cache\n\
1039
flush-privileges Reload grant tables (same as reload)\n\
1040
kill id,id,... Kill mysql threads");
1041
#if MYSQL_VERSION_ID >= 32200
1043
password new-password Change old password to new-password, MySQL 4.1 hashing.\n\
1044
old-password new-password Change old password to new-password in old format.\n");
1047
ping Check if mysqld is alive\n\
1048
processlist Show list of active threads in server\n\
1049
reload Reload grant tables\n\
1050
refresh Flush all tables and close and open logfiles\n\
1051
shutdown Take server down\n\
1052
status Gives a short status message from the server\n\
1053
start-slave Start slave\n\
1054
stop-slave Stop slave\n\
1055
variables Prints variables available\n\
1056
version Get version info from server");
1059
#include <help_end.h>
1061
static int drop_db(MYSQL *mysql, const char *db)
1063
char name_buff[FN_REFLEN+20], buf[10];
1066
puts("Dropping the database is potentially a very bad thing to do.");
1067
puts("Any data stored in the database will be destroyed.\n");
1068
printf("Do you really want to drop the '%s' database [y/N] ",db);
1070
VOID(fgets(buf,sizeof(buf)-1,stdin));
1071
if ((*buf != 'y') && (*buf != 'Y'))
1073
puts("\nOK, aborting database drop!");
1077
sprintf(name_buff,"drop database `%.*s`",FN_REFLEN,db);
1078
if (mysql_query(mysql,name_buff))
1080
my_printf_error(0, "DROP DATABASE %s failed;\nerror: '%s'", error_flags,
1081
db,mysql_error(mysql));
1084
printf("Database \"%s\" dropped\n",db);
1089
static void nice_time(ulong sec,char *buff)
1093
if (sec >= 3600L*24)
1097
buff=int10_to_str(tmp, buff, 10);
1098
buff=strmov(buff,tmp > 1 ? " days " : " day ");
1104
buff=int10_to_str(tmp, buff, 10);
1105
buff=strmov(buff,tmp > 1 ? " hours " : " hour ");
1111
buff=int10_to_str(tmp, buff, 10);
1112
buff=strmov(buff," min ");
1114
strmov(int10_to_str(sec, buff, 10)," sec");
1118
static void print_header(MYSQL_RES *result)
1123
mysql_field_seek(result,0);
1125
while ((field = mysql_fetch_field(result)))
1127
printf(" %-*s|",(int) field->max_length+1,field->name);
1134
static void print_top(MYSQL_RES *result)
1140
mysql_field_seek(result,0);
1141
while((field = mysql_fetch_field(result)))
1143
if ((length=(uint) strlen(field->name)) > field->max_length)
1144
field->max_length=length;
1146
length=field->max_length;
1147
for (i=length+2 ; i--> 0 ; )
1155
/* 3.rd argument, uint row, is not in use. Don't remove! */
1156
static void print_row(MYSQL_RES *result, MYSQL_ROW cur,
1157
uint row __attribute__((unused)))
1163
mysql_field_seek(result,0);
1164
for (i=0 ; i < mysql_num_fields(result); i++)
1166
field = mysql_fetch_field(result);
1167
length=field->max_length;
1168
printf(" %-*s|",length+1,cur[i] ? (char*) cur[i] : "");
1174
static void print_relative_row(MYSQL_RES *result, MYSQL_ROW cur, uint row)
1180
mysql_field_seek(result, 0);
1181
field = mysql_fetch_field(result);
1182
printf("| %-*s|", (int) field->max_length + 1, cur[0]);
1184
field = mysql_fetch_field(result);
1185
tmp = cur[1] ? strtoull(cur[1], NULL, 10) : (ulonglong) 0;
1186
printf(" %-*s|\n", (int) field->max_length + 1,
1187
llstr((tmp - last_values[row]), buff));
1188
last_values[row] = tmp;
1192
static void print_relative_row_vert(MYSQL_RES *result __attribute__((unused)),
1194
uint row __attribute__((unused)))
1203
tmp = cur[1] ? strtoull(cur[1], NULL, 10) : (ulonglong) 0;
1204
printf(" %-*s|", ex_val_max_len[row] + 1,
1205
llstr((tmp - last_values[row]), buff));
1207
/* Find the minimum row length needed to output the relative value */
1208
if ((length=(uint) strlen(buff) > ex_val_max_len[row]) && ex_status_printed)
1209
ex_val_max_len[row] = length;
1210
last_values[row] = tmp;
1214
static void store_values(MYSQL_RES *result)
1220
field = mysql_fetch_field(result);
1221
max_var_length = field->max_length;
1222
field = mysql_fetch_field(result);
1223
max_val_length = field->max_length;
1225
for (i = 0; (row = mysql_fetch_row(result)); i++)
1227
strmov(ex_var_names[i], row[0]);
1228
last_values[i]=strtoull(row[1],NULL,10);
1229
ex_val_max_len[i]=2; /* Default print width for values */
1236
static void print_relative_header()
1241
for (i = 0; i < ex_var_count; i++)
1242
printf(" %-*s|", ex_val_max_len[i] + 1, truncated_var_names[i]);
1247
static void print_relative_line()
1252
for (i = 0; i < ex_var_count; i++)
1255
for (j = 0; j < ex_val_max_len[i] + 2; j++)
1263
static void truncate_names()
1266
char *ptr,top_line[MAX_TRUNC_LENGTH+4+NAME_LEN+22+1],buff[22];
1270
ptr=strfill(ptr,max_var_length+2,'-');
1272
ptr=strfill(ptr,MAX_TRUNC_LENGTH+2,'-');
1274
ptr=strfill(ptr,max_val_length+2,'-');
1279
for (i = 0 ; i < ex_var_count; i++)
1282
printf("| %-*s|", max_var_length + 1, ex_var_names[i]);
1283
ptr = ex_var_names[i];
1284
/* Make sure no two same truncated names will become */
1285
for (j = 0; j < i; j++)
1286
if (*truncated_var_names[j] == *ptr)
1289
truncated_var_names[i][0]= *ptr; /* Copy first var char */
1290
int10_to_str(sfx, truncated_var_names[i]+1,10);
1291
printf(" %-*s|", MAX_TRUNC_LENGTH + 1, truncated_var_names[i]);
1292
printf(" %-*s|\n", max_val_length + 1, llstr(last_values[i],buff));
1299
static my_bool get_pidfile(MYSQL *mysql, char *pidfile)
1303
if (mysql_query(mysql, "SHOW VARIABLES LIKE 'pid_file'"))
1305
my_printf_error(0, "query failed; error: '%s'", error_flags,
1306
mysql_error(mysql));
1308
result = mysql_store_result(mysql);
1311
MYSQL_ROW row=mysql_fetch_row(result);
1313
strmov(pidfile, row[1]);
1314
mysql_free_result(result);
1315
return row == 0; /* Error if row = 0 */
1317
return 1; /* Error */
1321
Return 1 if pid file didn't disappear or change
1324
static my_bool wait_pidfile(char *pidfile, time_t last_modified,
1325
struct stat *pidfile_status)
1327
char buff[FN_REFLEN];
1330
DBUG_ENTER("wait_pidfile");
1332
system_filename(buff, pidfile);
1336
if ((fd= my_open(buff, O_RDONLY, MYF(0))) < 0)
1341
(void) my_close(fd,MYF(0));
1342
if (last_modified && !stat(pidfile, pidfile_status))
1344
if (last_modified != pidfile_status->st_mtime)
1346
/* File changed; Let's assume that mysqld did restart */
1348
printf("pid file '%s' changed while waiting for it to disappear!\nmysqld did probably restart\n",
1354
if (count++ == opt_shutdown_timeout)
1357
} while (!interrupted);
1361
DBUG_PRINT("warning",("Pid file didn't disappear"));
1363
"Warning; Aborted waiting on pid file: '%s' after %d seconds\n",