I need to execute a mysql query in one line using bash.
It should be something like this:
mysql database --user=\'root\' --password=\'my-password\' <
If you are running this on a production environment, it would be better to login to the mysql shell first so as not to expose your db details.
Once logged into shell, why not just use a prepared.sql file?
mysql -u user -p
Next, enter your user password
Now you are logged into shell and you can run commands securely from here:
mysql> use DBNAME mysql> SOURCE file.sql
This is how I operate on the command line with my databases in order for my passwords not to appear in the logs.
Did you try
mysql -u root -pmy_password -D DATABASENAME -e "UPDATE `database` SET `field1` = '1' WHERE `id` = 1111;" > output.txt
(the > output.txt
part can be ignored but, it will be useful to see what was returned by the statement executed by looking at the file.)
Use echo
and a pipe:
echo "UPDATE `database` SET `field1` = '1' WHERE `id` = 1111;" | mysql database --user='root' --password='my-password'
Use the -e
option:
$ mysql -e "UPDATE ..."
I normally prefer Triple less then as its syntax and approach is similar to file redirect. Easy to go back in history and modify query
mysql database --user='root' --password='my-password' <<< "UPDATE `database` SET `field1` = '1' WHERE `id` = 1111"
It is called Here Strings in bash. You can find more about them here http://linux.die.net/abs-guide/x15683.html
It is useful when you want to pipe string to commands.
Writing your password in a command is generally a bad idea (people can read it over your shoulder, it probably gets stored in your shell history, etc.), but you can put your credentials in a file. Giving the file a name starting with .
makes it hidden, which is also more secure.
# .db.conf
[client]
database=myDatabase
user=myUserName
password=myPassWord
Make sure only you can read the file:
chmod 600 .db.conf
Then call MySQL like so:
mysql --defaults-extra-file=.db.conf -e "UPDATE database SET field1 = '1' WHERE id = 1111;"
or:
echo "UPDATE database SET field1 = '1' WHERE id = 1111;" | mysql --defaults-extra-file=.db.conf
Note that --defaults-extra-file
needs to be the first option supplied to mysql
otherwise it freaks out.