Il client da riga di comando mysql

Informazioni sul client da riga di comando mysql

mysql è una semplice shell SQL (che fa uso di GNU readline). Supporta sia l'utilizzo interattivo sia quello non interattivo. Quando è usato in modo interattivo, i risultati delle query sono presentati come tabelle con caratteri ASCII. Quando è usato in modo non interattivo (per esempio come filtro), i risultati sono presentati con un carattere tab come separatore. Il formato dell'output può essere cambiato tramite le opzioni.

Se con i grandi insiemi di risultati la memoria non è sufficiente, si usi l'opzione --quick. Essa fa sì che mysql estragga i risultati dal server una riga alla volta, piuttosto che riceverli tutti insieme e inserirli in un buffer in memoria in attesa di mostrarli. Questo si può ottenere anche utilizzando la funzione dell'API C mysql_use_result() nella libreria client/server, invece di mysql_store_result().

Utilizzare mysql è molto semplice. Per invocarlo dal prompt dei comandi:

shell> mysql nome_db

Oppure:

shell> mysql --user=nome_utente --password=pwd nome_db

Poi si possono scrivere le istruzioni SQL, che devono terminare con “;”, \g, o \G, e infine premere Invio.

A partire da MySQL 5.1.10, se si preme Control-C mysql tenta di terminare l'esecuzione dell'ultima istruzione. Se questo non è possibile, o se Control-C viene premuto di nuovo prima che il comando venga terminato, mysql termina l'esecuzione. Precedentemente, Control-C terminata mysql in ogni caso.

E' possibile eseguire le istruzioni SQL in uno script (file batch) in questo modo:

shell> mysql nome_db < script.sql > output.tab

mysql Options

Le opzioni possono essere specificate dalla riga di comando o nel file my.cnf, nei gruppi [mysql] e [client]. L'elenco completo delle opzioni supportate si può visualizzare così:

shell> mysql --verbose --help

In MariaDB 5.1.49 l'output di tale comando è il seguente:

shell> mysql --verbose --help mysql Ver 14.16 Distrib 5.1.49-MariaDB, for debian-linux-gnu (i486) using readline 5.1 This software comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to modify and redistribute it under the GPL v2 license Usage: mysql [OPTIONS] [database] -?, --help Display this help and exit. -I, --help Synonym for -? --abort-source-on-error Abort 'source filename' operations in case of errors --auto-rehash Enable automatic rehashing. One doesn't need to use 'rehash' to get table and field completion, but startup and reconnecting may take a longer time. Disable with --disable-auto-rehash. -A, --no-auto-rehash No automatic rehashing. One has to use 'rehash' to get table and field completion. This gives a quicker start of mysql and disables rehashing on reconnect. -B, --batch Don't use history file. Disable interactive behavior. (Enables --silent.) --character-sets-dir=name Directory for character set files. --column-type-info Display column type information. -c, --comments Preserve comments. Send comments to the server. The default is --skip-comments (discard comments), enable with --comments. -C, --compress Use compression in server/client protocol. -#, --debug[=#] This is a non-debug version. Catch this and exit. --debug-check Check memory and open file usage at exit. -T, --debug-info Print some debug info at exit. -D, --database=name Database to use. --default-character-set=name Set the default character set. --delimiter=name Delimiter to be used. -e, --execute=name Execute command and quit. (Disables --force and history file.) -E, --vertical Print the output of a query (rows) vertically. -f, --force Continue even if we get an SQL error. Sets abort-source-on-error to 0 -G, --named-commands Enable named commands. Named commands mean this program's internal commands; see mysql> help . When enabled, the named commands can be used from any line of the query, otherwise only from the first line, before an enter. Disable with --disable-named-commands. This option is disabled by default. -g, --no-named-commands Named commands are disabled. Use \* form only, or use named commands only in the beginning of a line ending with a semicolon (;). Since version 10.9, the client now starts with this option ENABLED by default. Disable with '-G'. Long format commands still work from the first line. WARNING: option deprecated; use --disable-named-commands instead. -i, --ignore-spaces Ignore space after function names. --local-infile Enable/disable LOAD DATA LOCAL INFILE. -b, --no-beep Turn off beep on error. -h, --host=name Connect to host. -H, --html Produce HTML output. -X, --xml Produce XML output. --line-numbers Write line numbers for errors. -L, --skip-line-numbers Don't write line number for errors. -n, --unbuffered Flush buffer after each query. --column-names Write column names in results. -N, --skip-column-names Don't write column names in results. -O, --set-variable=name Change the value of a variable. Please note that this option is deprecated; you can set variables directly with --variable-name=value. --sigint-ignore Ignore SIGINT (CTRL-C). -o, --one-database Only update the default database. This is useful for skipping updates to other database in the update log. --pager[=name] Pager to use to display results. If you don't supply an option, the default pager is taken from your ENV variable PAGER. Valid pagers are less, more, cat [> filename], etc. See interactive help (\h) also. This option does not work in batch mode. Disable with --disable-pager. This option is disabled by default. --no-pager Disable pager and print to stdout. See interactive help (\h) also. WARNING: option deprecated; use --disable-pager instead. -p, --password[=name] Password to use when connecting to server. If password is not given it's asked from the tty. -P, --port=# Port number to use for connection or 0 for default to, in order of preference, my.cnf, $MYSQL_TCP_PORT, /etc/services, built-in default (3306). --prompt=name Set the mysql prompt to this value. --protocol=name The protocol to use for connection (tcp, socket, pipe, memory). -q, --quick Don't cache result, print it row by row. This may slow down the server if the output is suspended. Doesn't use history file. -r, --raw Write fields without conversion. Used with --batch. --reconnect Reconnect if the connection is lost. Disable with --disable-reconnect. This option is enabled by default. -s, --silent Be more silent. Print results with a tab as separator, each row on new line. -S, --socket=name The socket file to use for connection. --ssl Enable SSL for connection (automatically enabled with other flags).Disable with --skip-ssl. --ssl-ca=name CA file in PEM format (check OpenSSL docs, implies --ssl). --ssl-capath=name CA directory (check OpenSSL docs, implies --ssl). --ssl-cert=name X509 cert in PEM format (implies --ssl). --ssl-cipher=name SSL cipher to use (implies --ssl). --ssl-key=name X509 key in PEM format (implies --ssl). --ssl-verify-server-cert Verify server's "Common Name" in its cert against hostname used when connecting. This option is disabled by default. -t, --table Output in table format. --tee=name Append everything into outfile. See interactive help (\h) also. Does not work in batch mode. Disable with --disable-tee. This option is disabled by default. --no-tee Disable outfile. See interactive help (\h) also. WARNING: Option deprecated; use --disable-tee instead. -u, --user=name User for login if not current user. -U, --safe-updates Only allow UPDATE and DELETE that uses keys. -U, --i-am-a-dummy Synonym for option --safe-updates, -U. -v, --verbose Write more. (-v -v -v gives the table output format). -V, --version Output version information and exit. -w, --wait Wait and retry if connection is down. --connect_timeout=# Number of seconds before connection timeout. --max_allowed_packet=# The maximum packet length to send to or receive from server. --net_buffer_length=# The buffer size for TCP/IP and socket communication. --select_limit=# Automatic limit for SELECT when using --safe-updates. --max_join_size=# Automatic limit for rows in a join when using --safe-updates. --secure-auth Refuse client connecting to server if it uses old (pre-4.1.1) protocol. --server-arg=name Send embedded server this as a parameter. --show-warnings Show warnings after every statement.

Default options are read from the following files in the given order: /etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf /.my.cnf The following groups are read: mysql client The following options may be given as the first argument: --print-defaults Print the program argument list and exit. --no-defaults Don't read default options from any option file. --defaults-file=# Only read default options from the given file #. --defaults-extra-file=# Read this file after the global files are read.

Variables (--variable-name=value) and boolean options {FALSE|TRUE} Value (after reading options) --------------------------------- ----------------------------- abort-source-on-error FALSE auto-rehash TRUE character-sets-dir (No default value) column-type-info FALSE comments FALSE compress FALSE debug-check FALSE debug-info FALSE database (No default value) default-character-set latin1 delimiter ; vertical FALSE force FALSE named-commands FALSE ignore-spaces FALSE local-infile FALSE no-beep FALSE host (No default value) html FALSE xml FALSE line-numbers TRUE unbuffered FALSE column-names TRUE sigint-ignore FALSE port 3306 prompt \N [\d]> quick FALSE raw FALSE reconnect TRUE socket /var/run/mysqld/mysqld.sock ssl FALSE ssl-ca (No default value) ssl-capath (No default value) ssl-cert (No default value) ssl-cipher (No default value) ssl-key (No default value) ssl-verify-server-cert FALSE table FALSE user (No default value) safe-updates FALSE i-am-a-dummy FALSE connect_timeout 0 max_allowed_packet 16777216 net_buffer_length 16384 select_limit 1000 max_join_size 1000000 secure-auth FALSE show-warnings FALSE

L'output che si ottiene potrebbe essere leggermente diverso, a seconda della versione in uso e delle impostazioni nel file my.cnf.

Il file mysql_history

Su Unix, il client mysql registra ogni istruzione eseguita in un file di cronologia. Per default, questo si chiama .mysql_history e si trova nella directory home dell'utente. Per utilizzare un altro file, lo si specifichi nella variabile di ambiente MYSQL_HISTFILE.

Il file .mysql_history dovrebbe essere protetto in modo restrittivo, perché potrebbero esservi scritte informazioni sensibili, come il testo di alcune istruzioni SQL che contengono delle password. Si veda la sezione 5.3.2.2, “End-User Guidelines for Password Security”.

Se non si desidera mantenere un file di cronologia, prima si rimuova .mysql_history se esiste, poi si usi una delle seguenti tecniche:

  • Si imposti la variabile MYSQL_HISTFILE a /dev/null. Perché questa impostazione abbia effetto ad ogni login, la si inserisca in un file eseguito all'avvio della shell.
  • Si crei .mysql_history come collegamento simbolico a /dev/null:
shell> ln -s /dev/null $HOME/.mysql_history

Questo deve essere fatto una sola volta.

Suggerimenti su mysql

Questa sezione spiega alcune tecniche che possono essere d'aiuto per utilizzare mysql in modo più efficiente.

Mostrare i risultati verticalmente

A volte i risultati delle query sono più leggibili se mostrati verticalmente, invece che in modo orizzontale come avviene di solito. Le query possono essere mostrate in verticale terminandole con il carattere \G invece che con un punto e virgola. Ad esempio, i valori di testo più lunghi che includono dei caratteri di nuova riga a volte sono molto più semplici da leggere se mostrati verticalmente:

mysql> SELECT * FROM mails WHERE LENGTH(txt) < 300 LIMIT 300,1\G
*************************** 1. row ***************************
  msg_nro: 3068
    date: 2000-03-01 23:29:50
time_zone: +0200
mail_from: Monty
    reply: monty@no.spam.com
  mail_to: "Thimble Smith" <tim@no.spam.com>
      sbj: UTF-8
      txt: >>>>> "Thimble" == Thimble Smith writes:
Thimble> Hi.  I think this is a good idea.  Is anyone familiar
Thimble> with UTF-8 or Unicode? Otherwise, I´ll put this on my
Thimble> TODO list and see what happens.
Yes, please do that.
Regards,
Monty
    file: inbox-jani-1
    hash: 190402944
1 row in set (0.09 sec)

Usare l'opzione --safe-updates

I principianti potrebbero trovare utile l'opzione di avvio --safe-updates (o --i-am-a-dummy, che ha lo stesso effetto). Serve nei casi in cui si ha lanciato un'istruzione 'DELETE FROM nome_tabella' ma si ha dimenticato la clausola WHERE. Normalmente, questo comando eliminerebbe tutte le righe di una tabella. Con --safe-updates, è possibile eliminare le righe solo specificando i valori delle chiavi che li identificano. In questo modo, si prevengono alcuni incidenti.

Se si usa l'opzione --safe-updates, mysql esegue la seguente istruzione quando si connette al server MySQL:

SET sql_safe_updates=1, sql_select_limit=1000, sql_max_join_size=1000000;

L'istruzione SET ha i seguenti effetti:

  • Non è permesso eseguire istruzioni UPDATE o DELETE a meno che non si specifichino le chiavi nella clausola WHERE o si aggiunga una clausola LIMIT (o entrambe).Per esempio:
UPDATE nome_tabella SET nome_colonna_non_chiave=val WHERE colonna_chiave=val;
UPDATE nome_tabella SET cone_colonna_non_chiave=val LIMIT 1;
  • Il server limita tutte le grandi SELECT che producono più di 1,000 righe, a meno che non includano una clausola LIMIT.
  • Il server abortisce le SELECT multi-tabella che probabilmente dovrebbero esaminare più di 1 milione di combinazioni.

Per specificare limiti diversi da 1,000 e 1,000,000, si possono utilizzare le opzioni --select_limit e --max_join_size:

shell> mysql --safe-updates --select_limit=500 --max_join_size=10000

Disabilitare la riconnessione automatica di mysql

Se il client mysql perde la connessione al server mentre si invia un'istruzione, immediatamente cerca di riconnettersi e inviare nuovamente il comando. Tuttavia, anche se mysql riesce a ristabilire la connessione, quella precedente è terminata e tutti gli oggetti di sessione sono persi: tabelle temporanee, modalità di autocommit e variabili di sessione o definite dall'utente. Inoltre, tutte le transazioni interrotte vengono annullate. Questo comportamento può essere pericoloso. Si consideri l'esempio seguente, dove il server viene arrestato e riavviato tra la prima e la seconda istruzione, senza che l'utente lo sappia:

mysql> SET @a=1;
Query OK, 0 rows affected (0.05 sec)
mysql> INSERT INTO t VALUES(@a);
ERROR 2006: MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    1
Current database: test
Query OK, 1 row affected (1.30 sec)
mysql> SELECT * FROM t;
+------+
| a    |
+------+
| NULL |
+------+
1 row in set (0.05 sec)

La variabile utente @a si perde con la connessione, e dopo la riconnessione è indefinita. Se è importante che mysql termini con un errore quando la connessione viene interrotta, si avvi il client con l'opzione --skip-reconnect.

Commenti

Sto caricando i commenti......
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.