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>
23
#ifdef LATER_HAVE_NDBCLUSTER_DB
24
#include "../ndb/src/mgmclient/ndb_mgmclient.h"
31
27
#define ADMIN_VERSION "8.42"
28
#define MAX_MYSQL_VAR 256
32
29
#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;
30
#define MAX_TRUNC_LENGTH 3
32
char *host= NULL, *user= 0, *opt_password= 0,
33
*default_charset= NULL;
34
char truncated_var_names[MAX_MYSQL_VAR][MAX_TRUNC_LENGTH];
35
char ex_var_names[MAX_MYSQL_VAR][FN_REFLEN];
36
ulonglong last_values[MAX_MYSQL_VAR];
37
static int interval=0;
38
static my_bool option_force=0,interrupted=0,new_line=0,
39
opt_compress=0, opt_relative=0, opt_verbose=0, opt_vertical=0,
40
tty_password= 0, opt_nobeep;
41
static my_bool debug_info_flag= 0, debug_check_flag= 0;
42
static uint tcp_port = 0, option_wait = 0, option_silent=0, nr_iterations;
43
static uint opt_count_iterations= 0, my_end_arg;
44
static ulong opt_connect_timeout, opt_shutdown_timeout;
45
static char * unix_port=0;
46
#ifdef LATER_HAVE_NDBCLUSTER_DB
47
static my_bool opt_ndbcluster=0;
48
static char *opt_ndb_connectstring=0;
52
static char *shared_memory_base_name=0;
54
static uint opt_protocol=0;
39
55
static myf error_flags; /* flags to pass to my_printf_error, like ME_BELL */
58
When using extended-status relatively, ex_val_max_len is the estimated
59
maximum length for any relative value printed by extended-status. The
60
idea is to try to keep the length of output as short as possible.
63
static uint ex_val_max_len[MAX_MYSQL_VAR];
64
static my_bool ex_status_printed = 0; /* First output is not relative. */
65
static uint ex_var_count, max_var_length, max_val_length;
67
static void print_version(void);
44
68
static void usage(void);
45
static void print_version(void);
46
extern "C" RETSIGTYPE endprog(int signal_number);
47
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);
69
extern "C" my_bool get_one_option(int optid, const struct my_option *opt,
71
static my_bool sql_connect(MYSQL *mysql, uint wait);
72
static int execute_commands(MYSQL *mysql,int argc, char **argv);
73
static int drop_db(MYSQL *mysql,const char *db);
74
extern "C" sig_handler endprog(int signal_number);
75
static void nice_time(ulong sec,char *buff);
76
static void print_header(MYSQL_RES *result);
77
static void print_top(MYSQL_RES *result);
78
static void print_row(MYSQL_RES *result,MYSQL_ROW cur, uint row);
79
static void print_relative_row(MYSQL_RES *result, MYSQL_ROW cur, uint row);
80
static void print_relative_row_vert(MYSQL_RES *result, MYSQL_ROW cur, uint row);
81
static void print_relative_header();
82
static void print_relative_line();
83
static void truncate_names();
84
static my_bool get_pidfile(MYSQL *mysql, char *pidfile);
85
static my_bool wait_pidfile(char *pidfile, time_t last_modified,
86
struct stat *pidfile_status);
87
static void store_values(MYSQL_RES *result);
53
90
The order of commands must be the same as command_names,
95
ADMIN_CREATE, ADMIN_DROP, ADMIN_SHUTDOWN,
96
ADMIN_RELOAD, ADMIN_REFRESH, ADMIN_VER,
97
ADMIN_PROCESSLIST, ADMIN_STATUS, ADMIN_KILL,
98
ADMIN_DEBUG, ADMIN_VARIABLES, ADMIN_FLUSH_LOGS,
99
ADMIN_FLUSH_HOSTS, ADMIN_FLUSH_TABLES, ADMIN_PASSWORD,
100
ADMIN_PING, ADMIN_EXTENDED_STATUS, ADMIN_FLUSH_STATUS,
101
ADMIN_FLUSH_PRIVILEGES, ADMIN_START_SLAVE, ADMIN_STOP_SLAVE,
102
ADMIN_FLUSH_THREADS, ADMIN_OLD_PASSWORD
103
#ifdef LATER_HAVE_NDBCLUSTER_DB
62
107
static const char *command_names[]= {
108
"create", "drop", "shutdown",
109
"reload", "refresh", "version",
110
"processlist", "status", "kill",
111
"debug", "variables", "flush-logs",
112
"flush-hosts", "flush-tables", "password",
113
"ping", "extended-status", "flush-status",
114
"flush-privileges", "start-slave", "stop-slave",
115
"flush-threads","old-password",
116
#ifdef LATER_HAVE_NDBCLUSTER_DB
68
122
static TYPELIB command_typelib=
69
{ array_elements(command_names)-1,"commands", command_names, NULL };
123
{ array_elements(command_names)-1,"commands", command_names, NULL};
71
125
static struct my_option my_long_options[] =
73
{"help", '?', N_("Display this help and exit."), 0, 0, 0, GET_NO_ARG,
128
"Number of iterations to make. This works with -i (--sleep) only.",
129
(uchar**) &nr_iterations, (uchar**) &nr_iterations, 0, GET_UINT,
130
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
132
{"debug", '#', "Output debug log. Often this is 'd:t:o,filename'.",
133
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
135
{"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit .",
136
(uchar**) &debug_check_flag, (uchar**) &debug_check_flag, 0,
137
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
138
{"debug-info", OPT_DEBUG_INFO, "Print some debug info at exit.",
139
(uchar**) &debug_info_flag, (uchar**) &debug_info_flag,
140
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
142
"Don't ask for confirmation on drop database; with multiple commands, continue even if an error occurs.",
143
(uchar**) &option_force, (uchar**) &option_force, 0, GET_BOOL, NO_ARG, 0, 0,
145
{"compress", 'C', "Use compression in server/client protocol.",
146
(uchar**) &opt_compress, (uchar**) &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0,
148
{"character-sets-dir", OPT_CHARSETS_DIR,
149
"Directory where character sets are.", (uchar**) &charsets_dir,
150
(uchar**) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
151
{"default-character-set", OPT_DEFAULT_CHARSET,
152
"Set the default character set.", (uchar**) &default_charset,
153
(uchar**) &default_charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
154
{"help", '?', "Display this help and exit.", 0, 0, 0, GET_NO_ARG,
74
155
NO_ARG, 0, 0, 0, 0, 0, 0},
75
{"host", 'h', N_("Connect to host."), (char**) &host, (char**) &host, 0, GET_STR,
156
{"host", 'h', "Connect to host.", (uchar**) &host, (uchar**) &host, 0, GET_STR,
76
157
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
158
{"no-beep", 'b', "Turn off beep on error.", (uchar**) &opt_nobeep,
159
(uchar**) &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."),
161
"Password to use when connecting to server. If password is not given it's asked from the tty.",
79
162
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) ")."),
84
(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."),
163
{"port", 'P', "Port number to use for connection or 0 for default to, in "
164
"order of preference, my.cnf, $MYSQL_TCP_PORT, "
165
#if MYSQL_PORT_DEFAULT == 0
168
"built-in default (" STRINGIFY_ARG(MYSQL_PORT) ").",
170
(uchar**) &tcp_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
171
{"protocol", OPT_MYSQL_PROTOCOL, "The protocol of connection (tcp,socket,pipe,memory).",
172
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
174
"Show difference between current and previous values when used with -i. Currently works only with extended-status.",
175
(uchar**) &opt_relative, (uchar**) &opt_relative, 0, GET_BOOL, NO_ARG, 0, 0, 0,
177
{"set-variable", 'O',
178
"Change the value of a variable. Please note that this option is deprecated; you can set variables directly with --variable-name=value.",
179
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
181
{"shared-memory-base-name", OPT_SHARED_MEMORY_BASE_NAME,
182
"Base name of shared memory.", (uchar**) &shared_memory_base_name, (uchar**) &shared_memory_base_name,
183
0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
185
{"silent", 's', "Silently exit if one can't connect to server.",
86
186
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
187
{"socket", 'S', "Socket file to use for connection.",
188
(uchar**) &unix_port, (uchar**) &unix_port, 0, GET_STR, REQUIRED_ARG, 0, 0, 0,
190
{"sleep", 'i', "Execute commands again and again with a sleep between.",
191
(uchar**) &interval, (uchar**) &interval, 0, GET_INT, REQUIRED_ARG, 0, 0, 0, 0,
87
193
#ifndef DONT_ALLOW_USER_CHANGE
88
{"user", 'u', N_("User for login if not current user."), (char**) &user,
89
(char**) &user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
194
{"user", 'u', "User for login if not current user.", (uchar**) &user,
195
(uchar**) &user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
91
{"verbose", 'v', N_("Write more information."), (char**) &opt_verbose,
92
(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,
197
{"verbose", 'v', "Write more information.", (uchar**) &opt_verbose,
198
(uchar**) &opt_verbose, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
199
{"version", 'V', "Output version information and exit.", 0, 0, 0, GET_NO_ARG,
94
200
NO_ARG, 0, 0, 0, 0, 0, 0},
95
{"wait", 'w', N_("Wait and retry if connection is down."), 0, 0, 0, GET_UINT,
202
"Print output vertically. Is similar to --relative, but prints output vertically.",
203
(uchar**) &opt_vertical, (uchar**) &opt_vertical, 0, GET_BOOL, NO_ARG, 0, 0, 0,
205
{"wait", 'w', "Wait and retry if connection is down.", 0, 0, 0, GET_UINT,
96
206
OPT_ARG, 0, 0, 0, 0, 0, 0},
97
{"connect_timeout", OPT_CONNECT_TIMEOUT, "", (char**) &opt_connect_timeout,
98
(char**) &opt_connect_timeout, 0, GET_ULONG, REQUIRED_ARG, 3600*12, 0,
207
{"connect_timeout", OPT_CONNECT_TIMEOUT, "", (uchar**) &opt_connect_timeout,
208
(uchar**) &opt_connect_timeout, 0, GET_ULONG, REQUIRED_ARG, 3600*12, 0,
99
209
3600*12, 0, 1, 0},
100
{"shutdown_timeout", OPT_SHUTDOWN_TIMEOUT, "", (char**) &opt_shutdown_timeout,
101
(char**) &opt_shutdown_timeout, 0, GET_ULONG, REQUIRED_ARG,
210
{"shutdown_timeout", OPT_SHUTDOWN_TIMEOUT, "", (uchar**) &opt_shutdown_timeout,
211
(uchar**) &opt_shutdown_timeout, 0, GET_ULONG, REQUIRED_ARG,
102
212
SHUTDOWN_DEF_TIMEOUT, 0, 3600*12, 0, 1, 0},
213
#ifdef LATER_HAVE_NDBCLUSTER_DB
214
{"ndbcluster", OPT_NDBCLUSTER, ""
215
"", (uchar**) &opt_ndbcluster,
216
(uchar**) &opt_ndbcluster, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
217
{"ndb-connectstring", OPT_NDB_CONNECTSTRING, ""
218
"", (uchar**) &opt_ndb_connectstring,
219
(uchar**) &opt_ndb_connectstring, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
103
221
{ 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
107
static const char *load_default_groups[]= { "drizzleadmin","client",0 };
225
static const char *load_default_groups[]= { "mysqladmin","client",0 };
110
228
get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
235
opt_count_iterations= 1;
119
240
char *start=argument;
121
opt_password= my_strdup(argument,MYF(MY_FAE));
122
while (*argument) *argument++= 'x'; /* Destroy argument */
241
my_free(opt_password,MYF(MY_ALLOW_ZERO_PTR));
242
opt_password=my_strdup(argument,MYF(MY_FAE));
243
while (*argument) *argument++= 'x'; /* Destroy argument */
124
start[1]=0; /* Cut length of argument */
245
start[1]=0; /* Cut length of argument */
255
DBUG_PUSH(argument ? argument : "d:t:o,/tmp/mysqladmin.trace");
251
434
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());
437
host= (char*) LOCAL_HOST;
438
my_printf_error(0,"connect to server at '%s' failed\nerror: '%s'",
439
error_flags, host, mysql_error(mysql));
440
if (mysql_errno(mysql) == CR_CONNECTION_ERROR)
443
"Check that mysqld is running and that the socket: '%s' exists!\n",
444
unix_port ? unix_port : mysql_unix_port);
446
else if (mysql_errno(mysql) == CR_CONN_HOST_ERROR ||
447
mysql_errno(mysql) == CR_UNKNOWN_HOST)
449
fprintf(stderr,"Check that mysqld is running on %s",host);
450
fprintf(stderr," and that the port is %d.\n",
451
tcp_port ? tcp_port: mysql_port);
452
fprintf(stderr,"You can check this by doing 'telnet %s %d'\n",
453
host, tcp_port ? tcp_port: mysql_port);
271
if (wait != UINT32_MAX)
458
if (wait != (uint) ~0)
272
459
wait--; /* One less retry */
273
if ((drizzle_errno(drizzle) != CR_CONN_HOST_ERROR) &&
274
(drizzle_errno(drizzle) != CR_CONNECTION_ERROR))
460
if ((mysql_errno(mysql) != CR_CONN_HOST_ERROR) &&
461
(mysql_errno(mysql) != CR_CONNECTION_ERROR))
276
fprintf(stderr,_("Got error: %s\n"), drizzle_error(drizzle));
463
fprintf(stderr,"Got error: %s\n", mysql_error(mysql));
278
467
else if (!option_silent)
283
fputs(_("Waiting for Drizzle server to answer"),stderr);
284
(void) fflush(stderr);
472
fputs("Waiting for MySQL server to answer",stderr);
473
(void) fflush(stderr);
289
(void) fflush(stderr);
478
(void) fflush(stderr);
297
487
Execute a command.
299
489
-1 on retryable error
302
static int execute_commands(DRIZZLE *drizzle,int argc, char **argv)
493
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.
497
MySQL documentation relies on the fact that mysqladmin will
498
execute commands in the order specified, e.g.
499
mysqladmin -u root flush-privileges password "newpassword"
500
to reset a lost root password.
308
501
If this behaviour is ever changed, Docs should be notified.
504
struct rand_struct rand_st;
310
506
for (; argc > 0 ; argv++,argc--)
312
508
switch (find_type(argv[0],&command_typelib,2)) {
511
char buff[FN_REFLEN+20];
514
my_printf_error(0, "Too few arguments to create", error_flags);
517
sprintf(buff,"create database `%.*s`",FN_REFLEN,argv[1]);
518
if (mysql_query(mysql,buff))
520
my_printf_error(0,"CREATE DATABASE failed; error: '%-.200s'",
521
error_flags, mysql_error(mysql));
531
my_printf_error(0, "Too few arguments to drop", error_flags);
534
if (drop_db(mysql,argv[1]))
313
539
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 */
541
char pidfile[FN_REFLEN];
542
my_bool got_pidfile= 0;
543
time_t last_modified= 0;
544
struct stat pidfile_status;
547
Only wait for pidfile on local connections
548
If pidfile doesn't exist, continue without pid file checking
550
if (mysql->unix_socket && (got_pidfile= !get_pidfile(mysql, pidfile)) &&
551
!stat(pidfile, &pidfile_status))
552
last_modified= pidfile_status.st_mtime;
554
if (mysql_shutdown(mysql, SHUTDOWN_DEFAULT))
556
my_printf_error(0, "shutdown failed; error: '%s'", error_flags,
560
mysql_close(mysql); /* Close connection to avoid error messages */
561
argc=1; /* force SHUTDOWN to be the last command */
565
printf("Shutdown signal sent to server; Waiting for pid file to disappear\n");
567
/* Wait until pid file is gone */
568
if (wait_pidfile(pidfile, last_modified, &pidfile_status))
573
case ADMIN_FLUSH_PRIVILEGES:
575
if (mysql_query(mysql,"flush privileges"))
577
my_printf_error(0, "reload failed; error: '%s'", error_flags,
583
if (mysql_refresh(mysql,
584
(uint) ~(REFRESH_GRANT | REFRESH_STATUS |
585
REFRESH_READ_LOCK | REFRESH_SLAVE |
588
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
593
case ADMIN_FLUSH_THREADS:
594
if (mysql_refresh(mysql,(uint) REFRESH_THREADS))
596
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
604
puts("Copyright (C) 2000-2006 MySQL AB");
605
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");
606
printf("Server version\t\t%s\n", mysql_get_server_info(mysql));
607
printf("Protocol version\t%d\n", mysql_get_proto_info(mysql));
608
printf("Connection\t\t%s\n",mysql_get_host_info(mysql));
609
if (mysql->unix_socket)
610
printf("UNIX socket\t\t%s\n", mysql->unix_socket);
612
printf("TCP port\t\t%d\n", mysql->port);
613
status=mysql_stat(mysql);
617
pos= (char*) strchr(status,' ');
619
printf("%s\t\t\t",status); /* print label */
620
if ((status=str2int(pos,10,0,LONG_MAX,(long*) &sec)))
623
puts(buff); /* print nice time */
624
while (*status == ' ') status++; /* to next info */
631
case ADMIN_PROCESSLIST:
636
if (mysql_query(mysql, (opt_verbose ? "show full processlist" :
637
"show processlist")) ||
638
!(result = mysql_store_result(mysql)))
640
my_printf_error(0, "process list failed; error: '%s'", error_flags,
644
print_header(result);
645
while ((row=mysql_fetch_row(result)))
646
print_row(result,row,0);
648
mysql_free_result(result);
653
status=mysql_stat(mysql);
663
my_printf_error(0, "Too few arguments to 'kill'", error_flags);
669
if (mysql_kill(mysql,(ulong) atol(pos)))
671
my_printf_error(0, "kill failed on %ld; error: '%s'", error_flags,
672
atol(pos), mysql_error(mysql));
675
if (!(pos=strchr(pos,',')))
685
if (mysql_dump_debug_info(mysql))
687
my_printf_error(0, "debug failed; error: '%s'", error_flags,
692
case ADMIN_VARIABLES:
698
if (mysql_query(mysql,"show /*!40003 GLOBAL */ variables") ||
699
!(res=mysql_store_result(mysql)))
701
my_printf_error(0, "unable to show variables; error: '%s'", error_flags,
706
while ((row=mysql_fetch_row(res)))
707
print_row(res,row,0);
709
mysql_free_result(res);
712
case ADMIN_EXTENDED_STATUS:
717
void (*func) (MYSQL_RES*, MYSQL_ROW, uint);
720
if (mysql_query(mysql, "show /*!50002 GLOBAL */ status") ||
721
!(res = mysql_store_result(mysql)))
723
my_printf_error(0, "unable to show status; error: '%s'", error_flags,
731
if (!ex_status_printed)
734
truncate_names(); /* Does some printing also */
738
print_relative_line();
739
print_relative_header();
740
print_relative_line();
744
/* void (*func) (MYSQL_RES*, MYSQL_ROW, uint); */
745
if (opt_relative && !opt_vertical)
746
func = print_relative_row;
747
else if (opt_vertical)
748
func = print_relative_row_vert;
752
while ((row = mysql_fetch_row(res)))
753
(*func)(res, row, rownr++);
756
if (ex_status_printed)
759
print_relative_line();
765
ex_status_printed = 1; /* From now on the output will be relative */
766
mysql_free_result(res);
769
case ADMIN_FLUSH_LOGS:
771
if (mysql_refresh(mysql,REFRESH_LOG))
773
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
779
case ADMIN_FLUSH_HOSTS:
781
if (mysql_query(mysql,"flush hosts"))
783
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
789
case ADMIN_FLUSH_TABLES:
791
if (mysql_query(mysql,"flush tables"))
793
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
799
case ADMIN_FLUSH_STATUS:
801
if (mysql_query(mysql,"flush status"))
803
my_printf_error(0, "refresh failed; error: '%s'", error_flags,
809
case ADMIN_OLD_PASSWORD:
812
char buff[128],crypted_pw[64];
814
/* Do initialization the same way as we do in mysqld */
815
start_time=time((time_t*) 0);
816
randominit(&rand_st,(ulong) start_time,(ulong) start_time/2);
820
my_printf_error(0, "Too few arguments to change password", error_flags);
826
bool old= (find_type(argv[0], &command_typelib, 2) ==
829
If we don't already know to use an old-style password, see what
834
if (mysql_query(mysql, "SHOW VARIABLES LIKE 'old_passwords'"))
836
my_printf_error(0, "Could not determine old_passwords setting from server; error: '%s'",
837
error_flags, mysql_error(mysql));
842
MYSQL_RES *res= mysql_store_result(mysql);
846
"Could not get old_passwords setting from "
847
"server; error: '%s'",
848
error_flags, mysql_error(mysql));
851
if (!mysql_num_rows(res))
855
MYSQL_ROW row= mysql_fetch_row(res);
856
old= !strncmp(row[1], "ON", 2);
858
mysql_free_result(res);
862
make_scrambled_password_323(crypted_pw, pw);
864
make_scrambled_password(crypted_pw, pw);
867
crypted_pw[0]=0; /* No password */
868
sprintf(buff,"set password='%s',sql_log_off=0",crypted_pw);
870
if (mysql_query(mysql,"set sql_log_off=1"))
872
my_printf_error(0, "Can't turn off logging; error: '%s'",
873
error_flags, mysql_error(mysql));
876
if (mysql_query(mysql,buff))
878
if (mysql_errno(mysql)!=1290)
880
my_printf_error(0,"unable to change password; error: '%s'",
881
error_flags, mysql_error(mysql));
887
We don't try to execute 'update mysql.user set..'
888
because we can't perfectly find out the host
890
my_printf_error(0,"\n"
891
"You cannot use 'password' command as mysqld runs\n"
892
" with grant tables disabled (was started with"
893
" --skip-grant-tables).\n"
894
"Use: \"mysqladmin flush-privileges password '*'\""
895
" instead", error_flags);
903
case ADMIN_START_SLAVE:
904
if (mysql_query(mysql, "START SLAVE"))
906
my_printf_error(0, "Error starting slave: %s", error_flags,
911
puts("Slave started");
913
case ADMIN_STOP_SLAVE:
914
if (mysql_query(mysql, "STOP SLAVE"))
916
my_printf_error(0, "Error stopping slave: %s", error_flags,
921
puts("Slave stopped");
333
drizzle->reconnect=0; /* We want to know of reconnects */
334
if (!drizzle_ping(drizzle))
925
mysql->reconnect=0; /* We want to know of reconnects */
926
if (!mysql_ping(mysql))
336
if (option_silent < 2)
337
puts(_("drizzled is alive"));
928
if (option_silent < 2)
929
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));
933
if (mysql_errno(mysql) == CR_SERVER_GONE_ERROR)
936
if (!mysql_ping(mysql))
937
puts("connection was down, but mysqld is now alive");
941
my_printf_error(0,"mysqld doesn't answer to ping, error: '%s'",
942
error_flags, mysql_error(mysql));
354
drizzle->reconnect=1; /* Automatic reconnect is default */
946
mysql->reconnect=1; /* Automatic reconnect is default */
948
#ifdef LATER_HAVE_NDBCLUSTER_DB
953
my_printf_error(0, "Too few arguments to ndb-mgm", error_flags);
957
Ndb_mgmclient_handle cmd=
958
ndb_mgmclient_handle_create(opt_ndb_connectstring);
959
ndb_mgmclient_execute(cmd, --argc, ++argv);
960
ndb_mgmclient_handle_destroy(cmd);
358
my_printf_error(0, _("Unknown command: '%-.60s'"), error_flags, argv[0]);
967
my_printf_error(0, "Unknown command: '%-.60s'", error_flags, argv[0]);
974
#include <help_start.h>
365
976
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);
978
printf("%s Ver %s Distrib %s, for %s on %s\n",my_progname,ADMIN_VERSION,
979
MYSQL_SERVER_VERSION,SYSTEM_TYPE,MACHINE_TYPE);
371
983
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);
986
puts("Copyright (C) 2000-2006 MySQL AB");
987
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");
988
puts("Administration program for the mysqld daemon.");
989
printf("Usage: %s [OPTIONS] command command....\n", my_progname);
378
990
my_print_help(my_long_options);
380
ping Check if server is down\n\
381
shutdown Take server down\n"));
991
my_print_variables(my_long_options);
992
print_defaults("my",load_default_groups);
993
puts("\nWhere command is a one or more of: (Commands may be shortened)\n\
994
create databasename Create a new database\n\
995
debug Instruct server to write debug information to log\n\
996
drop databasename Delete a database and all its tables\n\
997
extended-status Gives an extended status message from the server\n\
998
flush-hosts Flush all cached hosts\n\
999
flush-logs Flush all logs\n\
1000
flush-status Clear status variables\n\
1001
flush-tables Flush all tables\n\
1002
flush-threads Flush the thread cache\n\
1003
flush-privileges Reload grant tables (same as reload)\n\
1004
kill id,id,... Kill mysql threads");
1005
#if MYSQL_VERSION_ID >= 32200
1007
password new-password Change old password to new-password, MySQL 4.1 hashing.\n\
1008
old-password new-password Change old password to new-password in old format.\n");
1011
ping Check if mysqld is alive\n\
1012
processlist Show list of active threads in server\n\
1013
reload Reload grant tables\n\
1014
refresh Flush all tables and close and open logfiles\n\
1015
shutdown Take server down\n\
1016
status Gives a short status message from the server\n\
1017
start-slave Start slave\n\
1018
stop-slave Stop slave\n\
1019
variables Prints variables available\n\
1020
version Get version info from server");
1023
#include <help_end.h>
1025
static int drop_db(MYSQL *mysql, const char *db)
1027
char name_buff[FN_REFLEN+20], buf[10];
1030
puts("Dropping the database is potentially a very bad thing to do.");
1031
puts("Any data stored in the database will be destroyed.\n");
1032
printf("Do you really want to drop the '%s' database [y/N] ",db);
1034
VOID(fgets(buf,sizeof(buf)-1,stdin));
1035
if ((*buf != 'y') && (*buf != 'Y'))
1037
puts("\nOK, aborting database drop!");
1041
sprintf(name_buff,"drop database `%.*s`",FN_REFLEN,db);
1042
if (mysql_query(mysql,name_buff))
1044
my_printf_error(0, "DROP DATABASE %s failed;\nerror: '%s'", error_flags,
1045
db,mysql_error(mysql));
1048
printf("Database \"%s\" dropped\n",db);
1053
static void nice_time(ulong sec,char *buff)
1057
if (sec >= 3600L*24)
1061
buff=int10_to_str(tmp, buff, 10);
1062
buff=strmov(buff,tmp > 1 ? " days " : " day ");
1068
buff=int10_to_str(tmp, buff, 10);
1069
buff=strmov(buff,tmp > 1 ? " hours " : " hour ");
1075
buff=int10_to_str(tmp, buff, 10);
1076
buff=strmov(buff," min ");
1078
strmov(int10_to_str(sec, buff, 10)," sec");
1082
static void print_header(MYSQL_RES *result)
1087
mysql_field_seek(result,0);
1089
while ((field = mysql_fetch_field(result)))
1091
printf(" %-*s|",(int) field->max_length+1,field->name);
1098
static void print_top(MYSQL_RES *result)
1104
mysql_field_seek(result,0);
1105
while((field = mysql_fetch_field(result)))
1107
if ((length=(uint) strlen(field->name)) > field->max_length)
1108
field->max_length=length;
1110
length=field->max_length;
1111
for (i=length+2 ; i--> 0 ; )
1119
/* 3.rd argument, uint row, is not in use. Don't remove! */
1120
static void print_row(MYSQL_RES *result, MYSQL_ROW cur,
1121
uint row __attribute__((unused)))
1127
mysql_field_seek(result,0);
1128
for (i=0 ; i < mysql_num_fields(result); i++)
1130
field = mysql_fetch_field(result);
1131
length=field->max_length;
1132
printf(" %-*s|",length+1,cur[i] ? (char*) cur[i] : "");
1138
static void print_relative_row(MYSQL_RES *result, MYSQL_ROW cur, uint row)
1144
mysql_field_seek(result, 0);
1145
field = mysql_fetch_field(result);
1146
printf("| %-*s|", (int) field->max_length + 1, cur[0]);
1148
field = mysql_fetch_field(result);
1149
tmp = cur[1] ? strtoull(cur[1], NULL, 10) : (ulonglong) 0;
1150
printf(" %-*s|\n", (int) field->max_length + 1,
1151
llstr((tmp - last_values[row]), buff));
1152
last_values[row] = tmp;
1156
static void print_relative_row_vert(MYSQL_RES *result __attribute__((unused)),
1158
uint row __attribute__((unused)))
1167
tmp = cur[1] ? strtoull(cur[1], NULL, 10) : (ulonglong) 0;
1168
printf(" %-*s|", ex_val_max_len[row] + 1,
1169
llstr((tmp - last_values[row]), buff));
1171
/* Find the minimum row length needed to output the relative value */
1172
if ((length=(uint) strlen(buff) > ex_val_max_len[row]) && ex_status_printed)
1173
ex_val_max_len[row] = length;
1174
last_values[row] = tmp;
1178
static void store_values(MYSQL_RES *result)
1184
field = mysql_fetch_field(result);
1185
max_var_length = field->max_length;
1186
field = mysql_fetch_field(result);
1187
max_val_length = field->max_length;
1189
for (i = 0; (row = mysql_fetch_row(result)); i++)
1191
strmov(ex_var_names[i], row[0]);
1192
last_values[i]=strtoull(row[1],NULL,10);
1193
ex_val_max_len[i]=2; /* Default print width for values */
1200
static void print_relative_header()
1205
for (i = 0; i < ex_var_count; i++)
1206
printf(" %-*s|", ex_val_max_len[i] + 1, truncated_var_names[i]);
1211
static void print_relative_line()
1216
for (i = 0; i < ex_var_count; i++)
1219
for (j = 0; j < ex_val_max_len[i] + 2; j++)
1227
static void truncate_names()
1230
char *ptr,top_line[MAX_TRUNC_LENGTH+4+NAME_LEN+22+1],buff[22];
1234
ptr=strfill(ptr,max_var_length+2,'-');
1236
ptr=strfill(ptr,MAX_TRUNC_LENGTH+2,'-');
1238
ptr=strfill(ptr,max_val_length+2,'-');
1243
for (i = 0 ; i < ex_var_count; i++)
1246
printf("| %-*s|", max_var_length + 1, ex_var_names[i]);
1247
ptr = ex_var_names[i];
1248
/* Make sure no two same truncated names will become */
1249
for (j = 0; j < i; j++)
1250
if (*truncated_var_names[j] == *ptr)
1253
truncated_var_names[i][0]= *ptr; /* Copy first var char */
1254
int10_to_str(sfx, truncated_var_names[i]+1,10);
1255
printf(" %-*s|", MAX_TRUNC_LENGTH + 1, truncated_var_names[i]);
1256
printf(" %-*s|\n", max_val_length + 1, llstr(last_values[i],buff));
1263
static my_bool get_pidfile(MYSQL *mysql, char *pidfile)
1267
if (mysql_query(mysql, "SHOW VARIABLES LIKE 'pid_file'"))
1269
my_printf_error(0, "query failed; error: '%s'", error_flags,
1270
mysql_error(mysql));
1272
result = mysql_store_result(mysql);
1275
MYSQL_ROW row=mysql_fetch_row(result);
1277
strmov(pidfile, row[1]);
1278
mysql_free_result(result);
1279
return row == 0; /* Error if row = 0 */
1281
return 1; /* Error */
1285
Return 1 if pid file didn't disappear or change
1288
static my_bool wait_pidfile(char *pidfile, time_t last_modified,
1289
struct stat *pidfile_status)
1291
char buff[FN_REFLEN];
1294
DBUG_ENTER("wait_pidfile");
1296
system_filename(buff, pidfile);
1300
if ((fd= my_open(buff, O_RDONLY, MYF(0))) < 0)
1305
(void) my_close(fd,MYF(0));
1306
if (last_modified && !stat(pidfile, pidfile_status))
1308
if (last_modified != pidfile_status->st_mtime)
1310
/* File changed; Let's assume that mysqld did restart */
1312
printf("pid file '%s' changed while waiting for it to disappear!\nmysqld did probably restart\n",
1318
if (count++ == opt_shutdown_timeout)
1321
} while (!interrupted);
1325
DBUG_PRINT("warning",("Pid file didn't disappear"));
1327
"Warning; Aborted waiting on pid file: '%s' after %d seconds\n",