OBS/Adminhilfe/MySQL Tipps: Unterschied zwischen den Versionen

Aus OBS Wiki
Zur Navigation springen Zur Suche springen
Für diese Seite wurde eine Zugriffsbeschränkung eingerichtet. Falls du diese Nachricht siehst, bist du nicht berechtigt, diese Seite einzusehen.
Zeile 31: Zeile 31:
AND p_wgr.liefnr = '700758'
AND p_wgr.liefnr = '700758'
</source><br/>
</source><br/>
==Tabellen kopieren bei InnoDB==
==Tabellen kopieren bei InnoDB==
Habe mal ein wenig im Internet dazu geschaut und fast überall wird gesagt, man soll Tabellen bei InnoDB lieber per Dump kopieren. Bei MyISAM stellt das Kopieren kein Problem dar, aber bei InnoDB ist es sehr riskant und kann zu Problemen führen.
Habe mal ein wenig im Internet dazu geschaut und fast überall wird gesagt, man soll Tabellen bei InnoDB lieber per Dump kopieren. Bei MyISAM stellt das Kopieren kein Problem dar, aber bei InnoDB ist es sehr riskant und kann zu Problemen führen.
Zeile 48: Zeile 49:
Allerdings wird die Tabelle durch den Befehl gelockt und muss, nachdem sie kopiert wurde, per Befehl UNLOCK TABLES; wieder freigegeben werden, was eine Anwendung im laufenden Betrieb sehr unpraktikabel macht.  
Allerdings wird die Tabelle durch den Befehl gelockt und muss, nachdem sie kopiert wurde, per Befehl UNLOCK TABLES; wieder freigegeben werden, was eine Anwendung im laufenden Betrieb sehr unpraktikabel macht.  


 
==Table Engine zwischen MyISAM und InnoDB wechseln
Folgender SQL Befehl generiert für eine bestimmte Datenbank eine Reihe von SQL Befehlen, welche die Table Engine ändern. Diese können einfach in die Zwischenablage exportiert und anschließend in Heidi-SQL ausgeführt werden.
<source lang="SQL">
SELECT  CONCAT('ALTER TABLE `', table_name, '` ENGINE=MYISAM;') AS sql_statements
FROM    information_schema.tables AS tb
WHERE  table_schema = 'Datenbankname'
AND    `ENGINE` = 'InnoDB'
AND    `TABLE_TYPE` = 'BASE TABLE'
ORDER BY table_name DESC;
</source>



Version vom 24. Oktober 2017, 07:48 Uhr

Dies ist eine zugriffsgeschützte Seite.


Admin-Hilfe

OBS-Administration / Installation
kundenspezifische Anpassungen
OBS Protokolle
Shop-Administration


MySQL Tipps

MySQL DELETE Statements

Wenn man ein DELETE Statement braucht, in dem man einen JOIN auf auf die Tabelle benötigt, aus welcher man die Daten löschen möchte, gibt MySQL einen Fehler aus, dass man nicht auf die Tabelle joinen darf, aus welcher man löschen möchte.
Als Beispiel, doppelte Warengruppen aus der Wortmann Artikelpflege löschen:

DELETE
FROM P_WGR
WHERE EXISTS (
  SELECT sys_uid 
  FROM P_WGR AS DUP 
  WHERE P_WGR.hwgr = DUP.hwgr 
  AND P_WGR.wgrname = DUP.wgrname 
  AND P_WGR.sys_uid <> DUP.sys_uid 
  AND liefnr = '700758') 
ORDER BY hwgr;


So lässt sich dieses aber umgehen:

DELETE
FROM p_wgr 
USING p_wgr, p_wgr AS DUP
WHERE p_wgr.sys_uid > DUP.sys_uid 
AND p_wgr.hwgr = DUP.hwgr 
AND p_wgr.liefnr = '700758'


Tabellen kopieren bei InnoDB

Habe mal ein wenig im Internet dazu geschaut und fast überall wird gesagt, man soll Tabellen bei InnoDB lieber per Dump kopieren. Bei MyISAM stellt das Kopieren kein Problem dar, aber bei InnoDB ist es sehr riskant und kann zu Problemen führen. Das Problem ist wohl, dass in der ibdata der Tablespace gespeichert wird und dieser nicht mit kopiert werden kann. http://serverfault.com/questions/367255/linux-mysql-is-it-safe-to-copy-mysql-db-files-with-cp-command-from-one-db-to

Es gibt hier noch eine Anleitung wir man den Table Space manuell setzen kann, wofür aber einiges an manueller Arbeit pro Tabelle vorgenommen werden muss,
was sich vermutlich am ehesten für Back Recovery eignet. http://www.chriscalender.com/tag/innodb-error-tablespace-id-in-file/


Nachdem ich noch etwas weiter gelesen habe, habe ich herausgefunden , dass ab MySQL 5.6.6 wohl eine Möglichkeit besteht den Tablespace aus der Ibdata zu extrahieren: https://dev.mysql.com/doc/refman/5.6/en/tablespace-copying.html

Hierfür muss jedoch pro Tabelle der Befehl FLUSH TABLES tabellenname FOR EXPORT; durchgeführt werden. Dadurch wird eine cfg Datei angelegt, die dann mit kopiert werden muss. Allerdings wird die Tabelle durch den Befehl gelockt und muss, nachdem sie kopiert wurde, per Befehl UNLOCK TABLES; wieder freigegeben werden, was eine Anwendung im laufenden Betrieb sehr unpraktikabel macht.

==Table Engine zwischen MyISAM und InnoDB wechseln Folgender SQL Befehl generiert für eine bestimmte Datenbank eine Reihe von SQL Befehlen, welche die Table Engine ändern. Diese können einfach in die Zwischenablage exportiert und anschließend in Heidi-SQL ausgeführt werden.

SELECT  CONCAT('ALTER TABLE `', table_name, '` ENGINE=MYISAM;') AS sql_statements
FROM    information_schema.tables AS tb
WHERE   table_schema = 'Datenbankname'
AND     `ENGINE` = 'InnoDB'
AND     `TABLE_TYPE` = 'BASE TABLE'
ORDER BY table_name DESC;