Not really a blog, just some stuff that a future me might need to remember one day.
My preferred RDBMS is PostgreSQL these days but for some projects I
still need to use MySQL. I prefer to use the command line interface for
simple ad-hoc queries and updates. I don’t feel quite so at home using
the mysql
CLI as psql
but once you find your way around and tweak it
a little its usable enough.
$ mysql --user=<username> --password=<password> database_name
mysql>
mysql> \q
Bye
$
If you want to edit the most recent statement in your default text
editor you can use \e
:
mysql> SELECT * FROM ordrs;
ERROR 1146 (42S02): Table 'ordrs' doesn't exist
mysql> \e
The tee
command lets you copy all output to a file. notee
to switch
it off again:
mysql> tee tmp/foo.txt
Logging to file 'tmp/foo.txt'
mysql> notee
Outfile disabled.
Ctrl-r can be configured to work the same way it does in the
shell to let you retrieve previous commands if you add the following to
your ~/.editrc
:
bind "^R" em-inc-search-prev
There are many settings that you can use to customise the CLI. You can set many of these options at the command prompt on a per session basis. For example, you can customise your prompt to display the name of the current database:
mysql> prompt \d>
Another useful setting is the pager
to help you scroll through bigger
result sets. You can use common Unix paging programs like less
or
more
:
mysql> pager more
To set up a default configuration you’ll need to put your preferences
into a ~/.my.cnf
file. e.g.
[mysql]
prompt=\d>
pager=more
See http://dev.mysql.com/doc/refman/5.7/en/mysql-command-options.html and http://dev.mysql.com/doc/refman/5.7/en/option-files.html
http://dev.mysql.com/doc/refman/5.7/en/mysql-commands.html
To see a list of tables in the current database:
mysql> show tables;
or to filter by name:
mysql> show tables like '%tax%';
And then to drill down into the schema for an individual table:
mysql> describe <mytable>;
Check the indexes on a given table:
mysql> show indexes in <mytable>;
Which database am I in?:
mysql> select database();
Which databases are available?:
mysql> show databases;
Change database:
mysql> use <db-name>;
If you need to find your datafiles then use:
$ mysql -e 'SHOW VARIABLES WHERE Variable_Name LIKE "%dir"'
+---------------------------+------------------------------------------------------+
| Variable_name | Value |
+---------------------------+------------------------------------------------------+
| basedir | /usr/local/Cellar/mysql/5.6.15 |
| character_sets_dir | /usr/local/Cellar/mysql/5.6.15/share/mysql/charsets/ |
| datadir | /usr/local/var/mysql/ |
| innodb_data_home_dir | |
| innodb_log_group_home_dir | ./ |
| lc_messages_dir | /usr/local/Cellar/mysql/5.6.15/share/mysql/ |
| plugin_dir | /usr/local/Cellar/mysql/5.6.15/lib/plugin/ |
| slave_load_tmpdir | /var/folders/pl/8w9lz0_537n2st2rcq95q24m0000gn/T/ |
| tmpdir | /var/folders/pl/8w9lz0_537n2st2rcq95q24m0000gn/T/ |
+---------------------------+------------------------------------------------------+
If you just want to backup a single database:
$ mysqldump --user=myuser --password=mypassword dbname > tmp/dev.dmp
Backups are just SQL script text files so to restore a backup just use the mysql
program:
$ mysql --user=myuser --password=mypassword dbname < tmp/dev.dmp
If you want to take a backup of all your local databases mysqldump
has
an all-databases
option:
$ mysqldump -u root -ptmppassword --all-databases > /tmp/all-database.sql