Als Oracle DBA beschäftige ich mich privat häufig mit MySQL Datenbanken und möchte mit diesen Artikel anderen Oracle DBAs einen schnellen Einstieg ermöglichen.
Die MySQL Referenz Handbücher findet man unter http://dev.mysql.com/doc/#manual
MySQL bietet im Gegensatz zum Oracle DBMS verschiedene Speichersubsysteme an. Die häufigst verwendete ist die MyISAM Engine, welche beispielsweise im Gegensatz zur InnoDB Engine keine Transaktionssicherheit gemäß der ACID Kriterien gewährleistet. Neben der Performance und der Transaktionssicherheit unterscheiden sich die Engines auch bei der Implementierung von Constraints und Indexen. Je nach Einsatzgebiet sollte man sich also gut überlegen, welche Enigine zu den Anforderungen passt. Nähere Infos erhält man in folgender Referenz http://dev.mysql.com/doc/refman/5.1/de/storage-engines.html (auf Version im Link achten)
Standardmäßig ist Auto Commit aktiviert. Um Rollbacks nutzen zu können, muss Auto Commit deaktiviert werden und eine transaktionale Engine wie InnoDB verwendet werden.
Zum Thema Performance Tuning findet man hier einen Artikel https://www.schoenhoff.org/datenbanksysteme/mysql-optimierung/
Abweichende Terminologie:
Oracle | MySQL |
Schema | Datenbank |
Sequenz | Auto Increment |
Wichtige SQL- Unterschiede
Oracle | MySQL |
NVL() | IFNULL() |
ROWNUM < 10 | LIMIT 10 |
SEQ.CURRVAL | LAST_INSERT_ID() |
SELECT sysdate FROM dual; | SELECT CURDATE(); oder SELECT NOW(); DUAL muss nicht angegeben werden. |
SEQ.NEXTVAL | NULL |
Achtung: Abfragen in MySQL sind nicht case sensitivite! LIKE ‚A%‘ und LIKE ‚a%‘ liefern das selbe Ergebnis.
Die MySQL-Syntax weicht an vielen Stellen von der Oracle DBMS SQL-Syntax ab, beispielsweise können mit einem Insert mehere Tupel angelegt werden:
INSERT INTO
tabelle
(a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
Vor allem Funktionen haben in MySQL andere Namen.
Datumsformat
Oracle | MySQL |
Gemäß NLS_DATE_FORMAT | Standardmäßig YYYY-MM-DD |
Speicherort der Initialisierungsparameter:
Oracle | MySQL |
$ORACLE_HOME/dbs/init<Datenbankname>.ora | /etc/mysql/my.cnfoder/etc/my.cnf |
Verbindung zur Datenbank herstellen:
Oracle | MySQL |
export ORACLE_SID=<Datenbankname>sqlplus sys as sysdbasqlplus> | mysql -u root -p mysql> |
Datenbank starten/stoppen/neustarten
Oracle | MySQL |
sqlplus> startup | /etc/init.d/mysql start |
sqlplus> shutdown immediate | /etc/init.d/mysql stop |
– | /etc/init.d/mysql restart |
Benutzer auflisten:
Oracle | MySQL |
sqlplus> SELECT * FROM dba_users; | mysql> SELECT * FROM mysql.user; |
Schemata auflisten:
Oracle | MySQL |
sqlplus> SELECT DISTINCT owner FROM dba_objects; | mysql> SHOW DATABASES; |
Tabelleninformationen auflisten:
Oracle | MySQL |
sqlplus> SELECT * FROM dba_tables; | mysql> SELECT * FROM information_schema.tables; |
Sessions auflisten:
Oracle | MySQL |
sqlplus> SELECT * FROM v$session; | mysql> SHOW PROCESSLIST; |
System-Priviliegien auflisten:
Oracle | MySQL |
sqlplus> SELECT * FROM dba_sys_privs; | mysql> SELECT * FROM mysql.db; |
Backup und Restore
Das Backup und Restore von MySQL gestaltet sich am simpelsten mit dem Programm mysqldump. Für Backups im Enterprise Bereich eignen sich wahrscheinlich andere Lösungen besser. mysqldump erzeugt einen SQL-File Dump von den Metadaten und Content.
Schema Dump
mysqldump -u root -p –extended-insert [–lock-tables oder –single-transaction] –add-drop-database –databases <Schema [, Schema2]> > <Dumpfile>
Datenbank Dump
mysqldump -u root -p –extended-insert [–lock-tables oder –single-transaction] –add-drop-database –all-databases > <Dumpfile>
–extended-insert verkleinert das Dumpfile und beschleunigt das Backup und Recovery
–lock-tables sperrt die Tabellen exklusiv bevor sie exportiert werden, für InnoDB Tabellen eignet sich –single-transaction besser
–single-transaction sichert InnoDB Tabellen transaktional konsistent, ohne die Tabellen exklusiv zu sperren
–add-drop-database löscht evtl. vorhandene Daten vor dem Import
Restore
mysql -u root -p < <Dumpfile>