====== MySql Tips and Commands ==
Done with slack 11.0 2007-06-26, slack 12.0 2007-10-18, slack 14.1 2014-11-07
===== Setup ==
==== Install inital Database ==
According to ''/etc/rc.d/rc.mysqld'' do the following:
su - # become user 'root'
chmod +x /etc/rc.d/rc.mysqld # start mysqld at every boot
mysql_install_db --user=mysql # install inital database (/var/lib/mysql)
/etc/rc.d/rc.mysqld start # start mysqld
==== Secure Mysql ==
Run ''mysql_secure_installation'' as root and answer every question with yes!
After that, you may continue with creating databases. See [[mysql_commands#Managing_Databases]] below.
DELETEME The rest of this section is obsolete since --- 2014-11-07 (Slack 14.1)
Get your values for and with ''hostname -f''
The command ''mysql_install_db'' (see above) strongly recommends to setup a root password:
su - # become user 'root'
mysqladmin -u root password
#mysqladmin -u root -h password
Don't issue the second command, it fails, because of 2 independent reasons:
- Access from other hostnames than 'localhost' is not allowed and
- is somehow always extended to . on Slackware. (More in Mysql manual at "4.2.11 Causes of Acccess denied Errors"
We don't care about this quirk and just delete all rows from the table mysql/user which contain as host:
pager less -S;
use mysql;
select * from user; # to check
delete from user where host='';
flush privileges;
select * from user; # to check
DELETEME The follwing is obsolete since 2007-10-18 (Slack 12.0)
Comment out the line ''SKIP="--skip-networking"'' in ''/etc/rc.d/rc.mysqld'' and restart mysqld with ''/etc/rc.d/rc.mysqld resart''. Log into the monitor with ''mysql -u root -p'', then issue the following commands:
pager less -S;
use mysql;
select * from user; # to check
update user set host='.' where host='';
flush privileges;
select * from user; # to check
Now the command ''mysqladmin -u root -h password '' should work
Comment in the line ''SKIP="--skip-networking"'' in ''/etc/rc.d/rc.mysqld'' again and restart mysqld with ''/etc/rc.d/rc.mysqld resart'' again.
===== MySql Commands ==
In order to get UTF-8 content, you must log in and mysqldump with ''----default-character-set=latin1''. FIXME Dont know why!!
==== Misc ==
mysql -u username -p # log into mysql
PAGER most; /* or */ PAGER less -S; # Redirect output to a pager
NOPAGER; # Switch off redirection
SHOW DATABASES; # Display the availabel databaese on the server
USE myDatabase; # Subsequent commands refer to myDatabase
See also [[http://www.developer.com/db/article.php/3725901|Secrets of the MySQL Client Command Line]]
==== Managing Databases ==
/* Create a database with name myDb.
Shell alternative: mysqladmin create myDb */
CREATE DATABASE myDb;
/* Recommended metohd to create a user for the new datase with all possible access privileges.
Affects mysql.user and mysql.db
' is important for password! */
GRANT ALL PRIVILEGES ON myDb.* TO myUser@localhost IDENTIFIED BY 'myPassword';
/* Alternative to create a user: */
CREATE USER myUser@localhost IDENTIFIED BY 'myPassword';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, LOCK TABLES ON myDb.* TO myUser@localhost;
/* Delete the database with all tables. */
DROP DATABASE myDb;
FIXME [[http://dev.mysql.com/doc/refman/5.7/en/grant.html|Manual]] says: Use of GRANT to create accounts ... is deprecated as of MySQL 5.7.6. Instead, perform these tasks using CREATE USER or ALTER USER.
==== Managing Tables ==
SHOW TABLES; # Show all tables of a dababase
DESCRIBE myTable; # Show column data types of a table
RENAME TABLE oldname TO newname;
/* To alter the data tye of a column or eg to remove auto_increment. */
ALTER TABLE myTable MODIFY myColumn MEDIUMINT UNSIGNED;
/* Delete Tables */
DROP TABLE [IF EXISTS] myTable [, my2ndTable, ...] [RESTRICT | CASCADE]
==== Working with Data ==
SELECT * FROM myTable; -- Show content of a table
/* Query 2 tables at the same time (see 3.6.6. Using Foreign Keys) */
SELECT a.*, b.myCol1 FROM myTabA a INNER JOIN myTabB b ON a.id = b.a_id WHERE ...;
/* To test for NULL, you cannot use the arithmetic comparison operators such as =, <, or <> */
SELECT * FROM myTable WHERE myColumn IS NULL;
SELECT COUNT(*) FROM myTable; -- Shows the number of lines of a table
TRUNCATE myTable; -- Delete all rows of a table, like DELETE, but faster
/* Delete rows with conditions */
DELETE [LOW_PRIORITY] FROM myTable [WHERE where_definition] [LIMIT rows]
==== Backup and Restore ==
# Backup an existing database into an SQL-file
mysqldump -u root -p$password --opt --default-character-set=utf8 $dbname > $filename
# Restore the Database from a SQL-file
# Note that the dababase must already exist!
mysql -u root -p$password $db_name < $filename
# Backup all Databases into one SQL-textfile:
mysqldump [--opt] --all_databases > file
To avoid root user and passwords in mysqldump, add a special user vor backups in mysql:
GRANT SELECT, LOCK TABLES ON *.* TO backupuser@localhost IDENTIFIED BY 'your_pass';
Create a file ''.my.cnf'' in the Linux home dir of the user:
[client]
password=your_pass
FIXME Is this warning still relevant:
In order to have all UTF-8:
* Check if the dumped ''backup-file.sql'' is encoded in UTF-8 (use eg. ''file backup-file.sql'')
* Use ''DEFAULT CHARSET=utf8'' in ''CREATE TABLE'' sections of ''backup-file.sql''
* Remove all appearences of ''collate latin1_german2_ci''
* ''mysqldump'' inserts funny comments which seem to mess with the character set when imported. => Remove all comments in ''backup-file.sql''
===== Old, German & unsorted ==
pager or \P; nopager or \pager on/off, wich pager to use is set in ??? env-variable
INSERT INTO tabelname SET colname1=('c1val1'), ...;
Es müssen nicht alle Spalten angegeben werden
INSERT INTO urlConnector VALUES (2, 1);
alle Spalten müssen angegben werden; NULL wenn kein Wert vorliegt
mysql -u user --pager="less -S" database
Als Benutzer user in die Datenbank database einloggen. Output geht nach less, und Zeilen werden nicht umgebrochen
Wenn man schon eingeloggt ist, kann man das gleiche erreichen mit "mysql> \P less -S"
-t Output in table format (for batch mode)
-vvv very verbose (for batch mode ?)
-? show all command line options (unlike 'man mysql' or the manual)
--pager use pager set in $PAGER environment variable
varchar() Datentyp String
date Datentyp Datum
load data infile "" into table ;
Daten aus einer Textdatei tabgetrennt in die Tabelle laden